diff --git a/DEPS b/DEPS
index 01c2f84..fe0f53343 100644
--- a/DEPS
+++ b/DEPS
@@ -287,7 +287,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': 'afbfd351374d93484f8eecf532afbd0dac084865',
+  'swiftshader_revision': '1178eb9eef342d5dfebddc551d0831f5309ebf13',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -302,7 +302,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
-  'fuchsia_version': 'version:8.20220607.3.1',
+  'fuchsia_version': 'version:8.20220608.1.1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling google-toolbox-for-mac
   # and whatever else without interference from each other.
@@ -354,7 +354,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': '042fe07f91b82c1ef08d0d0dfaf3f563a6ba36bc',
+  'devtools_frontend_revision': '0cca99b9409a03b9523f1d5cd13675b5fc0aed62',
   # 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.
@@ -457,7 +457,7 @@
   'libcxx_revision':       'b1269813eaf5b8ac78e35e45a0f7cc320bd3e7d6',
 
   # GN CIPD package version.
-  'gn_version': 'git_revision:2f71761a90bdccdb5f4a99e8b231c96aba0967d9',
+  'gn_version': 'git_revision:fd6cae41bd7d5d255dc2fb96004a8bf74ac9d972',
 }
 
 # Only these hosts are allowed for dependencies in this DEPS file.
@@ -920,7 +920,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'j5iQQcfEJWgNhcd2zCVNcBHd4gFj3fzcuU6Q1EENWQ4C',
+          'version': 'JPzPwtVT1B0wxFtrYWysxKnlZrx9hVhFuT00NvADQ64C',
       },
     ],
     'condition': 'checkout_android',
@@ -1113,7 +1113,7 @@
   # Tools used when building Chrome for Chrome OS. This affects both the Simple
   # Chrome workflow, as well as the chromeos-chrome ebuild.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'e2b62ac2cfc6aaecac290dc511540534bd9da966',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '41d2e02e8d1438445eee7463ae4536fe6280e0fc',
       'condition': 'checkout_chromeos',
   },
 
@@ -1533,7 +1533,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'c05294a1704cc6992869ad438342328ca2b38b8d',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '2e22f4e894ed9800027ff05dc0c7fe2217b033d6',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1708,7 +1708,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'edd275f0ad33c708fba30643cf971adf0f6ba488',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '86c452ac5ae9cf84e92b8d28c35432b188728edf',
+    Var('webrtc_git') + '/src.git' + '@' + 'ca6726d5c47156b6ed79a19d186b5bdb3384ff41',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index a5fd46a..b0b4057 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -3603,7 +3603,7 @@
       </message>
 
       <message name="IDS_ASH_CALENDAR_NO_EVENTS" desc="Text that appears on the event list when there are no events.">
-        Open in Google calendar
+        Open in Google Calendar
       </message>
 
       <message name="IDS_ASH_STATUS_TRAY_PROGRESS_BAR_ACCESSIBLE_NAME" desc="The accessible name for the progress bar shown in the status tray.">
diff --git a/ash/ash_strings_grd/IDS_ASH_CALENDAR_NO_EVENTS.png.sha1 b/ash/ash_strings_grd/IDS_ASH_CALENDAR_NO_EVENTS.png.sha1
index 99217f8..42e40f1 100644
--- a/ash/ash_strings_grd/IDS_ASH_CALENDAR_NO_EVENTS.png.sha1
+++ b/ash/ash_strings_grd/IDS_ASH_CALENDAR_NO_EVENTS.png.sha1
@@ -1 +1 @@
-d8eed11d7af76ee7413e3db47a3336946a49a86e
\ No newline at end of file
+13e34c005f09211a2d4f960790018bc01c93023f
\ No newline at end of file
diff --git a/ash/components/arc/input_overlay/resources/com.blackpanther.ninjaarashi2.json b/ash/components/arc/input_overlay/resources/com.blackpanther.ninjaarashi2.json
index 7913ee8..905fb802 100644
--- a/ash/components/arc/input_overlay/resources/com.blackpanther.ninjaarashi2.json
+++ b/ash/components/arc/input_overlay/resources/com.blackpanther.ninjaarashi2.json
@@ -147,8 +147,8 @@
       "input_sources": [
         "keyboard"
       ],
-      "name": "Setting",
-      "key": "Escape",
+      "name": "Pause",
+      "key": "Backspace",
       "location": [
         {
           "type": "dependent_position",
diff --git a/ash/components/arc/input_overlay/resources/com.direlight.grimvalor.json b/ash/components/arc/input_overlay/resources/com.direlight.grimvalor.json
index 166e55d..805ba0f 100644
--- a/ash/components/arc/input_overlay/resources/com.direlight.grimvalor.json
+++ b/ash/components/arc/input_overlay/resources/com.direlight.grimvalor.json
@@ -124,8 +124,8 @@
       "input_sources": [
         "keyboard"
       ],
-      "name": "settings",
-      "key": "Escape",
+      "name": "pause",
+      "key": "Backspace",
       "location": [
         {
           "type": "dependent_position",
diff --git a/ash/components/login/auth/auth_session_authenticator.cc b/ash/components/login/auth/auth_session_authenticator.cc
index a371334..6030478 100644
--- a/ash/components/login/auth/auth_session_authenticator.cc
+++ b/ash/components/login/auth/auth_session_authenticator.cc
@@ -612,9 +612,13 @@
       break;
     case user_data_auth::CRYPTOHOME_ERROR_TPM_COMM_ERROR:
     case user_data_auth::CRYPTOHOME_ERROR_TPM_NEEDS_REBOOT:
-    case user_data_auth::CRYPTOHOME_ERROR_TPM_DEFEND_LOCK:
       error.failure_reason = AuthFailure::TPM_ERROR;
       break;
+    case user_data_auth::CRYPTOHOME_ERROR_TPM_DEFEND_LOCK:
+      // PIN is locked out, for now mark it as auth failure, and pin lockout
+      // would be detected by PinStorageCryptohome.
+      error.failure_reason = default_error;
+      break;
     case user_data_auth::CRYPTOHOME_ERROR_MOUNT_MOUNT_POINT_BUSY:
       // Assumption about system state is not correct
       error.failure_reason = default_error;
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 008e44c..04f12b3 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -598,8 +598,8 @@
     "EnableOobeNetworkScreenSkip", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Enables skipping of network screen.
-const base::Feature kEnableOobeThemeSelection{
-    "EnableOobeThemeSelection", base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kEnableOobeThemeSelection{"EnableOobeThemeSelection",
+                                              base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Enables showing notification after the password change for SAML users.
 const base::Feature kEnableSamlNotificationOnPasswordChangeSuccess{
@@ -2039,8 +2039,14 @@
   return base::FeatureList::IsEnabled(kNotificationsInContextMenu);
 }
 
+// True if `kNotificationsRefresh` or `kDarkLightMode` is enabled. Showing the
+// new notifications UI if the D/L mode feature is enabled, since the new
+// notifications UI supports D/L mode. These two features will be launched at
+// the same time, or the new notifications UI will be launched earlier than D/L
+// mode, so it is safe to do this.
 bool IsNotificationsRefreshEnabled() {
-  return base::FeatureList::IsEnabled(kNotificationsRefresh);
+  return base::FeatureList::IsEnabled(kNotificationsRefresh) ||
+         IsDarkLightModeEnabled();
 }
 
 bool IsOobeChromeVoxHintEnabled() {
diff --git a/ash/quick_pair/keyed_service/quick_pair_metrics_logger.cc b/ash/quick_pair/keyed_service/quick_pair_metrics_logger.cc
index 462cc0a..8e59695 100644
--- a/ash/quick_pair/keyed_service/quick_pair_metrics_logger.cc
+++ b/ash/quick_pair/keyed_service/quick_pair_metrics_logger.cc
@@ -130,13 +130,11 @@
             *device, FastPairEngagementFlowEvent::
                          kDiscoveryUiDismissedByUserAfterLearnMorePressed);
         discovery_learn_more_devices_.erase(device);
-        feature_usage_metrics_logger_->RecordUsage(/*success=*/true);
         break;
       }
 
       AttemptRecordingFastPairEngagementFlow(
           *device, FastPairEngagementFlowEvent::kDiscoveryUiDismissedByUser);
-      feature_usage_metrics_logger_->RecordUsage(/*success=*/true);
       break;
     case DiscoveryAction::kDismissed:
       if (base::Contains(discovery_learn_more_devices_, device)) {
@@ -144,13 +142,11 @@
             *device, FastPairEngagementFlowEvent::
                          kDiscoveryUiDismissedAfterLearnMorePressed);
         discovery_learn_more_devices_.erase(device);
-        feature_usage_metrics_logger_->RecordUsage(/*success=*/true);
         break;
       }
 
       AttemptRecordingFastPairEngagementFlow(
           *device, FastPairEngagementFlowEvent::kDiscoveryUiDismissed);
-      feature_usage_metrics_logger_->RecordUsage(/*success=*/true);
       break;
   }
 }
@@ -252,13 +248,15 @@
   if (device->protocol == Protocol::kFastPairRetroactive)
     RecordRetroactivePairingResult(/*success=*/!error.has_value());
 
-  if (error) {
+  if (error.has_value()) {
     RecordAccountKeyResult(*device, /*success=*/false);
     RecordAccountKeyFailureReason(*device, error.value());
+    feature_usage_metrics_logger_->RecordUsage(/*success=*/false);
     return;
   }
 
   RecordAccountKeyResult(*device, /*success=*/true);
+  feature_usage_metrics_logger_->RecordUsage(/*success=*/true);
 }
 
 void QuickPairMetricsLogger::OnCompanionAppAction(scoped_refptr<Device> device,
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb
index 14f7bf3..bb1029e 100644
--- a/ash/strings/ash_strings_am.xtb
+++ b/ash/strings/ash_strings_am.xtb
@@ -236,6 +236,7 @@
 <translation id="2359808026110333948">ቀጥል</translation>
 <translation id="2367186422933365202">ወደ የእርስዎ Chromebook መግባት አልተቻለም</translation>
 <translation id="2369165858548251131">«Hello» በቻይንኛ</translation>
+<translation id="2375445874393996153">በማያ ገጼ ላይ ያለውን ነገር በGoogle ረዳት መፈለግ ከአሁን በኋላ አይደገፍም።</translation>
 <translation id="2390318262976603432">የቋንቋ ቅንብሮች</translation>
 <translation id="240006516586367791">የሚዲያ መቆጣጠሪያዎች</translation>
 <translation id="2402411679569069051">የእርስዎን Chromebook ለመክፈት የጣት አሻራዎን ይጠቀሙ ወይም ስልክዎን ይክፈቱ</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index a08c45e..576486de 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -240,6 +240,7 @@
 <translation id="2359808026110333948">متابعة</translation>
 <translation id="2367186422933365202">‏يتعذّر تسجيل الدخول إلى جهاز Chromebook.</translation>
 <translation id="2369165858548251131">"مرحبًا" باللغة الصينية</translation>
+<translation id="2375445874393996153">‏ميزة البحث عن المحتوى الذي يظهر على الشاشة باستخدام "مساعد Google" تم إيقافها نهائيًا.</translation>
 <translation id="2390318262976603432">إعدادات اللغة</translation>
 <translation id="240006516586367791">عناصر التحكُّم في الوسائط</translation>
 <translation id="2402411679569069051">‏لفتح قفل جهاز Chromebook، استخدِم بصمة إصبعك أو افتح قفل هاتفك.</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb
index 9ffe46b..57eddb1 100644
--- a/ash/strings/ash_strings_as.xtb
+++ b/ash/strings/ash_strings_as.xtb
@@ -240,6 +240,7 @@
 <translation id="2359808026110333948">অব্যাহত ৰাখক</translation>
 <translation id="2367186422933365202">আপোনাৰ Chromebookত ছাইন ইন কৰিব পৰা নাই</translation>
 <translation id="2369165858548251131">চীনা ভাষাত "নমস্কাৰ"</translation>
+<translation id="2375445874393996153">মোৰ স্ক্ৰীনত কি আছে সেয়া Google Assistantৰ জৰিয়তে সন্ধান কৰাটো আৰু সমৰ্থিত নহয়।</translation>
 <translation id="2390318262976603432">স্থানীয় ভাষাৰ ছেটিংসমূহ</translation>
 <translation id="240006516586367791">মিডিয়াৰ নিয়ন্ত্ৰণ</translation>
 <translation id="2402411679569069051">আপোনাৰ Chromebook আনলক কৰিবলৈ নিজৰ ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰক অথবা আপোনাৰ ফ’নটো আনলক কৰক</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb
index a66a75ff4..59d7e59 100644
--- a/ash/strings/ash_strings_az.xtb
+++ b/ash/strings/ash_strings_az.xtb
@@ -31,6 +31,7 @@
 <translation id="1150989369772528668">Təqvim</translation>
 <translation id="1153356358378277386">Birləşmiş cihazlar</translation>
 <translation id="1165712434476988950">Güncəlləməni tətbiq etmək üçün cihazı yenidən başlatmaq tələb olunur.</translation>
+<translation id="1170753161936175256"><ph name="EVENT_SUMMARY" />, <ph name="TIME_RANGE" /></translation>
 <translation id="1171742223880403396">USB-C kabeliniz displeylərə düzgün qoşulmaya bilər</translation>
 <translation id="1175572348579024023">Sürüşdürün</translation>
 <translation id="1178581264944972037">Durdurun</translation>
@@ -239,6 +240,7 @@
 <translation id="2359808026110333948">Davam edin</translation>
 <translation id="2367186422933365202">Chromebook'a daxil olmaq olmur</translation>
 <translation id="2369165858548251131">Çin dilində "Salam"</translation>
+<translation id="2375445874393996153">Google Assistent ilə ekranımda olanları axtarmaq artıq dəstəklənmir.</translation>
 <translation id="2390318262976603432">Yerli ayarlar</translation>
 <translation id="240006516586367791">Media nizamlayıcıları</translation>
 <translation id="2402411679569069051">Chromebook'u kiliddən çıxarmaq üçün barmaq izinizi istifadə edin və ya telefonunuzu kiliddən çıxarın</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb
index 36c1486..a024c13 100644
--- a/ash/strings/ash_strings_bs.xtb
+++ b/ash/strings/ash_strings_bs.xtb
@@ -31,6 +31,7 @@
 <translation id="1150989369772528668">Kalendar</translation>
 <translation id="1153356358378277386">Upareni uređaji</translation>
 <translation id="1165712434476988950">Potrebno je ponovo pokrenuti uređaj kako bi se primijenilo ažuriranje.</translation>
+<translation id="1170753161936175256"><ph name="EVENT_SUMMARY" />, <ph name="TIME_RANGE" /></translation>
 <translation id="1171742223880403396">USB-C kabl se ne može ispravno povezati s ekranima</translation>
 <translation id="1175572348579024023">Klizanje</translation>
 <translation id="1178581264944972037">Pauziraj</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb
index e66887c5..99d69aa 100644
--- a/ash/strings/ash_strings_ca.xtb
+++ b/ash/strings/ash_strings_ca.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">Continua</translation>
 <translation id="2367186422933365202">No es pot iniciar la sessió al Chromebook</translation>
 <translation id="2369165858548251131">"Hola" en xinès</translation>
+<translation id="2375445874393996153">L'opció per cercar què hi ha a la pantalla amb l'Assistent de Google ja no s'admet.</translation>
 <translation id="2390318262976603432">Configuració regional</translation>
 <translation id="240006516586367791">Controls multimèdia</translation>
 <translation id="2402411679569069051">Per desbloquejar el Chromebook, fes servir l'empremta digital o desbloqueja el telèfon</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index 602ad5f..2adb9ba 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">Fortsæt</translation>
 <translation id="2367186422933365202">Det lykkedes ikke at logge ind på din Chromebook</translation>
 <translation id="2369165858548251131">"Hej" på kinesisk</translation>
+<translation id="2375445874393996153">Der kan ikke længeres søges efter, hvad der vises på skærmen, ved hjælp af Google Assistent.</translation>
 <translation id="2390318262976603432">Lokale indstillinger</translation>
 <translation id="240006516586367791">Mediestyring</translation>
 <translation id="2402411679569069051">Hvis du vil låse din Chromebook op, skal du bruge dit fingeraftryk eller låse din telefon op</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index ee75584..9ca1c8f 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">ادامه</translation>
 <translation id="2367186422933365202">‏نمی‌توان به سیستم Chromebook وارد شد</translation>
 <translation id="2369165858548251131">‏‎«Hello»‎ in Chinese (سلام به زبان چینی)</translation>
+<translation id="2375445874393996153">‏ویژگی جستجوی محتوای روی صفحه‌نمایش با «دستیار Google» دیگر پشتیبانی نمی‌شود.</translation>
 <translation id="2390318262976603432">تنظیمات منطقه زبانی</translation>
 <translation id="240006516586367791">کنترل‌های رسانه</translation>
 <translation id="2402411679569069051">‏برای باز کردن قفل Chromebook، از اثر انگشت استفاده کنید یا قفل تلفنتان را باز کنید</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index 787ca5d..50d80533 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -31,6 +31,7 @@
 <translation id="1150989369772528668">Kalendaryo</translation>
 <translation id="1153356358378277386">Mga nakapares na device</translation>
 <translation id="1165712434476988950">Kailangang mag-restart ng device para mailapat ang update.</translation>
+<translation id="1170753161936175256"><ph name="EVENT_SUMMARY" />, <ph name="TIME_RANGE" /></translation>
 <translation id="1171742223880403396">Posibleng hindi kumonekta nang maayos sa mga display ang iyong USB-C cable</translation>
 <translation id="1175572348579024023">Mag-scroll</translation>
 <translation id="1178581264944972037">I-pause</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb
index 79ed851..f725d2c 100644
--- a/ash/strings/ash_strings_gu.xtb
+++ b/ash/strings/ash_strings_gu.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">આગળ વધો</translation>
 <translation id="2367186422933365202">તમારી Chromebookમાં સાઇન ઇન કરી શકતા નથી</translation>
 <translation id="2369165858548251131">ચીની ભાષામાં "નમસ્કાર"</translation>
+<translation id="2375445874393996153">મારી સ્ક્રીન પર શું છે તે Google Assistant વડે શોધવાની સુવિધાને હવે સપોર્ટ કરવામાં આવતો નથી.</translation>
 <translation id="2390318262976603432">લોકેલ સેટિંગ</translation>
 <translation id="240006516586367791">મીડિયા નિયંત્રણો</translation>
 <translation id="2402411679569069051">તમારી Chromebook અનલૉક કરવા માટે, તમારી ફિંગરપ્રિન્ટનો ઉપયોગ કરો અથવા તમારો ફોન અનલૉક કરો</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index a9d21db..fd96a29 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -31,6 +31,7 @@
 <translation id="1150989369772528668">कैलेंडर</translation>
 <translation id="1153356358378277386">युग्‍मित डिवाइस</translation>
 <translation id="1165712434476988950">अपडेट लागू करने के लिए डिवाइस को रीस्टार्ट करना ज़रूरी है.</translation>
+<translation id="1170753161936175256"><ph name="EVENT_SUMMARY" />, <ph name="TIME_RANGE" /></translation>
 <translation id="1171742223880403396">हो सकता है कि आपकी यूएसबी-सी केबल, डिसप्ले के साथ ठीक तरह से कनेक्ट न हो पाए</translation>
 <translation id="1175572348579024023">स्क्रोल करें</translation>
 <translation id="1178581264944972037">रोकें</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb
index 2fbd79f3..f89bd455 100644
--- a/ash/strings/ash_strings_hr.xtb
+++ b/ash/strings/ash_strings_hr.xtb
@@ -31,6 +31,7 @@
 <translation id="1150989369772528668">Kalendar</translation>
 <translation id="1153356358378277386">Upareni uređaji</translation>
 <translation id="1165712434476988950">Da bi se primijenilo ažuriranje, potrebno je ponovo pokrenuti uređaj.</translation>
+<translation id="1170753161936175256"><ph name="EVENT_SUMMARY" />, <ph name="TIME_RANGE" /></translation>
 <translation id="1171742223880403396">Vaš kabel USB-C možda nije ispravno povezan sa zaslonima</translation>
 <translation id="1175572348579024023">Pomicanje</translation>
 <translation id="1178581264944972037">Pauziraj</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb
index 8b90206..fbb7aed 100644
--- a/ash/strings/ash_strings_hu.xtb
+++ b/ash/strings/ash_strings_hu.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">Tovább</translation>
 <translation id="2367186422933365202">Nem lehet bejelentkezni a Chromebookra</translation>
 <translation id="2369165858548251131">„Helló” kínai nyelven</translation>
+<translation id="2375445874393996153">A Google Segéddel már nem lehetséges a képernyőn látható tartalmak közötti keresés.</translation>
 <translation id="2390318262976603432">Nyelv- és országkód beállításai</translation>
 <translation id="240006516586367791">Médiaelemek vezérlője</translation>
 <translation id="2402411679569069051">A Chromebook zárolásának feloldásához használja ujjlenyomatát, vagy oldja fel telefonja zárolását.</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb
index a447d308..6bea916 100644
--- a/ash/strings/ash_strings_id.xtb
+++ b/ash/strings/ash_strings_id.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">Lanjutkan</translation>
 <translation id="2367186422933365202">Tidak dapat login ke Chromebook</translation>
 <translation id="2369165858548251131">"Halo" dalam bahasa China</translation>
+<translation id="2375445874393996153">Penelusuran konten layar dengan Asisten Google tidak lagi didukung.</translation>
 <translation id="2390318262976603432">Setelan Lokal</translation>
 <translation id="240006516586367791">Kontrol media</translation>
 <translation id="2402411679569069051">Untuk membuka kunci Chromebook, gunakan sidik jari atau buka kunci ponsel</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb
index 6dd49ecc..7c757bf 100644
--- a/ash/strings/ash_strings_is.xtb
+++ b/ash/strings/ash_strings_is.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">Halda áfram</translation>
 <translation id="2367186422933365202">Ekki tókst að skrá þig inn á Chromebook</translation>
 <translation id="2369165858548251131">„Halló“ á kínversku</translation>
+<translation id="2375445874393996153">Ekki er lengur stuðningur við að leita að því sem er á skjánum með Google hjálpara.</translation>
 <translation id="2390318262976603432">Stillingar tungumálskóða</translation>
 <translation id="240006516586367791">Efnisstýringar</translation>
 <translation id="2402411679569069051">Notaðu fingrafar eða taktu símann þinn úr lás til að taka Chromebook úr lás</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index 27f0f54..ffe93f4 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">続行</translation>
 <translation id="2367186422933365202">Chromebook にログインできません</translation>
 <translation id="2369165858548251131">中国語で「こんにちは」ってどう言うの</translation>
+<translation id="2375445874393996153">画面の表示内容を Google アシスタントで検索することはできなくなりました。</translation>
 <translation id="2390318262976603432">言語 / 地域設定</translation>
 <translation id="240006516586367791">メディア コントロール</translation>
 <translation id="2402411679569069051">Chromebook のロックを解除するには、指紋認証を使用するか、スマートフォンのロックを解除します</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb
index a6ad309..64929e2 100644
--- a/ash/strings/ash_strings_km.xtb
+++ b/ash/strings/ash_strings_km.xtb
@@ -31,6 +31,7 @@
 <translation id="1150989369772528668">ប្រតិទិន</translation>
 <translation id="1153356358378277386">ឧបករណ៍​ដែល​បាន​ផ្គូផ្គង</translation>
 <translation id="1165712434476988950">តម្រូវឱ្យ​ចាប់ផ្ដើម​ឧបករណ៍​ឡើងវិញ ដើម្បី​អនុវត្ត​កំណែថ្មី​។</translation>
+<translation id="1170753161936175256"><ph name="EVENT_SUMMARY" /> <ph name="TIME_RANGE" /></translation>
 <translation id="1171742223880403396">ខ្សែ USB-C របស់អ្នក​ប្រហែលជា​មិនអាចភ្ជាប់​ផ្ទាំងអេក្រង់​បានត្រឹមត្រូវទេ</translation>
 <translation id="1175572348579024023">រំកិល</translation>
 <translation id="1178581264944972037">ផ្អាក</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb
index ebf12e6c..5e77be72 100644
--- a/ash/strings/ash_strings_kn.xtb
+++ b/ash/strings/ash_strings_kn.xtb
@@ -31,6 +31,7 @@
 <translation id="1150989369772528668">ಕ್ಯಾಲೆಂಡರ್</translation>
 <translation id="1153356358378277386">ಜೋಡಿ ಮಾಡಲಾದ ಸಾಧನಗಳು</translation>
 <translation id="1165712434476988950">ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಅನ್ವಯಿಸಲು ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕಾಗುತ್ತದೆ.</translation>
+<translation id="1170753161936175256"><ph name="EVENT_SUMMARY" />, <ph name="TIME_RANGE" /></translation>
 <translation id="1171742223880403396">ನಿಮ್ಮ USB-C ಕೇಬಲ್ ಡಿಸ್‌ಪ್ಲೇಗಳಿಗೆ ಸರಿಯಾಗಿ ಕನೆಕ್ಟ್ ಆಗದಿರಬಹುದು</translation>
 <translation id="1175572348579024023">ಸ್ಕ್ರಾಲ್</translation>
 <translation id="1178581264944972037">ವಿರಾಮ</translation>
@@ -239,6 +240,7 @@
 <translation id="2359808026110333948">ಮುಂದುವರೆಸಿ</translation>
 <translation id="2367186422933365202">ನಿಮ್ಮ Chromebook ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ</translation>
 <translation id="2369165858548251131">ಚೈನಿಸ್ ಭಾಷೆಯಲ್ಲಿ "ನಮಸ್ಕಾರ"</translation>
+<translation id="2375445874393996153">Google Now ಮೂಲಕ ಆನ್-ಸ್ಕ್ರೀನ್ ವಿಷಯವನ್ನು ಹುಡುಕುವುದನ್ನು ಇನ್ನು ಮುಂದೆ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ.</translation>
 <translation id="2390318262976603432">ಸ್ಥಳೀಯ ಭಾಷೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="240006516586367791">ಮೀಡಿಯಾ ನಿಯಂತ್ರಣಗಳು</translation>
 <translation id="2402411679569069051">ನಿಮ್ಮ Chromebook ಅನ್‌ಲಾಕ್ ಮಾಡಲು, ನಿಮ್ಮ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಬಳಸಿ ಅಥವಾ ನಿಮ್ಮ ಫೋನ್ ಅನ್‌ಲಾಕ್ ಮಾಡಿ</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index f09b6b0..13cdfe37 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">계속</translation>
 <translation id="2367186422933365202">Chromebook에 로그인할 수 없음</translation>
 <translation id="2369165858548251131">중국어로 '안녕'</translation>
+<translation id="2375445874393996153">Google 어시스턴트로 화면에 표시된 내용을 검색하는 기능은 더 이상 지원되지 않습니다.</translation>
 <translation id="2390318262976603432">언어 설정</translation>
 <translation id="240006516586367791">미디어 컨트롤</translation>
 <translation id="2402411679569069051">Chromebook을 잠금 해제하려면 지문을 사용하거나 휴대전화를 잠금 해제하세요.</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb
index c36b5e8..6d1448c 100644
--- a/ash/strings/ash_strings_ky.xtb
+++ b/ash/strings/ash_strings_ky.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">Улантуу</translation>
 <translation id="2367186422933365202">Chromebook'ка кирген жоксуз</translation>
 <translation id="2369165858548251131">Кытайча "Салам"</translation>
+<translation id="2375445874393996153">Google Жардамчы менен экрандагыны издөө мындан ары колдоого алынбайт.</translation>
 <translation id="2390318262976603432">Тил жөндөөлөрү</translation>
 <translation id="240006516586367791">Медианы башкаруу элементтери</translation>
 <translation id="2402411679569069051">Chromebook'тун кулпусун ачуу үчүн манжаңыздын изин колдонуңуз же телефонуңуздун кулпусун ачыңыз</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb
index 54584c87..b8da89b9 100644
--- a/ash/strings/ash_strings_lo.xtb
+++ b/ash/strings/ash_strings_lo.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">ສືບຕໍ່</translation>
 <translation id="2367186422933365202">ບໍ່ສາມາດເຂົ້າສູ່ລະບົບຫາ Chromebook ຂອງທ່ານໄດ້</translation>
 <translation id="2369165858548251131">"ສະບາຍດີ" ເປັນພາສາຈີນ</translation>
+<translation id="2375445874393996153">ບໍ່ຮອງຮັບການຊອກຫາສິ່ງທີ່ຢູ່ໜ້າຈໍຂອງຂ້ອຍດ້ວຍ Google ຜູ້ຊ່ວຍອີກຕໍ່ໄປແລ້ວ.</translation>
 <translation id="2390318262976603432">ການຕັ້ງຄ່າສະຖານທີ່</translation>
 <translation id="240006516586367791">ການຄວບຄຸມມີເດຍ</translation>
 <translation id="2402411679569069051">ເພື່ອປົດລັອກ Chromebook ຂອງທ່ານ, ໃຫ້ໃຊ້ລາຍນິ້ວມືຂອງທ່ານ ຫຼື ປົດລັອກໂທລະສັບທ່ານ</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb
index 85efec8..6068db5 100644
--- a/ash/strings/ash_strings_lt.xtb
+++ b/ash/strings/ash_strings_lt.xtb
@@ -240,6 +240,7 @@
 <translation id="2359808026110333948">Tęskite</translation>
 <translation id="2367186422933365202">Nepavyksta prisijungti prie „Chromebook“</translation>
 <translation id="2369165858548251131">„Labas“ kinų kalba</translation>
+<translation id="2375445874393996153">Paieška savo ekrane naudojant „Google“ padėjėją nebepalaikoma.</translation>
 <translation id="2390318262976603432">Lokalės nustatymai</translation>
 <translation id="240006516586367791">Medijos valdikliai</translation>
 <translation id="2402411679569069051">Kad atrakintumėte „Chromebook“, naudokite kontrolinį kodą arba atrakinkite telefoną</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb
index 1bb0330..b1657871 100644
--- a/ash/strings/ash_strings_lv.xtb
+++ b/ash/strings/ash_strings_lv.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">Turpināt</translation>
 <translation id="2367186422933365202">Nevar pierakstīties Chromebook datorā.</translation>
 <translation id="2369165858548251131">“Sveiki!” ķīniešu valodā</translation>
+<translation id="2375445874393996153">Vairs netiek atbalstīta ekrānā redzamā satura meklēšana, izmantojot Google asistentu.</translation>
 <translation id="2390318262976603432">Lokalizācijas iestatījumi</translation>
 <translation id="240006516586367791">Multivides vadīklas</translation>
 <translation id="2402411679569069051">Lai atbloķētu Chromebook datoru, izmantojiet pirksta nospiedumu vai atbloķējiet tālruni.</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb
index 54dfa48..a6c9001 100644
--- a/ash/strings/ash_strings_mk.xtb
+++ b/ash/strings/ash_strings_mk.xtb
@@ -31,6 +31,7 @@
 <translation id="1150989369772528668">Календар</translation>
 <translation id="1153356358378277386">Спарени уреди</translation>
 <translation id="1165712434476988950">Потребно е да се рестартира уредот за да се примени ажурирањето.</translation>
+<translation id="1170753161936175256"><ph name="EVENT_SUMMARY" /> <ph name="TIME_RANGE" /></translation>
 <translation id="1171742223880403396">Кабелот USB-C не може да поврзува екрани правилно</translation>
 <translation id="1175572348579024023">Лизгај</translation>
 <translation id="1178581264944972037">Пауза</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb
index dec588d..ff389bc 100644
--- a/ash/strings/ash_strings_mr.xtb
+++ b/ash/strings/ash_strings_mr.xtb
@@ -31,6 +31,7 @@
 <translation id="1150989369772528668">कॅलेंडर</translation>
 <translation id="1153356358378277386">जोडलेली डिव्हाइस</translation>
 <translation id="1165712434476988950">अपडेट लागू करण्यासाठी डिव्हाइस रीस्टार्ट करणे आवश्यक आहे.</translation>
+<translation id="1170753161936175256"><ph name="EVENT_SUMMARY" />, <ph name="TIME_RANGE" /></translation>
 <translation id="1171742223880403396">तुमची USB-C केबल ही कदाचित डिस्प्लेना योग्यरीत्या कनेक्ट होणार नाही</translation>
 <translation id="1175572348579024023">स्क्रोल करा</translation>
 <translation id="1178581264944972037">विराम द्या</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb
index 1a8ed2f..cbf793cd 100644
--- a/ash/strings/ash_strings_nl.xtb
+++ b/ash/strings/ash_strings_nl.xtb
@@ -236,6 +236,7 @@
 <translation id="2359808026110333948">Doorgaan</translation>
 <translation id="2367186422933365202">Kan niet inloggen op je Chromebook</translation>
 <translation id="2369165858548251131">Chinees voor 'hallo'</translation>
+<translation id="2375445874393996153">Inhoud van mijn scherm doorzoeken met de Google Assistent wordt niet meer ondersteund.</translation>
 <translation id="2390318262976603432">Landinstellingen</translation>
 <translation id="240006516586367791">Mediabediening</translation>
 <translation id="2402411679569069051">Gebruik je vingerafdruk of ontgrendel je telefoon om je Chromebook te ontgrendelen</translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb
index 1cf9659..ae5d88c 100644
--- a/ash/strings/ash_strings_or.xtb
+++ b/ash/strings/ash_strings_or.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">ଜାରି ରଖନ୍ତୁ</translation>
 <translation id="2367186422933365202">ଆପଣଙ୍କ Chromebookରେ ସାଇନ୍ ଇନ୍ କରାଯାଇପାରିବ ନାହିଁ</translation>
 <translation id="2369165858548251131">ଚୀନୀୟ ଭାଷାରେ "ନମସ୍କାର"</translation>
+<translation id="2375445874393996153">ମୋ ସ୍କ୍ରିନରେ କଣ ଅଛି ତାହା Google Assistant ମାଧ୍ୟମରେ ଖୋଜିବା ଆଉ ସମର୍ଥିତ ନୁହେଁ।</translation>
 <translation id="2390318262976603432">ଲୋକେଲ୍ ସେଟିଂସ୍</translation>
 <translation id="240006516586367791">ମିଡିଆ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ</translation>
 <translation id="2402411679569069051">ଆପଣଙ୍କ Chromebookକୁ ଅନଲକ୍ କରିବା ପାଇଁ, ଆପଣଙ୍କ ଟିପଚିହ୍ନ ବ୍ୟବହାର କରନ୍ତୁ କିମ୍ବା ଆପଣଙ୍କ ଫୋନକୁ ଅନଲକ୍ କରନ୍ତୁ</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index 050b019..36f08bc0 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">Dalej</translation>
 <translation id="2367186422933365202">Nie mogę zalogować się na Chromebooku</translation>
 <translation id="2369165858548251131">„Cześć” po chińsku</translation>
+<translation id="2375445874393996153">Wyszukiwanie zawartości ekranu za pomocą Asystenta Google nie jest już obsługiwane.</translation>
 <translation id="2390318262976603432">Ustawienia języka</translation>
 <translation id="240006516586367791">Sterowanie multimediami</translation>
 <translation id="2402411679569069051">Aby odblokować Chromebooka, użyj odcisku palca lub odblokuj swój telefon</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb
index 263ad99..3268b5c 100644
--- a/ash/strings/ash_strings_pt-BR.xtb
+++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -31,6 +31,7 @@
 <translation id="1150989369772528668">Agenda</translation>
 <translation id="1153356358378277386">Dispositivos pareados</translation>
 <translation id="1165712434476988950">É necessário reiniciar o dispositivo para aplicar a atualização.</translation>
+<translation id="1170753161936175256"><ph name="EVENT_SUMMARY" />, <ph name="TIME_RANGE" /></translation>
 <translation id="1171742223880403396">Seu cabo USB-C pode não se conectar a telas corretamente</translation>
 <translation id="1175572348579024023">Rolar</translation>
 <translation id="1178581264944972037">Pausar</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb
index 0171ef9..3619163 100644
--- a/ash/strings/ash_strings_ro.xtb
+++ b/ash/strings/ash_strings_ro.xtb
@@ -31,6 +31,7 @@
 <translation id="1150989369772528668">Calendar</translation>
 <translation id="1153356358378277386">Dispozitive asociate</translation>
 <translation id="1165712434476988950">Pentru aplicarea actualizării este necesară repornirea dispozitivului.</translation>
+<translation id="1170753161936175256"><ph name="EVENT_SUMMARY" /> <ph name="TIME_RANGE" /></translation>
 <translation id="1171742223880403396">Cablul USB-C poate să nu se conecteze corespunzător la ecrane</translation>
 <translation id="1175572348579024023">Derulează</translation>
 <translation id="1178581264944972037">Întrerupe</translation>
@@ -239,6 +240,7 @@
 <translation id="2359808026110333948">Continuă</translation>
 <translation id="2367186422933365202">Nu te poți conecta la Chromebook</translation>
 <translation id="2369165858548251131">„Bună” în chineză</translation>
+<translation id="2375445874393996153">Nu se mai acceptă căutarea conținutului de pe ecran cu Asistentul Google.</translation>
 <translation id="2390318262976603432">Setări de limbă</translation>
 <translation id="240006516586367791">Comenzi media</translation>
 <translation id="2402411679569069051">Pentru a debloca Chromebookul, folosește amprenta sau deblochează telefonul</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index 3bcc5b1e..3fa62f6 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">Продолжить</translation>
 <translation id="2367186422933365202">Не удалось войти в аккаунт на устройстве Chromebook.</translation>
 <translation id="2369165858548251131">"Привет" по-китайски</translation>
+<translation id="2375445874393996153">Google Ассистент больше не поддерживает поиск контента на экране.</translation>
 <translation id="2390318262976603432">Региональные настройки</translation>
 <translation id="240006516586367791">Управление медиаконтентом</translation>
 <translation id="2402411679569069051">Чтобы разблокировать Chromebook, используйте отпечаток пальца или разблокируйте телефон.</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb
index 6463da0..68aecce9 100644
--- a/ash/strings/ash_strings_si.xtb
+++ b/ash/strings/ash_strings_si.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">කරගෙන යන්න</translation>
 <translation id="2367186422933365202">ඔබගේ Chromebook වෙත පිරීමට නොහැකිය</translation>
 <translation id="2369165858548251131">චීන භාෂාවෙන් "Hello"</translation>
+<translation id="2375445874393996153">Google සහායක සමඟ මගේ තිරයේ ඇති දේ සෙවීම තවදුරටත් සහාය නොදක්වයි.</translation>
 <translation id="2390318262976603432">පෙදෙසි සැකසීම්</translation>
 <translation id="240006516586367791">මාධ්‍ය පාලන</translation>
 <translation id="2402411679569069051">ඔබගේ Chromebook අගුලු හැරීමට, ඔබගේ ඇඟිලි සලකුණ භාවිත කරන්න හෝ ඔබගේ දුරකථනය අගුලු හරින්න</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb
index 41c79ce..ebb4ba4 100644
--- a/ash/strings/ash_strings_sk.xtb
+++ b/ash/strings/ash_strings_sk.xtb
@@ -31,6 +31,7 @@
 <translation id="1150989369772528668">Kalendár</translation>
 <translation id="1153356358378277386">Spárované zariadenia</translation>
 <translation id="1165712434476988950">Uplatnenie aktualizácie vyžaduje reštartovanie zariadenia.</translation>
+<translation id="1170753161936175256"><ph name="EVENT_SUMMARY" />, <ph name="TIME_RANGE" /></translation>
 <translation id="1171742223880403396">Kábel USB‑C sa možno nedá správne pripojiť k obrazovkám</translation>
 <translation id="1175572348579024023">Posúvanie</translation>
 <translation id="1178581264944972037">Pozastaviť</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb
index b849a19..14054a7 100644
--- a/ash/strings/ash_strings_sl.xtb
+++ b/ash/strings/ash_strings_sl.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">Naprej</translation>
 <translation id="2367186422933365202">Prijava v Chromebook ni mogoča.</translation>
 <translation id="2369165858548251131">»Živijo« po kitajsko</translation>
+<translation id="2375445874393996153">Iskanje vsebine zaslona s Pomočnikom Google ni več podprto.</translation>
 <translation id="2390318262976603432">Nastavitve jezika</translation>
 <translation id="240006516586367791">Kontrolniki predstavnosti</translation>
 <translation id="2402411679569069051">Če želite odkleniti Chromebook, uporabite prstni odtis ali odklenite telefon.</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index 2b6b98b..f98beff8 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -239,6 +239,7 @@
 <translation id="2359808026110333948">தொடர்க</translation>
 <translation id="2367186422933365202">Chromebookகில் உள்நுழைய முடியவில்லை</translation>
 <translation id="2369165858548251131">சீன மொழியில் "ஹலோ"</translation>
+<translation id="2375445874393996153">திரையில் இருப்பவற்றை Google Assistant மூலம் தேடுவது இனி ஆதரிக்கப்படாது.</translation>
 <translation id="2390318262976603432">மொழி அமைப்புகள்</translation>
 <translation id="240006516586367791">மீடியா கட்டுப்பாடுகள்</translation>
 <translation id="2402411679569069051">Chromebookகை அன்லாக் செய்ய, உங்கள் கைரேகையைப் பயன்படுத்தவும் அல்லது மொபைலை அன்லாக் செய்யவும்</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 266e5438..daea28a 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -31,6 +31,7 @@
 <translation id="1150989369772528668">ปฏิทิน</translation>
 <translation id="1153356358378277386">อุปกรณ์ที่จับคู่</translation>
 <translation id="1165712434476988950">ต้องรีสตาร์ทอุปกรณ์เพื่อใช้การอัปเดต</translation>
+<translation id="1170753161936175256"><ph name="EVENT_SUMMARY" /> <ph name="TIME_RANGE" /></translation>
 <translation id="1171742223880403396">สาย USB-C อาจเชื่อมต่อกับจอแสดงผลอย่างไม่ถูกต้อง</translation>
 <translation id="1175572348579024023">เลื่อน</translation>
 <translation id="1178581264944972037">หยุดชั่วคราว</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb
index ccfd0e0..89ffba1d 100644
--- a/ash/strings/ash_strings_ur.xtb
+++ b/ash/strings/ash_strings_ur.xtb
@@ -31,6 +31,7 @@
 <translation id="1150989369772528668">کیلنڈر</translation>
 <translation id="1153356358378277386">جوڑا بنائے ہوئے آلات</translation>
 <translation id="1165712434476988950">اپ ڈیٹ لاگو کرنے کیلئے آلے کو ری سٹارٹ کرنا درکار ہے۔</translation>
+<translation id="1170753161936175256"><ph name="EVENT_SUMMARY" />، <ph name="TIME_RANGE" /></translation>
 <translation id="1171742223880403396">‏ہو سکتا ہے کہ آپ کی USB-C کیبل مناسب طریقے سے ڈسپلیز سے منسلک نہ ہو</translation>
 <translation id="1175572348579024023">اسکرول کریں</translation>
 <translation id="1178581264944972037">موقوف کریں</translation>
@@ -239,6 +240,7 @@
 <translation id="2359808026110333948">جاری رکھیں</translation>
 <translation id="2367186422933365202">‏اپنے Chromebook میں سائن ان نہیں کر سکتے</translation>
 <translation id="2369165858548251131">چینی میں "ہیلو"</translation>
+<translation id="2375445874393996153">‏میری اسکرین پر موجود چیزوں کو Google اسسٹنٹ کے ساتھ تلاش کرنے کی خصوصیت اب مزید تعاون یافتہ نہیں ہے۔</translation>
 <translation id="2390318262976603432">مقامی ترتیبات</translation>
 <translation id="240006516586367791">میڈیا کنٹرولز</translation>
 <translation id="2402411679569069051">‏اپنے Chromebook کو غیر مقفل کرنے کیلئے، اپنے فنگر پرنٹ کا استعمال کریں یا اپنے فون کو غیر مقفل کریں</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb
index 2e15893..a29231e9 100644
--- a/ash/strings/ash_strings_zh-HK.xtb
+++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -239,7 +239,7 @@
 <translation id="2359808026110333948">繼續</translation>
 <translation id="2367186422933365202">無法登入 Chromebook</translation>
 <translation id="2369165858548251131">「你好」嘅英文</translation>
-<translation id="2375445874393996153">系統已不再支援透過 Google 助理搜尋螢幕上的顯示內容。</translation>
+<translation id="2375445874393996153">系統不再支援透過「Google 助理」搜尋螢幕上的顯示內容。</translation>
 <translation id="2390318262976603432">語言代碼設定</translation>
 <translation id="240006516586367791">媒體控制項</translation>
 <translation id="2402411679569069051">如要解鎖 Chromebook,請使用指紋或解鎖手機</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb
index bbb6373..2aae9df 100644
--- a/ash/strings/ash_strings_zu.xtb
+++ b/ash/strings/ash_strings_zu.xtb
@@ -31,6 +31,7 @@
 <translation id="1150989369772528668">Ikhalenda</translation>
 <translation id="1153356358378277386">Amadivaysi abhanqene</translation>
 <translation id="1165712434476988950">Ukuqala kabusha idivayisi kudingekile ukuze usebenzise isibuyekezo.</translation>
+<translation id="1170753161936175256"><ph name="EVENT_SUMMARY" />, <ph name="TIME_RANGE" /></translation>
 <translation id="1171742223880403396">Ikhebuli lakho le-USB-C lingase lingaxhumi kahle kwizibonisi</translation>
 <translation id="1175572348579024023">Skrola</translation>
 <translation id="1178581264944972037">Misa isikhashana</translation>
@@ -239,6 +240,7 @@
 <translation id="2359808026110333948">Qhubeka</translation>
 <translation id="2367186422933365202">Ayikwazi ukungena ngemvume ku-Chromebook yakho</translation>
 <translation id="2369165858548251131">"Sawubona" ngesi-Chinese</translation>
+<translation id="2375445874393996153">Ukusesha okusesikrinini sami nge-Google Assistant akusasekelwa.</translation>
 <translation id="2390318262976603432">Izilungiselelo Zesifunda</translation>
 <translation id="240006516586367791">Izilawuli zemidiya</translation>
 <translation id="2402411679569069051">Ukuze uvule i-Chromebook yakho, sebenzisa isigxivizo somunwe wakho noma uvule ifoni yakho</translation>
diff --git a/ash/system/phonehub/phone_connected_view.cc b/ash/system/phonehub/phone_connected_view.cc
index b10f88e3..08fa905 100644
--- a/ash/system/phonehub/phone_connected_view.cc
+++ b/ash/system/phonehub/phone_connected_view.cc
@@ -31,6 +31,19 @@
 
 namespace ash {
 
+namespace {
+
+constexpr auto kDarkLightModeEnabledPadding =
+    gfx::Insets::TLBR(0,
+                      kBubbleHorizontalSidePaddingDip,
+                      16,
+                      kBubbleHorizontalSidePaddingDip);
+
+constexpr auto kDarkLightModeDisabledPadding =
+    gfx::Insets::VH(0, kBubbleHorizontalSidePaddingDip);
+
+}  // namespace
+
 PhoneConnectedView::PhoneConnectedView(
     phonehub::PhoneHubManager* phone_hub_manager) {
   SetID(PhoneHubViewID::kPhoneConnectedView);
@@ -42,7 +55,9 @@
 
   auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>(
       views::BoxLayout::Orientation::kVertical,
-      gfx::Insets::VH(0, kBubbleHorizontalSidePaddingDip)));
+      features::IsDarkLightModeEnabled() ? kDarkLightModeEnabledPadding
+                                         : kDarkLightModeDisabledPadding));
+
   layout->SetDefaultFlex(1);
 
   AddChildView(std::make_unique<MultideviceFeatureOptInView>(
diff --git a/ash/system/time/calendar_event_list_view.cc b/ash/system/time/calendar_event_list_view.cc
index d11aab4..e271971f 100644
--- a/ash/system/time/calendar_event_list_view.cc
+++ b/ash/system/time/calendar_event_list_view.cc
@@ -11,6 +11,7 @@
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/ash_color_provider.h"
 #include "ash/style/icon_button.h"
+#include "ash/style/pill_button.h"
 #include "ash/system/model/system_tray_model.h"
 #include "ash/system/time/calendar_utils.h"
 #include "ash/system/time/calendar_view_controller.h"
@@ -46,26 +47,30 @@
 // The insets for `CalendarEmptyEventListView`.
 constexpr auto kOpenGoogleCalendarContainerInsets = gfx::Insets::VH(20, 60);
 
+// Border thickness for `CalendarEmptyEventListView`.
+constexpr int kOpenGoogleCalendarBorderThickness = 1;
+
 }  // namespace
 
 // A view that's displayed when the user selects a day cell from the calendar
-// month view that has no events.  Clicking on it opens Google calendar.
-class CalendarEmptyEventListView : public views::LabelButton {
+// month view that has no events. Clicking on it opens Google calendar.
+class CalendarEmptyEventListView : public PillButton {
  public:
   explicit CalendarEmptyEventListView(CalendarViewController* controller)
-      : views::LabelButton(
-            views::Button::PressedCallback(base::BindRepeating(
-                &CalendarEmptyEventListView::OpenCalendarDefault,
-                base::Unretained(this))),
-            l10n_util::GetStringUTF16(IDS_ASH_CALENDAR_NO_EVENTS)),
+      : PillButton(views::Button::PressedCallback(base::BindRepeating(
+                       &CalendarEmptyEventListView::OpenCalendarDefault,
+                       base::Unretained(this))),
+                   l10n_util::GetStringUTF16(IDS_ASH_CALENDAR_NO_EVENTS),
+                   PillButton::Type::kIconlessFloating,
+                   /*icon=*/nullptr),
         controller_(controller) {
     SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_CENTER);
     label()->SetBorder(views::CreateEmptyBorder(kOpenGoogleCalendarInsets));
     label()->SetTextContext(CONTEXT_CALENDAR_DATE);
-    SetBorder(std::make_unique<views::HighlightBorder>(
-        GetPreferredSize().height() / 2,
-        views::HighlightBorder::Type::kHighlightBorder1,
-        /*use_light_colors=*/!features::IsDarkLightModeEnabled()));
+    SetBorder(views::CreateRoundedRectBorder(
+        kOpenGoogleCalendarBorderThickness, GetPreferredSize().height() / 2,
+        AshColorProvider::Get()->GetControlsLayerColor(
+            ColorProvider::ControlsLayerType::kHairlineBorderColor)));
     SetTooltipText(
         l10n_util::GetStringUTF16(IDS_ASH_CALENDAR_NO_EVENT_BUTTON_TOOL_TIP));
   }
@@ -74,15 +79,6 @@
       const CalendarEmptyEventListView& other) = delete;
   ~CalendarEmptyEventListView() override = default;
 
-  // views::View:
-  void OnThemeChanged() override {
-    views::View::OnThemeChanged();
-    SetEnabledTextColors(calendar_utils::GetPrimaryTextColor());
-    views::FocusRing::Get(this)->SetColor(
-        ColorProvider::Get()->GetControlsLayerColor(
-            ColorProvider::ControlsLayerType::kFocusRingColor));
-  }
-
   // Callback that's invoked when the user clicks on "Open in Google calendar"
   // in an empty event list.
   void OpenCalendarDefault() {
diff --git a/ash/webui/os_feedback_ui/backend/feedback_service_provider.cc b/ash/webui/os_feedback_ui/backend/feedback_service_provider.cc
index f525c5cb..97333feb 100644
--- a/ash/webui/os_feedback_ui/backend/feedback_service_provider.cc
+++ b/ash/webui/os_feedback_ui/backend/feedback_service_provider.cc
@@ -46,6 +46,12 @@
   feedback_delegate_->SendReport(std::move(report), std::move(callback));
 }
 
+void FeedbackServiceProvider::OpenDiagnosticsApp(
+    OpenDiagnosticsAppCallback callback) {
+  feedback_delegate_->OpenDiagnosticsApp();
+  std::move(callback).Run();
+}
+
 void FeedbackServiceProvider::BindInterface(
     mojo::PendingReceiver<os_feedback_ui::mojom::FeedbackServiceProvider>
         receiver) {
diff --git a/ash/webui/os_feedback_ui/backend/feedback_service_provider.h b/ash/webui/os_feedback_ui/backend/feedback_service_provider.h
index c025bd89..22a5ce41 100644
--- a/ash/webui/os_feedback_ui/backend/feedback_service_provider.h
+++ b/ash/webui/os_feedback_ui/backend/feedback_service_provider.h
@@ -32,6 +32,7 @@
   void GetScreenshotPng(GetScreenshotPngCallback callback) override;
   void SendReport(os_feedback_ui::mojom::ReportPtr report,
                   SendReportCallback callback) override;
+  void OpenDiagnosticsApp(OpenDiagnosticsAppCallback callback) override;
 
   void BindInterface(
       mojo::PendingReceiver<os_feedback_ui::mojom::FeedbackServiceProvider>
diff --git a/ash/webui/os_feedback_ui/backend/feedback_service_provider_unittest.cc b/ash/webui/os_feedback_ui/backend/feedback_service_provider_unittest.cc
index df857f1..8ca760a 100644
--- a/ash/webui/os_feedback_ui/backend/feedback_service_provider_unittest.cc
+++ b/ash/webui/os_feedback_ui/backend/feedback_service_provider_unittest.cc
@@ -57,6 +57,8 @@
                   SendReportCallback callback) override {
     std::move(callback).Run(SendReportStatus::kSuccess);
   }
+
+  void OpenDiagnosticsApp() override {}
 };
 
 class FeedbackServiceProviderTest : public testing::Test {
diff --git a/ash/webui/os_feedback_ui/backend/os_feedback_delegate.h b/ash/webui/os_feedback_ui/backend/os_feedback_delegate.h
index 8bf5e0c7..9399b052 100644
--- a/ash/webui/os_feedback_ui/backend/os_feedback_delegate.h
+++ b/ash/webui/os_feedback_ui/backend/os_feedback_delegate.h
@@ -39,6 +39,8 @@
   // Collect data and send the report to Google.
   virtual void SendReport(os_feedback_ui::mojom::ReportPtr report,
                           SendReportCallback callback) = 0;
+  // Open Diagnostics app.
+  virtual void OpenDiagnosticsApp() = 0;
 };
 
 }  // namespace ash
diff --git a/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom b/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom
index cba6698..5e4fff65 100644
--- a/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom
+++ b/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom
@@ -127,4 +127,6 @@
   GetScreenshotPng() => (array<uint8> png_data);
   // Sends a feedback report and returns its status.
   SendReport(Report report) => (SendReportStatus status);
+  // Open Diagnostics app.
+  OpenDiagnosticsApp() => ();
 };
diff --git a/ash/webui/os_feedback_ui/resources/BUILD.gn b/ash/webui/os_feedback_ui/resources/BUILD.gn
index ecd0b8a3..fdd9da9 100644
--- a/ash/webui/os_feedback_ui/resources/BUILD.gn
+++ b/ash/webui/os_feedback_ui/resources/BUILD.gn
@@ -140,6 +140,8 @@
     ":feedback_types",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
   ]
+  externs_list =
+      [ "//ui/webui/resources/cr_elements/cr_toast/cr_toast_externs.js" ]
 }
 
 js_library("help_resources_icons") {
diff --git a/ash/webui/os_feedback_ui/resources/confirmation_page.html b/ash/webui/os_feedback_ui/resources/confirmation_page.html
index 47a7861..cf8e59d 100644
--- a/ash/webui/os_feedback_ui/resources/confirmation_page.html
+++ b/ash/webui/os_feedback_ui/resources/confirmation_page.html
@@ -26,7 +26,8 @@
       </cr-link-row>
       <cr-link-row id="diagnostics" start-icon="help-resources:diagnostics"
           label="Diagnostics app" external
-          sub-label="Run tests and troubleshooting for hardware issues">
+          sub-label="Run tests and troubleshooting for hardware issues"
+          on-click="handleLinkClicked_">
       </cr-link-row>
       <cr-link-row id="chromebookCommunity"
           start-icon="help-resources2:chromebook-community"
diff --git a/ash/webui/os_feedback_ui/resources/confirmation_page.js b/ash/webui/os_feedback_ui/resources/confirmation_page.js
index c24b73b..d4f6ba3 100644
--- a/ash/webui/os_feedback_ui/resources/confirmation_page.js
+++ b/ash/webui/os_feedback_ui/resources/confirmation_page.js
@@ -11,7 +11,8 @@
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {FeedbackFlowState} from './feedback_flow.js';
-import {SendReportStatus} from './feedback_types.js';
+import {FeedbackServiceProviderInterface, SendReportStatus} from './feedback_types.js';
+import {getFeedbackServiceProvider} from './mojo_interface_provider.js';
 
 /**
  * @fileoverview
@@ -40,6 +41,9 @@
      * @type {?SendReportStatus}
      */
     this.sendReportStatus;
+
+    /** @private {!FeedbackServiceProviderInterface} */
+    this.feedbackServiceProvider_ = getFeedbackServiceProvider();
   }
 
   /**
@@ -100,6 +104,23 @@
   handleDoneButtonClicked_() {
     window.close();
   }
+
+  /**
+   * Open links, including SWA app link and web link.
+   * @param {!Event} e
+   * @protected
+   */
+  handleLinkClicked_(e) {
+    e.stopPropagation();
+
+    switch (e.target.id) {
+      case 'diagnostics':
+        this.feedbackServiceProvider_.openDiagnosticsApp();
+        break;
+      default:
+        console.warn('unexpected caller id: ', e.target.id);
+    }
+  }
 }
 
 customElements.define(ConfirmationPageElement.is, ConfirmationPageElement);
diff --git a/ash/webui/os_feedback_ui/resources/fake_feedback_service_provider.js b/ash/webui/os_feedback_ui/resources/fake_feedback_service_provider.js
index 37adf1d..1f56b6b3 100644
--- a/ash/webui/os_feedback_ui/resources/fake_feedback_service_provider.js
+++ b/ash/webui/os_feedback_ui/resources/fake_feedback_service_provider.js
@@ -20,6 +20,7 @@
     this.methods_.register('getFeedbackContext');
     this.methods_.register('getScreenshotPng');
     this.methods_.register('sendReport');
+    this.methods_.register('openDiagnosticsApp');
     // Let sendReport return success by default.
     this.methods_.setResult('sendReport', {status: SendReportStatus.kSuccess});
     // Let getScreenshotPng return an empty array by default.
@@ -36,6 +37,8 @@
       getScreenshotPng: 0,
       /** @type {number} */
       sendReport: 0,
+      /** @type {number} */
+      openDiagnosticsApp: 0,
     };
   }
 
@@ -115,4 +118,19 @@
   setFakeScreenshotPng(data) {
     this.methods_.setResult('getScreenshotPng', {pngData: data});
   }
+
+  /**
+   * @return {number}
+   */
+  getOpenDiagnosticsAppCallCount() {
+    return this.callCounts_.openDiagnosticsApp;
+  }
+
+  /**
+   * @return {!Promise<void>}
+   */
+  openDiagnosticsApp() {
+    this.callCounts_.openDiagnosticsApp++;
+    return this.methods_.resolveMethod('openDiagnosticsApp');
+  }
 }
diff --git a/ash/webui/os_feedback_ui/resources/file_attachment.html b/ash/webui/os_feedback_ui/resources/file_attachment.html
index 6a02729..b713904 100644
--- a/ash/webui/os_feedback_ui/resources/file_attachment.html
+++ b/ash/webui/os_feedback_ui/resources/file_attachment.html
@@ -14,6 +14,11 @@
     cursor: pointer;
   }
 
+  .error-outline {
+    --iron-icon-fill-color: var(--cros-icon-color-alert);
+    margin-inline-end: 12px;
+  }
+
   #addFileContainer,
   #replaceFileContainer {
     width: 248px;
@@ -47,3 +52,8 @@
     </label>
   </div>
 </div>
+<cr-toast id="fileTooBigErrorMessage" duration="5000">
+  <iron-icon id="toastInfoIcon" class="error-outline" icon="cr:error-outline">
+  </iron-icon>
+  <span>Can't upload file larger than 10 MB</span>
+</cr-toast>
diff --git a/ash/webui/os_feedback_ui/resources/file_attachment.js b/ash/webui/os_feedback_ui/resources/file_attachment.js
index 081c4e4..14208177b 100644
--- a/ash/webui/os_feedback_ui/resources/file_attachment.js
+++ b/ash/webui/os_feedback_ui/resources/file_attachment.js
@@ -4,6 +4,8 @@
 
 import './help_resources_icons.js';
 import './os_feedback_shared_css.js';
+import 'chrome://resources/cr_elements/cr_toast/cr_toast.js';
+import 'chrome://resources/cr_elements/icons.m.js';
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 
 import {stringToMojoString16} from 'chrome://resources/ash/common/mojo_utils.js';
@@ -123,7 +125,12 @@
    * @private
    */
   handleSelectedFileHelper_(file) {
-    // TODO(http://b/233398494): Handle it when file size exceeds the limit.
+    // Maximum file size is 10MB.
+    const MAX_ATTACH_FILE_SIZE_BYTES = 10 * 1024 * 1024;
+    if (file.size > MAX_ATTACH_FILE_SIZE_BYTES) {
+      this.getElement_('#fileTooBigErrorMessage').show();
+      return;
+    }
     this.selectedFile_ = file;
     this.getElement_('#selectedFileName').textContent = file.name;
     this.getElement_('#selectFileCheckbox').checked = true;
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/album_list_element.html b/ash/webui/personalization_app/resources/trusted/ambient/album_list_element.html
index a355e3f..56ff089 100644
--- a/ash/webui/personalization_app/resources/trusted/ambient/album_list_element.html
+++ b/ash/webui/personalization_app/resources/trusted/ambient/album_list_element.html
@@ -9,10 +9,14 @@
   }
 </style>
 
-<iron-list id="grid" items="[[albums]]" as="album" grid>
+<iron-list id="grid" items="[[albums]]" as="album" grid role="listbox"
+    aria-setsize$="[[albums.length]]">
   <template>
     <wallpaper-grid-item
       aria-label$="[[album.title]]"
+      aria-posinset$="[[getAriaIndex_(index)]]"
+      aria-selected$="[[getAriaSelected_(album, albums)]]"
+      role="option"
       class$="[[getAlbumItemClass_(album, albums)]]"
       image-src="[[album.url.url]]"
       on-click="onAlbumSelected_"
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/album_list_element.ts b/ash/webui/personalization_app/resources/trusted/ambient/album_list_element.ts
index 9f975da1..afc7bfe5 100644
--- a/ash/webui/personalization_app/resources/trusted/ambient/album_list_element.ts
+++ b/ash/webui/personalization_app/resources/trusted/ambient/album_list_element.ts
@@ -79,6 +79,12 @@
     return !!album && album.checked;
   }
 
+  private getAriaSelected_(
+      changedAlbum: AmbientModeAlbum|null,
+      albums: AmbientModeAlbum[]|null): string {
+    return this.isAlbumSelected_(changedAlbum, albums).toString();
+  }
+
   private getAlbumItemClass_(
       album: AmbientModeAlbum|null, albums: AmbientModeAlbum[]|null): string {
     return album && this.isAlbumSelected_(album, albums) ?
@@ -103,6 +109,10 @@
     }
     return '';
   }
+
+  private getAriaIndex_(index: number): number {
+    return index + 1;
+  }
 }
 
 customElements.define(AlbumList.is, AlbumList);
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/animation_theme_item_element.html b/ash/webui/personalization_app/resources/trusted/ambient/animation_theme_item_element.html
index 162b307..54c6358 100644
--- a/ash/webui/personalization_app/resources/trusted/ambient/animation_theme_item_element.html
+++ b/ash/webui/personalization_app/resources/trusted/ambient/animation_theme_item_element.html
@@ -32,7 +32,7 @@
     outline: 2px solid var(--cros-focus-ring-color);
   }
 
-  :host([aria-selected='true']) .item {
+  :host([aria-checked='true']) .item {
     background-color: rgba(
       var(--cros-color-prominent-rgb),
       var(--personalization-app-second-tone-opacity));
@@ -47,7 +47,7 @@
     width: 100%;
   }
 
-  :host([aria-selected='true']) .item img {
+  :host([aria-checked='true']) .item img {
     animation-duration:  200ms;
     animation-fill-mode: forwards;
     animation-name: img-resize;
@@ -80,7 +80,7 @@
     top: 8px;
   }
 
-  :host(:not([aria-selected='true'])) .item iron-icon {
+  :host(:not([aria-checked='true'])) .item iron-icon {
     display: none;
   }
 
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/animation_theme_list_element.html b/ash/webui/personalization_app/resources/trusted/ambient/animation_theme_list_element.html
index 307f462..022990f 100644
--- a/ash/webui/personalization_app/resources/trusted/ambient/animation_theme_list_element.html
+++ b/ash/webui/personalization_app/resources/trusted/ambient/animation_theme_list_element.html
@@ -6,16 +6,16 @@
   }
 </style>
 
-<h3 id="animationThemeDescription" class="ambient-subpage-element-title"
-    aria-hidden="true">
+<h3 id="animationThemeDescription" class="ambient-subpage-element-title">
   $i18n{ambientModeAnimationTitle}
 </h3>
 <iron-list items="[[animationThemes]]" as="theme" grid
-    role="listbox" aria-describedby="animationThemeDescription">
+    role="radiogroup" aria-describedby="animationThemeDescription">
   <template>
     <animation-theme-item tabindex$="[[tabIndex]]"
-        animation-theme="[[theme]]" role="option"
-        aria-selected$="[[getAriaSelected_(theme, selectedAnimationTheme)]]">
+        role="radio"
+        animation-theme="[[theme]]"
+        aria-checked$="[[getAriaChecked_(theme, selectedAnimationTheme)]]">
       </animation-theme-item>
   </template>
 </iron-list>
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/animation_theme_list_element.ts b/ash/webui/personalization_app/resources/trusted/ambient/animation_theme_list_element.ts
index a78ab87..1d71e0e 100644
--- a/ash/webui/personalization_app/resources/trusted/ambient/animation_theme_list_element.ts
+++ b/ash/webui/personalization_app/resources/trusted/ambient/animation_theme_list_element.ts
@@ -39,7 +39,7 @@
   animationThemes: Array<AnimationTheme>;
   private selectedAnimationTheme: AnimationTheme;
 
-  private getAriaSelected_(
+  private getAriaChecked_(
       animationTheme: AnimationTheme,
       selectedAnimationTheme: AnimationTheme): string {
     return (animationTheme === selectedAnimationTheme).toString();
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/topic_source_item_element.ts b/ash/webui/personalization_app/resources/trusted/ambient/topic_source_item_element.ts
index b72afe3..e83a4b4 100644
--- a/ash/webui/personalization_app/resources/trusted/ambient/topic_source_item_element.ts
+++ b/ash/webui/personalization_app/resources/trusted/ambient/topic_source_item_element.ts
@@ -41,6 +41,7 @@
         type: Boolean,
         value: false,
         reflectToAttribute: true,
+        observer: 'onCheckedChanged_',
       },
 
       topicSource: TopicSource,
@@ -70,6 +71,10 @@
     this.addEventListener('keydown', this.onItemSelected_.bind(this));
   }
 
+  private onCheckedChanged_(value: boolean) {
+    this.setAttribute('aria-checked', value.toString());
+  }
+
   private onItemSelected_(event: Event) {
     if (!isSelectionEvent(event)) {
       return;
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/topic_source_list_element.html b/ash/webui/personalization_app/resources/trusted/ambient/topic_source_list_element.html
index 59922d91..2a66713 100644
--- a/ash/webui/personalization_app/resources/trusted/ambient/topic_source_list_element.html
+++ b/ash/webui/personalization_app/resources/trusted/ambient/topic_source_list_element.html
@@ -13,13 +13,15 @@
   }
 </style>
 
-<h3 class="ambient-subpage-element-title" aria-hidden="true">
+<h3 id="topicSourceTitle" class="ambient-subpage-element-title">
   $i18n{ambientModeTopicSourceTitle}
 </h3>
 
-<iron-list id="topicSourceList" items="[[topicSources]]">
+<iron-list id="topicSourceList" items="[[topicSources]]"
+    aria-describedby="topicSourceTitle" role="radiogroup">
   <template>
     <topic-source-item topic-source="[[item]]"
+        role="radio"
         tabindex$="[[tabIndex]]"
         has-google-photos-albums="[[hasGooglePhotosAlbums]]"
         checked="[[isSelected_(item, selectedTopicSource)]]">
diff --git a/base/android/native_uma_recorder.cc b/base/android/native_uma_recorder.cc
index 1590c9a9..35cebe3fe 100644
--- a/base/android/native_uma_recorder.cc
+++ b/base/android/native_uma_recorder.cc
@@ -5,6 +5,7 @@
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
 #include "base/base_jni_headers/NativeUmaRecorder_jni.h"
+#include "base/format_macros.h"
 #include "base/lazy_instance.h"
 #include "base/metrics/histogram.h"
 #include "base/metrics/histogram_base.h"
@@ -36,7 +37,7 @@
       case BOOLEAN_HISTOGRAM:
       case CUSTOM_HISTOGRAM: {
         Histogram* hist = static_cast<Histogram*>(histogram);
-        params_str += StringPrintf("/%d/%d/%d", hist->declared_min(),
+        params_str += StringPrintf("/%d/%d/%" PRIuS, hist->declared_min(),
                                    hist->declared_max(), hist->bucket_count());
         break;
       }
@@ -51,7 +52,7 @@
                           jstring j_histogram_name,
                           int32_t expected_min,
                           int32_t expected_max,
-                          uint32_t expected_bucket_count,
+                          size_t expected_bucket_count,
                           HistogramBase* histogram) {
     std::string histogram_name = ConvertJavaStringToUTF8(env, j_histogram_name);
     bool valid_arguments = Histogram::InspectConstructionArguments(
@@ -87,7 +88,7 @@
     DCHECK(j_histogram_name);
     int32_t min = static_cast<int32_t>(j_min);
     int32_t max = static_cast<int32_t>(j_max);
-    int32_t num_buckets = static_cast<int32_t>(j_num_buckets);
+    size_t num_buckets = static_cast<size_t>(j_num_buckets);
     HistogramBase* histogram = HistogramFromHint(j_histogram_hint);
     if (histogram) {
       CheckHistogramArgs(env, j_histogram_name, min, max, num_buckets,
@@ -112,7 +113,7 @@
     DCHECK(j_histogram_name);
     int32_t min = static_cast<int32_t>(j_min);
     int32_t max = static_cast<int32_t>(j_max);
-    int32_t num_buckets = static_cast<int32_t>(j_num_buckets);
+    size_t num_buckets = static_cast<size_t>(j_num_buckets);
     HistogramBase* histogram = HistogramFromHint(j_histogram_hint);
     if (histogram) {
       CheckHistogramArgs(env, j_histogram_name, min, max, num_buckets,
diff --git a/base/metrics/dummy_histogram.cc b/base/metrics/dummy_histogram.cc
index bb73787..afbdc2d 100644
--- a/base/metrics/dummy_histogram.cc
+++ b/base/metrics/dummy_histogram.cc
@@ -77,7 +77,7 @@
 bool DummyHistogram::HasConstructionArguments(
     Sample expected_minimum,
     Sample expected_maximum,
-    uint32_t expected_bucket_count) const {
+    size_t expected_bucket_count) const {
   return true;
 }
 
diff --git a/base/metrics/dummy_histogram.h b/base/metrics/dummy_histogram.h
index 77c70f089..7696832 100644
--- a/base/metrics/dummy_histogram.h
+++ b/base/metrics/dummy_histogram.h
@@ -32,7 +32,7 @@
   HistogramType GetHistogramType() const override;
   bool HasConstructionArguments(Sample expected_minimum,
                                 Sample expected_maximum,
-                                uint32_t expected_bucket_count) const override;
+                                size_t expected_bucket_count) const override;
   void Add(Sample value) override {}
   void AddCount(Sample value, int count) override {}
   void AddSamples(const HistogramSamples& samples) override {}
diff --git a/base/metrics/field_trial.cc b/base/metrics/field_trial.cc
index e1e3774..40acb59 100644
--- a/base/metrics/field_trial.cc
+++ b/base/metrics/field_trial.cc
@@ -257,7 +257,7 @@
   const char* src =
       reinterpret_cast<const char*>(this) + sizeof(FieldTrialEntry);
 
-  Pickle pickle(src, pickle_size);
+  Pickle pickle(src, checked_cast<size_t>(pickle_size));
   return PickleIterator(pickle);
 }
 
@@ -1002,7 +1002,8 @@
 
   size_t allocated_size =
       global_->field_trial_allocator_->GetAllocSize(field_trial->ref_);
-  size_t actual_size = sizeof(FieldTrial::FieldTrialEntry) + entry->pickle_size;
+  uint64_t actual_size =
+      sizeof(FieldTrial::FieldTrialEntry) + entry->pickle_size;
   if (allocated_size < actual_size)
     return false;
 
diff --git a/base/metrics/field_trial.h b/base/metrics/field_trial.h
index 7895924..b69ee49 100644
--- a/base/metrics/field_trial.h
+++ b/base/metrics/field_trial.h
@@ -139,10 +139,10 @@
   // base::Pickle object that we unpickle and read from.
   struct BASE_EXPORT FieldTrialEntry {
     // SHA1(FieldTrialEntry): Increment this if structure changes!
-    static constexpr uint32_t kPersistentTypeId = 0xABA17E13 + 2;
+    static constexpr uint32_t kPersistentTypeId = 0xABA17E13 + 3;
 
     // Expected size for 32/64-bit check.
-    static constexpr size_t kExpectedInstanceSize = 8;
+    static constexpr size_t kExpectedInstanceSize = 16;
 
     // Whether or not this field trial is activated. This is really just a
     // boolean but using a 32 bit value for portability reasons. It should be
@@ -151,8 +151,12 @@
     // thread is accessing the memory location.
     subtle::Atomic32 activated;
 
+    // On e.g. x86, alignof(uint64_t) is 4.  Ensure consistent size and
+    // alignment of `pickle_size` across platforms.
+    uint32_t padding;
+
     // Size of the pickled structure, NOT the total size of this entry.
-    uint32_t pickle_size;
+    uint64_t pickle_size;
 
     // Calling this is only valid when the entry is initialized. That is, it
     // resides in shared memory and has a pickle containing the trial name and
diff --git a/base/metrics/histogram.cc b/base/metrics/histogram.cc
index d95d2b44..4c2f244f 100644
--- a/base/metrics/histogram.cc
+++ b/base/metrics/histogram.cc
@@ -18,6 +18,7 @@
 #include <utility>
 
 #include "base/compiler_specific.h"
+#include "base/cxx17_backports.h"
 #include "base/debug/alias.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
@@ -47,17 +48,17 @@
                             int* flags,
                             int* declared_min,
                             int* declared_max,
-                            uint32_t* bucket_count,
+                            size_t* bucket_count,
                             uint32_t* range_checksum) {
-  if (!iter->ReadString(histogram_name) ||
-      !iter->ReadInt(flags) ||
-      !iter->ReadInt(declared_min) ||
-      !iter->ReadInt(declared_max) ||
-      !iter->ReadUInt32(bucket_count) ||
+  uint32_t bucket_count_u32;
+  if (!iter->ReadString(histogram_name) || !iter->ReadInt(flags) ||
+      !iter->ReadInt(declared_min) || !iter->ReadInt(declared_max) ||
+      !iter->ReadUInt32(&bucket_count_u32) ||
       !iter->ReadUInt32(range_checksum)) {
     DLOG(ERROR) << "Pickle error decoding Histogram: " << *histogram_name;
     return false;
   }
+  *bucket_count = bucket_count_u32;
 
   // Since these fields may have come from an untrusted renderer, do additional
   // checks above and beyond those in Histogram::Initialize()
@@ -95,17 +96,14 @@
 typedef HistogramBase::Count Count;
 typedef HistogramBase::Sample Sample;
 
-// static
-const uint32_t Histogram::kBucketCount_MAX = 1002u;
-
 class Histogram::Factory {
  public:
   Factory(const std::string& name,
           HistogramBase::Sample minimum,
           HistogramBase::Sample maximum,
-          uint32_t bucket_count,
+          size_t bucket_count,
           int32_t flags)
-    : Factory(name, HISTOGRAM, minimum, maximum, bucket_count, flags) {}
+      : Factory(name, HISTOGRAM, minimum, maximum, bucket_count, flags) {}
 
   Factory(const Factory&) = delete;
   Factory& operator=(const Factory&) = delete;
@@ -119,14 +117,14 @@
           HistogramType histogram_type,
           HistogramBase::Sample minimum,
           HistogramBase::Sample maximum,
-          uint32_t bucket_count,
+          size_t bucket_count,
           int32_t flags)
-    : name_(name),
-      histogram_type_(histogram_type),
-      minimum_(minimum),
-      maximum_(maximum),
-      bucket_count_(bucket_count),
-      flags_(flags) {}
+      : name_(name),
+        histogram_type_(histogram_type),
+        minimum_(minimum),
+        maximum_(maximum),
+        bucket_count_(bucket_count),
+        flags_(flags) {}
 
   // Create a BucketRanges structure appropriate for this histogram.
   virtual BucketRanges* CreateRanges() {
@@ -153,7 +151,7 @@
   const HistogramType histogram_type_;
   HistogramBase::Sample minimum_;
   HistogramBase::Sample maximum_;
-  uint32_t bucket_count_;
+  size_t bucket_count_;
   int32_t flags_;
 };
 
@@ -177,7 +175,7 @@
     // at run-time. In the latter case, those ctor parameters are zero and
     // the results extracted from the result of CreateRanges().
     if (bucket_count_ == 0) {
-      bucket_count_ = static_cast<uint32_t>(registered_ranges->bucket_count());
+      bucket_count_ = registered_ranges->bucket_count();
       minimum_ = registered_ranges->range(1);
       maximum_ = registered_ranges->range(bucket_count_ - 1);
     }
@@ -250,7 +248,7 @@
 HistogramBase* Histogram::FactoryGet(const std::string& name,
                                      Sample minimum,
                                      Sample maximum,
-                                     uint32_t bucket_count,
+                                     size_t bucket_count,
                                      int32_t flags) {
   bool valid_arguments =
       InspectConstructionArguments(name, &minimum, &maximum, &bucket_count);
@@ -266,7 +264,7 @@
 HistogramBase* Histogram::FactoryTimeGet(const std::string& name,
                                          TimeDelta minimum,
                                          TimeDelta maximum,
-                                         uint32_t bucket_count,
+                                         size_t bucket_count,
                                          int32_t flags) {
   DCHECK_LT(minimum.InMilliseconds(), std::numeric_limits<Sample>::max());
   DCHECK_LT(maximum.InMilliseconds(), std::numeric_limits<Sample>::max());
@@ -278,7 +276,7 @@
 HistogramBase* Histogram::FactoryMicrosecondsTimeGet(const std::string& name,
                                                      TimeDelta minimum,
                                                      TimeDelta maximum,
-                                                     uint32_t bucket_count,
+                                                     size_t bucket_count,
                                                      int32_t flags) {
   DCHECK_LT(minimum.InMicroseconds(), std::numeric_limits<Sample>::max());
   DCHECK_LT(maximum.InMicroseconds(), std::numeric_limits<Sample>::max());
@@ -290,7 +288,7 @@
 HistogramBase* Histogram::FactoryGet(const char* name,
                                      Sample minimum,
                                      Sample maximum,
-                                     uint32_t bucket_count,
+                                     size_t bucket_count,
                                      int32_t flags) {
   return FactoryGet(std::string(name), minimum, maximum, bucket_count, flags);
 }
@@ -298,7 +296,7 @@
 HistogramBase* Histogram::FactoryTimeGet(const char* name,
                                          TimeDelta minimum,
                                          TimeDelta maximum,
-                                         uint32_t bucket_count,
+                                         size_t bucket_count,
                                          int32_t flags) {
   return FactoryTimeGet(std::string(name), minimum, maximum, bucket_count,
                         flags);
@@ -307,7 +305,7 @@
 HistogramBase* Histogram::FactoryMicrosecondsTimeGet(const char* name,
                                                      TimeDelta minimum,
                                                      TimeDelta maximum,
-                                                     uint32_t bucket_count,
+                                                     size_t bucket_count,
                                                      int32_t flags) {
   return FactoryMicrosecondsTimeGet(std::string(name), minimum, maximum,
                                     bucket_count, flags);
@@ -369,9 +367,9 @@
 const int Histogram::kCommonRaceBasedCountMismatch = 5;
 
 uint32_t Histogram::FindCorruption(const HistogramSamples& samples) const {
-  int inconsistencies = NO_INCONSISTENCIES;
+  uint32_t inconsistencies = NO_INCONSISTENCIES;
   Sample previous_range = -1;  // Bottom range is always 0.
-  for (uint32_t index = 0; index < bucket_count(); ++index) {
+  for (size_t index = 0; index < bucket_count(); ++index) {
     int new_range = ranges(index);
     if (previous_range >= new_range)
       inconsistencies |= BUCKET_ORDER_ERROR;
@@ -416,19 +414,19 @@
   return ranges->range(ranges->bucket_count() - 1);
 }
 
-Sample Histogram::ranges(uint32_t i) const {
+Sample Histogram::ranges(size_t i) const {
   return bucket_ranges()->range(i);
 }
 
-uint32_t Histogram::bucket_count() const {
-  return static_cast<uint32_t>(bucket_ranges()->bucket_count());
+size_t Histogram::bucket_count() const {
+  return bucket_ranges()->bucket_count();
 }
 
 // static
 bool Histogram::InspectConstructionArguments(StringPiece name,
                                              Sample* minimum,
                                              Sample* maximum,
-                                             uint32_t* bucket_count) {
+                                             size_t* bucket_count) {
   bool check_okay = true;
 
   // Checks below must be done after any min/max swap.
@@ -478,9 +476,11 @@
     check_okay = false;
     *bucket_count = 3;
   }
-  if (*bucket_count > static_cast<uint32_t>(*maximum - *minimum + 2)) {
+  // The swap at the top of the function guarantees this cast is safe.
+  const size_t max_buckets = static_cast<size_t>(*maximum - *minimum + 2);
+  if (*bucket_count > max_buckets) {
     check_okay = false;
-    *bucket_count = static_cast<uint32_t>(*maximum - *minimum + 2);
+    *bucket_count = max_buckets;
   }
 
   if (!check_okay) {
@@ -501,7 +501,7 @@
 
 bool Histogram::HasConstructionArguments(Sample expected_minimum,
                                          Sample expected_maximum,
-                                         uint32_t expected_bucket_count) const {
+                                         size_t expected_bucket_count) const {
   return (expected_bucket_count == bucket_count() &&
           expected_minimum == declared_min() &&
           expected_maximum == declared_max());
@@ -585,7 +585,8 @@
   pickle->WriteInt(flags());
   pickle->WriteInt(declared_min());
   pickle->WriteInt(declared_max());
-  pickle->WriteUInt32(bucket_count());
+  // Limited to kBucketCount_MAX, which fits in a uint32_t.
+  pickle->WriteUInt32(static_cast<uint32_t>(bucket_count()));
   pickle->WriteUInt32(bucket_ranges()->checksum());
 }
 
@@ -614,7 +615,7 @@
 
 Histogram::~Histogram() = default;
 
-const std::string Histogram::GetAsciiBucketRange(uint32_t i) const {
+const std::string Histogram::GetAsciiBucketRange(size_t i) const {
   return GetSimpleAsciiBucketRange(ranges(i));
 }
 
@@ -627,7 +628,7 @@
   int flags;
   int declared_min;
   int declared_max;
-  uint32_t bucket_count;
+  size_t bucket_count;
   uint32_t range_checksum;
 
   if (!ReadHistogramArguments(iter, &histogram_name, &flags, &declared_min,
@@ -680,11 +681,15 @@
   Factory(const std::string& name,
           HistogramBase::Sample minimum,
           HistogramBase::Sample maximum,
-          uint32_t bucket_count,
+          size_t bucket_count,
           int32_t flags,
           const DescriptionPair* descriptions)
-    : Histogram::Factory(name, LINEAR_HISTOGRAM, minimum, maximum,
-                         bucket_count, flags) {
+      : Histogram::Factory(name,
+                           LINEAR_HISTOGRAM,
+                           minimum,
+                           maximum,
+                           bucket_count,
+                           flags) {
     descriptions_ = descriptions;
   }
 
@@ -729,7 +734,7 @@
 HistogramBase* LinearHistogram::FactoryGet(const std::string& name,
                                            Sample minimum,
                                            Sample maximum,
-                                           uint32_t bucket_count,
+                                           size_t bucket_count,
                                            int32_t flags) {
   return FactoryGetWithRangeDescription(name, minimum, maximum, bucket_count,
                                         flags, NULL);
@@ -738,7 +743,7 @@
 HistogramBase* LinearHistogram::FactoryTimeGet(const std::string& name,
                                                TimeDelta minimum,
                                                TimeDelta maximum,
-                                               uint32_t bucket_count,
+                                               size_t bucket_count,
                                                int32_t flags) {
   DCHECK_LT(minimum.InMilliseconds(), std::numeric_limits<Sample>::max());
   DCHECK_LT(maximum.InMilliseconds(), std::numeric_limits<Sample>::max());
@@ -750,7 +755,7 @@
 HistogramBase* LinearHistogram::FactoryGet(const char* name,
                                            Sample minimum,
                                            Sample maximum,
-                                           uint32_t bucket_count,
+                                           size_t bucket_count,
                                            int32_t flags) {
   return FactoryGet(std::string(name), minimum, maximum, bucket_count, flags);
 }
@@ -758,7 +763,7 @@
 HistogramBase* LinearHistogram::FactoryTimeGet(const char* name,
                                                TimeDelta minimum,
                                                TimeDelta maximum,
-                                               uint32_t bucket_count,
+                                               size_t bucket_count,
                                                int32_t flags) {
   return FactoryTimeGet(std::string(name),  minimum, maximum, bucket_count,
                         flags);
@@ -779,7 +784,7 @@
     const std::string& name,
     Sample minimum,
     Sample maximum,
-    uint32_t bucket_count,
+    size_t bucket_count,
     int32_t flags,
     const DescriptionPair descriptions[]) {
   // Originally, histograms were required to have at least one sample value
@@ -822,7 +827,7 @@
     HistogramSamples::Metadata* logged_meta)
     : Histogram(name, ranges, counts, logged_counts, meta, logged_meta) {}
 
-const std::string LinearHistogram::GetAsciiBucketRange(uint32_t i) const {
+const std::string LinearHistogram::GetAsciiBucketRange(size_t i) const {
   int range = ranges(i);
   BucketDescriptionMap::const_iterator it = bucket_description_.find(range);
   if (it == bucket_description_.end())
@@ -841,7 +846,7 @@
   for (size_t i = 1; i < bucket_count; ++i) {
     double linear_range =
         (min * (bucket_count - 1 - i) + max * (i - 1)) / (bucket_count - 2);
-    uint32_t range = static_cast<Sample>(linear_range + 0.5);
+    auto range = static_cast<Sample>(linear_range + 0.5);
     ranges->set_range(i, range);
   }
   ranges->set_range(ranges->bucket_count(), HistogramBase::kSampleType_MAX);
@@ -854,7 +859,7 @@
   int flags;
   int declared_min;
   int declared_max;
-  uint32_t bucket_count;
+  size_t bucket_count;
   uint32_t range_checksum;
 
   if (!ReadHistogramArguments(iter, &histogram_name, &flags, &declared_min,
@@ -882,7 +887,7 @@
 ScaledLinearHistogram::ScaledLinearHistogram(const char* name,
                                              Sample minimum,
                                              Sample maximum,
-                                             uint32_t bucket_count,
+                                             size_t bucket_count,
                                              int32_t scale,
                                              int32_t flags)
     : ScaledLinearHistogram(std::string(name),
@@ -895,7 +900,7 @@
 ScaledLinearHistogram::ScaledLinearHistogram(const std::string& name,
                                              Sample minimum,
                                              Sample maximum,
-                                             uint32_t bucket_count,
+                                             size_t bucket_count,
                                              int32_t scale,
                                              int32_t flags)
     : histogram_(LinearHistogram::FactoryGet(name,
@@ -934,11 +939,8 @@
 
   DCHECK_EQ(histogram_->GetHistogramType(), LINEAR_HISTOGRAM);
   LinearHistogram* histogram = static_cast<LinearHistogram*>(histogram_);
-  const int32_t max_value = static_cast<int32_t>(histogram->bucket_count() - 1);
-  if (value > max_value)
-    value = max_value;
-  if (value < 0)
-    value = 0;
+  const auto max_value = static_cast<Sample>(histogram->bucket_count() - 1);
+  value = base::clamp(value, 0, max_value);
 
   int scaled_count = count / scale_;
   subtle::Atomic32 remainder = count - scaled_count * scale_;
@@ -947,15 +949,16 @@
   // and bucket which alleviates the need to do a bucket lookup here (something
   // that is internal to the HistogramSamples object).
   if (remainder > 0) {
-    remainder =
-        subtle::NoBarrier_AtomicIncrement(&remainders_[value], remainder);
+    remainder = subtle::NoBarrier_AtomicIncrement(
+        &remainders_[static_cast<size_t>(value)], remainder);
     // If remainder passes 1/2 scale, increment main count (thus rounding up).
     // The remainder is decremented by the full scale, though, which will
     // cause it to go negative and thus requrire another increase by the full
     // scale amount before another bump of the scaled count.
     if (remainder >= scale_ / 2) {
       scaled_count += 1;
-      subtle::NoBarrier_AtomicIncrement(&remainders_[value], -scale_);
+      subtle::NoBarrier_AtomicIncrement(
+          &remainders_[static_cast<size_t>(value)], -scale_);
     }
   }
 
@@ -1029,7 +1032,7 @@
   int flags;
   int declared_min;
   int declared_max;
-  uint32_t bucket_count;
+  size_t bucket_count;
   uint32_t range_checksum;
 
   if (!ReadHistogramArguments(iter, &histogram_name, &flags, &declared_min,
@@ -1075,7 +1078,7 @@
     ranges.erase(ranges::unique(ranges), ranges.end());
 
     BucketRanges* bucket_ranges = new BucketRanges(ranges.size());
-    for (uint32_t i = 0; i < ranges.size(); i++) {
+    for (size_t i = 0; i < ranges.size(); i++) {
       bucket_ranges->set_range(i, ranges[i]);
     }
     bucket_ranges->ResetChecksum();
@@ -1153,7 +1156,7 @@
 
   // Serialize ranges. First and last ranges are alwasy 0 and INT_MAX, so don't
   // write them.
-  for (uint32_t i = 1; i < bucket_ranges()->bucket_count(); ++i)
+  for (size_t i = 1; i < bucket_ranges()->bucket_count(); ++i)
     pickle->WriteInt(bucket_ranges()->range(i));
 }
 
@@ -1163,7 +1166,7 @@
   int flags;
   int declared_min;
   int declared_max;
-  uint32_t bucket_count;
+  size_t bucket_count;
   uint32_t range_checksum;
 
   if (!ReadHistogramArguments(iter, &histogram_name, &flags, &declared_min,
@@ -1174,8 +1177,8 @@
   // First and last ranges are not serialized.
   std::vector<Sample> sample_ranges(bucket_count - 1);
 
-  for (uint32_t i = 0; i < sample_ranges.size(); ++i) {
-    if (!iter->ReadInt(&sample_ranges[i]))
+  for (Sample& sample : sample_ranges) {
+    if (!iter->ReadInt(&sample))
       return nullptr;
   }
 
@@ -1195,8 +1198,7 @@
 bool CustomHistogram::ValidateCustomRanges(
     const std::vector<Sample>& custom_ranges) {
   bool has_valid_range = false;
-  for (uint32_t i = 0; i < custom_ranges.size(); i++) {
-    Sample sample = custom_ranges[i];
+  for (Sample sample : custom_ranges) {
     if (sample < 0 || sample > HistogramBase::kSampleType_MAX - 1)
       return false;
     if (sample != 0)
diff --git a/base/metrics/histogram.h b/base/metrics/histogram.h
index d8724d5..a56f16b 100644
--- a/base/metrics/histogram.h
+++ b/base/metrics/histogram.h
@@ -100,8 +100,11 @@
 
 class BASE_EXPORT Histogram : public HistogramBase {
  public:
-  // Initialize maximum number of buckets in histograms as 16,384.
-  static const uint32_t kBucketCount_MAX;
+  // Initialize maximum number of buckets in histograms as 1000, plus over and
+  // under.  This must be a value that fits in a uint32_t (since that's how we
+  // serialize bucket counts) as well as a Sample (since samples can be up to
+  // this value).
+  static constexpr size_t kBucketCount_MAX = 1002;
 
   typedef std::vector<Count> Counts;
 
@@ -123,17 +126,17 @@
   static HistogramBase* FactoryGet(const std::string& name,
                                    Sample minimum,
                                    Sample maximum,
-                                   uint32_t bucket_count,
+                                   size_t bucket_count,
                                    int32_t flags);
   static HistogramBase* FactoryTimeGet(const std::string& name,
                                        base::TimeDelta minimum,
                                        base::TimeDelta maximum,
-                                       uint32_t bucket_count,
+                                       size_t bucket_count,
                                        int32_t flags);
   static HistogramBase* FactoryMicrosecondsTimeGet(const std::string& name,
                                                    base::TimeDelta minimum,
                                                    base::TimeDelta maximum,
-                                                   uint32_t bucket_count,
+                                                   size_t bucket_count,
                                                    int32_t flags);
 
   // Overloads of the above functions that take a const char* |name| param, to
@@ -142,17 +145,17 @@
   static HistogramBase* FactoryGet(const char* name,
                                    Sample minimum,
                                    Sample maximum,
-                                   uint32_t bucket_count,
+                                   size_t bucket_count,
                                    int32_t flags);
   static HistogramBase* FactoryTimeGet(const char* name,
                                        base::TimeDelta minimum,
                                        base::TimeDelta maximum,
-                                       uint32_t bucket_count,
+                                       size_t bucket_count,
                                        int32_t flags);
   static HistogramBase* FactoryMicrosecondsTimeGet(const char* name,
                                                    base::TimeDelta minimum,
                                                    base::TimeDelta maximum,
-                                                   uint32_t bucket_count,
+                                                   size_t bucket_count,
                                                    int32_t flags);
 
   // Create a histogram using data in persistent storage.
@@ -191,8 +194,8 @@
   const BucketRanges* bucket_ranges() const;
   Sample declared_min() const;
   Sample declared_max() const;
-  virtual Sample ranges(uint32_t i) const;
-  virtual uint32_t bucket_count() const;
+  virtual Sample ranges(size_t i) const;
+  virtual size_t bucket_count() const;
 
   // This function validates histogram construction arguments. It returns false
   // if some of the arguments are bad but also corrects them so they should
@@ -202,14 +205,14 @@
   static bool InspectConstructionArguments(StringPiece name,
                                            Sample* minimum,
                                            Sample* maximum,
-                                           uint32_t* bucket_count);
+                                           size_t* bucket_count);
 
   // HistogramBase implementation:
   uint64_t name_hash() const override;
   HistogramType GetHistogramType() const override;
   bool HasConstructionArguments(Sample expected_minimum,
                                 Sample expected_maximum,
-                                uint32_t expected_bucket_count) const override;
+                                size_t expected_bucket_count) const override;
   void Add(Sample value) override;
   void AddCount(Sample value, int count) override;
   std::unique_ptr<HistogramSamples> SnapshotSamples() const override;
@@ -250,7 +253,7 @@
   // Return a string description of what goes in a given bucket.
   // Most commonly this is the numeric value, but in derived classes it may
   // be a name (or string description) given to the bucket.
-  virtual const std::string GetAsciiBucketRange(uint32_t it) const;
+  virtual const std::string GetAsciiBucketRange(size_t it) const;
 
  private:
   // Allow tests to corrupt our innards for testing purposes.
@@ -307,12 +310,12 @@
   static HistogramBase* FactoryGet(const std::string& name,
                                    Sample minimum,
                                    Sample maximum,
-                                   uint32_t bucket_count,
+                                   size_t bucket_count,
                                    int32_t flags);
   static HistogramBase* FactoryTimeGet(const std::string& name,
                                        TimeDelta minimum,
                                        TimeDelta maximum,
-                                       uint32_t bucket_count,
+                                       size_t bucket_count,
                                        int32_t flags);
 
   // Overloads of the above two functions that take a const char* |name| param,
@@ -321,12 +324,12 @@
   static HistogramBase* FactoryGet(const char* name,
                                    Sample minimum,
                                    Sample maximum,
-                                   uint32_t bucket_count,
+                                   size_t bucket_count,
                                    int32_t flags);
   static HistogramBase* FactoryTimeGet(const char* name,
                                        TimeDelta minimum,
                                        TimeDelta maximum,
-                                       uint32_t bucket_count,
+                                       size_t bucket_count,
                                        int32_t flags);
 
   // Create a histogram using data in persistent storage.
@@ -352,7 +355,7 @@
       const std::string& name,
       Sample minimum,
       Sample maximum,
-      uint32_t bucket_count,
+      size_t bucket_count,
       int32_t flags,
       const DescriptionPair descriptions[]);
 
@@ -377,7 +380,7 @@
 
   // If we have a description for a bucket, then return that.  Otherwise
   // let parent class provide a (numeric) description.
-  const std::string GetAsciiBucketRange(uint32_t i) const override;
+  const std::string GetAsciiBucketRange(size_t i) const override;
 
  private:
   friend BASE_EXPORT HistogramBase* DeserializeHistogramInfo(
@@ -410,13 +413,13 @@
   ScaledLinearHistogram(const char* name,
                         Sample minimum,
                         Sample maximum,
-                        uint32_t bucket_count,
+                        size_t bucket_count,
                         int32_t scale,
                         int32_t flags);
   ScaledLinearHistogram(const std::string& name,
                         Sample minimum,
                         Sample maximum,
-                        uint32_t bucket_count,
+                        size_t bucket_count,
                         int32_t scale,
                         int32_t flags);
 
diff --git a/base/metrics/histogram_base.cc b/base/metrics/histogram_base.cc
index c1036cf9..ffba4e8 100644
--- a/base/metrics/histogram_base.cc
+++ b/base/metrics/histogram_base.cc
@@ -169,7 +169,8 @@
   root.SetKey("params", std::move(parameters));
   if (verbosity_level != JSON_VERBOSITY_LEVEL_OMIT_BUCKETS)
     root.SetKey("buckets", std::move(count_and_bucket_data.buckets));
-  root.SetIntKey("pid", GetUniqueIdForProcess().GetUnsafeValue());
+  root.SetIntKey("pid",
+                 static_cast<int>(GetUniqueIdForProcess().GetUnsafeValue()));
   serializer.Serialize(root);
 }
 
@@ -203,7 +204,9 @@
 
     Value bucket_value(Value::Type::DICTIONARY);
     bucket_value.SetIntKey("low", bucket_min);
-    bucket_value.SetIntKey("high", bucket_max);
+    // TODO(crbug.com/1334256): Make base::Value able to hold int64_t and remove
+    // this cast.
+    bucket_value.SetIntKey("high", static_cast<int>(bucket_max));
     bucket_value.SetIntKey("count", bucket_count);
     buckets.push_back(std::move(bucket_value));
     it->Next();
diff --git a/base/metrics/histogram_base.h b/base/metrics/histogram_base.h
index ba2053e..7e876b23 100644
--- a/base/metrics/histogram_base.h
+++ b/base/metrics/histogram_base.h
@@ -172,10 +172,9 @@
   // Whether the histogram has construction arguments as parameters specified.
   // For histograms that don't have the concept of minimum, maximum or
   // bucket_count, this function always returns false.
-  virtual bool HasConstructionArguments(
-      Sample expected_minimum,
-      Sample expected_maximum,
-      uint32_t expected_bucket_count) const = 0;
+  virtual bool HasConstructionArguments(Sample expected_minimum,
+                                        Sample expected_maximum,
+                                        size_t expected_bucket_count) const = 0;
 
   virtual void Add(Sample value) = 0;
 
diff --git a/base/metrics/histogram_delta_serialization.cc b/base/metrics/histogram_delta_serialization.cc
index 7214c9af..82abd862 100644
--- a/base/metrics/histogram_delta_serialization.cc
+++ b/base/metrics/histogram_delta_serialization.cc
@@ -59,7 +59,7 @@
     const std::vector<std::string>& serialized_deltas) {
   for (auto it = serialized_deltas.begin(); it != serialized_deltas.end();
        ++it) {
-    Pickle pickle(it->data(), checked_cast<int>(it->size()));
+    Pickle pickle(it->data(), it->size());
     PickleIterator iter(pickle);
     DeserializeHistogramAndAddSamples(&iter);
   }
diff --git a/base/metrics/histogram_functions.cc b/base/metrics/histogram_functions.cc
index c8468c0..f129f800 100644
--- a/base/metrics/histogram_functions.cc
+++ b/base/metrics/histogram_functions.cc
@@ -26,16 +26,16 @@
 void UmaHistogramExactLinear(const std::string& name,
                              int sample,
                              int exclusive_max) {
-  HistogramBase* histogram =
-      LinearHistogram::FactoryGet(name, 1, exclusive_max, exclusive_max + 1,
-                                  HistogramBase::kUmaTargetedHistogramFlag);
+  HistogramBase* histogram = LinearHistogram::FactoryGet(
+      name, 1, exclusive_max, static_cast<size_t>(exclusive_max + 1),
+      HistogramBase::kUmaTargetedHistogramFlag);
   histogram->Add(sample);
 }
 
 void UmaHistogramExactLinear(const char* name, int sample, int exclusive_max) {
-  HistogramBase* histogram =
-      LinearHistogram::FactoryGet(name, 1, exclusive_max, exclusive_max + 1,
-                                  HistogramBase::kUmaTargetedHistogramFlag);
+  HistogramBase* histogram = LinearHistogram::FactoryGet(
+      name, 1, exclusive_max, static_cast<size_t>(exclusive_max + 1),
+      HistogramBase::kUmaTargetedHistogramFlag);
   histogram->Add(sample);
 }
 
@@ -60,7 +60,7 @@
                               int sample,
                               int min,
                               int exclusive_max,
-                              int buckets) {
+                              size_t buckets) {
   HistogramBase* histogram =
       Histogram::FactoryGet(name, min, exclusive_max, buckets,
                             HistogramBase::kUmaTargetedHistogramFlag);
@@ -71,7 +71,7 @@
                               int sample,
                               int min,
                               int exclusive_max,
-                              int buckets) {
+                              size_t buckets) {
   HistogramBase* histogram =
       Histogram::FactoryGet(name, min, exclusive_max, buckets,
                             HistogramBase::kUmaTargetedHistogramFlag);
@@ -130,7 +130,7 @@
                              TimeDelta sample,
                              TimeDelta min,
                              TimeDelta max,
-                             int buckets) {
+                             size_t buckets) {
   HistogramBase* histogram = Histogram::FactoryTimeGet(
       name, min, max, buckets, HistogramBase::kUmaTargetedHistogramFlag);
   histogram->AddTimeMillisecondsGranularity(sample);
@@ -140,7 +140,7 @@
                              TimeDelta sample,
                              TimeDelta min,
                              TimeDelta max,
-                             int buckets) {
+                             size_t buckets) {
   HistogramBase* histogram = Histogram::FactoryTimeGet(
       name, min, max, buckets, HistogramBase::kUmaTargetedHistogramFlag);
   histogram->AddTimeMillisecondsGranularity(sample);
@@ -182,7 +182,7 @@
                                          TimeDelta sample,
                                          TimeDelta min,
                                          TimeDelta max,
-                                         int buckets) {
+                                         size_t buckets) {
   HistogramBase* histogram = Histogram::FactoryMicrosecondsTimeGet(
       name, min, max, buckets, HistogramBase::kUmaTargetedHistogramFlag);
   histogram->AddTimeMicrosecondsGranularity(sample);
@@ -192,7 +192,7 @@
                                          TimeDelta sample,
                                          TimeDelta min,
                                          TimeDelta max,
-                                         int buckets) {
+                                         size_t buckets) {
   HistogramBase* histogram = Histogram::FactoryMicrosecondsTimeGet(
       name, min, max, buckets, HistogramBase::kUmaTargetedHistogramFlag);
   histogram->AddTimeMicrosecondsGranularity(sample);
diff --git a/base/metrics/histogram_functions.h b/base/metrics/histogram_functions.h
index d30b903..76c79b30 100644
--- a/base/metrics/histogram_functions.h
+++ b/base/metrics/histogram_functions.h
@@ -152,12 +152,12 @@
                                           int sample,
                                           int min,
                                           int exclusive_max,
-                                          int buckets);
+                                          size_t buckets);
 BASE_EXPORT void UmaHistogramCustomCounts(const char* name,
                                           int sample,
                                           int min,
                                           int exclusive_max,
-                                          int buckets);
+                                          size_t buckets);
 
 // Counts specialization for maximum counts 100, 1000, 10k, 100k, 1M and 10M.
 BASE_EXPORT void UmaHistogramCounts100(const std::string& name, int sample);
@@ -178,12 +178,12 @@
                                          TimeDelta sample,
                                          TimeDelta min,
                                          TimeDelta max,
-                                         int buckets);
+                                         size_t buckets);
 BASE_EXPORT void UmaHistogramCustomTimes(const char* name,
                                          TimeDelta sample,
                                          TimeDelta min,
                                          TimeDelta max,
-                                         int buckets);
+                                         size_t buckets);
 // For short timings from 1 ms up to 10 seconds (50 buckets).
 BASE_EXPORT void UmaHistogramTimes(const std::string& name, TimeDelta sample);
 BASE_EXPORT void UmaHistogramTimes(const char* name, TimeDelta sample);
@@ -206,12 +206,12 @@
                                                      TimeDelta sample,
                                                      TimeDelta min,
                                                      TimeDelta max,
-                                                     int buckets);
+                                                     size_t buckets);
 BASE_EXPORT void UmaHistogramCustomMicrosecondsTimes(const char* name,
                                                      TimeDelta sample,
                                                      TimeDelta min,
                                                      TimeDelta max,
-                                                     int buckets);
+                                                     size_t buckets);
 
 // For microseconds timings from 1 microsecond up to 10 seconds (50 buckets).
 BASE_EXPORT void UmaHistogramMicrosecondsTimes(const std::string& name,
diff --git a/base/metrics/persistent_histogram_allocator.cc b/base/metrics/persistent_histogram_allocator.cc
index f8fe4b0..437e62e9 100644
--- a/base/metrics/persistent_histogram_allocator.cc
+++ b/base/metrics/persistent_histogram_allocator.cc
@@ -4,10 +4,10 @@
 
 #include "base/metrics/persistent_histogram_allocator.h"
 
+#include <atomic>
 #include <limits>
 #include <utility>
 
-#include "base/atomicops.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/important_file_writer.h"
@@ -254,7 +254,7 @@
   uint32_t bucket_count;
   PersistentMemoryAllocator::Reference ranges_ref;
   uint32_t ranges_checksum;
-  subtle::Atomic32 counts_ref;  // PersistentMemoryAllocator::Reference
+  std::atomic<PersistentMemoryAllocator::Reference> counts_ref;
   HistogramSamples::Metadata samples_metadata;
   HistogramSamples::Metadata logged_metadata;
 
@@ -573,7 +573,7 @@
 
   size_t counts_bytes = CalculateRequiredCountsBytes(histogram_bucket_count);
   PersistentMemoryAllocator::Reference counts_ref =
-      subtle::Acquire_Load(&histogram_data_ptr->counts_ref);
+      histogram_data_ptr->counts_ref.load(std::memory_order_acquire);
   if (counts_bytes == 0 ||
       (counts_ref != 0 &&
        memory_allocator_->GetAllocSize(counts_ref) < counts_bytes)) {
@@ -879,7 +879,7 @@
   // also released, future accesses to those histograms will seg-fault.
   CHECK(!subtle::NoBarrier_Load(&g_histogram_allocator));
   subtle::Release_Store(&g_histogram_allocator,
-                        reinterpret_cast<uintptr_t>(allocator.release()));
+                        reinterpret_cast<intptr_t>(allocator.release()));
   size_t existing = StatisticsRecorder::GetHistogramCount();
 
   DVLOG_IF(1, existing)
diff --git a/base/metrics/persistent_memory_allocator.cc b/base/metrics/persistent_memory_allocator.cc
index c90bb634..583d05f8 100644
--- a/base/metrics/persistent_memory_allocator.cc
+++ b/base/metrics/persistent_memory_allocator.cc
@@ -35,43 +35,41 @@
 
 // Limit of memory segment size. It has to fit in an unsigned 32-bit number
 // and should be a power of 2 in order to accommodate almost any page size.
-const uint32_t kSegmentMaxSize = 1 << 30;  // 1 GiB
+constexpr uint32_t kSegmentMaxSize = 1 << 30;  // 1 GiB
 
 // A constant (random) value placed in the shared metadata to identify
 // an already initialized memory segment.
-const uint32_t kGlobalCookie = 0x408305DC;
+constexpr uint32_t kGlobalCookie = 0x408305DC;
 
 // The current version of the metadata. If updates are made that change
 // the metadata, the version number can be queried to operate in a backward-
 // compatible manner until the memory segment is completely re-initalized.
-const uint32_t kGlobalVersion = 2;
+constexpr uint32_t kGlobalVersion = 2;
 
 // Constant values placed in the block headers to indicate its state.
-const uint32_t kBlockCookieFree = 0;
-const uint32_t kBlockCookieQueue = 1;
-const uint32_t kBlockCookieWasted = (uint32_t)-1;
-const uint32_t kBlockCookieAllocated = 0xC8799269;
+constexpr uint32_t kBlockCookieFree = 0;
+constexpr uint32_t kBlockCookieQueue = 1;
+constexpr uint32_t kBlockCookieWasted = (uint32_t)-1;
+constexpr uint32_t kBlockCookieAllocated = 0xC8799269;
 
 // TODO(bcwhite): When acceptable, consider moving flags to std::atomic<char>
 // types rather than combined bitfield.
 
 // Flags stored in the flags_ field of the SharedMetadata structure below.
-enum : int {
-  kFlagCorrupt = 1 << 0,
-  kFlagFull    = 1 << 1
-};
+constexpr uint32_t kFlagCorrupt = 1 << 0;
+constexpr uint32_t kFlagFull = 1 << 1;
 
 // Errors that are logged in "errors" histogram.
 enum AllocatorError : int {
   kMemoryIsCorrupt = 1,
 };
 
-bool CheckFlag(const volatile std::atomic<uint32_t>* flags, int flag) {
+bool CheckFlag(const volatile std::atomic<uint32_t>* flags, uint32_t flag) {
   uint32_t loaded_flags = flags->load(std::memory_order_relaxed);
   return (loaded_flags & flag) != 0;
 }
 
-void SetFlag(volatile std::atomic<uint32_t>* flags, int flag) {
+void SetFlag(volatile std::atomic<uint32_t>* flags, uint32_t flag) {
   uint32_t loaded_flags = flags->load(std::memory_order_relaxed);
   for (;;) {
     uint32_t new_flags = (loaded_flags & ~flag) | flag;
@@ -647,8 +645,7 @@
   }
 
   // Round up the requested size, plus header, to the next allocation alignment.
-  uint32_t size = checked_cast<uint32_t>(req_size + sizeof(BlockHeader));
-  size = bits::AlignUp(size, kAllocAlignment);
+  size_t size = bits::AlignUp(req_size + sizeof(BlockHeader), kAllocAlignment);
   if (size <= sizeof(BlockHeader) || size > mem_page_) {
     NOTREACHED();
     return kReferenceNull;
@@ -766,7 +763,8 @@
     // data here because this memory can, currently, be seen only by the thread
     // performing the allocation. When it comes time to share this, the thread
     // will call MakeIterable() which does the release operation.
-    block->size = size;
+    // `size` is at most kSegmentMaxSize, so this cast is safe.
+    block->size = static_cast<uint32_t>(size);
     block->cookie = kBlockCookieAllocated;
     block->type_id.store(type_id, std::memory_order_relaxed);
     return freeptr;
@@ -976,7 +974,7 @@
   if (address)
     return Memory(address, MEM_VIRTUAL);
   UmaHistogramSparse("UMA.LocalPersistentMemoryAllocator.Failures.Win",
-                     ::GetLastError());
+                     static_cast<int>(::GetLastError()));
 #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
   // MAP_ANON is deprecated on Linux but MAP_ANONYMOUS is not universal on Mac.
   // MAP_SHARED is not available on Linux <2.4 but required on Mac.
@@ -1157,36 +1155,6 @@
 
 //----- DelayedPersistentAllocation --------------------------------------------
 
-// Forwarding constructors.
-DelayedPersistentAllocation::DelayedPersistentAllocation(
-    PersistentMemoryAllocator* allocator,
-    subtle::Atomic32* ref,
-    uint32_t type,
-    size_t size,
-    bool make_iterable)
-    : DelayedPersistentAllocation(
-          allocator,
-          reinterpret_cast<std::atomic<Reference>*>(ref),
-          type,
-          size,
-          0,
-          make_iterable) {}
-
-DelayedPersistentAllocation::DelayedPersistentAllocation(
-    PersistentMemoryAllocator* allocator,
-    subtle::Atomic32* ref,
-    uint32_t type,
-    size_t size,
-    size_t offset,
-    bool make_iterable)
-    : DelayedPersistentAllocation(
-          allocator,
-          reinterpret_cast<std::atomic<Reference>*>(ref),
-          type,
-          size,
-          offset,
-          make_iterable) {}
-
 DelayedPersistentAllocation::DelayedPersistentAllocation(
     PersistentMemoryAllocator* allocator,
     std::atomic<Reference>* ref,
@@ -1200,7 +1168,6 @@
                                   0,
                                   make_iterable) {}
 
-// Real constructor.
 DelayedPersistentAllocation::DelayedPersistentAllocation(
     PersistentMemoryAllocator* allocator,
     std::atomic<Reference>* ref,
diff --git a/base/metrics/persistent_memory_allocator.h b/base/metrics/persistent_memory_allocator.h
index 723ab55..2ec56ff 100644
--- a/base/metrics/persistent_memory_allocator.h
+++ b/base/metrics/persistent_memory_allocator.h
@@ -858,20 +858,6 @@
   // with every Get() request to see if the allocation has already been
   // done. If reading |ref| outside of this object, be sure to do an
   // "acquire" load. Don't write to it -- leave that to this object.
-  //
-  // For convenience, methods taking both Atomic32 and std::atomic<Reference>
-  // are defined.
-  DelayedPersistentAllocation(PersistentMemoryAllocator* allocator,
-                              subtle::Atomic32* ref,
-                              uint32_t type,
-                              size_t size,
-                              bool make_iterable);
-  DelayedPersistentAllocation(PersistentMemoryAllocator* allocator,
-                              subtle::Atomic32* ref,
-                              uint32_t type,
-                              size_t size,
-                              size_t offset,
-                              bool make_iterable);
   DelayedPersistentAllocation(PersistentMemoryAllocator* allocator,
                               std::atomic<Reference>* ref,
                               uint32_t type,
diff --git a/base/metrics/sample_vector.cc b/base/metrics/sample_vector.cc
index e89144d..18f7f8a 100644
--- a/base/metrics/sample_vector.cc
+++ b/base/metrics/sample_vector.cc
@@ -350,15 +350,6 @@
   if (max_size > kLineLength)
     scaling_factor = kLineLength / max_size;
 
-  // Calculate space needed to print bucket range numbers.  Leave room to print
-  // nearly the largest bucket range without sliding over the histogram.
-  uint32_t largest_non_empty_bucket = bucket_count() - 1;
-  while (0 == GetCountAtIndex(largest_non_empty_bucket)) {
-    if (0 == largest_non_empty_bucket)
-      break;  // All buckets are empty.
-    --largest_non_empty_bucket;
-  }
-
   // Calculate largest print width needed for any of our bucket range displays.
   size_t print_width = 1;
   for (uint32_t i = 0; i < bucket_count(); ++i) {
diff --git a/base/metrics/sparse_histogram.cc b/base/metrics/sparse_histogram.cc
index b30192c..9c90d893 100644
--- a/base/metrics/sparse_histogram.cc
+++ b/base/metrics/sparse_histogram.cc
@@ -101,7 +101,7 @@
 bool SparseHistogram::HasConstructionArguments(
     Sample expected_minimum,
     Sample expected_maximum,
-    uint32_t expected_bucket_count) const {
+    size_t expected_bucket_count) const {
   // SparseHistogram never has min/max/bucket_count limit.
   return false;
 }
diff --git a/base/metrics/sparse_histogram.h b/base/metrics/sparse_histogram.h
index 76b2290..b77e2f2 100644
--- a/base/metrics/sparse_histogram.h
+++ b/base/metrics/sparse_histogram.h
@@ -49,7 +49,7 @@
   HistogramType GetHistogramType() const override;
   bool HasConstructionArguments(Sample expected_minimum,
                                 Sample expected_maximum,
-                                uint32_t expected_bucket_count) const override;
+                                size_t expected_bucket_count) const override;
   void Add(Sample value) override;
   void AddCount(Sample value, int count) override;
   void AddSamples(const HistogramSamples& samples) override;
diff --git a/base/metrics/user_metrics.cc b/base/metrics/user_metrics.cc
index d08b9ff..2d2f41c 100644
--- a/base/metrics/user_metrics.cc
+++ b/base/metrics/user_metrics.cc
@@ -68,12 +68,9 @@
   DCHECK(g_task_runner.Get());
   DCHECK(g_task_runner.Get()->BelongsToCurrentThread());
   std::vector<ActionCallback>* callbacks = g_callbacks.Pointer();
-  for (size_t i = 0; i < callbacks->size(); ++i) {
-    if ((*callbacks)[i] == callback) {
-      callbacks->erase(callbacks->begin() + i);
-      return;
-    }
-  }
+  const auto i = std::find(callbacks->begin(), callbacks->end(), callback);
+  if (i != callbacks->end())
+    callbacks->erase(i);
 }
 
 void SetRecordActionTaskRunner(
diff --git a/build/android/BUILD.gn b/build/android/BUILD.gn
index 2475f7d..8e7de407 100644
--- a/build/android/BUILD.gn
+++ b/build/android/BUILD.gn
@@ -55,6 +55,9 @@
   }
 
   junit_binary("build_junit_tests") {
+    # No JNI is required, and including JNI Generator reference causes trouble
+    # for projects such as Angle, which don't pull in //base.
+    generate_final_jni = false
     sources = [ "junit/src/org/chromium/build/IncrementalJavacTest.java" ]
     deps = [
       "//build/android/test/incremental_javac_gn:no_signature_change_prebuilt_java",
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index c1e532e..ff3240f 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -167,16 +167,24 @@
     if (defined(invoker.possible_config_public_deps)) {
       foreach(_possible_dep, invoker.possible_config_public_deps) {
         _dep_label = get_label_info(_possible_dep, "label_no_toolchain")
-        if (filter_exclude([ _dep_label ], java_target_patterns) == []) {
-          # Put the bug number in the target name so that false-positives
-          # have a hint in the error message about non-existent dependencies.
-          deps += [ "$_dep_label$build_config_target_suffix" ]
-          _dep_gen_dir = get_label_info(_possible_dep, "target_gen_dir")
-          _dep_name = get_label_info(_possible_dep, "name")
-          _dep_config = "$_dep_gen_dir/$_dep_name.build_config.json"
 
-          _public_deps_configs += [ _dep_config ]
-        }
+        # E.g. Adding an action that generates a .java file that is then
+        # consumed by a subsequent java_library() target would not work
+        # because the libraries depend only on the nested targets of one
+        # another. It is simplest to just ban non-java public_deps.
+        assert(filter_exclude([ _dep_label ], java_target_patterns) == [],
+               "Only java_library targets can be used as public_deps. " +
+                   "Found:\n${_dep_label}\non Target:\n" +
+                   get_label_info(":$target_name", "label_no_toolchain"))
+
+        # Put the bug number in the target name so that false-positives
+        # have a hint in the error message about non-existent dependencies.
+        deps += [ "$_dep_label$build_config_target_suffix" ]
+        _dep_gen_dir = get_label_info(_possible_dep, "target_gen_dir")
+        _dep_name = get_label_info(_possible_dep, "name")
+        _dep_config = "$_dep_gen_dir/$_dep_name.build_config.json"
+
+        _public_deps_configs += [ _dep_config ]
       }
     }
     _rebased_deps_configs = rebase_path(_deps_configs, root_build_dir)
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 1a9b3736..2104df3 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -1372,12 +1372,18 @@
       target_sdk_version = android_sdk_version
     }
 
-    _jni_srcjar_target = "${target_name}__final_jni"
-    _outer_target_name = target_name
-    generate_jni_registration(_jni_srcjar_target) {
-      enable_native_mocks = true
-      require_native_mocks = true
-      targets = [ ":$_outer_target_name" ]
+    # Some may want to disable this to remove dependency on //base
+    # (JNI generator is in //base).
+    _generate_final_jni =
+        !defined(invoker.generate_final_jni) || invoker.generate_final_jni
+    if (_generate_final_jni) {
+      _jni_srcjar_target_name = "${target_name}__final_jni"
+      _outer_target_name = target_name
+      generate_jni_registration(_jni_srcjar_target_name) {
+        enable_native_mocks = true
+        require_native_mocks = true
+        targets = [ ":$_outer_target_name" ]
+      }
     }
 
     java_library_impl(_java_binary_target_name) {
@@ -1406,11 +1412,11 @@
       }
       srcjar_deps += [
         ":$_compile_resources_target",
-        ":$_jni_srcjar_target",
-
-        # This dep is required for any targets that depend on //base:base_java.
         "//build/android:build_config_gen",
       ]
+      if (_generate_final_jni) {
+        srcjar_deps += [ ":$_jni_srcjar_target_name" ]
+      }
     }
 
     test_runner_script(_test_runner_target_name) {
diff --git a/build/config/ios/BUILD.gn b/build/config/ios/BUILD.gn
index d462d48..cfe4a0f 100644
--- a/build/config/ios/BUILD.gn
+++ b/build/config/ios/BUILD.gn
@@ -69,6 +69,11 @@
   # an Objective C struct won't be called, which is very bad.
   cflags_objcc = [ "-fobjc-call-cxx-cdtors" ]
 
+  # TODO(crbug.com/1331345) Disable sprintf errors in Xcode 14 beta 1.
+  if (xcode_version_int >= 1400) {
+    cflags += [ "-Wno-deprecated-declarations" ]
+  }
+
   ldflags = common_flags
 }
 
diff --git a/chrome/VERSION b/chrome/VERSION
index 0b09d77..d320449 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=104
 MINOR=0
-BUILD=5109
+BUILD=5110
 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
index 81b09d2..090bd675 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
@@ -150,6 +150,8 @@
             public void onLayoutChange(View v, int left, int top, int right, int bottom,
                     int oldLeft, int oldTop, int oldRight, int oldBottom) {
                 if (sNativeOverlayWindowAndroid == 0) return;
+                // We sometimes get an initial update of zero before getting something reasonable.
+                if (top == bottom || left == right) return;
 
                 PictureInPictureActivityJni.get().onViewSizeChanged(
                         sNativeOverlayWindowAndroid, right - left, bottom - top);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoAboutThisSiteController.java b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoAboutThisSiteController.java
index be58052..c0fe245 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoAboutThisSiteController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoAboutThisSiteController.java
@@ -14,6 +14,7 @@
 import org.chromium.base.supplier.Supplier;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCoordinator;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.tab.TabLaunchType;
 import org.chromium.chrome.browser.tab.TabUtils;
 import org.chromium.chrome.browser.tabmodel.document.TabDelegate;
@@ -91,7 +92,7 @@
         if (mEphemeralTabCoordinatorSupplier != null
                 && mEphemeralTabCoordinatorSupplier.get() != null) {
             String title =
-                    mRowView.getContext().getString(R.string.page_info_about_this_site_title);
+                    mRowView.getContext().getString(R.string.page_info_about_this_page_title);
             mEphemeralTabCoordinatorSupplier.get().requestOpenSheet(
                     new GURL(url), title, /*isIncognito=*/false);
             mMainController.dismiss();
@@ -119,18 +120,25 @@
             return;
         }
 
+        boolean more_info_enabled =
+                ChromeFeatureList.isEnabled(ChromeFeatureList.PAGE_INFO_ABOUT_THIS_SITE_MORE_INFO);
+
         assert mSiteInfo.hasDescription();
         String subtitle = mSiteInfo.getDescription().getDescription();
-
         PageInfoRowView.ViewParams rowParams = new PageInfoRowView.ViewParams();
-        rowParams.title = mRowView.getContext().getResources().getString(
-                R.string.page_info_about_this_site_title);
+        rowParams.title = mRowView.getContext().getResources().getString(more_info_enabled
+                        ? R.string.page_info_about_this_page_title
+                        : R.string.page_info_about_this_site_title);
         rowParams.subtitle = subtitle;
         rowParams.singleLineSubTitle = true;
         rowParams.visible = true;
-        rowParams.iconResId = R.drawable.ic_info_outline_grey_24dp;
+        rowParams.iconResId =
+                more_info_enabled ? R.drawable.ic_globe_24dp : R.drawable.ic_info_outline_grey_24dp;
         rowParams.decreaseIconSize = true;
-        rowParams.clickCallback = this::launchSubpage;
+        rowParams.clickCallback = more_info_enabled ? ()
+                -> openUrl(mSiteInfo.getMoreAbout().getUrl(),
+                        PageInfoAction.PAGE_INFO_ABOUT_THIS_SITE_PAGE_OPENED)
+                : this::launchSubpage;
         mRowView.setParams(rowParams);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareDelegateImpl.java
index 11f6cce..86c78dd1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareDelegateImpl.java
@@ -262,8 +262,7 @@
             Profile profile = profileSupplier.get();
             if (chromeShareExtras.shareDirectly()) {
                 ShareHelper.shareWithLastUsedComponent(params);
-            } else if (sharingHubEnabled && !chromeShareExtras.sharingTabGroup()
-                    && tabProvider.get() != null && tabProvider.get().getWebContents() != null) {
+            } else if (sharingHubEnabled && !chromeShareExtras.sharingTabGroup()) {
                 // TODO(crbug.com/1085078): Sharing hub is suppressed for tab group sharing.
                 // Re-enable it when tab group sharing is supported by sharing hub.
                 RecordHistogram.recordEnumeratedHistogram(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialog.java
index 95fe41f..ddcb45d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialog.java
@@ -114,12 +114,16 @@
             dialogCustomView.configureShortNames(oldAppShortName, newAppShortName);
         }
 
+        // A detailed explanation is only required when the icon is changing. The name updates are
+        // more straight-forward and the dialog title is enough to explain what is going on.
+        String explanation =
+                iconChanging ? resources.getString(R.string.webapp_update_explanation) : "";
+
         mDialogModel =
                 new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
                         .with(ModalDialogProperties.CONTROLLER, this)
                         .with(ModalDialogProperties.TITLE, resources, titleId)
-                        .with(ModalDialogProperties.MESSAGE_PARAGRAPH_1,
-                                resources.getString(R.string.webapp_update_explanation))
+                        .with(ModalDialogProperties.MESSAGE_PARAGRAPH_1, explanation)
                         .with(ModalDialogProperties.CUSTOM_VIEW, dialogCustomView)
                         .with(ModalDialogProperties.BUTTON_STYLES,
                                 ModalDialogProperties.ButtonStyles.PRIMARY_FILLED_NEGATIVE_OUTLINE)
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/launchpad/LaunchpadPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/launchpad/LaunchpadPageTest.java
index f3e7a86..3e83287f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/launchpad/LaunchpadPageTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/launchpad/LaunchpadPageTest.java
@@ -34,6 +34,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
@@ -164,6 +165,7 @@
 
     @Test
     @MediumTest
+    @DisabledTest(message = "crbug.com/1306215")
     public void testManagementMenuAppShortcutsProperties() {
         openLaunchpadPage();
         View dialogView = LaunchpadTestUtils.openAppManagementMenu(mLaunchpadCoordinator,
@@ -194,6 +196,7 @@
 
     @Test
     @MediumTest
+    @DisabledTest(message = "crbug.com/1306215")
     public void testLaunchAppShortcuts() {
         openLaunchpadPage();
         ModalDialogManager modalDialogManager =
@@ -219,6 +222,7 @@
 
     @Test
     @MediumTest
+    @DisabledTest(message = "crbug.com/1306215")
     public void testManagementMenuOtherMenuItemProperties() {
         openLaunchpadPage();
         View dialogView = LaunchpadTestUtils.openAppManagementMenu(mLaunchpadCoordinator,
@@ -246,6 +250,7 @@
 
     @Test
     @MediumTest
+    @DisabledTest(message = "crbug.com/1306215")
     public void testLaunchAppSetting_whenSiteSettingsMenuItemClicked() {
         openLaunchpadPage();
         ModalDialogManager modalDialogManager =
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialogTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialogTest.java
index b4c550b..9b63e9f9 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialogTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialogTest.java
@@ -42,6 +42,9 @@
     private final CallbackHelper mOnActionCallback = new CallbackHelper();
     private final MockModalDialogManager mDialogManager = new MockModalDialogManager();
 
+    // The length of the explanation header when icon updates are requested.
+    private static final int MESSAGE_HEADER_LENGTH = 88;
+
     private Integer mLastDismissalCause;
 
     private static class DialogParams {
@@ -59,6 +62,7 @@
             dialogParams.expectNameHiddenAnyway = false;
             dialogParams.nameBefore = "";
             dialogParams.nameAfter = "";
+            dialogParams.hasExplanationString = true;
             return dialogParams;
         }
 
@@ -74,6 +78,7 @@
         public boolean expectNameHiddenAnyway;
         public String nameBefore;
         public String nameAfter;
+        public boolean hasExplanationString;
     }
 
     private static class MockModalDialogManager extends ModalDialogManager {
@@ -118,6 +123,11 @@
         return mDialogManager.getCurrentDialogModel().get(ModalDialogProperties.CUSTOM_VIEW);
     }
 
+    private CharSequence getDialogHeaderView() {
+        return mDialogManager.getCurrentDialogModel().get(
+                ModalDialogProperties.MESSAGE_PARAGRAPH_1);
+    }
+
     private String getDialogTitle() {
         return mDialogManager.getCurrentDialogModel().get(ModalDialogProperties.TITLE).toString();
     }
@@ -135,6 +145,10 @@
         return textView.getText().toString();
     }
 
+    private String getUpdateDialogHeaderLabel() {
+        return getDialogHeaderView().toString();
+    }
+
     private void onUpdateDialogResult(Integer dialogDismissalCause) {
         mLastDismissalCause = dialogDismissalCause;
         mOnActionCallback.notifyCalled();
@@ -197,6 +211,9 @@
         Assert.assertEquals(clickAccept ? (Integer) DialogDismissalCause.POSITIVE_BUTTON_CLICKED
                                         : (Integer) DialogDismissalCause.NEGATIVE_BUTTON_CLICKED,
                 mLastDismissalCause);
+
+        Assert.assertEquals((dialogParams.hasExplanationString ? MESSAGE_HEADER_LENGTH : 0),
+                getUpdateDialogHeaderLabel().length());
     }
 
     public void verifyReportAbuseValues(
@@ -243,8 +260,10 @@
         dialogParams.shortNameChanged = true;
         dialogParams.shortNameBefore = "short1";
         dialogParams.shortNameAfter = "short2";
-        // When only the short name changes, the icon is shown (as unchanged) to provide context.
+        // When only the short name changes, the icon is shown (as unchanged) to provide context and
+        // the explanation string is dropped.
         dialogParams.expectIconShownAnyway = true;
+        dialogParams.hasExplanationString = false;
         verifyValues(/* clickAccept= */ true, dialogParams);
 
         // Test only long name changing.
@@ -254,6 +273,7 @@
         dialogParams.nameAfter = "name2";
         // Icons always show, even if unchanged.
         dialogParams.expectIconShownAnyway = true;
+        dialogParams.hasExplanationString = false;
         verifyValues(/* clickAccept= */ true, dialogParams);
 
         // Test only short name and icon changing.
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index e01010c..89317c7 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -1333,6 +1333,9 @@
   <message name="IDS_LOGIN_RECOMMEND_APPS_SCREEN_CONTAINS_ADS" desc="Part of an app description message.">
     Contains ads
   </message>
+  <message name="IDS_LOGIN_RECOMMEND_APPS_SCREEN_DESCRIPTION_EXPAND_BUTTON" desc="An expand button description message announced to ChromeVox users.">
+    More about <ph name="APP_NAME">$1<ex>Google Maps</ex></ph>
+  </message>
   <message name="IDS_LOGIN_RECOMMEND_APPS_SKIP" desc="The label on the button that skips installing any recomended apps">
     Skip
   </message>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_RECOMMEND_APPS_SCREEN_DESCRIPTION_EXPAND_BUTTON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_RECOMMEND_APPS_SCREEN_DESCRIPTION_EXPAND_BUTTON.png.sha1
new file mode 100644
index 0000000..f54c946e
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_RECOMMEND_APPS_SCREEN_DESCRIPTION_EXPAND_BUTTON.png.sha1
@@ -0,0 +1 @@
+95433a683802c641f77de091130c4684e2d323a6
\ No newline at end of file
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd
index 4119762..03d9cbf 100644
--- a/chrome/app/chromium_strings.grd
+++ b/chrome/app/chromium_strings.grd
@@ -906,10 +906,13 @@
       </if>
 
       <if expr="not chromeos_ash and not is_android">
-        <!-- Profile Customization Bubble-->
+        <!-- Profile Customization Web UI -->
         <message name="IDS_PROFILE_CUSTOMIZATION_TEXT" desc="Text of the profile customization bubble">
           Customize your new Chromium profile
         </message>
+        <message name="IDS_PROFILE_CUSTOMIZATION_TITLE_V2" desc="Title of the profile customization dialog">
+          Customize your Chromium profile
+        </message>
       </if>
 
       <!-- Chrome Cleanup prompt.
diff --git a/chrome/app/chromium_strings_grd/IDS_PROFILE_CUSTOMIZATION_TITLE_V2.png.sha1 b/chrome/app/chromium_strings_grd/IDS_PROFILE_CUSTOMIZATION_TITLE_V2.png.sha1
new file mode 100644
index 0000000..5709ae7
--- /dev/null
+++ b/chrome/app/chromium_strings_grd/IDS_PROFILE_CUSTOMIZATION_TITLE_V2.png.sha1
@@ -0,0 +1 @@
+64924d8d2dbbe691d74821ef5394c3b18a59871d
\ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index f2b9cd6..f28cbb4 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -3001,6 +3001,12 @@
         <message name="IDS_BLUETOOTH_DEVICE_CREDENTIALS_LABEL" desc="Label of the text prompt for Bluetooth device credentials.">
           Enter Bluetooth Passkey for device <ph name="DEVICE">$1</ph>
         </message>
+        <message name="IDS_BLUETOOTH_DEVICE_PAIR_CONFIRM_TITLE" desc="Title of the Bluetooth device pair confirmation prompt dialog.">
+          Pair Confirmation
+        </message>
+        <message name="IDS_BLUETOOTH_DEVICE_PAIR_CONFIRM_LABEL" desc="Label of the text prompt for Bluetooth device pair confirmation.">
+          Bluetooth device <ph name="DEVICE">$1</ph> would like permission to pair.
+        </message>
       </if>
 
       <!-- Content blocking strings -->
diff --git a/chrome/app/generated_resources_grd/IDS_BLUETOOTH_DEVICE_PAIR_CONFIRM_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_BLUETOOTH_DEVICE_PAIR_CONFIRM_LABEL.png.sha1
new file mode 100644
index 0000000..199890c
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_BLUETOOTH_DEVICE_PAIR_CONFIRM_LABEL.png.sha1
@@ -0,0 +1 @@
+6699d8fde261c301eac0d4fda586e35c79f5d934
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_BLUETOOTH_DEVICE_PAIR_CONFIRM_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_BLUETOOTH_DEVICE_PAIR_CONFIRM_TITLE.png.sha1
new file mode 100644
index 0000000..199890c
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_BLUETOOTH_DEVICE_PAIR_CONFIRM_TITLE.png.sha1
@@ -0,0 +1 @@
+6699d8fde261c301eac0d4fda586e35c79f5d934
\ No newline at end of file
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd
index 62ff616a..c60869a 100644
--- a/chrome/app/google_chrome_strings.grd
+++ b/chrome/app/google_chrome_strings.grd
@@ -950,10 +950,13 @@
       </if>
 
       <if expr="not chromeos_ash and not is_android">
-        <!-- Profile Customization Bubble-->
+        <!-- Profile Customization Web UI -->
         <message name="IDS_PROFILE_CUSTOMIZATION_TEXT" desc="Text of the profile customization bubble">
           Customize your new Chrome profile
         </message>
+        <message name="IDS_PROFILE_CUSTOMIZATION_TITLE_V2" desc="Title of the profile customization dialog">
+          Customize your Chrome profile
+        </message>
       </if>
 
       <!-- Chrome Cleanup prompt -->
diff --git a/chrome/app/google_chrome_strings_grd/IDS_PROFILE_CUSTOMIZATION_TITLE_V2.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_PROFILE_CUSTOMIZATION_TITLE_V2.png.sha1
new file mode 100644
index 0000000..ddf5839
--- /dev/null
+++ b/chrome/app/google_chrome_strings_grd/IDS_PROFILE_CUSTOMIZATION_TITLE_V2.png.sha1
@@ -0,0 +1 @@
+6c18f6454e8cb874b324cfc04724d768086172c7
\ No newline at end of file
diff --git a/chrome/app/profiles_strings.grdp b/chrome/app/profiles_strings.grdp
index 20ca3a2..b928b07 100644
--- a/chrome/app/profiles_strings.grdp
+++ b/chrome/app/profiles_strings.grdp
@@ -486,7 +486,7 @@
   </if>
 
   <if expr="not chromeos_ash and not is_android">
-    <!-- Profile customization bubble -->
+    <!-- Profile Customization Web UI -->
     <message name="IDS_PROFILE_CUSTOMIZATION_DONE_BUTTON_LABEL" desc="Text for the Done button on the profile customization bubble">
       Done
     </message>
@@ -496,6 +496,9 @@
     <message name="IDS_PROFILE_CUSTOMIZATION_INPUT_LABEL" desc="Not displayed. Used by screen readers to describe the input used to rename the profile.">
       Rename your profile
     </message>
+    <message name="IDS_PROFILE_CUSTOMIZATION_SKIP_BUTTON_LABEL" desc="Text for the Skip button on the profile customization dialog">
+      Skip
+    </message>
 
     <!-- Enterprise profile welcome screen -->
     <message name="IDS_ENTERPRISE_PROFILE_WELCOME_TITLE" desc="Title of the enteprise profile welcome screen. It is part of the profile creation flow, shown after sign-in to enterprise users.">
diff --git a/chrome/app/profiles_strings_grdp/IDS_PROFILE_CUSTOMIZATION_SKIP_BUTTON_LABEL.png.sha1 b/chrome/app/profiles_strings_grdp/IDS_PROFILE_CUSTOMIZATION_SKIP_BUTTON_LABEL.png.sha1
new file mode 100644
index 0000000..5709ae7
--- /dev/null
+++ b/chrome/app/profiles_strings_grdp/IDS_PROFILE_CUSTOMIZATION_SKIP_BUTTON_LABEL.png.sha1
@@ -0,0 +1 @@
+64924d8d2dbbe691d74821ef5394c3b18a59871d
\ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 19c08ba..1d1197e 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -180,6 +180,7 @@
 <translation id="1166583374608765787">የግምገማ ስም ዝማኔ</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> የዴስክ <ph name="DESK_TITLE" /> ነው</translation>
 <translation id="1168020859489941584">ለመከፈት የቀረው ጊዜ <ph name="TIME_REMAINING" />...</translation>
+<translation id="1169266963600477608">የጨዋታ መቆጣጠሪያዎች</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> ሚስጥራዊነት ያለው ወይም አደገኛ ውሂብ አለው። የእርስዎ አስተዳዳሪ «<ph name="CUSTOM_MESSAGE" />» ይላል</translation>
 <translation id="1171135284592304528">ነገርየው በሚለወጥበት ጊዜ በቁልፍ ሰሌዳ ትኩረት አድምቅ</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> ወደ HID መሣሪያ ማገናኘት ይፈልጋል</translation>
@@ -3370,6 +3371,7 @@
 <translation id="4227605727325220318">አዲስ Android ስልክ ያክሉ</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{ይህ ቅጥያ አይፈቀድም}one{አንዳንድ ቅጥያዎች አይፈቀዱም}other{አንዳንድ ቅጥያዎች አይፈቀዱም}}</translation>
 <translation id="4231095370974836764">ከGoogle Play በእርስዎ <ph name="DEVICE_TYPE" /> ላይ መተግበሪያዎችን እና ጨዋታዎችን ይጫኑ። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">የጨዋታ መቆጣጠሪያዎችን ዝጋ</translation>
 <translation id="4232375817808480934">Kerberosን ያዋቅሩ</translation>
 <translation id="4235965441080806197">መግባትን ሰርዝ</translation>
 <translation id="4236163961381003811">ተጨማሪ ቅጥያዎችን ያግኙ</translation>
@@ -3634,6 +3636,7 @@
 <translation id="449232563137139956">ጣቢያዎች ለመስመር ላይ መደብሮች ወይም ለዜና ዘገባዎች እንደ ፎቶዎች ያሉ ስዕላዊ ማብራሪያን ለማቅረብ ምስሎችን ያሳያሉ</translation>
 <translation id="4492698018379445570">ወደ የግዢ ተሳቢዎች ያከሉትን ያግኙ እና ዝግጁ ሲሆኑ ይመልከቱ</translation>
 <translation id="4493468155686877504">የተመከሩ (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">ይህ ቅጥያ <ph name="SITE" /> ላይ ይፈቀድ?</translation>
 <translation id="4495419450179050807">በዚህ ገጽ ላይ አታሳይ</translation>
 <translation id="4497145443434063861">ፒሲ እና Chromecast በተለያዩ የWi-Fi አውታረ መረቦች ላይ ናቸው (ለምሳሌ፦ 2.4 ጊኸ እና 5 ጊኸ)</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> ተበላሽቷል</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 812f4ce..716b413 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -180,6 +180,7 @@
 <translation id="1166583374608765787">مراجعة التعديل الذي تم إجراؤه على الاسم</translation>
 <translation id="1166596238782048887">تنتمي علامة التبويب <ph name="TAB_TITLE" /> إلى سطح المكتب <ph name="DESK_TITLE" /></translation>
 <translation id="1168020859489941584">سيتمّ فتح الملفّ بعد <ph name="TIME_REMAINING" />...</translation>
+<translation id="1169266963600477608">عناصر التحكم في اللعبة</translation>
 <translation id="1169435433292653700">يتضمّن الملف <ph name="FILE_NAME" /> بيانات حساسة أو خطيرة. أرسَل المشرف الرسالة "<ph name="CUSTOM_MESSAGE" />".</translation>
 <translation id="1171135284592304528">تمييز الكائن باستخدام تركيز لوحة المفاتيح عندما يتغير</translation>
 <translation id="1171515578268894665">‏يريد <ph name="ORIGIN" /> الاتصال بجهاز HID</translation>
@@ -1803,7 +1804,7 @@
 <translation id="2687407218262674387">‏بنود خدمة Google</translation>
 <translation id="2687621393791886981">اسألني لاحقًا</translation>
 <translation id="2688196195245426394">حدث خطأ عند تسجيل الجهاز مع الخادم: <ph name="CLIENT_ERROR" />.</translation>
-<translation id="2688734475209947648">‏لن تضطر إلى تذكُّر كلمة المرور هذه. سيتم حفظ كلمة المرور في "مدير كلمات المرور في Google" على عنوان البريد الإلكتروني <ph name="ACCOUNT" />.</translation>
+<translation id="2688734475209947648">‏لن تضطر إلى تذكُّر كلمة المرور هذه. سيتم حفظ كلمة المرور في "مدير كلمات المرور في Google" ضمن الحساب <ph name="ACCOUNT" />.</translation>
 <translation id="2690024944919328218">عرض خيارات اللغة</translation>
 <translation id="2691385045260836588">الطراز</translation>
 <translation id="2691440343905273290">تغيير إعدادات الإدخال</translation>
@@ -3365,6 +3366,7 @@
 <translation id="4227605727325220318">‏إضافة هاتف Android جديد</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{هذه الإضافة غير مسموح بها}zero{هذه الإضافات غير مسموح بها}two{هاتان الإضافتان غير مسموح بهما}few{بعض الإضافات غير مسموح بها}many{بعض الإضافات غير مسموح بها}other{بعض الإضافات غير مسموح بها}}</translation>
 <translation id="4231095370974836764">‏يمكنك تثبيت التطبيقات والألعاب من Google Play على جهاز <ph name="DEVICE_TYPE" /> الخاص بك. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">إغلاق عناصر التحكم في اللعبة</translation>
 <translation id="4232375817808480934">‏ضبط Kerberos</translation>
 <translation id="4235965441080806197">إلغاء تسجيل الدخول</translation>
 <translation id="4236163961381003811">الاطّلاع على مزيد من الإضافات</translation>
@@ -3629,6 +3631,7 @@
 <translation id="449232563137139956">تعمل المواقع الإلكترونية عادةً على عرض الصور لتوفير صور توضيحية مثل صور متاجر على الإنترنت أو مقالات إخبارية.</translation>
 <translation id="4492698018379445570">يمكنك الاطّلاع على المنتجات التي أضفتها إلى سلات التسوّق وإتمام الدفع عندما تكون جاهزًا.</translation>
 <translation id="4493468155686877504">موصى به (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">هل تريد السماح بتشغيل هذه الإضافة على الموقع الإلكتروني <ph name="SITE" />؟</translation>
 <translation id="4495419450179050807">عدم الظهور في هذه الصفحة</translation>
 <translation id="4497145443434063861">‏جهاز الكمبيوتر الشخصي وجهاز Chromecast متصلان بشبكتَي Wi-Fi مختلفتَين (على سبيل المثال، واحدة بتردد 2.4 غيغا هرتز والأخرى بتردد 5 غيغا هرتز)</translation>
 <translation id="4500114933761911433">تعطّل <ph name="PLUGIN_NAME" />.</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index 67341df7..71b3a4e 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">নামৰ আপডে’ট পৰ্যালোচনা কৰক</translation>
 <translation id="1166596238782048887">ডেস্ক <ph name="DESK_TITLE" />ত <ph name="TAB_TITLE" /> আছে</translation>
 <translation id="1168020859489941584"><ph name="TIME_REMAINING" />ত খুলি থকা হৈছে...</translation>
+<translation id="1169266963600477608">গে’মৰ নিয়ন্ত্ৰণ</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" />ত সংবেদনশীল অথবা বিপজ্জনক ডেটা আছে। আপোনাৰ প্ৰশাসকে কৈছে "<ph name="CUSTOM_MESSAGE" />"</translation>
 <translation id="1171135284592304528">অবজেক্ট সলনি হ’লে কীব’র্ড ফ’কাছৰ জৰিয়তে হাইলাইট কৰক</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" />এ এটা HID ডিভাইচৰ সৈতে সংযুক্ত হ'ব বিচাৰে</translation>
@@ -3377,6 +3378,7 @@
 <translation id="4227605727325220318">এটা নতুন Android ফ’ন যোগ দিয়ক</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{এই এক্সটেনশ্বনটোক অনুমতি দিয়া নহয়}one{কিছুমান এক্সটেনশ্বনক অনুমতি দিয়া নহয়}other{কিছুমান এক্সটেনশ্বনক অনুমতি দিয়া নহয়}}</translation>
 <translation id="4231095370974836764">আপোনাৰ <ph name="DEVICE_TYPE" />ত Google Playৰ পৰা এপ্‌ আৰু গে’মসমূহ ইনষ্টল কৰক। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">গে’মৰ নিয়ন্ত্ৰক বন্ধ কৰক</translation>
 <translation id="4232375817808480934">Kerberos কনফিগাৰ কৰক</translation>
 <translation id="4235965441080806197">ছাইন ইন বাতিল কৰক</translation>
 <translation id="4236163961381003811">অধিক এক্সটেনশ্বন বিচাৰি পাওক</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index 7998118..987dc54 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -178,6 +178,7 @@
 <translation id="1166583374608765787">Ad güncəlləməsini nəzərdən keçirin</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> <ph name="DESK_TITLE" /> masasına aiddir</translation>
 <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> ərzində açılır...</translation>
+<translation id="1169266963600477608">Oyun nəzarətləri</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> həssas və ya təhlükəli data ehtiva edir. Administratorunuz "<ph name="CUSTOM_MESSAGE" />" deyir</translation>
 <translation id="1171135284592304528">Dəyişiklik olduqda, klaviatura fokusu ilə obyekti vurğulayın</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> HID cihazına qoşulmaq istəyir</translation>
@@ -199,6 +200,7 @@
 <translation id="1188807932851744811">Loq güncəlləşməyib.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Kompüterinizdə saxlanılan fayla daxil olun}other{Kompüterinizdə saxlanılan # fayla daxil olun}}</translation>
 <translation id="119092896208640858">Axtarış tarixçəsini yalnız bu cihazan silmək, Google Hesabında saxlamaq üçün <ph name="BEGIN_LINK" />çıxış edin<ph name="END_LINK" />.</translation>
+<translation id="1191353342579061195">Ehtiyaclarınıza uyğun olan mövzunu seçin. Mövzu, divar kağızı, ekran qoruyucusu və daha çoxunu dəyişmək üçün masaüstünə sağ düymə ilə klikləyin.</translation>
 <translation id="1192706927100816598">{0,plural, =1{# saniyə sonra avtomatik çıxılacaq.
 <ph name="DOMAIN" /> smart kartınızın taxılı qalmasını tələb edir.}other{# saniyə sonra avtomatik çıxılacaq.
 <ph name="DOMAIN" /> smart kartınızın taxılı qalmasını tələb edir.}}</translation>
@@ -1288,6 +1290,7 @@
 <translation id="2220409419896228519">Əlfəcinləri sevimli Google Tətbiqlərinizə əlavə edin</translation>
 <translation id="2220529011494928058">Problemi xəbər verin</translation>
 <translation id="2220572644011485463">PIN və ya parol</translation>
+<translation id="222115440608612541">Gün çıxanda və batanda mövzuları dəyişdirin</translation>
 <translation id="2221261048068091179"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" /></translation>
 <translation id="222201875806112242">Adsız media mənbəyi</translation>
 <translation id="2224444042887712269">Bu ayarlar <ph name="OWNER_EMAIL" /> hesabına məxsusdur.</translation>
@@ -1516,6 +1519,7 @@
 <translation id="241082044617551207">Naməlum plaqin</translation>
 <translation id="2412753904894530585">Kerberos</translation>
 <translation id="2416435988630956212">Klaviaturanın funksiya düymələri</translation>
+<translation id="2418307627282545839">İşıqlandırın və havalandırın</translation>
 <translation id="2419131370336513030">Quraşdırılmış tətbiqlərə baxın</translation>
 <translation id="2419706071571366386">Təhlükəsizliyiniz üçün kompüterdən istifadə etmədikdə çıxış edin.</translation>
 <translation id="2422125132043002186">Linux bərpası ləğv edildi</translation>
@@ -3359,6 +3363,7 @@
 <translation id="4227605727325220318">Yeni Android telefonu əlavə edin</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Bu artırmaya icazə verilmir}other{Bəzi artırmalara icazə verilmir}}</translation>
 <translation id="4231095370974836764"><ph name="DEVICE_TYPE" /> cihazında Google Play'dən tətbiq və oyunlar quraşdırın. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">Oyun nəzarətlərini bağlayın</translation>
 <translation id="4232375817808480934">Kerberos'u konfiqurasiya edin</translation>
 <translation id="4235965441080806197">Daxilolmanı ləğv edin</translation>
 <translation id="4236163961381003811">Digər artırmaları kəşf edin</translation>
@@ -6021,6 +6026,7 @@
 <translation id="6895032998810961280">Zərərli proqram, sistem ayarları, təmizlik zamanı kompüterdə aşkarlanan əməliyyatlar barədə məlumatları Google'a göndərin</translation>
 <translation id="6896758677409633944">Kopyalayın</translation>
 <translation id="6897363604023044284">Təmizlənəcək saytları seçin</translation>
+<translation id="6897688156970667447">Aşağı işıqda faydalıdır və batareyaya qənaət edir</translation>
 <translation id="6898440773573063262">Kiosk tətbiqləri indi bu cihazda avtomatik işə salına bilər.</translation>
 <translation id="6900284862687837908">Arxa Fon Tətbiqi: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">Təkmil qoruma</translation>
@@ -7507,6 +7513,7 @@
 <translation id="8358685469073206162">Səhifələr bərpa edilsin?</translation>
 <translation id="8358912028636606457">Bu cihazda tab yayımı zamanı audio dəstəklənmir.</translation>
 <translation id="835951711479681002">Google Hesabınızda saxlayın</translation>
+<translation id="8360140320636871023">Ekran mövzusunu fərdiləşdirin</translation>
 <translation id="8363095875018065315">stabil</translation>
 <translation id="8363142353806532503">Mikrofon blok edildi</translation>
 <translation id="8366396658833131068">Şəbəkə bağlantınız bərpa oldu. Fərqli şəbəkə seçin və ya kiosk tətbiqini işə salmaq üçün "Davam edin" düyməsinə basın.</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index 90f6fab..1c19682 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -204,6 +204,7 @@
 <translation id="1188807932851744811">Zapisnik nije otpremljen.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Pristup fajlu koji je pohranjen na vašem računaru}one{Pristup # fajlu koji je pohranjen na vašem računaru}few{Pristup za # fajla koja su pohranjena na vašem računaru}other{Pristup za # fajlova koji su pohranjeni na vašem računaru}}</translation>
 <translation id="119092896208640858"><ph name="BEGIN_LINK" />Odjavite se<ph name="END_LINK" /> da obrišete podatke pregledanja samo s ovog uređaja, a zadržite ih na Google računu.</translation>
+<translation id="1191353342579061195">Odaberite temu koja odgovara vašim potrebama. Da biste promijenili temu, pozadinu, čuvar zaslona i drugo, jednostavno kliknite desnom tipkom na radnoj površini.</translation>
 <translation id="1192706927100816598">{0,plural, =1{Automatski ćete se odjaviti za # sekundu.
 Domena <ph name="DOMAIN" /> zahtijeva da pametna kartica ostane umetnuta.}one{Automatski ćete se odjaviti za # sekundu.
 Domena <ph name="DOMAIN" /> zahtijeva da pametna kartica ostane umetnuta.}few{Automatski ćete se odjaviti za # sekunde.
@@ -1304,6 +1305,7 @@
 <translation id="2220409419896228519">Dodavanje oznaka u vaše omiljene Googleove aplikacije</translation>
 <translation id="2220529011494928058">Prijavite problem</translation>
 <translation id="2220572644011485463">PIN ili lozinka</translation>
+<translation id="222115440608612541">Promjena teme kad sunce izađe i zađe</translation>
 <translation id="2221261048068091179"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" /></translation>
 <translation id="222201875806112242">Neimenovani izvor medijskog sadržaja</translation>
 <translation id="2224444042887712269">Vlasnik ove postavke je <ph name="OWNER_EMAIL" />.</translation>
@@ -1532,6 +1534,7 @@
 <translation id="241082044617551207">Nepoznati dodatak</translation>
 <translation id="2412753904894530585">Kerberos</translation>
 <translation id="2416435988630956212">Funkcijske tipke tastature</translation>
+<translation id="2418307627282545839">Sve je svijetlo i jasno</translation>
 <translation id="2419131370336513030">Prikaz instaliranih aplikacija</translation>
 <translation id="2419706071571366386">Radi sigurnosti, odjavite se kada vaš računar nije u upotrebi.</translation>
 <translation id="2422125132043002186">Vraćanje Linuxa je otkazano</translation>
@@ -6047,6 +6050,7 @@
 <translation id="6895032998810961280">Prijavite Googleu detalje o štetnom softveru, sistemskim postavkama i procesima koji su pronađeni na vašem računaru tokom ovog čišćenja</translation>
 <translation id="6896758677409633944">Kopiraj</translation>
 <translation id="6897363604023044284">Odaberite web lokacije za brisanje</translation>
+<translation id="6897688156970667447">Korisno pri slabom osvjetljenju i štedi bateriju</translation>
 <translation id="6898440773573063262">Sada se aplikacije za kisok mogu konfigurirati za automatsko pokretanje na ovom uređaju.</translation>
 <translation id="6900284862687837908">Aplikacije u pozadini: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">Poboljšana zaštita</translation>
@@ -7535,6 +7539,7 @@
 <translation id="8358685469073206162">Vratiti stranice?</translation>
 <translation id="8358912028636606457">Emitiranje zvuka kartice nije podržano na ovom uređaju.</translation>
 <translation id="835951711479681002">Sačuvajte na Google računu</translation>
+<translation id="8360140320636871023">Prilagodite temu zaslona</translation>
 <translation id="8363095875018065315">Stabilno</translation>
 <translation id="8363142353806532503">Mikrofon je blokiran</translation>
 <translation id="8366396658833131068">Vaša mrežna veza je vraćena. Odaberite drugu mrežu ili pritisnite dugme "Nastavi" ispod da pokrenete aplikaciju za kiosk.</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index e4794326..3decb57 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -180,6 +180,7 @@
 <translation id="1166583374608765787">Revisa l'actualització del nom</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> pertany a l'escriptori <ph name="DESK_TITLE" /></translation>
 <translation id="1168020859489941584">Obrint a <ph name="TIME_REMAINING" />...</translation>
+<translation id="1169266963600477608">Controls del joc</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> conté dades sensibles o perilloses. L'administrador diu: "<ph name="CUSTOM_MESSAGE" />".</translation>
 <translation id="1171135284592304528">Ressalta l'objecte amb el focus del teclat quan canviï</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> vol connectar-se a un dispositiu d'interfície humana</translation>
@@ -3362,6 +3363,7 @@
 <translation id="4227605727325220318">Afegeix un telèfon Android nou</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Aquesta extensió no està permesa}other{Algunes extensions no estan permeses}}</translation>
 <translation id="4231095370974836764">Instal·la aplicacions i jocs de Google Play al dispositiu <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">Tanca els controls del joc</translation>
 <translation id="4232375817808480934">Configura Kerberos</translation>
 <translation id="4235965441080806197">Cancel·la l'inici de sessió</translation>
 <translation id="4236163961381003811">Descobreix més extensions</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 72a8eb4..81eeaec 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">Gennemgå navneopdateringen</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> tilhører skrivebordet <ph name="DESK_TITLE" /></translation>
 <translation id="1168020859489941584">Åbner om <ph name="TIME_REMAINING" />...</translation>
+<translation id="1169266963600477608">Spilstyring</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> indeholder følsomme eller farlige data. Din administrator siger: "<ph name="CUSTOM_MESSAGE" />"</translation>
 <translation id="1171135284592304528">Fremhæv elementet med tastaturfokus, når det ændres.</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> anmoder om at oprette forbindelse til en HID-enhed</translation>
@@ -3379,6 +3380,7 @@
 <translation id="4227605727325220318">Tilføj en ny Android-telefon</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Denne udvidelse er ikke tilladt}one{Denne udvidelse er ikke tilladt}other{Nogle udvidelser er ikke tilladt}}</translation>
 <translation id="4231095370974836764">Installer apps og spil fra Google Play på din <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">Luk spilstyring</translation>
 <translation id="4232375817808480934">Konfigurer Kerberos</translation>
 <translation id="4235965441080806197">Annuller login</translation>
 <translation id="4236163961381003811">Se flere udvidelser</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 529dbec..8f545b3 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -2084,6 +2084,7 @@
 <ph name="DOMAIN" /> requires you to keep your smart card inserted.</translation>
 <translation id="2923234477033317484">Remove this account</translation>
 <translation id="2923644930701689793">Access your phone's camera roll</translation>
+<translation id="2925658782192398150">Done, no issues found</translation>
 <translation id="2926085873880284723">Restore default shortcuts</translation>
 <translation id="2926620265753325858"><ph name="DEVICE_NAME" /> is not supported.</translation>
 <translation id="2927017729816812676">Cache Storage</translation>
@@ -5028,6 +5029,7 @@
 <translation id="5891688036610113830">Preferred Wi-Fi networks</translation>
 <translation id="5895138241574237353">Restart</translation>
 <translation id="5895335062901455404">Your saved preferences and activity will be ready on any Chrome OS Flex device when you sign in with your Google Account. You can choose what to sync in Settings.</translation>
+<translation id="589541317545606110">Search page with <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
 <translation id="5896436821193322561">Don't allow</translation>
 <translation id="5900186025777217044">Smart Lock has changed</translation>
 <translation id="5900302528761731119">Google Profile photo</translation>
@@ -5079,6 +5081,7 @@
 <translation id="5941153596444580863">Add person</translation>
 <translation id="5941343993301164315">Please sign in to <ph name="TOKEN_NAME" />.</translation>
 <translation id="5941711191222866238">Minimise</translation>
+<translation id="594221546068848596">Search page with <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
 <translation id="5942779427914696408">Device visibility</translation>
 <translation id="5943127421590245687">Your verification was successful. To unlock and restore your local data, please enter your old <ph name="DEVICE_TYPE" /> password.</translation>
 <translation id="5945002094477276055"><ph name="FILE_NAME" /> may be dangerous. Send to Google Safe Browsing for scanning?</translation>
@@ -6722,6 +6725,7 @@
 <translation id="7582582252461552277">Prefer this network</translation>
 <translation id="7582844466922312471">Mobile Data</translation>
 <translation id="7583948862126372804">Count</translation>
+<translation id="7585106857920830898">Checking with your organisation's security policies…</translation>
 <translation id="7586498138629385861">Chrome will keep running while Chrome Apps are open.</translation>
 <translation id="758895749110326677">Help us improve gaming on Chromebooks</translation>
 <translation id="7589461650300748890">Whoa, there. Be careful.</translation>
@@ -6999,6 +7003,7 @@
 <translation id="7839051173341654115">View/Backup media</translation>
 <translation id="7839192898639727867">Certificate Subject Key ID</translation>
 <translation id="7842692330619197998">Visit g.co/ChromeEnterpriseAccount if you need to create a new account.</translation>
+<translation id="78427265591841839">Search any part of the page with <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
 <translation id="784273751836026224">Uninstall Linux</translation>
 <translation id="7843786652787044762">Sign in to <ph name="WEB_DRIVE" /></translation>
 <translation id="7844992432319478437">Updating diff</translation>
@@ -7006,6 +7011,7 @@
 <translation id="7847212883280406910">Press Ctrl + Alt + S to switch to <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="7849264908733290972">Open &amp;Image in New Tab</translation>
 <translation id="784934925303690534">Time range</translation>
+<translation id="7850353716413205957">Search any part of the page with <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
 <translation id="7850717413915978159"><ph name="BEGIN_PARAGRAPH1" />Allowing your ChromeOS devices to send automatic reports helps us prioritise what to fix and improve in ChromeOS. These reports can include things like when ChromeOS crashes, which features you use, how much memory you typically use, and Android app diagnostic and usage data. Some aggregate data will also help Google apps and partners, such as Android developers.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />You can start or stop allowing these reports at any time in your Chrome OS device settings. If you’re a domain administrator, you can change this setting in the Admin console.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />If the Web &amp; App Activity setting is turned on for your Google Account, your Android data may be saved to your Google Account. You can see your data, delete it and change your account settings at account.google.com.<ph name="END_PARAGRAPH3" /></translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index b250685..d47eb0d 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -3626,6 +3626,7 @@
 <translation id="449232563137139956">Los sitios suelen mostrar imágenes a modo ilustrativo, como fotos de tiendas online o artículos de prensa.</translation>
 <translation id="4492698018379445570">Encuentra lo que has añadido a los carritos de la compra y paga cuando tengas todo listo</translation>
 <translation id="4493468155686877504">Recomendado (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">¿Permitir esta extensión en <ph name="SITE" />?</translation>
 <translation id="4495419450179050807">No mostrar en esta página</translation>
 <translation id="4497145443434063861">PC y Chromecast en distintas redes Wi‑Fi (por ejemplo, una de 2,4 GHz y otra de 5 GHz)</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> ha fallado</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 193a51a..1744c352 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -3633,6 +3633,7 @@
 <translation id="449232563137139956">Saidid kuvavad pilte tavaliselt illustratiivsel eesmärgil, näiteks fotosid veebipoes või uudisteartiklite juures</translation>
 <translation id="4492698018379445570">Leidke ostukorvidesse lisatud üksused ja makske, kui olete soovitud üksused välja valinud</translation>
 <translation id="4493468155686877504">Soovitatav (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">Kas lubada see laiendus saidil <ph name="SITE" />?</translation>
 <translation id="4495419450179050807">Ära sellel lehel kuva</translation>
 <translation id="4497145443434063861">Arvuti ja Chromecast on erinevates WiFi-võrkudes (nt 2,4 GHz vs. 5 GHz)</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> jooksis kokku</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index a9dc835..3a7e6c5 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -3629,6 +3629,7 @@
 <translation id="449232563137139956">Webguneek irudiak erabili ohi dituzte zerbait ilustratzeko, hala nola sareko dendetarako argazkiak edo albiste-artikuluak</translation>
 <translation id="4492698018379445570">Ikusi erosketa-saskietan gehitu duzuna eta egin erosketa prest zaudenean</translation>
 <translation id="4493468155686877504">Gomendatua (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180"><ph name="SITE" /> webgunean exekutatzeko baimena eman nahi diozu luzapenari?</translation>
 <translation id="4495419450179050807">Ez erakutsi orri honetan</translation>
 <translation id="4497145443434063861">PCa eta Chromecast-a wifi-sare desberdinetan (adibidez, 2,4 GHz eta 5 GHz)</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> pluginak huts egin du</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 0435445..3f13ac4 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">مرور به‌روزرسانی نام</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> به میزکار <ph name="DESK_TITLE" /> تعلق دارد</translation>
 <translation id="1168020859489941584">باز کردن با <ph name="TIME_REMAINING" />...</translation>
+<translation id="1169266963600477608">کنترل‌های بازی</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> حاوی داده‌های حساس یا خطرناکی است. پیام سرپرست: «<ph name="CUSTOM_MESSAGE" />»</translation>
 <translation id="1171135284592304528">برجسته کردن شیء با فوکوس صفحه‌کلید در صورت تغییر</translation>
 <translation id="1171515578268894665">‏<ph name="ORIGIN" /> می‌خواهد به یک دستگاه HID متصل شود</translation>
@@ -3375,6 +3376,7 @@
 <translation id="4227605727325220318">‏افزودن تلفن Android جدید</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{این افزونه مجاز نیست}one{برخی افزونه‌ها مجاز نیستند}other{برخی افزونه‌ها مجاز نیستند}}</translation>
 <translation id="4231095370974836764">‏برنامه‌ها و بازی‌ها را از Google Play در <ph name="DEVICE_TYPE" /> نصب کنید. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">بستن کنترل‌های بازی</translation>
 <translation id="4232375817808480934">‏پیکربندی Kerberos</translation>
 <translation id="4235965441080806197">لغو ورود به سیستم</translation>
 <translation id="4236163961381003811">کاوش افزونه‌های بیشتر</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 795147d..9bd2528 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -204,6 +204,7 @@
 <translation id="1188807932851744811">Hindi na-upload ang log.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Mag-access ng file na naka-store sa iyong computer}one{Mag-access ng # file na naka-store sa iyong computer}other{Mag-access ng # na file na naka-store sa iyong computer}}</translation>
 <translation id="119092896208640858">Para i-clear ang data sa pag-browse sa device lang na ito, habang pinapanatili ito sa iyong Google Account, <ph name="BEGIN_LINK" />mag-sign out<ph name="END_LINK" />.</translation>
+<translation id="1191353342579061195">Piliin ang temang tumutugon sa iyong mga pangangailangan. Para baguhin ang iyong tema, wallpaper, screen saver, at higit pa, mag-right click lang sa desktop.</translation>
 <translation id="1192706927100816598">{0,plural, =1{Awtomatiko kang masa-sign out sa loob ng # segundo.
 Inaatasan ka ng <ph name="DOMAIN" /> na panatilihing nakalagay ang iyong smart card.}one{Awtomatiko kang masa-sign out sa loob ng # segundo.
 Inaatasan ka ng <ph name="DOMAIN" /> na panatilihing nakalagay ang iyong smart card.}other{Awtomatiko kang masa-sign out sa loob ng # na segundo.
@@ -1306,6 +1307,7 @@
 <translation id="2220409419896228519">Magdagdag ng mga bookmark sa iyong paboritong Google Apps</translation>
 <translation id="2220529011494928058">Mag-ulat ng isyu</translation>
 <translation id="2220572644011485463">PIN o password</translation>
+<translation id="222115440608612541">Magpalit ng tema sa pagsikat at paglubog ng araw</translation>
 <translation id="2221261048068091179"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" /></translation>
 <translation id="222201875806112242">Walang pangalan na media source</translation>
 <translation id="2224444042887712269">Ang setting na ito ay kay <ph name="OWNER_EMAIL" />.</translation>
@@ -1534,6 +1536,7 @@
 <translation id="241082044617551207">Hindi kilalang plugin</translation>
 <translation id="2412753904894530585">Kerberos</translation>
 <translation id="2416435988630956212">Mga function key ng keyboard</translation>
+<translation id="2418307627282545839">Panatilihing maliwanag at maaliwalas ang mga bagay</translation>
 <translation id="2419131370336513030">Tingnan ang mga naka-install na app</translation>
 <translation id="2419706071571366386">Para sa seguridad, mag-sign out kapag hindi ginagamit ang iyong computer.</translation>
 <translation id="2422125132043002186">Nakansela ang pag-restore ng Linux</translation>
@@ -6048,6 +6051,7 @@
 <translation id="6895032998810961280">Mag-ulat ng mga detalye sa Google tungkol sa mapaminsalang software, setting ng system, at prosesong nahanap sa iyong computer sa panahon ng paglilinis na ito</translation>
 <translation id="6896758677409633944">Copy</translation>
 <translation id="6897363604023044284">Pumili ng mga site na iki-clear</translation>
+<translation id="6897688156970667447">Makakatulong kapag madilim at nakakatipid ng baterya</translation>
 <translation id="6898440773573063262">Maaari na ngayong i-configure ang mga kiosk application na mag-auto-launch sa device na ito.</translation>
 <translation id="6900284862687837908">Background App: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">Enhanced protection</translation>
@@ -7536,6 +7540,7 @@
 <translation id="8358685469073206162">Ipanumbalik ang mga page?</translation>
 <translation id="8358912028636606457">Hindi sinusuportahan sa device na ito ang pag-cast ng audio ng tab.</translation>
 <translation id="835951711479681002">I-save sa iyong Google Account</translation>
+<translation id="8360140320636871023">I-personalize ang tema ng iyong display</translation>
 <translation id="8363095875018065315">matatag</translation>
 <translation id="8363142353806532503">Naka-block ang mikropono</translation>
 <translation id="8366396658833131068">Naipanumbalik na ang connectivity ng iyong network. Mangyaring pumili ng ibang network o pindutin ang button sa ibaba na 'Magpatuloy' upang ilunsad ang iyong kiosk app.</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 31e4c87a..cceae64 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -180,6 +180,7 @@
 <translation id="1166583374608765787">અપડેટ કરેલા નામનો રિવ્યૂ કરો</translation>
 <translation id="1166596238782048887"><ph name="DESK_TITLE" /> ડેસ્ક <ph name="TAB_TITLE" />ની માલિકી ધરાવે છે</translation>
 <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> માં ખુલી રહ્યું છે...</translation>
+<translation id="1169266963600477608">ગેમના નિયંત્રણો</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" />માં સંવેદનશીલ અથવા જોખમી ડેટા છે. તમારા વ્યવસ્થાપકના કહેવા પ્રમાણે: "<ph name="CUSTOM_MESSAGE" />"</translation>
 <translation id="1171135284592304528">ફેરફાર થવા પર કીબોર્ડ ફોકસ વડે ઑબ્જેક્ટને હાઇલાઇટ કરો</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> HID ડિવાઇસ સાથે કનેક્ટ કરવા માગે છે</translation>
@@ -3361,6 +3362,7 @@
 <translation id="4227605727325220318">નવો Android ફોન ઉમેરો</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{આ એક્સ્ટેન્શન મંજૂરી ધરાવતું નથી}one{આ એક્સ્ટેન્શન મંજૂરી ધરાવતું નથી}other{કેટલાક એક્સ્ટેન્શન મંજૂરી ધરાવતા નથી}}</translation>
 <translation id="4231095370974836764">Google Playમાંથી તમારા <ph name="DEVICE_TYPE" /> પર ઍપ અને ગેમ ઇન્સ્ટૉલ કરો. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">ગેમના નિયંત્રણો બંધ કરો</translation>
 <translation id="4232375817808480934">Kerberosની ગોઠવણી કરો</translation>
 <translation id="4235965441080806197">સાઇન ઇન રદ કરો</translation>
 <translation id="4236163961381003811">વધુ એક્સ્ટેન્શન વિશે શોધખોળ કરો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index 1a6b0f2..e7d90942 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -203,6 +203,7 @@
 <translation id="1188807932851744811">लॉग अपलोड नहीं किया गया.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{अपने कंप्‍यूटर पर स्टोर की गई कोई फ़ाइल एक्सेस करें}one{अपने कंप्‍यूटर पर स्टोर की गई # फ़ाइलें एक्सेस करें}other{अपने कंप्‍यूटर पर स्टोर की गई # फ़ाइलें एक्सेस करें}}</translation>
 <translation id="119092896208640858">ब्राउजिंग डेटा को सिर्फ़ इस डिवाइस से साफ़ करने और अपने 'Google खाते' में रखने के लिए, <ph name="BEGIN_LINK" />साइन आउट करें<ph name="END_LINK" />.</translation>
+<translation id="1191353342579061195">अपनी ज़रूरतों के मुताबिक थीम चुनें. अपनी थीम, वॉलपेपर, स्क्रीन सेवर वगैरह बदलने के लिए, बस डेस्कटॉप पर दायां क्लिक करें.</translation>
 <translation id="1192706927100816598">{0,plural, =1{आप अगले # सेकंड में अपने-आप साइन आउट हो जाएंगे.
 <ph name="DOMAIN" /> के लिए ज़रूरी है कि आप अपना स्मार्ट कार्ड डालकर रखें.}one{आप अगले # सेकंड में अपने-आप साइन आउट हो जाएंगे.
 <ph name="DOMAIN" /> के लिए ज़रूरी है कि आप अपना स्मार्ट कार्ड डालकर रखें.}other{आप अगले # सेकंड में अपने-आप साइन आउट हो जाएंगे.
@@ -1305,6 +1306,7 @@
 <translation id="2220409419896228519">अपने पसंदीदा Google ऐप्लिकेशन के बुकमार्क जोड़ें</translation>
 <translation id="2220529011494928058">किसी समस्या की रिपोर्ट करें</translation>
 <translation id="2220572644011485463">पिन या पासवर्ड</translation>
+<translation id="222115440608612541">सुबह और शाम के समय थीम बदलें</translation>
 <translation id="2221261048068091179"><ph name="FIRST_SWITCH" /> और <ph name="SECOND_SWITCH" /></translation>
 <translation id="222201875806112242">बिना लेबल वाला मीडिया सोर्स</translation>
 <translation id="2224444042887712269">यह सेटिंग <ph name="OWNER_EMAIL" /> से संबंधित है.</translation>
@@ -1533,6 +1535,7 @@
 <translation id="241082044617551207">अज्ञात प्लग इन</translation>
 <translation id="2412753904894530585">केर्बेरोस</translation>
 <translation id="2416435988630956212">कीबोर्ड के फ़ंक्शन बटन</translation>
+<translation id="2418307627282545839">ब्राइट और आंखों को सुकून देने वाली डिसप्ले थीम</translation>
 <translation id="2419131370336513030">इंस्टॉल किए गए ऐप्लिकेशन देखें</translation>
 <translation id="2419706071571366386">सुरक्षा के लिए, आपका कंप्यूटर इस्तेमाल में नहीं होने पर साइन आउट कर दें.</translation>
 <translation id="2422125132043002186">Linux का डेटा बहाल करने की प्रक्रिया रद्द कर दी गई है</translation>
@@ -6044,6 +6047,7 @@
 <translation id="6895032998810961280">नुकसान पहुंचाने वाले सॉफ़्टवेयर, सिस्टम की सेटिंग, और उन प्रक्रियाओं की पूरी रिपोर्ट Google को भेजें, जो हटाए जाने की इस प्रक्रिया में आपके कंप्यूटर पर मिली थीं</translation>
 <translation id="6896758677409633944">कॉपी बनाएं</translation>
 <translation id="6897363604023044284">डेटा मिटाने के लिए साइटें चुनें</translation>
+<translation id="6897688156970667447">कम रोशनी में स्क्रीन देखने में आसानी होती है और बैटरी कम खर्च होती है</translation>
 <translation id="6898440773573063262">किओस्क ऐप्लिकेशन अब इस डिवाइस परअपने-आपलॉन्च होने के लिए कॉन्फ़िगर किए जा सकते हैं.</translation>
 <translation id="6900284862687837908">बैकग्राउंड ऐप्लिकेशन: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">बेहतर सुरक्षा मोड</translation>
@@ -7531,6 +7535,7 @@
 <translation id="8358685469073206162">सभी पेज वापस लाएं?</translation>
 <translation id="8358912028636606457">टैब ऑडियो कास्ट करने की सुविधा इस डिवाइस पर काम नहीं करती.</translation>
 <translation id="835951711479681002">अपने Google खाते में सेव करें</translation>
+<translation id="8360140320636871023">अपनी पसंद के हिसाब से, डिसप्ले थीम सेट करें</translation>
 <translation id="8363095875018065315">स्‍थिर</translation>
 <translation id="8363142353806532503">माइक्रोफ़ोन ब्लॉक किया गया है</translation>
 <translation id="8366396658833131068">आपका नेटवर्क कनेक्शन रिस्टोर हो गया है. कृपया अपना किओस्क ऐप्लिकेशन लॉन्च करने के लिए कोई दूसरा नेटवर्क चुनें या नीचे दिया गया 'जारी रखें' बटन दबाएं.</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index d52019d..22dee477 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -202,6 +202,7 @@
 <translation id="1188807932851744811">Zapisnik nije prenesen.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Pristup datoteci spremljenoj na računalu}one{Pristup do # datoteke spremljene na računalu}few{Pristup do # datoteke spremljene na računalu}other{Pristup do # datoteka spremljenih na računalu}}</translation>
 <translation id="119092896208640858">Da biste podatke o pregledavanju izbrisali samo s ovog uređaja, a zadržali ih na svojem Google računu, <ph name="BEGIN_LINK" />odjavite se<ph name="END_LINK" />.</translation>
+<translation id="1191353342579061195">Odaberite temu koja odgovara vašim potrebama. Da biste promijenili temu, pozadinu, čuvar zaslona i drugo, jednostavno kliknite desnom tipkom na radnoj površini.</translation>
 <translation id="1192706927100816598">{0,plural, =1{Automatski ćete se odjaviti za # sekundu.
 <ph name="DOMAIN" /> zahtijeva da vaša pametna kartica ostane umetnuta.}one{Automatski ćete se odjaviti za # sekundu.
 <ph name="DOMAIN" /> zahtijeva da vaša pametna kartica ostane umetnuta.}few{Automatski ćete se odjaviti za # sekunde.
@@ -1295,6 +1296,7 @@
 <translation id="2220409419896228519">Dodajte oznake svojim omiljenim Googleovim aplikacijama</translation>
 <translation id="2220529011494928058">Prijavite poteškoću</translation>
 <translation id="2220572644011485463">PIN ili zaporka</translation>
+<translation id="222115440608612541">Promjena teme kad sunce izađe i zađe</translation>
 <translation id="2221261048068091179"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" /></translation>
 <translation id="222201875806112242">Neimenovan medijski izvor</translation>
 <translation id="2224444042887712269">Ova postavka pripada korisniku <ph name="OWNER_EMAIL" />.</translation>
@@ -1521,6 +1523,7 @@
 <translation id="241082044617551207">Nepoznati dodatak</translation>
 <translation id="2412753904894530585">Kerberos</translation>
 <translation id="2416435988630956212">Funkcijske tipke na tipkovnici</translation>
+<translation id="2418307627282545839">Sve je svijetlo i jasno</translation>
 <translation id="2419131370336513030">Pregled instaliranih aplikacija</translation>
 <translation id="2419706071571366386">Iz sigurnosnih razloga odjavite se kad ne upotrebljavate računalo.</translation>
 <translation id="2422125132043002186">Otkazano je vraćanje Linuxa</translation>
@@ -6033,6 +6036,7 @@
 <translation id="6895032998810961280">Prijavljujte pojedinosti Googleu o štetnom softveru, postavkama sustava i procesima pronađenim na računalu tijekom čišćenja</translation>
 <translation id="6896758677409633944">Kopiraj</translation>
 <translation id="6897363604023044284">Odaberite web-lokacije za brisanje</translation>
+<translation id="6897688156970667447">Korisno pri slabom osvjetljenju i štedi bateriju</translation>
 <translation id="6898440773573063262">Aplikacije kioska sada je moguće konfigurirati za automatsko pokretanje na ovom uređaju.</translation>
 <translation id="6900284862687837908">Aplikacija u pozadini: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">Poboljšana zaštita</translation>
@@ -7520,6 +7524,7 @@
 <translation id="8358685469073206162">Želite li vratiti stranice?</translation>
 <translation id="8358912028636606457">Kartica audio sustava za emitiranje nije podržana na ovom uređaju.</translation>
 <translation id="835951711479681002">Spremi na Google račun</translation>
+<translation id="8360140320636871023">Prilagodite temu zaslona</translation>
 <translation id="8363095875018065315">stabilan</translation>
 <translation id="8363142353806532503">Mikrofon je blokiran</translation>
 <translation id="8366396658833131068">Veza s mrežom ponovno je uspostavljena. Odaberite neku drugu mrežu ili pritisnite gumb "Nastavi" u nastavku kako biste pokrenuli aplikaciju kioska.</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index b6d04d6..e693672 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">Névvel módosításának áttekintése</translation>
 <translation id="1166596238782048887">A(z) <ph name="TAB_TITLE" /> a következő számítógéphez tartozik: <ph name="DESK_TITLE" /></translation>
 <translation id="1168020859489941584">Megnyitás <ph name="TIME_REMAINING" /> múlva...</translation>
+<translation id="1169266963600477608">Játékvezérlők</translation>
 <translation id="1169435433292653700">A(z) <ph name="FILE_NAME" /> bizalmas vagy veszélyes adatokat tartalmaz. A rendszergazda üzenete: „<ph name="CUSTOM_MESSAGE" />“</translation>
 <translation id="1171135284592304528">Az elem kiemelése a billentyűzetfókusszal, ha módosul</translation>
 <translation id="1171515578268894665">A(z) <ph name="ORIGIN" /> HID-eszközhöz szeretne csatlakozni</translation>
@@ -3375,6 +3376,7 @@
 <translation id="4227605727325220318">Új androidos telefon hozzáadása</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Ez a bővítmény nem engedélyezett}other{Egyes bővítmények nem engedélyezettek}}</translation>
 <translation id="4231095370974836764">Alkalmazásokat és játékokat telepíthet a Google Playről <ph name="DEVICE_TYPE" /> eszközére. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">Játékvezérlők bezárása</translation>
 <translation id="4232375817808480934">A Kerberos konfigurálása</translation>
 <translation id="4235965441080806197">Bejelentkezés megszakítása</translation>
 <translation id="4236163961381003811">További bővítmények felfedezése</translation>
@@ -3639,6 +3641,7 @@
 <translation id="449232563137139956">A webhelyek illusztráció biztosítása érdekében általában képeket (például online áruházakról vagy újságcikkekről készült fotókat) jelenítenek meg</translation>
 <translation id="4492698018379445570">Ellenőrizze, hogy mit helyezett a bevásárlókosarába, és ha kész, fizethet</translation>
 <translation id="4493468155686877504">Ajánlott (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">Engedélyezi ezt a bővítményt a következő webhelyen: <ph name="SITE" />?</translation>
 <translation id="4495419450179050807">Ne jelenjen meg ezen az oldalon</translation>
 <translation id="4497145443434063861">A számítógép és a Chromecast különböző Wi-Fi-hálózatokon van (pl. 2,4 GHz
     és 5 GHz)</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 9cb6dd1..54f3614 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">Tinjau pembaruan nama</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> milik desktop <ph name="DESK_TITLE" /></translation>
 <translation id="1168020859489941584">Dibuka dalam waktu <ph name="TIME_REMAINING" />...</translation>
+<translation id="1169266963600477608">Kontrol game</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> berisi data sensitif atau berbahaya. Administrator Anda menyatakan: "<ph name="CUSTOM_MESSAGE" />"</translation>
 <translation id="1171135284592304528">Sorot objek dengan fokus keyboard saat berubah</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> ingin terhubung ke perangkat HID</translation>
@@ -3378,6 +3379,7 @@
 <translation id="4227605727325220318">Tambahkan ponsel Android baru</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Ekstensi ini tidak diizinkan}other{Beberapa ekstensi tidak diizinkan}}</translation>
 <translation id="4231095370974836764">Instal aplikasi dan game dari Google Play di <ph name="DEVICE_TYPE" /> Anda. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">Tutup kontrol game</translation>
 <translation id="4232375817808480934">Konfigurasikan Kerberos</translation>
 <translation id="4235965441080806197">Batalkan proses masuk</translation>
 <translation id="4236163961381003811">Temukan lebih banyak ekstensi</translation>
@@ -3642,6 +3644,7 @@
 <translation id="449232563137139956">Situs biasanya menampilkan gambar untuk memberikan ilustrasi, seperti foto untuk toko online atau artikel berita</translation>
 <translation id="4492698018379445570">Temukan yang Anda tambahkan ke keranjang belanja dan check out jika sudah siap</translation>
 <translation id="4493468155686877504">Direkomendasikan (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">Izinkan ekstensi ini di <ph name="SITE" />?</translation>
 <translation id="4495419450179050807">Jangan tampilkan pada halaman ini</translation>
 <translation id="4497145443434063861">PC dan Chromecast di jaringan Wi-Fi yang berbeda (misalnya 2,4 GHz
     vs. 5 GHz)</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index 09bd1206..0000fac 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">Fara yfir uppfærslu heitis</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> tilheyrir skrifborðinu <ph name="DESK_TITLE" /></translation>
 <translation id="1168020859489941584">Opnar í <ph name="TIME_REMAINING" />...</translation>
+<translation id="1169266963600477608">Leikjastýringar</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> inniheldur viðkvæm eða hættuleg gögn. Kerfisstjórinn þinn segir: „<ph name="CUSTOM_MESSAGE" />“</translation>
 <translation id="1171135284592304528">Auðkenna hlutinn með lyklaborðsfókus þegar hann breytist</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> vill tengjast við HID-tæki</translation>
@@ -3378,6 +3379,7 @@
 <translation id="4227605727325220318">Bæta við nýjum Android síma</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Þessi viðbót er bönnuð}one{Sumar viðbætur eru bannaðar}other{Sumar viðbætur eru bannaðar}}</translation>
 <translation id="4231095370974836764">Settu upp forrit og leiki af Google Play í <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">Loka leikjastýringum</translation>
 <translation id="4232375817808480934">Stilla Kerberos</translation>
 <translation id="4235965441080806197">Hætta við innskráningu</translation>
 <translation id="4236163961381003811">Sjá fleiri viðbætur</translation>
@@ -3642,6 +3644,7 @@
 <translation id="449232563137139956">Vefsvæði sýna yfirleitt myndir til myndskreytingar, t.d. myndir fyrir netverslanir eða fréttagreinar.</translation>
 <translation id="4492698018379445570">Finndu það sem þú settir í innkaupakörfur og gakktu frá kaupum þegar þér hentar</translation>
 <translation id="4493468155686877504">Ráðlagt (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">Leyfa þessa viðbót á <ph name="SITE" />?</translation>
 <translation id="4495419450179050807">Ekki sýna á þessari síðu</translation>
 <translation id="4497145443434063861">Tölvan og Chromecast á mismunandi Wi-Fi neti (t.d. 2,4 GHz
     og 5 GHz)</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 6869bc0..fcdc6f1 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -3627,6 +3627,7 @@
 <translation id="449232563137139956">In genere, i siti mostrano immagini per fornire un'illustrazione come foto per negozi online o articoli di notizie</translation>
 <translation id="4492698018379445570">Trova gli articoli aggiunti ai carrelli degli acquisti ed esegui il pagamento quando vuoi procedere</translation>
 <translation id="4493468155686877504">Consigliato (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">Vuoi consentire questa estensione su <ph name="SITE" />?</translation>
 <translation id="4495419450179050807">Non visualizzare in questa pagina</translation>
 <translation id="4497145443434063861">PC e Chromecast sono collegati a reti Wi-Fi diverse (ad esempio 2,4 GHz e 5 GHz)</translation>
 <translation id="4500114933761911433">Arresto anomalo di <ph name="PLUGIN_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 5fd0ab5f..215cef21 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -180,6 +180,7 @@
 <translation id="1166583374608765787">新しい名前を確認</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> はデスク <ph name="DESK_TITLE" /> に含まれています</translation>
 <translation id="1168020859489941584">後 <ph name="TIME_REMAINING" />でファイルが開きます...</translation>
+<translation id="1169266963600477608">ゲーム操作キー</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> には機密データまたは危険なデータが含まれています。管理者からのメッセージ:「<ph name="CUSTOM_MESSAGE" />」</translation>
 <translation id="1171135284592304528">キーボード フォーカスの移動に合わせて項目を強調表示する</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> が HID デバイスへの接続を要求しています</translation>
@@ -3354,6 +3355,7 @@
 <translation id="4227605727325220318">新しい Android スマートフォンを追加</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{この拡張機能は許可されていません}other{一部の拡張機能は許可されていません}}</translation>
 <translation id="4231095370974836764">Google Play のアプリとゲームを <ph name="DEVICE_TYPE" /> にインストールします。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">ゲーム操作キーを閉じる</translation>
 <translation id="4232375817808480934">Kerberos の設定</translation>
 <translation id="4235965441080806197">ログインをキャンセル</translation>
 <translation id="4236163961381003811">他の拡張機能を見る</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index c229aa9..971246c9 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -3623,6 +3623,7 @@
 <translation id="449232563137139956">Сайттар әдетте онлайн дүкендер немесе жаңалықтарға арналған фотосуреттер сияқты суреттерді көрсетеді.</translation>
 <translation id="4492698018379445570">Сатып алу себетіңізде не бар екенін көріңіз және бәрі дайын болғанда төлем жасаңыз.</translation>
 <translation id="4493468155686877504">Ұсынылған (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180"><ph name="SITE" /> сайтында бұл кеңейтімді пайдалануға рұқсат берілсін бе?</translation>
 <translation id="4495419450179050807">Бұл бетте көрсетпеу</translation>
 <translation id="4497145443434063861">Әртүрлі Wi-Fi желілеріндегі ДК және Chromecast (мысалы, 2,4 ГГц және 5 ГГц)</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> бұзылды</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb
index 81ee91d..4c1c364 100644
--- a/chrome/app/resources/generated_resources_km.xtb
+++ b/chrome/app/resources/generated_resources_km.xtb
@@ -204,6 +204,7 @@
 <translation id="1188807932851744811">កំណត់ត្រាមិនត្រូវបានទាញឡើងទេ។</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{ចូលប្រើឯកសារដែលផ្ទុកលើកុំព្យូទ័ររបស់អ្នក។}other{ចូលប្រើឯកសារ # ដែលផ្ទុកលើកុំព្យូទ័ររបស់អ្នក}}</translation>
 <translation id="119092896208640858">ដើម្បីសម្អាត​ទិន្នន័យ​រុករក​ចេញពី​ឧបករណ៍​នេះ ​តែរក្សាទុក​វានៅក្នុងគណនី Google របស់អ្នក <ph name="BEGIN_LINK" />សូមចាកចេញ<ph name="END_LINK" />។</translation>
+<translation id="1191353342579061195">ជ្រើសរើស​រចនាប័ទ្ម​ដែល​ស្រប​តាម​តម្រូវការ​របស់អ្នក។ ដើម្បីប្ដូរ​រចនាប័ទ្ម ផ្ទាំងរូបភាព ធាតុរក្សាអេក្រង់ និង​អ្វីៗជាច្រើនទៀត គ្រាន់តែ​ចុច​កណ្ដុរ​ខាងស្ដាំ​នៅលើ​អេក្រង់ដើម។</translation>
 <translation id="1192706927100816598">{0,plural, =1{អ្នក​នឹងត្រូវបាន​នាំចេញ​ដោយស្វ័យប្រវត្តិ​ក្នុងរយៈពេល # វិនាទី​ទៀត​។
 <ph name="DOMAIN" /> តម្រូវឱ្យ​អ្នក​បន្តដោត​កាតឆ្លាតវៃ​របស់អ្នក។}other{អ្នក​នឹងត្រូវបាន​នាំចេញ​ដោយស្វ័យប្រវត្តិ​ក្នុងរយៈពេល # វិនាទី​ទៀត​។
 <ph name="DOMAIN" /> តម្រូវឱ្យ​អ្នក​បន្តដោត​កាតឆ្លាតវៃ​របស់អ្នក។}}</translation>
@@ -1305,6 +1306,7 @@
 <translation id="2220409419896228519">បញ្ចូល​ចំណាំទៅក្នុងកម្មវិធី Google ដែល​អ្នក​ពេញចិត្ត</translation>
 <translation id="2220529011494928058">រាយការណ៍ពីបញ្ហា</translation>
 <translation id="2220572644011485463">កូដ PIN ឬពាក្យសម្ងាត់</translation>
+<translation id="222115440608612541">ប្ដូរ​រចនាប័ទ្ម​នៅពេល​ថ្ងៃរះ និង​ថ្ងៃលិច</translation>
 <translation id="2221261048068091179"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" /></translation>
 <translation id="222201875806112242">ប្រភពមេឌៀគ្មានឈ្មោះ</translation>
 <translation id="2224444042887712269">ការកំណត់នេះជាកម្មសិទ្ធិ <ph name="OWNER_EMAIL" />។</translation>
@@ -1533,6 +1535,7 @@
 <translation id="241082044617551207">កម្មវិធីជំនួយដែលមិនស្គាល់</translation>
 <translation id="2412753904894530585">Kerberos</translation>
 <translation id="2416435988630956212">គ្រាប់ចុច​មុខងារ​នៅលើក្ដារចុច</translation>
+<translation id="2418307627282545839">រក្សាអ្វីៗ​ឱ្យ​ភ្លឺ និង​មានខ្យល់ចេញចូល</translation>
 <translation id="2419131370336513030">មើល​កម្មវិធីដែលបានដំឡើង</translation>
 <translation id="2419706071571366386">ដើម្បីរក្សា​សុវត្ថិភាព សូមចាកចេញពីគណនី​នៅពេលមិនប្រើប្រាស់​កុំព្យូទ័រ​។</translation>
 <translation id="2422125132043002186">បានបោះបង់​ការស្ដារ Linux</translation>
@@ -6046,6 +6049,7 @@
 <translation id="6895032998810961280">រាយការណ៍ព័ត៌មាន​លម្អិតទៅ Google អំពីកម្មវិធី​បង្កគ្រោះថ្នាក់ ការកំណត់ប្រព័ន្ធ និងដំណើរការ​ដែលបានរកឃើញ​នៅលើកុំព្យូទ័ររបស់អ្នក​អំឡុងពេលការសម្អាតនេះ</translation>
 <translation id="6896758677409633944">ចម្លង</translation>
 <translation id="6897363604023044284">ជ្រើសរើស​គេហទំព័រ ដើម្បី​សម្អាត​ទិន្នន័យ​ដែលបាន​រក្សាទុក</translation>
+<translation id="6897688156970667447">មានប្រយោជន៍​នៅពេល​មាន​ពន្លឺ​តិច និង​សន្សំ​ថ្ម</translation>
 <translation id="6898440773573063262">កម្មវិធីបញ្ជអាចត្រូវបានតំឡើងទៅការបើកដំណើរការស្វ័យប្រវត្តិនៅលើឧបករណ៍នេះឥឡូវនេះ។</translation>
 <translation id="6900284862687837908">កម្មវិធីផ្ទៃខាងក្រោយ៖ <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">ការការពារ​ដែលប្រសើរជាងមុន</translation>
@@ -7533,6 +7537,7 @@
 <translation id="8358685469073206162">ស្តារទំព័រ?</translation>
 <translation id="8358912028636606457">មិនអាចប្រើ​ការបញ្ជូន​សំឡេងរបស់ផ្ទាំង​នៅលើឧបករណ៍​នេះបានទេ។</translation>
 <translation id="835951711479681002">រក្សាទុកនៅក្នុងគណនី Google របស់អ្នក</translation>
+<translation id="8360140320636871023">កំណត់​រចនាប័ទ្ម​នៃ​ការបង្ហាញ​ឱ្យស្រប​នឹង​អ្នក</translation>
 <translation id="8363095875018065315">ថេរ</translation>
 <translation id="8363142353806532503">បាន​ទប់ស្កាត់​មីក្រូហ្វូន</translation>
 <translation id="8366396658833131068">ការភ្ជាប់បណ្តាញរបសអ្នកត្រូវបានស្តារ។ សូមជ្រើសរើសបណ្តាញផ្សេងទៀត ឬចុចប៊ូតុង 'បន្ត' ខាងក្រោមដើម្បីបើកដំណើរការកម្មវិធីបញ្ជរបស់អ្នក។</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index ea4cc96..5a8c40dc 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">ಹೆಸರಿನ ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ</translation>
 <translation id="1166596238782048887"><ph name="DESK_TITLE" /> ಡೆಸ್ಕ್‌ಗೆ <ph name="TAB_TITLE" /> ಸೇರಿದೆ</translation>
 <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> ನಲ್ಲಿ ತೆರೆದುಕೊಳ್ಳುತ್ತಿದೆ...</translation>
+<translation id="1169266963600477608">ಗೇಮ್‌ನ ನಿಯಂತ್ರಣಗಳು</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> ಸೂಕ್ಷ್ಮ ಅಥವಾ ಅಪಾಯಕಾರಿ ಡೇಟಾವನ್ನು ಒಳಗೊಂಡಿದೆ. ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಹೀಗೆ ಹೇಳುತ್ತಾರೆ: "<ph name="CUSTOM_MESSAGE" />"</translation>
 <translation id="1171135284592304528">ಆಬ್ಜೆಕ್ಟ್ ಬದಲಾದಾಗ ಕೀಬೋರ್ಡ್ ಫೋಕಸ್ ಬಳಸಿಕೊಂಡು ಅದನ್ನು ಹೈಲೈಟ್ ಮಾಡಿ</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> HID ಸಾಧನಕ್ಕೆ ಸಂಪರ್ಕಿಸಲು ಬಯಸುತ್ತದೆ</translation>
@@ -203,6 +204,7 @@
 <translation id="1188807932851744811">ಲಾಗ್ ಅನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಿಲ್ಲ.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಫೈಲ್ ಅನ್ನು ಪ್ರವೇಶಿಸಿ}one{ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ # ಫೈಲ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ}other{ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ # ಫೈಲ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ}}</translation>
 <translation id="119092896208640858">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು Google ಖಾತೆಯಲ್ಲಿ ಇರಿಸಿಕೊಂಡು, ಅದನ್ನು ಈ ಸಾಧನದಿಂದ ಮಾತ್ರ ತೆರವುಗೊಳಿಸಲು, <ph name="BEGIN_LINK" />ಸೈನ್ ಔಟ್<ph name="END_LINK" /> ಮಾಡಿ.</translation>
+<translation id="1191353342579061195">ನಿಮ್ಮ ಅಗತ್ಯಗಳಿಗೆ ಸರಿಹೊಂದುವ ಥೀಮ್ ಆಯ್ಕೆಮಾಡಿ. ನಿಮ್ಮ ಥೀಮ್, ವಾಲ್‌ಪೇಪರ್‌, ಸ್ಕ್ರೀನ್ ಸೇವರ್ ಮತ್ತು ಇತ್ಯಾದಿಗಳನ್ನು ಬದಲಾಯಿಸಲು, ಡೆಸ್ಕ್‌ಟಾಪ್ ಮೇಲೆ ಬಲ-ಕ್ಲಿಕ್ ಮಾಡಿದರೆ ಸಾಕು.</translation>
 <translation id="1192706927100816598">{0,plural, =1{ನೀವು # ಸೆಕೆಂಡಿನಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೈನ್ ಔಟ್ ಆಗುತ್ತೀರಿ.
 <ph name="DOMAIN" />, ನಿಮ್ಮ ಸ್ಮಾರ್ಟ್ ಕಾರ್ಡ್ ಅನ್ನು ಸೇರಿಸಬೇಕೆಂದು ಬಯಸುತ್ತದೆ.}one{ನೀವು # ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೈನ್ ಔಟ್ ಆಗುತ್ತೀರಿ.
 <ph name="DOMAIN" />, ನಿಮ್ಮ ಸ್ಮಾರ್ಟ್ ಕಾರ್ಡ್ ಅನ್ನು ಸೇರಿಸಬೇಕೆಂದು ಬಯಸುತ್ತದೆ.}other{ನೀವು # ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೈನ್ ಔಟ್ ಆಗುತ್ತೀರಿ.
@@ -1297,6 +1299,7 @@
 <translation id="2220409419896228519">ನಿಮ್ಮ ಮೆಚ್ಚಿನ Google ಆ್ಯಪ್‌ಗಳಿಗೆ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ಸೇರಿಸಿ</translation>
 <translation id="2220529011494928058">ಸಮಸ್ಯೆ ವರದಿಮಾಡಿ</translation>
 <translation id="2220572644011485463">ಪಿನ್ ಅಥವಾ ಪಾಸ್‌ವರ್ಡ್</translation>
+<translation id="222115440608612541">ಸೂರ್ಯೋದಯ ಮತ್ತು ಸೂರ್ಯಾಸ್ತದ ಸಮಯದಲ್ಲಿ ಥೀಮ್‌ಗಳನ್ನು ಬದಲಿಸಿ</translation>
 <translation id="2221261048068091179"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" /></translation>
 <translation id="222201875806112242">ಹೆಸರಿಸದ ಮಾಧ್ಯಮ ಮೂಲ</translation>
 <translation id="2224444042887712269">ಈ ಸೆಟ್ಟಿಂಗ್ <ph name="OWNER_EMAIL" /> ಗೆ ಸೇರಿರುತ್ತದೆ.</translation>
@@ -1525,6 +1528,7 @@
 <translation id="241082044617551207">ಅಪರಿಚಿತ ಪ್ಲಗ್-ಇನ್</translation>
 <translation id="2412753904894530585">Kerberos</translation>
 <translation id="2416435988630956212">ಕೀಬೋರ್ಡ್ ಫಂಕ್ಷನ್ ಕೀಗಳು</translation>
+<translation id="2418307627282545839">ಎಲ್ಲವನ್ನೂ ಪ್ರಕಾಶಮಾನ ಮತ್ತು ಉಲ್ಲಾಸಕರವಾಗಿರಿಸಿ</translation>
 <translation id="2419131370336513030">ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿದ ಆ್ಯಪ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ</translation>
 <translation id="2419706071571366386">ಸುರಕ್ಷತೆಗಾಗಿ, ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಬಳಕೆಯಾಗದೆ ಇದ್ದಾಗ ಸೈನ್ ಔಟ್ ಮಾಡಿ.</translation>
 <translation id="2422125132043002186">Linux ಮರುಸ್ಥಾಪನೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ</translation>
@@ -3371,6 +3375,7 @@
 <translation id="4227605727325220318">ಹೊಸ Android ಫೋನ್ ಸೇರಿಸಿ</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{ಈ ವಿಸ್ತರಣೆಯನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ}one{ಕೆಲವು ವಿಸ್ತರಣೆಗಳನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ}other{ಕೆಲವು ವಿಸ್ತರಣೆಗಳನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ}}</translation>
 <translation id="4231095370974836764">Google Play ನಿಂದ ಆ್ಯಪ್‌ಗಳು ಹಾಗೂ ಗೇಮ್‌ಗಳನ್ನು ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ನಲ್ಲಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">ಗೇಮ್‌ನ ನಿಯಂತ್ರಣಗಳನ್ನು ಮುಚ್ಚಿರಿ</translation>
 <translation id="4232375817808480934">Kerberos ಕಾನ್ಫಿಗರ್ ಮಾಡಿ</translation>
 <translation id="4235965441080806197">ಸೈನ್‌ ಇನ್ ಮಾಡುವುದನ್ನು ರದ್ದುಮಾಡಿ</translation>
 <translation id="4236163961381003811">ಇನ್ನಷ್ಟು ವಿಸ್ತರಣೆಗಳನ್ನು ಅನ್ವೇಷಿಸಿ</translation>
@@ -6039,6 +6044,7 @@
 <translation id="6895032998810961280">ಈ ಸ್ವಚ್ಛಗೊಳಿಸುವಿಕೆಯ ಸಂದರ್ಭದಲ್ಲಿ, ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಪತ್ತೆಯಾದ ಹಾನಿಕಾರಕ ಸಾಫ್ಟ್‌ವೇರ್, ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗಳ ಕುರಿತಾದ ವಿವರಗಳನ್ನು Google ಗೆ ವರದಿ ಮಾಡಿ</translation>
 <translation id="6896758677409633944">ನಕಲಿಸು</translation>
 <translation id="6897363604023044284">ಸೈಟ್‌ಗಳನ್ನು ತೆರವುಗೊಳಿಸಲು ಆಯ್ಕೆಮಾಡಿ</translation>
+<translation id="6897688156970667447">ಕಡಿಮೆ ಬೆಳಕಿದ್ದಾಗ ಉಪಯುಕ್ತ ಮತ್ತು ಬ್ಯಾಟರಿ ಉಳಿಸುತ್ತದೆ</translation>
 <translation id="6898440773573063262">ಕಿಯೋಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಇದೀಗ ಈ ಸಾಧನದಲ್ಲಿ ಸ್ವಯಂ-ಪ್ರಾರಂಭಿಸಲು ಕಾನ್ಫಿಗರ್ ಮಾಡಬಹುದು.</translation>
 <translation id="6900284862687837908">ಹಿನ್ನೆಲೆ ಅಪ್ಲಿಕೇಶನ್: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">ವರ್ಧಿತ ಸುರಕ್ಷತೆ</translation>
@@ -7524,6 +7530,7 @@
 <translation id="8358685469073206162">ಪುಟಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸುವುದೆ?</translation>
 <translation id="8358912028636606457">ಈ ಸಾಧನದಲ್ಲಿ ಟ್ಯಾಬ್ ಆಡಿಯೋ ಬಿತ್ತರಿಸುವಿಕೆಗೆ ಬೆಂಬಲವಿಲ್ಲ.</translation>
 <translation id="835951711479681002">ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಿ</translation>
+<translation id="8360140320636871023">ನಿಮ್ಮ ಡಿಸ್‌ಪ್ಲೇ ಥೀಮ್ ಅನ್ನು ವೈಯಕ್ತಿಕಗೊಳಿಸಿ</translation>
 <translation id="8363095875018065315">ಸ್ಥಿರ</translation>
 <translation id="8363142353806532503">ಮೈಕ್ರೊಫೋನ್ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation>
 <translation id="8366396658833131068">ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್‌ ಸಂಪರ್ಕವನ್ನು ಮರುಸ್ಥಾಪಿಸಲಾಗಿದೆ. ದಯವಿಟ್ಟು ಬೇರೊಂದು ನೆಟ್‌ವರ್ಕ್‌ ಆಯ್ಕೆಮಾಡಿ ಅಥವಾ ನಿಮ್ಮ ಕಿಯೋಸ್ಕ್‌ ಅಪ್ಲಿಕೇಶನ್‌ ಪ್ರಾರಂಭಿಸಲು ಕೆಳಗಿರುವ 'ಮುಂದುವರಿಸು' ಬಟನ್‌ ಕ್ಲಿಕ್ ಮಾಡಿ.</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 1d6530b..2e536c8 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">이름 업데이트 검토</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> 탭이 <ph name="DESK_TITLE" /> 데스크로 이동했습니다</translation>
 <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> 후에 파일이 열립니다...</translation>
+<translation id="1169266963600477608">게임 컨트롤</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> 파일에 민감하거나 위험한 데이터가 포함되어 있습니다. 관리자의 메시지: "<ph name="CUSTOM_MESSAGE" />"</translation>
 <translation id="1171135284592304528">키보드 포커스가 이동할 때 키보드 포커스가 있는 객체를 강조표시합니다.</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" />에서 HID 기기에 연결하려고 합니다.</translation>
@@ -3377,6 +3378,7 @@
 <translation id="4227605727325220318">새 Android 휴대전화 추가</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{확장 프로그램이 허용되지 않음}other{일부 확장 프로그램이 허용되지 않음}}</translation>
 <translation id="4231095370974836764"><ph name="DEVICE_TYPE" />에서 Google Play 앱 및 게임을 설치하세요. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">게임 컨트롤 닫기</translation>
 <translation id="4232375817808480934">Kerberos 설정</translation>
 <translation id="4235965441080806197">로그인 취소</translation>
 <translation id="4236163961381003811">더 많은 확장 프로그램 찾아보기</translation>
@@ -3641,6 +3643,7 @@
 <translation id="449232563137139956">사이트에서는 일반적으로 이미지를 표시하여 온라인 상점 또는 뉴스 기사의 사진과 같은 삽화를 제공합니다.</translation>
 <translation id="4492698018379445570">장바구니에 추가한 항목을 살펴보고 준비가 되면 결제하세요.</translation>
 <translation id="4493468155686877504">권장 크기(<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180"><ph name="SITE" />에서 이 확장 프로그램을 허용하시겠습니까?</translation>
 <translation id="4495419450179050807">이 페이지에 표시하지 않음</translation>
 <translation id="4497145443434063861">PC와 Chromecast가 서로 다른 Wi-Fi 네트워크(예: 2.4GHz와 5GHz)에 연결됨</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" />이(가) 다운되었습니다</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index 81af25551..976c546ea 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">Аталышка киргизилген өзгөртүүнү карап көрүү</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> төмөнкүгө таандык: <ph name="DESK_TITLE" /></translation>
 <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> кийин ачылат…</translation>
+<translation id="1169266963600477608">Оюндун башкаруу элементтери</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> файлында купуя же кооптуу маалымат бар. Администраторуңуз мындай дейт: "<ph name="CUSTOM_MESSAGE" />"</translation>
 <translation id="1171135284592304528">Объект өзгөргөндө ал баскычтоп фокусу менен баса белгиленсин</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> HID түзмөгүнө туташканы жатат</translation>
@@ -3378,6 +3379,7 @@
 <translation id="4227605727325220318">Жаңы Android телефонун кошуу</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Бул кеңейтүүнү колдонууга тыюу салынган}other{Айрым кеңейтүүлөрдү колдонууга тыюу салынган}}</translation>
 <translation id="4231095370974836764">Google Play'ден колдонмолор менен оюндарды <ph name="DEVICE_TYPE" /> түзмөгүңүзгө орнотуп аласыз. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">Оюнду башкаруу элементтерин жабуу</translation>
 <translation id="4232375817808480934">Kerberos’ту конфигурациялоо</translation>
 <translation id="4235965441080806197">Аккаунтка кирүүнү жокко чыгаруу</translation>
 <translation id="4236163961381003811">Дагы башка кеңейтүүлөрдү карап көрүңүз</translation>
@@ -3642,6 +3644,7 @@
 <translation id="449232563137139956">Сайттар адатта маалыматты (мисалы, онлайн дүкөндөр же жаңы макалалар) иллюстрациялоо үчүн, сүрөттөрдү көрсөтөт</translation>
 <translation id="4492698018379445570">Себеттерде эмнелер бар экенин көрүп, даяр болгонуңузда төлөңүз</translation>
 <translation id="4493468155686877504">Сунушталат (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180"><ph name="SITE" /> сайтындагы бул кеңейтүү иштетилсинби?</translation>
 <translation id="4495419450179050807">Бул бетте көрүнбөсүн</translation>
 <translation id="4497145443434063861">Компьютер менен Chromecast ар башка Wi-Fi тармактарына туташып турат
     (мис. 2,4 Ггц – 5 Ггц)</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb
index 87ea599..274a4ec 100644
--- a/chrome/app/resources/generated_resources_lo.xtb
+++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">ກວດສອບການອັບເດດຊື່</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> ເປັນຂອງໂຕະ <ph name="DESK_TITLE" /></translation>
 <translation id="1168020859489941584">ກໍາລັງເປີດຢູ່ໃນ <ph name="TIME_REMAINING" />...</translation>
+<translation id="1169266963600477608">ການຄວບຄຸມເກມ</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> ມີຂໍ້ມູນທີ່ລະອຽດອ່ອນ ຫຼື ເປັນອັນຕະລາຍ. ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານເວົ້າວ່າ: "<ph name="CUSTOM_MESSAGE" />"</translation>
 <translation id="1171135284592304528">ໝາຍວັດຖຸດ້ວຍໂຟກັສແປ້ນພິມເມື່ອວັດຖຸນັ້ນປ່ຽນແປງ</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> ຕ້ອງການເຊື່ອມຕໍ່ອຸປະກອນ HID</translation>
@@ -3377,6 +3378,7 @@
 <translation id="4227605727325220318">ເພີ່ມໂທລະສັບ Android ໃໝ່</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{ບໍ່ອະນຸຍາດສ່ວນຂະຫຍາຍນີ້}other{ບໍ່ອະນຸຍາດສ່ວນຂະຫຍາຍບາງອັນ}}</translation>
 <translation id="4231095370974836764">ຕິດຕັ້ງແອັບ ແລະ ເກມຈາກ Google Play ໃນ <ph name="DEVICE_TYPE" /> ຂອງທ່ານ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">ປິດການຄວບຄຸມເກມ</translation>
 <translation id="4232375817808480934">ກຳນົດຄ່າ Kerberos</translation>
 <translation id="4235965441080806197">ຍົກເລີກການເຂົ້າສູ່ລະບົບ</translation>
 <translation id="4236163961381003811">ຄົ້ນພົບສ່ວນຂະຫຍາຍເພີ່ມເຕີມ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 768b6315..0d795e5 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">Peržiūrėkite atnaujintą pavadinimą</translation>
 <translation id="1166596238782048887">„<ph name="TAB_TITLE" />“ priklauso to darbalaukiui „<ph name="DESK_TITLE" />“</translation>
 <translation id="1168020859489941584">Atidaroma po <ph name="TIME_REMAINING" />...</translation>
+<translation id="1169266963600477608">Žaidimų valdikliai</translation>
 <translation id="1169435433292653700">Faile <ph name="FILE_NAME" /> yra neskelbtinų ar pavojingų duomenų. Administratorius sako: „<ph name="CUSTOM_MESSAGE" />“</translation>
 <translation id="1171135284592304528">Paryškinti objektą jį suaktyvinus klaviatūra, kai jis pasikeičia</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> nori prisijungti prie HID įrenginio</translation>
@@ -3384,6 +3385,7 @@
 <translation id="4227605727325220318">Pridėti naują „Android“ telefoną</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Šis plėtinys neleidžiamas}one{Keli plėtiniai neleidžiami}few{Keli plėtiniai neleidžiami}many{Keli plėtiniai neleidžiami}other{Keli plėtiniai neleidžiami}}</translation>
 <translation id="4231095370974836764">Diekite programas ir žaidimus iš „Google Play“ įrenginyje „<ph name="DEVICE_TYPE" />“. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">Uždaryti žaidimų valdiklius</translation>
 <translation id="4232375817808480934">Konfigūruoti „Kerberos“</translation>
 <translation id="4235965441080806197">Atšaukti prisijungimą</translation>
 <translation id="4236163961381003811">Žr. daugiau plėtinių</translation>
@@ -3648,6 +3650,7 @@
 <translation id="449232563137139956">Paprastai svetainėse rodomi vaizdai, norint teikti iliustracijas, pvz., internetinių parduotuvių ar naujienų straipsnių nuotraukas</translation>
 <translation id="4492698018379445570">Peržiūrėkite, ką įsidėjote į pirkinių krepšelius, ir apmokėkite, kai būsite pasiruošę</translation>
 <translation id="4493468155686877504">Rekomenduojama (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">Leisti šį plėtinį svetainėje <ph name="SITE" />?</translation>
 <translation id="4495419450179050807">Nerodyti šiame puslapyje</translation>
 <translation id="4497145443434063861">Asmeninis kompiuteris ir „Chromecast“ yra prijungti prie skirtingų „Wi-Fi“ tinklų (pvz., 2,4
     ir 5 GHz)</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 11ac508..9ab7ab9 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -180,6 +180,7 @@
 <translation id="1166583374608765787">Pārskatiet nosaukuma izmaiņas</translation>
 <translation id="1166596238782048887">“<ph name="TAB_TITLE" />” ir cilne no darbvietas “<ph name="DESK_TITLE" />”</translation>
 <translation id="1168020859489941584">Atveras <ph name="TIME_REMAINING" /> ...</translation>
+<translation id="1169266963600477608">Spēles vadīklas</translation>
 <translation id="1169435433292653700">Fails “<ph name="FILE_NAME" />” ietver sensitīvus vai bīstamus datus. Ziņojums no administratora: “<ph name="CUSTOM_MESSAGE" />”.</translation>
 <translation id="1171135284592304528">Izcelt objektu ar tastatūras fokusu, kad tas tiek mainīts</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> vēlas izveidot savienojumu ar HID ierīci</translation>
@@ -3365,6 +3366,7 @@
 <translation id="4227605727325220318">Pievienot jaunu Android tālruni</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Šis paplašinājums nav atļauts}zero{Daži paplašinājumi nav atļauti}one{Daži paplašinājumi nav atļauti}other{Daži paplašinājumi nav atļauti}}</translation>
 <translation id="4231095370974836764">Instalējiet lietotnes un spēles no pakalpojuma Google Play savā <ph name="DEVICE_TYPE" /> ierīcē. <ph name="LINK_BEGIN" />Uzziniet vairāk<ph name="LINK_END" />.</translation>
+<translation id="4231141543165771749">Aizvērt spēļu vadīklas</translation>
 <translation id="4232375817808480934">Kerberos konfigurēšana</translation>
 <translation id="4235965441080806197">Atcelt pierakstīšanos</translation>
 <translation id="4236163961381003811">Atklāt vairāk paplašinājumu</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb
index 8f4eb36..7a1a210 100644
--- a/chrome/app/resources/generated_resources_mk.xtb
+++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -204,6 +204,7 @@
 <translation id="1188807932851744811">Дневникот не се постави.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Пристап до датотека складирана на компјутерот}one{Пристап до # датотека складирана на компјутерот}other{Пристап до # датотеки складирани на компјутерот}}</translation>
 <translation id="119092896208640858">За да ги избришете податоците од прелистувањето само од овој уред, а притоа да ги задржите во вашата сметка на Google, <ph name="BEGIN_LINK" />одјавете се<ph name="END_LINK" />.</translation>
+<translation id="1191353342579061195">Изберете ја темата што одговара на вашите потреби. За да промените тема, тапет, заштитник на екран и друго, само кликнете со десното копче на работната површина.</translation>
 <translation id="1192706927100816598">{0,plural, =1{Автоматски ќе ве одјавиме по # секунда.
 <ph name="DOMAIN" /> бара паметната картичка да ви остане вметната.}one{Автоматски ќе ве одјавиме по # секунда.
 <ph name="DOMAIN" /> бара паметната картичка да ви остане вметната.}other{Автоматски ќе ве одјавиме по # секунди.
@@ -1306,6 +1307,7 @@
 <translation id="2220409419896228519">Додајте обележувачи во вашите омилени апликации на Google</translation>
 <translation id="2220529011494928058">Пријави проблем</translation>
 <translation id="2220572644011485463">PIN или лозинка</translation>
+<translation id="222115440608612541">Менувај ги темите на изгрејсонце и зајдисонце</translation>
 <translation id="2221261048068091179"><ph name="FIRST_SWITCH" /> <ph name="SECOND_SWITCH" /></translation>
 <translation id="222201875806112242">Неименуван извор на аудиовизуелни содржини</translation>
 <translation id="2224444042887712269">Оваа поставка припаѓа на <ph name="OWNER_EMAIL" />.</translation>
@@ -1534,6 +1536,7 @@
 <translation id="241082044617551207">Непознат приклучок</translation>
 <translation id="2412753904894530585">Kerberos</translation>
 <translation id="2416435988630956212">Функциски копчиња на тастатурата</translation>
+<translation id="2418307627282545839">Работите на екранот нека бидат светли и нежни</translation>
 <translation id="2419131370336513030">Приказ на инсталирани апликации</translation>
 <translation id="2419706071571366386">Од безбедносни причини, одјавете се од компјутерот кога не го користите.</translation>
 <translation id="2422125132043002186">Враќањето на Linux е откажано</translation>
@@ -6048,6 +6051,7 @@
 <translation id="6895032998810961280">Пријавете детали во Google за штетен софтвер, поставки на системот и процеси што се најдени на вашиот компјутер при ова чистење</translation>
 <translation id="6896758677409633944">Копирај</translation>
 <translation id="6897363604023044284">Изберете ги сајтовите за бришење</translation>
+<translation id="6897688156970667447">Корисно при слаба светлина и штеди батерија</translation>
 <translation id="6898440773573063262">Апликациите на Киоск сега може да се конфигурираат за автоматски да се стартуваат на уредот.</translation>
 <translation id="6900284862687837908">Апликација во заднина: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">Подобрена заштита</translation>
@@ -7538,6 +7542,7 @@
 <translation id="8358685469073206162">Да се обноват страниците?</translation>
 <translation id="8358912028636606457">Емитувањето на звукот од картичката не е поддржано на овој уред.</translation>
 <translation id="835951711479681002">Најавете се на вашата сметка на Google</translation>
+<translation id="8360140320636871023">Персонализирајте ја темата на екранот</translation>
 <translation id="8363095875018065315">стабилно</translation>
 <translation id="8363142353806532503">Микрофонот е блокиран</translation>
 <translation id="8366396658833131068">Поврзливоста на мрежата е обновена. Изберете друга мрежа или притиснете го копчето „Продолжи“ подолу за да се активира киоск-апликацијата.</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index b9967e5..1b6daf7 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -2080,6 +2080,7 @@
 <ph name="DOMAIN" /> таныг ухаалаг картаа оруулсан хэвээр байхыг шаардана.</translation>
 <translation id="2923234477033317484">Энэ бүртгэлийг устгах</translation>
 <translation id="2923644930701689793">Утасны камераараа авсан зургийн цомогт хандаарай</translation>
+<translation id="2925658782192398150">Дууссан, асуудал байхгүй</translation>
 <translation id="2926085873880284723">Өгөгдмөл товчлолыг сэргээх</translation>
 <translation id="2926620265753325858"><ph name="DEVICE_NAME" />-г дэмждэггүй.</translation>
 <translation id="2927017729816812676">Нөөшийн сан</translation>
@@ -5024,6 +5025,7 @@
 <translation id="5891688036610113830">Сонгосон Wi-Fi сүлжээнүүд</translation>
 <translation id="5895138241574237353">Дахин асаах</translation>
 <translation id="5895335062901455404">Таныг Google Бүртгэлээрээ нэвтрэх үед хадгалсан сонголт болон үйл ажиллагаа тань аливаа ChromeOS Flex төхөөрөмж дээр бэлэн байх болно. Та Тохиргоо хэсэгт синк хийх зүйлээ сонгох боломжтой.</translation>
+<translation id="589541317545606110"><ph name="VISUAL_SEARCH_PROVIDER" />-р хуудас хайх</translation>
 <translation id="5896436821193322561">Бүү зөвшөөр</translation>
 <translation id="5900186025777217044">Ухаалаг түгжээг өөрчилсөн</translation>
 <translation id="5900302528761731119">Google-ийн танилцуулга зураг</translation>
@@ -5074,6 +5076,7 @@
 <translation id="5941153596444580863">Хүн нэм...</translation>
 <translation id="5941343993301164315"><ph name="TOKEN_NAME" />-т нэвтрэнэ үү.</translation>
 <translation id="5941711191222866238">Багасгах</translation>
+<translation id="594221546068848596"><ph name="VISUAL_SEARCH_PROVIDER" />-р хуудас хайх</translation>
 <translation id="5942779427914696408">Төхөөрөмжийн харагдац</translation>
 <translation id="5943127421590245687">Та амжилттай баталгаажууллаа. Та дотоод өгөгдлийнхөө түгжээг тайлж, сэргээхийн тулд <ph name="DEVICE_TYPE" />-н хуучин нууц үгээ оруулна уу.</translation>
 <translation id="5945002094477276055"><ph name="FILE_NAME" /> аюултай байж болзошгүй. Google-н аюулгүй хөтөч рүү скан хийлгэхээр илгээх үү?</translation>
@@ -6717,6 +6720,7 @@
 <translation id="7582582252461552277">Энэ сүлжээг сонгох</translation>
 <translation id="7582844466922312471">Хөдөлгөөнт мэдээлэл</translation>
 <translation id="7583948862126372804">Тоо</translation>
+<translation id="7585106857920830898">Танай байгууллагын аюулгүй байдлын бодлогод нийцэх эсэхийг шалгаж байна...</translation>
 <translation id="7586498138629385861">Chrome-г хэрэглээний программыг нээсэн байгаа тохиолдолд Chrome нь ачаалласан хэвээр байна.</translation>
 <translation id="758895749110326677">Бидэнд Chromebook дээр тоглоом тоглохыг сайжруулахад тусална уу</translation>
 <translation id="7589461650300748890">Харж байгаа биз. Болгоомжтой байгаарай.</translation>
@@ -6993,6 +6997,7 @@
 <translation id="7839051173341654115">Өгөгдлийг харах/хадгалах</translation>
 <translation id="7839192898639727867">Certificate Subject Key ID</translation>
 <translation id="7842692330619197998">Хэрэв та шинэ бүртгэл үүсгэх шаардлагатай бол g.co/ChromeEnterpriseAccount хаягаар зочилно уу.</translation>
+<translation id="78427265591841839"><ph name="VISUAL_SEARCH_PROVIDER" />-р хуудасны дурын хэсгийг хайх</translation>
 <translation id="784273751836026224">Linux-г устгах</translation>
 <translation id="7843786652787044762"><ph name="WEB_DRIVE" />-д нэвтрэх</translation>
 <translation id="7844992432319478437">Шинэчлэх ялгаа</translation>
@@ -7000,6 +7005,7 @@
 <translation id="7847212883280406910">Ctrl + Alt + S дээр даран <ph name="IDS_SHORT_PRODUCT_OS_NAME" />-д шилжих</translation>
 <translation id="7849264908733290972">Зургийг шинэ цонхонд нээх</translation>
 <translation id="784934925303690534">Цагийн хүрээ</translation>
+<translation id="7850353716413205957"><ph name="VISUAL_SEARCH_PROVIDER" />-р хуудасны дурын хэсгийг хайх</translation>
 <translation id="7850717413915978159"><ph name="BEGIN_PARAGRAPH1" />ChromeOS төхөөрөмжүүддээ автомат тайлан илгээхийг зөвшөөрснөөр бидэнд ChromeOS-д юуг засаж, сайжруулахыг чухалчилж үзэхэд тусална. Эдгээр тайланд ChromeOS хэзээ гэмтсэн, та ямар онцлогууд, хэр санах ойг ихэвчлэн ашигладаг болон Android аппын оношилгоо, ашиглалтын өгөгдөл зэргийг багтааж болно. Зарим хуримтлуулсан өгөгдөл нь мөн Android хөгжүүлэгчид зэрэг Android аппууд болон Google-н түншүүдэд тусална.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Та ChromeOS төхөөрөмжийнхөө тохиргоонд эдгээр тайланг хүссэн үедээ зөвшөөрч эхлэх эсвэл зогсоох боломжтой. Хэрэв та домэйний администратор бол энэ тохиргоог хүссэн үедээ админ консолд өөрчлөх боломжтой.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />Хэрэв таны Google Бүртгэлд Веб, аппын үйл ажиллагааны тохиргоо асаалттай бол таны Android-н өгөгдлийг Google Бүртгэлд тань хадгалж магадгүй. Та account.google.com дээр өгөгдлөө харах, устгах болон бүртгэлийн тохиргоогоо өөрчлөх боломжтой.<ph name="END_PARAGRAPH3" /></translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index d9e4fa89..c818b60 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -204,6 +204,7 @@
 <translation id="1188807932851744811">लॉग अपलोड झाला नाही.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{आपल्या संगणकावर संचयित केलेल्या फाईलवर प्रवेश करा}other{आपल्या संगणकावर संचयित केलेल्या # फाइलवर प्रवेश करा}}</translation>
 <translation id="119092896208640858">तुमच्या Google खात्यामध्ये डेटा तसाच ठेवून फक्त या डिव्हाइसमधून ब्राउझ केलेला डेटा साफ करण्यासाठी, <ph name="BEGIN_LINK" />साइन आउट करा<ph name="END_LINK" />.</translation>
+<translation id="1191353342579061195">तुमच्या आवश्यकतांची पूर्तता करणारी थीम निवडा. तुमची थीम, वॉलपेपर, स्क्रीन सेव्हर आणि आणखी बरेच काही बदलण्यासाठी, डेस्कटॉपवर फक्त राइट-क्लिक करा.</translation>
 <translation id="1192706927100816598">{0,plural, =1{तुम्हाला # सेकंदाने आपोआप साइन आउट केले जाईल.
 <ph name="DOMAIN" /> ला तुम्ही तुमचे स्मार्ट कार्ड घालून ठेवणे आवश्यक आहे.}other{तुम्हाला # सेकंदांनी आपोआप साइन आउट केले जाईल.
 <ph name="DOMAIN" /> ला तुम्ही तुमचे स्मार्ट कार्ड घालून ठेवणे आवश्यक आहे.}}</translation>
@@ -1304,6 +1305,7 @@
 <translation id="2220409419896228519">तुमच्या आवडत्या Google Apps वर बुकमार्क जोडा</translation>
 <translation id="2220529011494928058">समस्या नोंदवा</translation>
 <translation id="2220572644011485463">पिन किंवा पासवर्ड</translation>
+<translation id="222115440608612541">सूर्योदय आणि सूर्यास्ताच्यावेळी थीम स्विच करा</translation>
 <translation id="2221261048068091179"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" /></translation>
 <translation id="222201875806112242">अनामित मीडिया स्रोत</translation>
 <translation id="2224444042887712269">ही सेटिंग <ph name="OWNER_EMAIL" /> च्या मालकीची आहे.</translation>
@@ -1532,6 +1534,7 @@
 <translation id="241082044617551207">अज्ञात प्लग-इन</translation>
 <translation id="2412753904894530585">Kerberos</translation>
 <translation id="2416435988630956212">कीबोर्ड कार्य की</translation>
+<translation id="2418307627282545839">प्रखर आणि आरामदायी रंग ठेवा</translation>
 <translation id="2419131370336513030">इंस्टॉल केलेली अ‍ॅप्स पहा</translation>
 <translation id="2419706071571366386">सुरक्षिततेसाठी, तुमचा काँप्युटर वापरला जात नसताना साइन आउट करा.</translation>
 <translation id="2422125132043002186">Linux रिस्टोअर रद्द केले</translation>
@@ -3641,6 +3644,7 @@
 <translation id="449232563137139956">ऑनलाइन स्टोअर किंवा बातमीपर लेख यांसाठी फोटोसारखी इलस्ट्रेशन पुरवण्याकरिता साइट सामान्यपणे इमेज दाखवतात</translation>
 <translation id="4492698018379445570">तुम्ही शॉपिंग कार्टमध्ये काय जोडले आहे ते पहा आणि तुम्ही तयार असाल तेव्हा चेक आउट करा</translation>
 <translation id="4493468155686877504">शिफारस केलेले (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">या एक्स्टेंशनला <ph name="SITE" /> वर अनुमती द्यायची आहे का?</translation>
 <translation id="4495419450179050807">या पेजवर दर्शवू नका</translation>
 <translation id="4497145443434063861">PC आणि Chromecast वेगवेगळ्या वाय-फाय नेटवर्कशी कनेक्ट केले आहेत (उदा. २.४ GHz
     वि. ५ GHz)</translation>
@@ -6042,6 +6046,7 @@
 <translation id="6895032998810961280">या क्लीनअपदरम्यान तुमच्या काँप्युटरवर सापडलेले हानिकारक सॉफ्टवेअर, सिस्टम सेटिंग्ज आणि प्रक्रिया यांची संपूर्ण तपशीलांसह Google कडे तक्रार करा</translation>
 <translation id="6896758677409633944">कॉपी करा</translation>
 <translation id="6897363604023044284">साफ करण्यासाठी साइट निवडा</translation>
+<translation id="6897688156970667447">कमी प्रकाशात उपयुक्त आहे आणि बॅटरी वाचवते</translation>
 <translation id="6898440773573063262">कियोस्क ॲप्लिकेशन आता या डिव्हाइसवर स्वयं-लाँच करण्यासाठी कॉंफिगर केले जाऊ शकतात.</translation>
 <translation id="6900284862687837908">पार्श्वभूमी ॲप: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">वर्धित संरक्षण</translation>
@@ -7528,6 +7533,7 @@
 <translation id="8358685469073206162">पेज पुनर्संचयित करायची?</translation>
 <translation id="8358912028636606457">या डिव्हाइसवर कास्टिंग टॅब ऑडिओला सपोर्ट नाही.</translation>
 <translation id="835951711479681002">तुमच्या Google खाते मध्ये सेव्ह करा</translation>
+<translation id="8360140320636871023">तुमची डिस्प्ले थीम पर्सनलाइझ करा</translation>
 <translation id="8363095875018065315">स्थिर</translation>
 <translation id="8363142353806532503">मायक्रोफोन ब्लॉक केला आहे</translation>
 <translation id="8366396658833131068">तुमची नेटवर्क कनेक्टिव्हिटी पुनर्संचयित झाली आहे. कृपया एक भिन्न नेटवर्क निवडा किंवा तुमचा कियोस्क ॲप लाँच करण्यासाठी खालील 'सुरू ठेवा' बटण दाबा.</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 054bd74d..9ad778d 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -180,6 +180,7 @@
 <translation id="1166583374608765787">Naamupdate bekijken</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> hoort bij bureau <ph name="DESK_TITLE" /></translation>
 <translation id="1168020859489941584">Openen in <ph name="TIME_REMAINING" />...</translation>
+<translation id="1169266963600477608">Gamebediening</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> bevat gevoelige of gevaarlijke gegevens. Je beheerder zegt: '<ph name="CUSTOM_MESSAGE" />'</translation>
 <translation id="1171135284592304528">Markeer het object met toetsenbordfocus wanneer dit wordt gewijzigd</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> wil verbinding maken met een HID-apparaat</translation>
@@ -3361,6 +3362,7 @@
 <translation id="4227605727325220318">Nieuwe Android-telefoon toevoegen</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Deze extensie is niet toegestaan}other{Sommige extensies zijn niet toegestaan}}</translation>
 <translation id="4231095370974836764">Installeer apps en games van Google Play op je <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">Gamebediening sluiten</translation>
 <translation id="4232375817808480934">Kerberos configureren</translation>
 <translation id="4235965441080806197">Inloggen annuleren</translation>
 <translation id="4236163961381003811">Meer extensies bekijken</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb
index 79b543f..ce4e676 100644
--- a/chrome/app/resources/generated_resources_or.xtb
+++ b/chrome/app/resources/generated_resources_or.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">ସମୀକ୍ଷା ନାମରେ ଅପଡେଟ୍</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> ଡେସ୍କ <ph name="DESK_TITLE" />ର ଅଟେ</translation>
 <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> ରେ ଖୋଲୁଛି...</translation>
+<translation id="1169266963600477608">ଗେମ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" />ରେ ସମ୍ବେଦନଶୀଳ କିମ୍ବା ବିପଦଜନକ ଡାଟା ଅଛି। ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟର୍ କହନ୍ତି: "<ph name="CUSTOM_MESSAGE" />"</translation>
 <translation id="1171135284592304528">ଅବ୍‌ଜେକ୍ଟ ଯେତେବେଳେ ପରିବର୍ତ୍ତିତ ହୁଏ ସେତେବେଳେ ଏହାକୁ କୀବୋର୍ଡ୍ ଫୋକସ୍ ମାଧ୍ୟମରେ ହାଇଲାଇଟ୍ କରନ୍ତୁ</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" />, ଗୋଟିଏ HID ଡିଭାଇସ୍ ସହ ସଂଯୋଗ କରିବା ପାଇଁ ଚାହୁଁଛନ୍ତି।</translation>
@@ -3360,6 +3361,7 @@
 <translation id="4227605727325220318">ଏକ ନୂଆ Android ଫୋନ ଯୋଗ କରନ୍ତୁ</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{ଏହି ଏକ୍ସଟେନସନକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ}other{କିଛି ଏକ୍ସଟେନସନକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ}}</translation>
 <translation id="4231095370974836764">ଆପଣଙ୍କ <ph name="DEVICE_TYPE" />ରେ Google Playରୁ ଆପ୍ ଏବଂ ଗେମଗୁଡ଼ିକ ଇନଷ୍ଟଲ୍ କରନ୍ତୁ। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">ଗେମ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ବନ୍ଦ କରନ୍ତୁ</translation>
 <translation id="4232375817808480934">Kerberos କନ୍‍ଫିଗର୍ କରନ୍ତୁ</translation>
 <translation id="4235965441080806197">ସାଇନ୍ ଇନ୍ ବାତିଲ୍ କରନ୍ତୁ</translation>
 <translation id="4236163961381003811">ଅଧିକ ଏକ୍ସଟେନସନ ଖୋଜି ପାଆନ୍ତୁ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index a84a516..ced1cdf1 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -180,6 +180,7 @@
 <translation id="1166583374608765787">Sprawdź zmienioną nazwę</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> należy do biurka <ph name="DESK_TITLE" /></translation>
 <translation id="1168020859489941584">Otworzę za <ph name="TIME_REMAINING" />…</translation>
+<translation id="1169266963600477608">Sterowanie grą</translation>
 <translation id="1169435433292653700">Plik <ph name="FILE_NAME" /> zawiera dane poufne lub niebezpieczne. Wiadomość od Twojego administratora: „<ph name="CUSTOM_MESSAGE" />”</translation>
 <translation id="1171135284592304528">Gdy obiekt wybrany za pomocą klawiatury zmienia się, podświetlaj go</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> chce się połączyć z urządzeniem HID</translation>
@@ -3349,6 +3350,7 @@
 <translation id="4227605727325220318">Dodaj nowy telefon z Androidem</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{To rozszerzenie jest niedozwolone}few{Niektóre rozszerzenia są niedozwolone}many{Niektóre rozszerzenia są niedozwolone}other{Niektóre rozszerzenia są niedozwolone}}</translation>
 <translation id="4231095370974836764">Instaluj aplikacje i gry z Google Play na urządzeniu <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">Zamknij elementy sterujące gry</translation>
 <translation id="4232375817808480934">Konfigurowanie Kerberos</translation>
 <translation id="4235965441080806197">Anuluj logowanie</translation>
 <translation id="4236163961381003811">Znajdź więcej rozszerzeń</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 2b31fbf..413ed813 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -203,6 +203,7 @@
 <translation id="1188807932851744811">Registro não enviado.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Acessar um arquivo armazenado no seu computador}one{Acessar # arquivos armazenados no seu computador.}other{Acessar # arquivos armazenados no seu computador}}</translation>
 <translation id="119092896208640858">Para limpar os dados de navegação apenas deste dispositivo e mantê-los na sua Conta do Google, <ph name="BEGIN_LINK" />saia da sua conta<ph name="END_LINK" />.</translation>
+<translation id="1191353342579061195">Escolha o tema ideal para suas necessidades. Para mudar o tema, o plano de fundo, o protetor de tela e muito mais, é só clicar com o botão direito do mouse na área de trabalho.</translation>
 <translation id="1192706927100816598">{0,plural, =1{Sua conta será desconectada automaticamente em # segundo.
 <ph name="DOMAIN" /> requer que você mantenha o cartão inteligente inserido.}one{Sua conta será desconectada automaticamente em # segundo.
 <ph name="DOMAIN" /> requer que você mantenha o cartão inteligente inserido.}other{Sua conta será desconectada automaticamente em # segundos.
@@ -1305,6 +1306,7 @@
 <translation id="2220409419896228519">Adicione favoritos aos apps do Google que você mais usa</translation>
 <translation id="2220529011494928058">Informar um problema</translation>
 <translation id="2220572644011485463">PIN ou senha</translation>
+<translation id="222115440608612541">Mudar o tema ao amanhecer e ao anoitecer</translation>
 <translation id="2221261048068091179"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" /></translation>
 <translation id="222201875806112242">Fonte de mídia sem nome</translation>
 <translation id="2224444042887712269">Esta configuração pertence a <ph name="OWNER_EMAIL" />.</translation>
@@ -1533,6 +1535,7 @@
 <translation id="241082044617551207">Plug-in desconhecido</translation>
 <translation id="2412753904894530585">Kerberos</translation>
 <translation id="2416435988630956212">Teclas de função do teclado</translation>
+<translation id="2418307627282545839">Deixe tudo iluminado e arejado</translation>
 <translation id="2419131370336513030">Ver apps instalados</translation>
 <translation id="2419706071571366386">Por segurança, saia da sua conta quando seu computador não estiver sendo usado.</translation>
 <translation id="2422125132043002186">Restauração do Linux cancelada</translation>
@@ -1959,7 +1962,7 @@
 <translation id="2811205483104563968">Contas</translation>
 <translation id="2811564570599779918">Redução de spam e fraudes</translation>
 <translation id="2812049959647166806">O Thunderbolt não é compatível</translation>
-<translation id="2813094189969465044">Controle dos pais</translation>
+<translation id="2813094189969465044">Controle da família</translation>
 <translation id="281390819046738856">Não foi possível assinar a solicitação.</translation>
 <translation id="2814489978934728345">Parar de carregar esta página</translation>
 <translation id="281504910091592009">Ver e gerenciar as senhas salvas na sua <ph name="BEGIN_LINK" />Conta do Google<ph name="END_LINK" /></translation>
@@ -6048,6 +6051,7 @@
 <translation id="6895032998810961280">Enviar ao Google detalhes sobre softwares nocivos, configurações do sistema e processos encontrados no seu computador durante a limpeza</translation>
 <translation id="6896758677409633944">Copiar</translation>
 <translation id="6897363604023044284">Selecionar sites para limpar</translation>
+<translation id="6897688156970667447">Útil em ambientes com pouca luz e economiza bateria</translation>
 <translation id="6898440773573063262">Os aplicativos de quiosque agora podem ser configurados para inicialização automática neste dispositivo.</translation>
 <translation id="6900284862687837908">Aplicativo de segundo plano: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">Proteção reforçada</translation>
@@ -7536,6 +7540,7 @@
 <translation id="8358685469073206162">Restaurar páginas?</translation>
 <translation id="8358912028636606457">A transmissão do áudio de guias não é compatível com este dispositivo.</translation>
 <translation id="835951711479681002">Salvar na sua Conta do Google</translation>
+<translation id="8360140320636871023">Personalizar o tema da tela</translation>
 <translation id="8363095875018065315">estável</translation>
 <translation id="8363142353806532503">Microfone bloqueado</translation>
 <translation id="8366396658833131068">Sua conectividade de rede foi restaurada. Selecione outra rede ou pressione o botão "Continuar" abaixo para iniciar seu aplicativo de quiosque.</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 0b71b37..ae9fc1bd 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -180,6 +180,7 @@
 <translation id="1166583374608765787">Examinează actualizarea numelui</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> aparține desktopului <ph name="DESK_TITLE" /></translation>
 <translation id="1168020859489941584">Se deschide în <ph name="TIME_REMAINING" />...</translation>
+<translation id="1169266963600477608">Comenzile jocului</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> conține date sensibile sau periculoase. Administratorul rostește <ph name="CUSTOM_MESSAGE" />.</translation>
 <translation id="1171135284592304528">Evidențiază obiectul focalizat de la tastatură când se schimbă</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> vrea să se conecteze la un dispozitiv HID</translation>
@@ -201,6 +202,7 @@
 <translation id="1188807932851744811">Jurnalul nu a fost încărcat.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Accesează un fișier stocat pe computer}few{Accesează # fișiere stocate pe computer}other{Accesează # de fișiere stocate pe computer}}</translation>
 <translation id="119092896208640858">Pentru a șterge datele de navigare doar de pe acest dispozitiv, dar nu și din Contul Google, <ph name="BEGIN_LINK" />deconectează-te<ph name="END_LINK" />.</translation>
+<translation id="1191353342579061195">Alege tema potrivită pentru nevoile tale. Pentru a schimba tema, imaginea de fundal, screensaverul și altele, dă clic dreapta pe desktop.</translation>
 <translation id="1192706927100816598">{0,plural, =1{Vei fi deconectat(ă) automat peste # secundă.
 <ph name="DOMAIN" /> solicită să nu scoți cardul inteligent din dispozitiv.}few{Vei fi deconectat(ă) automat peste # secunde.
 <ph name="DOMAIN" /> solicită să nu scoți cardul inteligent din dispozitiv.}other{Vei fi deconectat(ă) automat peste # de secunde.
@@ -449,7 +451,7 @@
 <translation id="1428770807407000502">Dezactivezi sincronizarea?</translation>
 <translation id="1429300045468813835">Totul a fost șters</translation>
 <translation id="1430915738399379752">Printează</translation>
-<translation id="1431188203598586230">Actualizare de software finală</translation>
+<translation id="1431188203598586230">Actualizarea finală a software-ului</translation>
 <translation id="1432581352905426595">Gestionați motoarele de căutare</translation>
 <translation id="1434696352799406980">Astfel, pagina de pornire, pagina Filă nouă, motorul de căutare și filele fixate vor fi resetate. De asemenea, vor fi dezactivate toate extensiile, iar datele temporare vor fi șterse, cum ar fi cookie-urile. Marcajele, istoricul și parolele salvate nu vor fi șterse.</translation>
 <translation id="1434886155212424586">Pagina de pornire este pagina Filă nouă</translation>
@@ -1293,6 +1295,7 @@
 <translation id="2220409419896228519">Adaugă marcaje la aplicațiile Google preferate</translation>
 <translation id="2220529011494928058">Semnalați o problemă</translation>
 <translation id="2220572644011485463">PIN sau parolă</translation>
+<translation id="222115440608612541">Schimbă tema la răsărit și la apus</translation>
 <translation id="2221261048068091179"><ph name="FIRST_SWITCH" /> <ph name="SECOND_SWITCH" /></translation>
 <translation id="222201875806112242">Sursă media nedenumită</translation>
 <translation id="2224444042887712269">Setarea aparține utilizatorului <ph name="OWNER_EMAIL" />.</translation>
@@ -1518,6 +1521,7 @@
 <translation id="241082044617551207">Plugin necunoscut</translation>
 <translation id="2412753904894530585">Kerberos</translation>
 <translation id="2416435988630956212">Tastele pentru funcții de la tastatură</translation>
+<translation id="2418307627282545839">Menține conținutul luminos și spațios</translation>
 <translation id="2419131370336513030">Vezi aplicațiile instalate</translation>
 <translation id="2419706071571366386">Pentru securitate, deconectează-te când nu folosești computerul.</translation>
 <translation id="2422125132043002186">Restabilirea Linux a fost anulată</translation>
@@ -3364,6 +3368,7 @@
 <translation id="4227605727325220318">Adaugă un nou telefon Android</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Extensia nu este permisă}few{Unele extensii nu sunt permise}other{Unele extensii nu sunt permise}}</translation>
 <translation id="4231095370974836764">Instalează aplicații și jocuri din Google Play pe <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">Închide comenzile pentru joc</translation>
 <translation id="4232375817808480934">Configurează Kerberos</translation>
 <translation id="4235965441080806197">Anulează conectarea</translation>
 <translation id="4236163961381003811">Descoperă mai multe extensii</translation>
@@ -5528,7 +5533,7 @@
 <translation id="6406708970972405507">Setări – <ph name="SECTION_TITLE" /></translation>
 <translation id="6408118934673775994">Citește și modifică datele de pe <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> și <ph name="WEBSITE_3" /></translation>
 <translation id="6410257289063177456">Fișiere imagine</translation>
-<translation id="6410328738210026208">Schimbați canalul și porniți Powerwash</translation>
+<translation id="6410328738210026208">Schimbați canalul și folosiți Powerwash</translation>
 <translation id="6410390304316730527">Navigarea sigură te protejează împotriva atacatorilor care ar putea să te păcălească să faci lucruri periculoase, cum ar fi să instalezi software rău intenționat sau să dezvălui informații cu caracter personal, cum ar fi parole, numere de telefon sau carduri de credit. Dacă o dezactivezi, ai grijă atunci când navighezi pe site-uri nefamiliare sau nelegitime.</translation>
 <translation id="6410668567036790476">Adaugă motorul de căutare</translation>
 <translation id="641469293210305670">Instalează actualizări și aplicații</translation>
@@ -6030,6 +6035,7 @@
 <translation id="6895032998810961280">Raportează la Google informațiile privind software-ul dăunător, setările de sistem și procesele care s-au găsit pe computer în timpul acestei curățări</translation>
 <translation id="6896758677409633944">Copiază</translation>
 <translation id="6897363604023044284">Alege site-urile de șters</translation>
+<translation id="6897688156970667447">Util în condiții de lumină slabă și economisește bateria</translation>
 <translation id="6898440773573063262">Acum, aplicațiile de tip chioșc pot fi configurate pentru a se lansa automat pe acest dispozitiv.</translation>
 <translation id="6900284862687837908">Aplicația de fundal: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">Protecție îmbunătățită</translation>
@@ -7517,6 +7523,7 @@
 <translation id="8358685469073206162">Restabiliți paginile?</translation>
 <translation id="8358912028636606457">Proiecția conținutului audio din filă nu este acceptată pe acest dispozitiv.</translation>
 <translation id="835951711479681002">Salvează în Contul Google</translation>
+<translation id="8360140320636871023">Personalizează tema ecranului</translation>
 <translation id="8363095875018065315">stabil</translation>
 <translation id="8363142353806532503">Microfonul este blocat</translation>
 <translation id="8366396658833131068">Conexiunea la rețea a fost restabilită. Selectați altă rețea sau apăsați mai jos pe butonul „Continuați” pentru a lansa aplicația chioșc.</translation>
@@ -8208,7 +8215,7 @@
 <translation id="9055636786322918818">Aplică criptarea RC4. Folosirea acestei opțiuni îți mărește riscul, deoarece suitele de codificare RC4 sunt nesecurizate.</translation>
 <translation id="9056810968620647706">Nu s-a găsit nicio potrivire.</translation>
 <translation id="9057007989365783744"><ph name="SUPERVISED_USER_NAME" /> vrea să acceseze următorul conținut:</translation>
-<translation id="9057354806206861646">Actualizează programul</translation>
+<translation id="9057354806206861646">Programarea actualizărilor</translation>
 <translation id="9062468308252555888">14x</translation>
 <translation id="9063208415146866933">Eroare de la linia <ph name="ERROR_LINE_START" /> la linia <ph name="ERROR_LINE_END" /></translation>
 <translation id="9064275926664971810">Activează completarea automată pentru a completa formularele cu un singur clic</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 24c1e01..f94c7c8 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -180,6 +180,7 @@
 <translation id="1166583374608765787">Проверьте новое название</translation>
 <translation id="1166596238782048887">Вкладка "<ph name="TAB_TITLE" />" находится на рабочем столе "<ph name="DESK_TITLE" />"</translation>
 <translation id="1168020859489941584">Открытие через <ph name="TIME_REMAINING" />...</translation>
+<translation id="1169266963600477608">Настройки игры</translation>
 <translation id="1169435433292653700">В файле "<ph name="FILE_NAME" />" содержатся конфиденциальные или опасные данные. Сообщение от администратора: "<ph name="CUSTOM_MESSAGE" />".</translation>
 <translation id="1171135284592304528">Выделять элементы, выбранные с помощью клавиатуры</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> запрашивает разрешение на подключение к HID-устройству</translation>
@@ -3364,6 +3365,7 @@
 <translation id="4227605727325220318">Добавить новый телефон Android</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Это расширение запрещено}one{Некоторые расширения запрещены}few{Некоторые расширения запрещены}many{Некоторые расширения запрещены}other{Некоторые расширения запрещены}}</translation>
 <translation id="4231095370974836764">Устанавливайте приложения и игры из Google Play на устройство <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">Закрыть настройки игры</translation>
 <translation id="4232375817808480934">Настройка Kerberos</translation>
 <translation id="4235965441080806197">Отменить вход</translation>
 <translation id="4236163961381003811">Посмотреть другие расширения</translation>
@@ -3628,6 +3630,7 @@
 <translation id="449232563137139956">Обычно сайты показывают изображения в качестве иллюстраций, например фото в интернет-магазинах или новостных статьях.</translation>
 <translation id="4492698018379445570">Здесь можно найти товары, которые вы добавили в корзину, и оформить покупку.</translation>
 <translation id="4493468155686877504">Рекомендуемый размер (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">Разрешить это расширение на сайте <ph name="SITE" />?</translation>
 <translation id="4495419450179050807">Не показывать на этой странице</translation>
 <translation id="4497145443434063861">Компьютер и устройство Chromecast подключены к разным сетям Wi-Fi (например, 2,4 ГГц и 5 ГГц)</translation>
 <translation id="4500114933761911433">Сбой в плагине <ph name="PLUGIN_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb
index c313f92..b0bb3697 100644
--- a/chrome/app/resources/generated_resources_si.xtb
+++ b/chrome/app/resources/generated_resources_si.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">නම යාවත්කාලීන කිරීම සමාලෝචනය කරන්න</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> <ph name="DESK_TITLE" /> මේසයට අයත් වේ</translation>
 <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> කින් විවෘත වේ...</translation>
+<translation id="1169266963600477608">ක්‍රීඩා පාලන</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> තුළ සංවේදී හෝ අනතුරුදායක දත්ත ඇත. ඔබගේ පරිපාලක "<ph name="CUSTOM_MESSAGE" />" යැයි පවසයි</translation>
 <translation id="1171135284592304528">වෙනස් වූ විට යතුරු පුවරුවේ කේන්ද්‍රය සමඟ වස්තුව උද්දීපනය කරන්න.</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> හට HID උපාංගයකට සම්බන්ධ කිරීමට අවශ්‍යයි</translation>
@@ -3367,6 +3368,7 @@
 <translation id="4227605727325220318">නව Android දුරකථනයක් එක් කරන්න</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{මෙම දිගුව ඉඩ නොදේ}one{සමහර දිගු ඉඩ නොදේ}other{සමහර දිගු ඉඩ නොදේ}}</translation>
 <translation id="4231095370974836764">Google Play වෙතින් ඔබගේ <ph name="DEVICE_TYPE" /> හි යෙදුම් සහ ක්‍රීඩා ස්ථාපනය කරන්න. <ph name="LINK_BEGIN" />තව දැන ගන්න<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">ක්‍රීඩා පාලන වසන්න</translation>
 <translation id="4232375817808480934">Kerberos වින්‍යාස කරන්න</translation>
 <translation id="4235965441080806197">පිරීම අවලංගු කරන්න</translation>
 <translation id="4236163961381003811">තවත් දිගු සොයා ගන්න</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index fb8cb1bb..46f025e 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -202,6 +202,7 @@
 <translation id="1188807932851744811">Denník nebol nahraný.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Pristupujte k súboru uloženému vo vašom počítači}few{Pristupujte k # súborom uloženým vo vašom počítači}many{Pristupujte k # súboru uloženému vo vašom počítači}other{Pristupujte k # súborom uloženým vo vašom počítači}}</translation>
 <translation id="119092896208640858">Ak chcete vymazať dáta prehliadania iba z tohto zariadenia a ponechať ich v účte Google, <ph name="BEGIN_LINK" />odhláste sa<ph name="END_LINK" />.</translation>
+<translation id="1191353342579061195">Vyberte motív, ktorý vyhovuje vašim potrebám. Ak chcete zmeniť motív, tapetu, šetrič obrazovky a ďalšie položky, stačí kliknúť pravým tlačidlom na pracovnú plochu.</translation>
 <translation id="1192706927100816598">{0,plural, =1{Systém vás automaticky odhlási o # sekundu.
 <ph name="DOMAIN" /> vyžaduje, aby ste svoju čipovú kartu ponechali vloženú.}few{Systém vás automaticky odhlási o # sekundy.
 <ph name="DOMAIN" /> vyžaduje, aby ste svoju čipovú kartu ponechali vloženú.}many{Systém vás automaticky odhlási o # sekundy.
@@ -345,7 +346,7 @@
 <translation id="1338631221631423366">Páruje sa…</translation>
 <translation id="1338802252451106843"><ph name="ORIGIN" /> chcete otvoriť túto aplikáciu.</translation>
 <translation id="1338950911836659113">Prebieha odstraňovanie...</translation>
-<translation id="1339009753652684748">Aktivujte svojho Asistenta vyslovením výrazu „Hey Google“. Ak chcete šetriť batériu, vyberte Zapnutý (odporúčané). Váš Asistent bude reagovať iba vtedy, keď bude zariadenie pripojené do zásuvky alebo sa bude nabíjať.</translation>
+<translation id="1339009753652684748">Aktivujte svojho Asistenta vyslovením výrazu „Ok, Google“. Ak chcete šetriť batériu, vyberte Zapnutý (odporúčané). Váš Asistent bude reagovať iba vtedy, keď bude zariadenie pripojené do zásuvky alebo sa bude nabíjať.</translation>
 <translation id="13392265090583506">A11y</translation>
 <translation id="1340527397989195812">Zálohovať médiá zo zariadenia pomocou aplikácie Súbory</translation>
 <translation id="1341988552785875222">Aktuálnu tapetu nastavila aplikácia <ph name="APP_NAME" />. Je možné, že pred výberom inej tapety bude nutné aplikáciu <ph name="APP_NAME" /> odinštalovať.</translation>
@@ -1295,6 +1296,7 @@
 <translation id="2220409419896228519">Pridajte si záložky na obľúbené aplikácie Google</translation>
 <translation id="2220529011494928058">Nahlásiť problém</translation>
 <translation id="2220572644011485463">PIN alebo heslo</translation>
+<translation id="222115440608612541">Prepínajte motívy pri východe a západe slnka</translation>
 <translation id="2221261048068091179"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" /></translation>
 <translation id="222201875806112242">Nepomenovaný mediálny zdroj</translation>
 <translation id="2224444042887712269">Nastavenie patrí používateľovi <ph name="OWNER_EMAIL" />.</translation>
@@ -1520,6 +1522,7 @@
 <translation id="241082044617551207">Neznámy doplnok</translation>
 <translation id="2412753904894530585">Kerberos</translation>
 <translation id="2416435988630956212">Funkčné klávesy na klávesnici</translation>
+<translation id="2418307627282545839">Zobrazujte si svetlé a vzdušné prostredie</translation>
 <translation id="2419131370336513030">Zobraziť inštalované aplikácie</translation>
 <translation id="2419706071571366386">Keď počítač nepoužívate, z bezpečnostných dôvodov sa odhláste.</translation>
 <translation id="2422125132043002186">Obnovenie systému Linux bolo zrušené</translation>
@@ -2068,6 +2071,7 @@
 <ph name="DOMAIN" /> vyžaduje, aby ste svoju čipovú kartu ponechali vloženú.</translation>
 <translation id="2923234477033317484">Odstrániť tento účet</translation>
 <translation id="2923644930701689793">Prístup k snímkam telefónu</translation>
+<translation id="2925658782192398150">Hotovo, nenašli sa žiadne problémy</translation>
 <translation id="2926085873880284723">Obnoviť predvolené skratky</translation>
 <translation id="2926620265753325858">Zariadenie <ph name="DEVICE_NAME" /> nie je podporované.</translation>
 <translation id="2927017729816812676">Úložisko vyrovnávacej pamäte</translation>
@@ -3889,7 +3893,7 @@
 <translation id="4742970037960872810">Odstrániť zvýraznenie</translation>
 <translation id="4743260470722568160"><ph name="BEGIN_LINK" />Ako aktualizovať aplikácie<ph name="END_LINK" /></translation>
 <translation id="4744981231093950366">{NUM_TABS,plural, =1{Zapnúť zvuk webu}few{Zapnúť zvuk webov}many{Zapnúť zvuk webov}other{Zapnúť zvuk webov}}</translation>
-<translation id="474609389162964566">Aktivujte svojho Asistenta príkazom „Hey Google“</translation>
+<translation id="474609389162964566">Aktivujte svojho Asistenta príkazom „Ok, Google“</translation>
 <translation id="4746351372139058112">Správy</translation>
 <translation id="4748783296226936791">Weby sa zvyčajne pripájajú k zariadeniam HID, aby mohli poskytovať funkcie používajúce nezvyčajné klávesnice, herné ovládače a iné zariadenia</translation>
 <translation id="4750185073185658673">Skontrolujte vo svojom telefóne niekoľko ďalších povolení. Nezabudnite mať zapnuté rozhranie Bluetooth aj sieť Wi‑Fi.</translation>
@@ -5010,6 +5014,7 @@
 <translation id="5891688036610113830">Preferované siete Wi-Fi</translation>
 <translation id="5895138241574237353">Reštartovať</translation>
 <translation id="5895335062901455404">Vaše uložené predvoľby a aktivita budú k dispozícii v ľubovoľnom zariadení so systémom Chrome OS Flex, keď sa prihlásite účtom Google. Položky, ktoré chcete synchronizovať, môžete vybrať v Nastaveniach.</translation>
+<translation id="589541317545606110">Hľadať na stránke pomocou služby <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
 <translation id="5896436821193322561">Nepovoliť</translation>
 <translation id="5900186025777217044">Funkcia Smart Lock sa zmenila</translation>
 <translation id="5900302528761731119">Fotografia profilu Google</translation>
@@ -5061,6 +5066,7 @@
 <translation id="5941153596444580863">Pridať osobu...</translation>
 <translation id="5941343993301164315">Prihláste sa do <ph name="TOKEN_NAME" />.</translation>
 <translation id="5941711191222866238">Minimalizovať</translation>
+<translation id="594221546068848596">Hľadať na stránke pomocou služby <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
 <translation id="5942779427914696408">Viditeľnosť zariadenia</translation>
 <translation id="5943127421590245687">Overenie bolo úspešné. Ak chcete zariadenie odomknúť a obnoviť svoje miestne údaje, zadajte staré heslo pre zariadenie <ph name="DEVICE_TYPE" />.</translation>
 <translation id="5945002094477276055">Súbor <ph name="FILE_NAME" /> môže byť nebezpečný. Chcete ho odoslať do Bezpečného prehliadania Google na kontrolu?</translation>
@@ -5713,7 +5719,7 @@
 <translation id="6583328141350416497">Pokračovať v sťahovaní</translation>
 <translation id="6584878029876017575">Podpisovanie s neobmedzenou platnosťou spoločnosti Microsoft</translation>
 <translation id="6586099239452884121">Hosťovské prehliadanie</translation>
-<translation id="6586213706115310390">Aktivujte svojho Asistenta vyslovením výrazu „Hey Google“.</translation>
+<translation id="6586213706115310390">Aktivujte svojho Asistenta vyslovením výrazu „Ok, Google“.</translation>
 <translation id="6586451623538375658">Zameniť primárne tlačidlo myši</translation>
 <translation id="6587958707401001932">Vybrať predvolené nastavenie</translation>
 <translation id="6588043302623806746">Používať zabezpečené DNS</translation>
@@ -6034,6 +6040,7 @@
 <translation id="6895032998810961280">Nahlasovať Googlu podrobnosti o škodlivom softvéri, nastaveniach systému a procesoch zistených v počítači počas tohto čistenia</translation>
 <translation id="6896758677409633944">Kopírovať</translation>
 <translation id="6897363604023044284">Vybrať weby na vymazanie</translation>
+<translation id="6897688156970667447">Užitočné pri slabom svetle a šetrí batériu</translation>
 <translation id="6898440773573063262">Aplikácie Kiosku je teraz možné v tomto zariadení nakonfigurovať na automatické spúšťanie.</translation>
 <translation id="6900284862687837908">Aplikácia na pozadí: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">Rozšírená ochrana</translation>
@@ -6707,6 +6714,7 @@
 <translation id="7582582252461552277">Preferovať túto sieť</translation>
 <translation id="7582844466922312471">Mobilné dáta</translation>
 <translation id="7583948862126372804">Počet</translation>
+<translation id="7585106857920830898">Kontroluje sa súlad s pravidlami zabezpečenia vašej organizácie…</translation>
 <translation id="7586498138629385861">Prehliadač Chrome zostane spustený dovtedy, kým budú otvorené aplikácie Chrome.</translation>
 <translation id="758895749110326677">Pomôžte nám zlepšiť hranie hier v Chromebookoch</translation>
 <translation id="7589461650300748890">Pozor, buďte opatrný/-á.</translation>
@@ -6984,6 +6992,7 @@
 <translation id="7839051173341654115">Zobraziť/zálohovať médiá</translation>
 <translation id="7839192898639727867">ID kľúča subjektu certifikátu</translation>
 <translation id="7842692330619197998">Ak chcete vytvoriť nový účet, prejdite na g.co/ChromeEnterpriseAccount.</translation>
+<translation id="78427265591841839">Hľadať na celej stránke pomocou funkcie <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
 <translation id="784273751836026224">Odinštalovať systém Linux</translation>
 <translation id="7843786652787044762">Prihlásiť sa do služby <ph name="WEB_DRIVE" /></translation>
 <translation id="7844992432319478437">Súbor diff sa aktualizuje</translation>
@@ -6991,6 +7000,7 @@
 <translation id="7847212883280406910">Ak chcete prepnúť na systém <ph name="IDS_SHORT_PRODUCT_OS_NAME" />, stlačte kombináciu klávesov Ctrl + Alt + S</translation>
 <translation id="7849264908733290972">Otvoriť &amp;obrázok na novej karte</translation>
 <translation id="784934925303690534">Obdobie</translation>
+<translation id="7850353716413205957">Hľadať na celej stránke pomocou funkcie <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
 <translation id="7850717413915978159"><ph name="BEGIN_PARAGRAPH1" />Ak povolíte zariadeniam so systémom Chrome OS odosielať automatické hlásenia, pomôžete nám tým určiť, čo treba v systéme Chrome OS prioritne opraviť a zlepšiť. Tieto hlásenia môžu obsahovať informácie, napríklad kedy Chrome OS padá, aké používate funkcie, koľko pamäte zvyčajne využívate, diagnostiky a údaje o využití aplikácií pre Android. Niektoré súhrnné dáta pomôžu aj aplikáciám a partnerom Googlu, ako sú vývojári pre Android.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Tieto hlásenia môžete kedykoľvek začať alebo prestať povoľovať v nastaveniach svojho zariadenia so systémom Chrome OS. Ak ste správcom domény, toto nastavenie môžete zmeniť v správcovskej konzole.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />Ak pre svoj účet Google zapnete nastavenie Aktivita na internete a v aplikáciách, údaje Androidu sa môžu ukladať do vášho účtu Google. Môžete ich zobraziť a odstrániť na account.google.com, kde tiež môžete zmeniť nastavenia účtu.<ph name="END_PARAGRAPH3" /></translation>
@@ -7521,6 +7531,7 @@
 <translation id="8358685469073206162">Obnoviť stránky?</translation>
 <translation id="8358912028636606457">Prenos zvuku karty nie je v tomto zariadení podporovaný.</translation>
 <translation id="835951711479681002">Uložiť vo vašom účte Google</translation>
+<translation id="8360140320636871023">Prispôsobte si motív obrazovky</translation>
 <translation id="8363095875018065315">stabilné</translation>
 <translation id="8363142353806532503">Mikrofón je zablokovaný</translation>
 <translation id="8366396658833131068">Vaše pripojenie k sieti je obnovené. Vyberte inú sieť alebo stlačte tlačidlo Pokračovať nachádzajúce sa nižšie a spustite tak aplikáciu Kiosk.</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 8ada286..517f262 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">Pregled posodobitve imena</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> pripada namizju <ph name="DESK_TITLE" /></translation>
 <translation id="1168020859489941584">Odpiranje čez <ph name="TIME_REMAINING" /> ...</translation>
+<translation id="1169266963600477608">Kontrolniki za igre</translation>
 <translation id="1169435433292653700">V datoteki <ph name="FILE_NAME" /> so občutljivi ali nevarni podatki. Sporočilo skrbnika: »<ph name="CUSTOM_MESSAGE" />«</translation>
 <translation id="1171135284592304528">Označitev predmeta s fokusom na tipkovnici, ko se spremeni</translation>
 <translation id="1171515578268894665"><ph name="ORIGIN" /> se želi povezati z napravo HID</translation>
@@ -3381,6 +3382,7 @@
 <translation id="4227605727325220318">Dodaj nov telefon Android</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Ta razširitev ni odobrena}one{Nekatere razširitve niso odobrene}two{Nekatere razširitve niso odobrene}few{Nekatere razširitve niso odobrene}other{Nekatere razširitve niso odobrene}}</translation>
 <translation id="4231095370974836764">Namestite aplikacije in igre iz Googla Play v napravi <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">Zapri kontrolnike za igre</translation>
 <translation id="4232375817808480934">Konfiguriranje storitve Kerberos</translation>
 <translation id="4235965441080806197">Prekliči prijavo</translation>
 <translation id="4236163961381003811">Odkrijte več razširitev</translation>
@@ -3645,6 +3647,7 @@
 <translation id="449232563137139956">Spletna mesta običajno prikazujejo slike, da zagotovijo ilustracije, kot so fotografije za spletne trgovine ali članke z novicami.</translation>
 <translation id="4492698018379445570">Oglejte si, kaj ste dodali v nakupovalne vozičke in dokončajte nakup, ko boste pripravljeni.</translation>
 <translation id="4493468155686877504">Priporočeno (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">Želite dovoliti to razširitev na mestu <ph name="SITE" />?</translation>
 <translation id="4495419450179050807">Ne pokaži na tej strani</translation>
 <translation id="4497145443434063861">Računalnik in Chromecast v različnih omrežjih Wi-Fi (npr. 2,4 GHz
     in 5 GHz)</translation>
@@ -6539,7 +6542,7 @@
 <translation id="7404065585741198296">Vaš telefon s kablom USB</translation>
 <translation id="7405938989981604410">{NUM_HOURS,plural, =1{Varnostno preverjanje je bilo izvedeno pred 1 uro}one{Varnostno preverjanje je bilo izvedeno pred {NUM_HOURS} uro}two{Varnostno preverjanje je bilo izvedeno pred {NUM_HOURS} urama}few{Varnostno preverjanje je bilo izvedeno pred {NUM_HOURS} urami}other{Varnostno preverjanje je bilo izvedeno pred {NUM_HOURS} urami}}</translation>
 <translation id="740624631517654988">Pojavno okno je blokirano</translation>
-<translation id="7407430846095439694">Uvoz in vezava</translation>
+<translation id="7407430846095439694">Uvozi in poveži</translation>
 <translation id="7407504355934009739">Večina ljudi blokira obvestila s tega spletnega mesta</translation>
 <translation id="740810853557944681">Dodajanje tiskalnega strežnika</translation>
 <translation id="7409549334477097887">Zelo veliko</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb
index 01d60ce..942dd44 100644
--- a/chrome/app/resources/generated_resources_sr-Latn.xtb
+++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -3628,6 +3628,7 @@
 <translation id="449232563137139956">Sajtovi obično prikazuju slike radi ilustracije, na primer, u onlajn prodavnicama ili vestima</translation>
 <translation id="4492698018379445570">Pronađite sadržaj koji ste dodali u korpe za kupovinu i platite kada budete spremni</translation>
 <translation id="4493468155686877504">Preporučeno (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">Želite da dozvolite ovaj dodatak na <ph name="SITE" />?</translation>
 <translation id="4495419450179050807">Ne prikazuj na ovoj stranici</translation>
 <translation id="4497145443434063861">Računar i Chromecast na različitim WiFi mrežama (npr. 2,4 GHz i 5 GHz)</translation>
 <translation id="4500114933761911433">Dodatna komponenta <ph name="PLUGIN_NAME" /> je otkazala</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 7ba521d9..26b648d 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -3628,6 +3628,7 @@
 <translation id="449232563137139956">Сајтови обично приказују слике ради илустрације, на пример, у онлајн продавницама или вестима</translation>
 <translation id="4492698018379445570">Пронађите садржај који сте додали у корпе за куповину и платите када будете спремни</translation>
 <translation id="4493468155686877504">Препоручено (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">Желите да дозволите овај додатак на <ph name="SITE" />?</translation>
 <translation id="4495419450179050807">Не приказуј на овој страници</translation>
 <translation id="4497145443434063861">Рачунар и Chromecast на различитим WiFi мрежама (нпр. 2,4 GHz и 5 GHz)</translation>
 <translation id="4500114933761911433">Додатна компонента <ph name="PLUGIN_NAME" /> је отказала</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 4844969..16617e9 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">பெயர் மாற்றப்பட்டுள்ளது</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> பக்கம் <ph name="DESK_TITLE" /> டெஸ்க்கில் உள்ளது</translation>
 <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> இல் திறக்கிறது…</translation>
+<translation id="1169266963600477608">கேம் கண்ட்ரோல்கள்</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> ஃபைலில் பாதுகாக்கவேண்டிய/ஆபத்தான தரவு உள்ளது. நிர்வாகி இவ்வாறு கூறுகிறார்: "<ph name="CUSTOM_MESSAGE" />"</translation>
 <translation id="1171135284592304528">கீபோர்டு ஃபோகஸ் மாறும் போது, ஃபோகஸைக் கொண்டுள்ள பொருளைத்  தனிப்படுத்து.</translation>
 <translation id="1171515578268894665">HID சாதனம் ஒன்றுடன் <ph name="ORIGIN" /> இணைய விரும்புகிறது</translation>
@@ -3378,6 +3379,7 @@
 <translation id="4227605727325220318">புதிய Android மொபைலைச் சேர்</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{இந்த நீட்டிப்பிற்கு அனுமதி இல்லை}other{சில நீட்டிப்புகளுக்கு அனுமதி இல்லை}}</translation>
 <translation id="4231095370974836764">Google Playயிலிருந்து உங்கள் <ph name="DEVICE_TYPE" /> சாதனத்தில் ஆப்ஸையும் கேம்களையும் நிறுவலாம். <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">கேம் கண்ட்ரோல்களை மூடுக</translation>
 <translation id="4232375817808480934">Kerberosஸை உள்ளமைத்தல்</translation>
 <translation id="4235965441080806197">உள்நுழைவை ரத்துசெய்</translation>
 <translation id="4236163961381003811">மேலும் நீட்டிப்புகளைக் கண்டறிக</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 138efa9a..534b30b 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -3646,6 +3646,7 @@
 <translation id="449232563137139956">ఆన్‌లైన్ స్టోర్‌లు లేదా వార్తా కథనాల ఫోటోలు వంటి వాటిని ఉదాహరణగా అందించడానికి సాధారణంగా సైట్‌లు ఇమేజ్‌లను చూపిస్తాయి</translation>
 <translation id="4492698018379445570">మీరు షాపింగ్ కార్ట్‌లలో ఏం జోడించారో కనుగొని, మీరు సిద్ధంగా ఉన్నప్పుడు చెక్ అవుట్ చేయండి</translation>
 <translation id="4493468155686877504">సిఫార్సు చేయబడినది (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180"><ph name="SITE" />‌లో ఈ ఎక్స్‌టెన్షన్‌ను అనుమతించాలా?</translation>
 <translation id="4495419450179050807">ఈ పేజీని చూపవద్దు</translation>
 <translation id="4497145443434063861">PC, Chromecast వేర్వేరు Wi-Fi నెట్‌వర్క్‌లలో (ఉదా. 2.4GHz
     వర్సెస్ 5GHz) ఉన్నాయి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 58059d9..be2a616 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -202,6 +202,7 @@
 <translation id="1188807932851744811">ยังไม่อัปโหลดบันทึก</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{เข้าถึง 1 ไฟล์ที่จัดเก็บไว้บนคอมพิวเตอร์}other{เข้าถึง # ไฟล์ที่จัดเก็บไว้บนคอมพิวเตอร์}}</translation>
 <translation id="119092896208640858"><ph name="BEGIN_LINK" />ออกจากระบบ<ph name="END_LINK" />เพื่อล้างข้อมูลการท่องเว็บในอุปกรณ์นี้เท่านั้น แต่ยังเก็บข้อมูลดังกล่าวไว้ในบัญชี Google</translation>
+<translation id="1191353342579061195">เลือกธีมที่ตรงกับความต้องการของคุณ หากต้องการเปลี่ยนธีม วอลเปเปอร์ โปรแกรมรักษาหน้าจอ และอื่นๆ เพียงคลิกขวาที่เดสก์ท็อป</translation>
 <translation id="1192706927100816598">{0,plural, =1{คุณจะออกจากระบบโดยอัตโนมัติใน # วินาที
 คุณต้องเสียบสมาร์ทการ์ดไว้ตลอดเพื่อให้ใช้งาน <ph name="DOMAIN" /> ได้}other{คุณจะออกจากระบบโดยอัตโนมัติใน # วินาที
 คุณต้องเสียบสมาร์ทการ์ดไว้ตลอดเพื่อให้ใช้งาน <ph name="DOMAIN" /> ได้}}</translation>
@@ -1293,6 +1294,7 @@
 <translation id="2220409419896228519">เพิ่มบุ๊กมาร์กไปยังแอป Google ที่คุณชอบ</translation>
 <translation id="2220529011494928058">รายงานปัญหา</translation>
 <translation id="2220572644011485463">PIN หรือรหัสผ่าน</translation>
+<translation id="222115440608612541">เปลี่ยนธีมตอนพระอาทิตย์ขึ้นและพระอาทิตย์ตก</translation>
 <translation id="2221261048068091179"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" /></translation>
 <translation id="222201875806112242">แหล่งที่มาของสื่อซึ่งไม่มีชื่อ</translation>
 <translation id="2224444042887712269">การตั้งค่านี้เป็นของ <ph name="OWNER_EMAIL" /></translation>
@@ -1518,6 +1520,7 @@
 <translation id="241082044617551207">ปลั๊กอินที่ไม่รู้จัก</translation>
 <translation id="2412753904894530585">Kerberos</translation>
 <translation id="2416435988630956212">แป้นฟังก์ชันของแป้นพิมพ์</translation>
+<translation id="2418307627282545839">ให้ความรู้สึกสว่างและปลอดโปร่ง</translation>
 <translation id="2419131370336513030">ดูแอปที่ติดตั้งไว้</translation>
 <translation id="2419706071571366386">โปรดออกจากระบบเมื่อไม่ได้ใช้คอมพิวเตอร์เพื่อความปลอดภัย</translation>
 <translation id="2422125132043002186">ยกเลิกการคืนค่า Linux แล้ว</translation>
@@ -6026,6 +6029,7 @@
 <translation id="6895032998810961280">รายงานรายละเอียดเกี่ยวกับซอฟต์แวร์ที่เป็นอันตราย การตั้งค่าระบบ และการประมวลผลที่พบในคอมพิวเตอร์ระหว่างการทำความสะอาดไปยัง Google</translation>
 <translation id="6896758677409633944">คัดลอก</translation>
 <translation id="6897363604023044284">เลือกเว็บไซต์เพื่อล้างข้อมูล</translation>
+<translation id="6897688156970667447">มีประโยชน์ในสภาวะแสงน้อยและประหยัดแบตเตอรี่</translation>
 <translation id="6898440773573063262">แอปพลิเคชันคีออสก์สามารถกำหนดค่าให้เปิดอัตโนมัติบนอุปกรณ์นี้ได้แล้ว</translation>
 <translation id="6900284862687837908">แอปพื้นหลัง: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">การปกป้องที่ปรับปรุงแล้ว</translation>
@@ -7513,6 +7517,7 @@
 <translation id="8358685469073206162">ต้องการกู้คืนหน้าเว็บไหม</translation>
 <translation id="8358912028636606457">อุปกรณ์นี้ไม่รองรับการแคสต์เสียงแท็บ</translation>
 <translation id="835951711479681002">บันทึกในบัญชี Google</translation>
+<translation id="8360140320636871023">ปรับเปลี่ยนธีมของการแสดงผลในแบบของคุณ</translation>
 <translation id="8363095875018065315">เสถียร</translation>
 <translation id="8363142353806532503">บล็อกไมโครโฟน</translation>
 <translation id="8366396658833131068">กู้คืนการเชื่อมต่อเครือข่ายของคุณแล้ว โปรดเลือกเครือข่ายอื่นหรือกดปุ่ม "ดำเนินการต่อ" ที่ด้านล่างเพื่อเปิดแอปคีออสก์</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb
index 062cc331..eb70e17 100644
--- a/chrome/app/resources/generated_resources_ur.xtb
+++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -180,6 +180,7 @@
 <translation id="1166583374608765787">نام میں ہوئی اپ ڈیٹ کا جائزہ لیں</translation>
 <translation id="1166596238782048887"><ph name="TAB_TITLE" /> <ph name="DESK_TITLE" /> ڈیسک سے تعلق رکھتی ہے</translation>
 <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> میں کھولا جا رہا ہے…</translation>
+<translation id="1169266963600477608">گیم کنٹرولز</translation>
 <translation id="1169435433292653700"><ph name="FILE_NAME" /> میں حساس یا خطرناک ڈیٹا ہے۔ آپ کے منتظم کے مطابق: "<ph name="CUSTOM_MESSAGE" />"</translation>
 <translation id="1171135284592304528">کی بورڈ فوکس کے ساتھ آبجیکٹ تبدیل ہونے پر اسے ہائی لائٹ کریں</translation>
 <translation id="1171515578268894665">‏<ph name="ORIGIN" /> HID آلہ سے منسلک کرنا چاہتا ہے</translation>
@@ -201,6 +202,7 @@
 <translation id="1188807932851744811">لاگ اپ لوڈ نہیں ہوا۔</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{اپنے کمپیوٹر پر اسٹور کردہ ایک فائل تک رسائی حاصل کریں}other{اپنے کمپیوٹر پر اسٹور کردہ # فائلوں تک رسائی حاصل کریں}}</translation>
 <translation id="119092896208640858">‏براؤزنگ ڈیٹا کو اپنے Google اکاؤنٹ میں رکھتے ہوئے، صرف اس آلہ سے اسے صاف کرنے کیلئے، <ph name="BEGIN_LINK" />سائن آؤٹ کریں<ph name="END_LINK" />۔</translation>
+<translation id="1191353342579061195">وہ تھیم منتخب کریں جو آپ کی ضروریات کے مطابق ہو۔ اپنی تھیم، وال پیپر، اسکرین سیور اور مزید کو تبدیل کرنے کے لیے، بس ڈیسک ٹاپ پر دائیں کلک کریں۔</translation>
 <translation id="1192706927100816598">{0,plural, =1{آپ خودکار طور پر # سیکنڈ میں سائن آؤٹ ہو جائیں گے۔
 <ph name="DOMAIN" /> آپ سے اپنا سمارٹ کارڈ داخل کئے رکھنے کا تقاضا کرتا ہے۔}other{آپ خودکار طور پر # سیکنڈ میں سائن آؤٹ ہو جائیں گے۔
 <ph name="DOMAIN" /> آپ سے اپنا سمارٹ کارڈ داخل کئے رکھنے کا تقاضا کرتا ہے۔}}</translation>
@@ -1293,6 +1295,7 @@
 <translation id="2220409419896228519">‏اپنی پسندیدہ Google ایپس میں بُک مارکس شامل کریں</translation>
 <translation id="2220529011494928058">ایک مسئلے کی اطلاع دیں</translation>
 <translation id="2220572644011485463">‏PIN یا پاس ورڈ</translation>
+<translation id="222115440608612541">طلوع آفتاب اور غروب آفتاب کی تھیمز پر سوئچ کریں</translation>
 <translation id="2221261048068091179"><ph name="FIRST_SWITCH" />، <ph name="SECOND_SWITCH" /></translation>
 <translation id="222201875806112242">بے نام میڈیا ماخذ</translation>
 <translation id="2224444042887712269">یہ ترتیب <ph name="OWNER_EMAIL" /> سے متعلق ہے۔</translation>
@@ -1519,6 +1522,7 @@
 <translation id="241082044617551207">نامعلوم پلگ ان</translation>
 <translation id="2412753904894530585">Kerberos</translation>
 <translation id="2416435988630956212">کی بورڈ کی فنکشن کلیدیں</translation>
+<translation id="2418307627282545839">چیزوں کو روشن اور ہوا دار رکھیں</translation>
 <translation id="2419131370336513030">انسٹال کردہ ایپس دیکھیں</translation>
 <translation id="2419706071571366386">سیکورٹی کے مد نظر جب آپ کا کمپیوٹر استعمال نہ ہو رہا ہو تو سائن آؤٹ کریں۔</translation>
 <translation id="2422125132043002186">‏Linux کی بحالی منسوخ ہو گئی</translation>
@@ -3364,6 +3368,7 @@
 <translation id="4227605727325220318">‏ایک نیا Android فون شامل کریں</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{اس ایکسٹینشن کی اجازت نہیں ہے}other{کچھ ایکسٹینشنز کی اجازت نہیں ہے}}</translation>
 <translation id="4231095370974836764">‏اپنے <ph name="DEVICE_TYPE" /> پر Google Play سے ایپس اور گیمز انسٹال کریں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">گیم کنٹرولز بند کریں</translation>
 <translation id="4232375817808480934">‏Kerberos کنفیگر کریں</translation>
 <translation id="4235965441080806197">سائن ان کو منسوخ کریں</translation>
 <translation id="4236163961381003811">مزید ایکسٹینشنز دریافت کریں</translation>
@@ -6027,6 +6032,7 @@
 <translation id="6895032998810961280">‏اس صفائی کے دوران اپنے کمپیوٹر پر ملنے والے نقصان دہ سافٹ ویئر، سسٹم کی ترتیبات اور کارروائیوں کی تفصیلات کے بارے میں Google کو مطلع کریں</translation>
 <translation id="6896758677409633944">کاپی کریں</translation>
 <translation id="6897363604023044284">صاف کرنے کے لیے سائٹس کا انتخاب کریں</translation>
+<translation id="6897688156970667447">کم روشنی میں مددگار اور بیٹری بچاتا ہے</translation>
 <translation id="6898440773573063262">کیوسک ایپلیکیشنز کو اس آلہ پر خودبخود شروع کرنے کیلئے اب کنفیگر کیا جا سکتا ہے۔</translation>
 <translation id="6900284862687837908">پس منظر ایپ: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">بہتر کردہ حفاظت</translation>
@@ -7513,6 +7519,7 @@
 <translation id="8358685469073206162">صفحات بحال کریں؟</translation>
 <translation id="8358912028636606457">ٹیب آڈیو کاسٹ کرنا اس آلہ پر تعاون یافتہ نہیں ہے۔</translation>
 <translation id="835951711479681002">‏اپنے Google اکاؤنٹ میں محفوظ کریں</translation>
+<translation id="8360140320636871023">اپنی ڈسپلے تھیم کو ذاتی نوعیت کا بنائیں</translation>
 <translation id="8363095875018065315">مستحکم</translation>
 <translation id="8363142353806532503">مائیکروفون مسدود ہے</translation>
 <translation id="8366396658833131068">آپ کے نیٹ ورک کی کنیکٹوٹی بحال ہوگئی ہے۔ براہ کرم اپنی کیوسک ایپ شروع کرنے کیلئے ایک مختلف نیٹ ورک منتخب کریں یا ذیل میں 'جاری رکھیں' بٹن دبائیں۔</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 2502ed6..accdf8d 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -3615,6 +3615,7 @@
 <translation id="449232563137139956">网站通常会显示图片以提供插图(例如网店或新闻报道的图片)</translation>
 <translation id="4492698018379445570">查看您已添加到购物车的商品,并在选定后结帐</translation>
 <translation id="4493468155686877504">建议大小 (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">允许此扩展程序在 <ph name="SITE" /> 上运行?</translation>
 <translation id="4495419450179050807">不要在本页上显示</translation>
 <translation id="4497145443434063861">PC 和 Chromecast 使用不同的 Wi-Fi 网络(例如分别为 2.4GHz 和 5GHz)</translation>
 <translation id="4500114933761911433">“<ph name="PLUGIN_NAME" />”崩溃了</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index e0feb17..88ed692 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -182,6 +182,7 @@
 <translation id="1166583374608765787">Hlola isibuyekezo segama</translation>
 <translation id="1166596238782048887">I-<ph name="TAB_TITLE" /> ingeye-<ph name="DESK_TITLE" /></translation>
 <translation id="1168020859489941584">Ivuleka ngo-<ph name="TIME_REMAINING" />...</translation>
+<translation id="1169266963600477608">Izilawuli zegeyimu</translation>
 <translation id="1169435433292653700">I-<ph name="FILE_NAME" /> inedatha ezwelayo noma eyingozi. Umlawuli wakho uthi: "<ph name="CUSTOM_MESSAGE" />".</translation>
 <translation id="1171135284592304528">Gqamisa into ngokugxila kwekhibhodi uma ishintsha</translation>
 <translation id="1171515578268894665">I-<ph name="ORIGIN" /> ifuna ukuxhumeka kudivayisi ye-HID</translation>
@@ -203,6 +204,7 @@
 <translation id="1188807932851744811">Ilogu ayilayishiwe.</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{Finyelela kufayela eligcinwe kukhompuyutha yakho}one{Finyelela kumafayela angu-# agcinwe kukhompuyutha yakho}other{Finyelela kumafayela angu-# agcinwe kukhompuyutha yakho}}</translation>
 <translation id="119092896208640858">Ukuze usule idatha yokuphequlula kusuka kule divayisi kuphela, ngenkathi uyigcina ku-akhawunti yakho ye-Google, <ph name="BEGIN_LINK" />phuma<ph name="END_LINK" />.</translation>
+<translation id="1191353342579061195">Khetha itimu ehambisana nezidingo zakho. Ukuze ushintshe itimu yakho, isithombe sangemuva, isilondolozi sesikrini, nokuningi, vele uchofoze kwesokudla kudeskithophu.</translation>
 <translation id="1192706927100816598">{0,plural, =1{Uzokhishwa ngemvume ngokuzenzakalealyo kusekhondi elingu-#.
 I-<ph name="DOMAIN" /> idinga ukuba ugcine ikhadi lakho elimsathi lifakiwe.}one{Uzokhishwa ngemvume ngokuzenzakalealyo kumasekhondi angu-#.
 I-<ph name="DOMAIN" /> idinga ukuba ugcine ikhadi lakho elimsathi lifakiwe.}other{Uzokhishwa ngemvume ngokuzenzakalealyo kumasekhondi angu-#.
@@ -1304,6 +1306,7 @@
 <translation id="2220409419896228519">Engeza amabhukhimakhi akho kuzinhlelo zakho zokusebenza eziyintandokazi ze-Google</translation>
 <translation id="2220529011494928058">Bika inkinga</translation>
 <translation id="2220572644011485463">Iphinikhodi noma iphasiwedi</translation>
+<translation id="222115440608612541">Shintsha amatimu ekuphumeni kwelanga nasekushoneni kwelanga</translation>
 <translation id="2221261048068091179"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" /></translation>
 <translation id="222201875806112242">Umthombo wemidiya ongaqanjwanga</translation>
 <translation id="2224444042887712269">Lokhu kulungiselelwa kungokwe-<ph name="OWNER_EMAIL" />.</translation>
@@ -1533,6 +1536,7 @@
 <translation id="241082044617551207">I-plugin engaziwa</translation>
 <translation id="2412753904894530585">I-Kerberos</translation>
 <translation id="2416435988630956212">Okhiye bokusebenza kwekhibhodi</translation>
+<translation id="2418307627282545839">Gcina izinto zigqamile futhi zinomoya</translation>
 <translation id="2419131370336513030">Buka izinhlelo zokusebenza ezifakiwe</translation>
 <translation id="2419706071571366386">Ngokuphepha, phuma uma ikhompyutha yakho ingasetshenziswa.</translation>
 <translation id="2422125132043002186">Ukubuyisa kwe-Linux kukhanseliwe</translation>
@@ -3378,6 +3382,7 @@
 <translation id="4227605727325220318">Faka ifoni entsha ye-Android</translation>
 <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Lesi sandiso asivunyelwe}one{Ezinye izandiso azivunyelwe}other{Ezinye izandiso azivunyelwe}}</translation>
 <translation id="4231095370974836764">Faka izinhlelo zokusebenza namageyimu avela ku-Google Play ku-<ph name="DEVICE_TYPE" /> yakho. <ph name="LINK_BEGIN" />Funda kabanzi<ph name="LINK_END" /></translation>
+<translation id="4231141543165771749">Vala izilawuli zegeyimu</translation>
 <translation id="4232375817808480934">Lungiselela i-Kerberos</translation>
 <translation id="4235965441080806197">Khansela ukungena ngemvume</translation>
 <translation id="4236163961381003811">Thola izandiso eziningi</translation>
@@ -3642,6 +3647,7 @@
 <translation id="449232563137139956">Amasayithi avamise ukubonisa izithombe ukuze kunikezwe imidwebo, efana nezithombe zezitolo eziku-inthanethi noma ama-athikili ezindaba</translation>
 <translation id="4492698018379445570">Thola lokho okwengeze emakalishini wokuthenga bese uqedela ukuthenga lapho usukulungele</translation>
 <translation id="4493468155686877504">Kunconyiwe (<ph name="INSTALL_SIZE" />)</translation>
+<translation id="4495002167047709180">Vumela lesi sandiso ukuthi sivuleke ku-<ph name="SITE" />?</translation>
 <translation id="4495419450179050807">Ungabonisi kuleli khasi</translation>
 <translation id="4497145443434063861">I-PC ne-Chromecast kumanethiwekhi ahlukile ku-Wi-Fi (isb. 2.4GHz
     vs. 5GHz)</translation>
@@ -6047,6 +6053,7 @@
 <translation id="6895032998810961280">Bika imininingwane ku-Google mayelana nesofthiwe, izilungiselelo zesistimu, nezincubo ezitholakele kwikhompyutha yakho phakathi nalokhu kuhlanza</translation>
 <translation id="6896758677409633944">Kopisha</translation>
 <translation id="6897363604023044284">Khetha amasayithi ozowasula</translation>
+<translation id="6897688156970667447">Iwusizo ekukhanyeni okuphansi futhi yonga ibhethri</translation>
 <translation id="6898440773573063262">Izinhlelo zokusebenza ze-Kiosk manje zingalungiswa ukuvula ngokuzenzakalelayo kule divayisi.</translation>
 <translation id="6900284862687837908">Uhlelo lokusebenza lwangemuva: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">Ukuvikelwa okugqanyisiwe</translation>
@@ -7533,6 +7540,7 @@
 <translation id="8358685469073206162">Buyisela amakhasi?</translation>
 <translation id="8358912028636606457">Umsindo wethebhu yokusakaza awusekelwe kule divayisi.</translation>
 <translation id="835951711479681002">Londoloza ku-akhawunti yakho ye-Google</translation>
+<translation id="8360140320636871023">Yenza kube ngokwakho itimu yakho yokubonisa</translation>
 <translation id="8363095875018065315">kuzinzile</translation>
 <translation id="8363142353806532503">Imakrofoni ivinjiwe</translation>
 <translation id="8366396658833131068">Umsebenzi wakho wenethiwekhi ubuyiselwe. Sicela ukhethe inethiwekhi ehlukile noma cindezela inkinobho ethi 'Qhubeka' ngezansi ukuze uqalise uhlelo lwakho lokusebenza lwekhiyoski.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb
index e71c05a..540f19b 100644
--- a/chrome/app/resources/google_chrome_strings_vi.xtb
+++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -9,7 +9,7 @@
 <translation id="110877069173485804">Đây là Chrome của bạn</translation>
 <translation id="1125124144982679672">Ai đang sử dụng Chrome?</translation>
 <translation id="1142745911746664600">Không thể cập nhật Chrome</translation>
-<translation id="1152920704813762236">Giới thiệu về ChromeOS</translation>
+<translation id="1152920704813762236">Giới thiệu về Chrome OS</translation>
 <translation id="1154147086299354128">&amp;Mở trong Chrome</translation>
 <translation id="1178374936842835197">Nếu bạn không thấy một chế độ cài đặt nào đó trên trang này, hãy xem phần <ph name="LINK_BEGIN" />Cài đặt ChromeOS Flex<ph name="LINK_END" /></translation>
 <translation id="1278833599417554002">Chạy lại để cập nhật &amp;Chrome</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index eacc45d7..e0de8e3 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -407,6 +407,8 @@
     "dips/dips_state.h",
     "dips/dips_storage.cc",
     "dips/dips_storage.h",
+    "dips/dips_utils.cc",
+    "dips/dips_utils.h",
     "display_capture/display_capture_permission_context.cc",
     "display_capture/display_capture_permission_context.h",
     "dom_distiller/dom_distiller_service_factory.cc",
diff --git a/chrome/browser/about_flags_unittest.cc b/chrome/browser/about_flags_unittest.cc
index 962b18f..99d4404 100644
--- a/chrome/browser/about_flags_unittest.cc
+++ b/chrome/browser/about_flags_unittest.cc
@@ -66,6 +66,14 @@
         result.insert(std::string(entry.feature.feature->name) + ":enabled");
         result.insert(std::string(entry.feature.feature->name) + ":disabled");
         break;
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+      case flags_ui::FeatureEntry::PLATFORM_FEATURE_NAME_VALUE:
+      case flags_ui::FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE:
+        std::string name(entry.platform_feature_name.name);
+        result.insert(name + ":enabled");
+        result.insert(name + ":disabled");
+        break;
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
     }
   }
   return result;
@@ -75,11 +83,18 @@
 std::vector<std::string> GetAllVariationIds() {
   std::vector<std::string> variation_ids;
   for (const auto& entry : testing::GetFeatureEntries()) {
-    // Only FEATURE_WITH_PARAMS_VALUE entries can have a variation id.
-    if (entry.type != flags_ui::FeatureEntry::FEATURE_WITH_PARAMS_VALUE)
+    // Only FEATURE_WITH_PARAMS_VALUE or PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE
+    // entries can have a variation id.
+    if (entry.type != flags_ui::FeatureEntry::FEATURE_WITH_PARAMS_VALUE
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+        && entry.type !=
+               flags_ui::FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+    ) {
       continue;
+    }
 
-    for (const auto& variation : entry.feature.feature_variations) {
+    for (const auto& variation : entry.GetVariations()) {
       if (variation.variation_id)
         variation_ids.push_back(variation.variation_id);
     }
diff --git a/chrome/browser/ash/external_metrics.cc b/chrome/browser/ash/external_metrics.cc
index 9c4fd81d..39008d6 100644
--- a/chrome/browser/ash/external_metrics.cc
+++ b/chrome/browser/ash/external_metrics.cc
@@ -33,7 +33,7 @@
 bool CheckValues(const std::string& name,
                  int minimum,
                  int maximum,
-                 uint32_t bucket_count) {
+                 size_t bucket_count) {
   if (!base::Histogram::InspectConstructionArguments(
       name, &minimum, &maximum, &bucket_count))
     return false;
diff --git a/chrome/browser/ash/file_manager/restore_io_task_unittest.cc b/chrome/browser/ash/file_manager/restore_io_task_unittest.cc
index 22503575..eef74e0 100644
--- a/chrome/browser/ash/file_manager/restore_io_task_unittest.cc
+++ b/chrome/browser/ash/file_manager/restore_io_task_unittest.cc
@@ -11,6 +11,8 @@
 #include "base/test/gmock_callback_support.h"
 #include "base/test/mock_callback.h"
 #include "chrome/browser/ash/file_manager/path_util.h"
+#include "chrome/browser/ash/file_manager/restore_io_task.h"
+#include "chrome/browser/ash/file_manager/trash_unittest_base.h"
 #include "chrome/test/base/testing_profile.h"
 #include "content/public/test/browser_task_environment.h"
 #include "storage/browser/file_system/file_system_context.h"
@@ -28,39 +30,12 @@
 using ::testing::_;
 using ::testing::Field;
 
-constexpr size_t kTestFileSize = 32;
+class RestoreIOTaskTest : public TrashBaseTest {
+ public:
+  RestoreIOTaskTest() = default;
 
-class RestoreIOTaskTest : public testing::Test {
- protected:
-  void SetUp() override {
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-
-    profile_ =
-        std::make_unique<TestingProfile>(base::FilePath(temp_dir_.GetPath()));
-
-    file_system_context_ = storage::CreateFileSystemContextForTesting(
-        nullptr, temp_dir_.GetPath());
-  }
-
-  storage::FileSystemURL CreateFileSystemURL(
-      const base::FilePath& absolute_path) {
-    std::string relative_path = absolute_path.value();
-    EXPECT_TRUE(file_manager::util::ReplacePrefix(
-        &relative_path, temp_dir_.GetPath().AsEndingWithSeparator().value(),
-        ""));
-
-    return file_system_context_->CreateCrackedFileSystemURL(
-        kTestStorageKey, storage::kFileSystemTypeTest,
-        base::FilePath::FromUTF8Unsafe(relative_path));
-  }
-
-  content::BrowserTaskEnvironment task_environment_;
-  std::unique_ptr<TestingProfile> profile_;
-  const blink::StorageKey kTestStorageKey =
-      blink::StorageKey::CreateFromStringForTesting("chrome-extension://abc");
-
-  base::ScopedTempDir temp_dir_;
-  scoped_refptr<storage::FileSystemContext> file_system_context_;
+  RestoreIOTaskTest(const RestoreIOTaskTest&) = delete;
+  RestoreIOTaskTest& operator=(const RestoreIOTaskTest&) = delete;
 };
 
 TEST_F(RestoreIOTaskTest, URLsWithInvalidSuffixShouldError) {
diff --git a/chrome/browser/ash/file_manager/trash_common_util.cc b/chrome/browser/ash/file_manager/trash_common_util.cc
new file mode 100644
index 0000000..cde7aff
--- /dev/null
+++ b/chrome/browser/ash/file_manager/trash_common_util.cc
@@ -0,0 +1,26 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ash/file_manager/trash_common_util.h"
+
+namespace file_manager {
+namespace io_task {
+
+constexpr char kTrashFolderName[] = ".Trash";
+constexpr char kInfoFolderName[] = "info";
+constexpr char kFilesFolderName[] = "files";
+
+const base::FilePath GenerateTrashPath(const base::FilePath& trash_path,
+                                       const std::string& subdir,
+                                       const std::string& file_name) {
+  base::FilePath path = trash_path.Append(subdir).Append(file_name);
+  // The metadata file in .Trash/info always has the .trashinfo extension.
+  if (subdir == kInfoFolderName) {
+    path = path.AddExtension(".trashinfo");
+  }
+  return path;
+}
+
+}  // namespace io_task
+}  // namespace file_manager
diff --git a/chrome/browser/ash/file_manager/trash_common_util.h b/chrome/browser/ash/file_manager/trash_common_util.h
new file mode 100644
index 0000000..d8dc4723
--- /dev/null
+++ b/chrome/browser/ash/file_manager/trash_common_util.h
@@ -0,0 +1,30 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ASH_FILE_MANAGER_TRASH_COMMON_UTIL_H_
+#define CHROME_BROWSER_ASH_FILE_MANAGER_TRASH_COMMON_UTIL_H_
+
+#include "base/files/file_path.h"
+
+namespace file_manager {
+namespace io_task {
+
+// Constant representing the Trash folder name.
+extern const char kTrashFolderName[];
+
+// Constant representing the "info" folder name inside .Trash.
+extern const char kInfoFolderName[];
+
+// Constant representing the "files" folder name inside .Trash.
+extern const char kFilesFolderName[];
+
+// Helper to create a destination path for a file in one of the .Trash folders.
+const base::FilePath GenerateTrashPath(const base::FilePath& trash_path,
+                                       const std::string& subdir,
+                                       const std::string& file_name);
+
+}  // namespace io_task
+}  // namespace file_manager
+
+#endif  // CHROME_BROWSER_ASH_FILE_MANAGER_TRASH_COMMON_UTIL_H_
diff --git a/chrome/browser/ash/file_manager/trash_io_task.cc b/chrome/browser/ash/file_manager/trash_io_task.cc
index 0798ef0..17f28ae 100644
--- a/chrome/browser/ash/file_manager/trash_io_task.cc
+++ b/chrome/browser/ash/file_manager/trash_io_task.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/ash/file_manager/fileapi_util.h"
 #include "chrome/browser/ash/file_manager/io_task_util.h"
 #include "chrome/browser/ash/file_manager/path_util.h"
+#include "chrome/browser/ash/file_manager/trash_common_util.h"
 #include "chrome/browser/ash/file_manager/volume_manager.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -24,11 +25,6 @@
 
 namespace file_manager {
 namespace io_task {
-
-constexpr char kTrashFolderName[] = ".Trash";
-constexpr char kInfoFolderName[] = "info";
-constexpr char kFilesFolderName[] = "files";
-
 namespace {
 
 // Generates and updates the `entry` with the standard contents of the
@@ -112,17 +108,6 @@
 
 }  // namespace
 
-const base::FilePath GenerateTrashPath(const base::FilePath& trash_path,
-                                       const std::string& subdir,
-                                       const std::string& file_name) {
-  base::FilePath path = trash_path.Append(subdir).Append(file_name);
-  // The metadata file in .Trash/info always has the .trashinfo extension.
-  if (subdir == kInfoFolderName) {
-    path = path.AddExtension(".trashinfo");
-  }
-  return path;
-}
-
 TrashIOTask::TrashIOTask(
     std::vector<storage::FileSystemURL> file_urls,
     Profile* profile,
diff --git a/chrome/browser/ash/file_manager/trash_io_task.h b/chrome/browser/ash/file_manager/trash_io_task.h
index 8d071451..2695d08 100644
--- a/chrome/browser/ash/file_manager/trash_io_task.h
+++ b/chrome/browser/ash/file_manager/trash_io_task.h
@@ -93,20 +93,6 @@
 
 }  // namespace
 
-// Constant representing the Trash folder name.
-extern const char kTrashFolderName[];
-
-// Constant representing the "info" folder name inside .Trash.
-extern const char kInfoFolderName[];
-
-// Constant representing the "files" folder name inside .Trash.
-extern const char kFilesFolderName[];
-
-// Helper to create a destination path for a file in one of the .Trash folders.
-const base::FilePath GenerateTrashPath(const base::FilePath& trash_path,
-                                       const std::string& subdir,
-                                       const std::string& file_name);
-
 // This class represents a trash task. A trash task attempts to trash zero or
 // more files by first moving them to a .Trash/files or .Trash-{UID}/files
 // folder that resides in a parent folder for:
diff --git a/chrome/browser/ash/file_manager/trash_io_task_unittest.cc b/chrome/browser/ash/file_manager/trash_io_task_unittest.cc
index dc0dfab..d125b479 100644
--- a/chrome/browser/ash/file_manager/trash_io_task_unittest.cc
+++ b/chrome/browser/ash/file_manager/trash_io_task_unittest.cc
@@ -9,37 +9,22 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/rand_util.h"
 #include "base/run_loop.h"
-#include "base/strings/strcat.h"
 #include "base/test/bind.h"
 #include "base/test/gmock_callback_support.h"
 #include "base/test/mock_callback.h"
 #include "base/time/time_override.h"
-#include "base/time/time_to_iso8601.h"
 #include "chrome/browser/ash/crostini/crostini_manager.h"
-#include "chrome/browser/ash/drive/drive_integration_service.h"
-#include "chrome/browser/ash/drive/drivefs_test_support.h"
 #include "chrome/browser/ash/file_manager/fake_disk_mount_manager.h"
-#include "chrome/browser/ash/file_manager/path_util.h"
-#include "chrome/browser/ash/file_manager/volume_manager.h"
-#include "chrome/browser/ash/file_manager/volume_manager_factory.h"
-#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
-#include "chrome/test/base/testing_profile.h"
+#include "chrome/browser/ash/file_manager/trash_common_util.h"
+#include "chrome/browser/ash/file_manager/trash_unittest_base.h"
 #include "chromeos/ash/components/dbus/cicerone/cicerone_client.h"
 #include "chromeos/ash/components/dbus/concierge/concierge_client.h"
-#include "chromeos/ash/components/dbus/seneschal/seneschal_client.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/account_id/account_id.h"
 #include "components/drive/drive_pref_names.h"
 #include "components/prefs/pref_service.h"
-#include "components/user_manager/scoped_user_manager.h"
-#include "content/public/test/browser_task_environment.h"
-#include "storage/browser/file_system/external_mount_points.h"
-#include "storage/browser/test/test_file_system_context.h"
 #include "storage/common/file_system/file_system_mount_option.h"
 #include "storage/common/file_system/file_system_types.h"
 #include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/common/storage_key/storage_key.h"
 
 namespace file_manager {
 namespace io_task {
@@ -75,181 +60,12 @@
   return testing::ExplainMatchResult(matcher, errors, result_listener);
 }
 
-constexpr size_t kTestFileSize = 32;
-class TrashIOTaskTest : public testing::Test {
- protected:
-  void SetUp() override {
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+class TrashIOTaskTest : public TrashBaseTest {
+ public:
+  TrashIOTaskTest() = default;
 
-    // Pass in a mock factory method that sets up a fake
-    // DriveIntegrationService. This ensures the enabled paths contain the drive
-    // path.
-    create_drive_integration_service_ =
-        base::BindRepeating(&TrashIOTaskTest::CreateDriveIntegrationService,
-                            base::Unretained(this));
-    service_factory_for_test_ = std::make_unique<
-        drive::DriveIntegrationServiceFactory::ScopedFactoryForTest>(
-        &create_drive_integration_service_);
-    // Create the profile and add it to the user manager for DriveFS.
-    profile_ =
-        std::make_unique<TestingProfile>(base::FilePath(temp_dir_.GetPath()));
-    auto user_manager = std::make_unique<ash::FakeChromeUserManager>();
-    AccountId account_id =
-        AccountId::FromUserEmailGaiaId(profile_->GetProfileUserName(), "12345");
-    user_manager->AddUser(account_id);
-    user_manager->LoginUser(account_id);
-    scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>(
-        std::move(user_manager));
-
-    file_system_context_ = storage::CreateFileSystemContextForTesting(
-        nullptr, temp_dir_.GetPath());
-    my_files_dir_ = temp_dir_.GetPath().Append("MyFiles");
-    storage::ExternalMountPoints::GetSystemInstance()->RegisterFileSystem(
-        file_manager::util::GetDownloadsMountPointName(profile_.get()),
-        storage::kFileSystemTypeLocal, storage::FileSystemMountOption(),
-        my_files_dir_);
-
-    // Create Downloads inside the `temp_dir_` which will implicitly create the
-    // `my_files_dir_.
-    downloads_dir_ = my_files_dir_.Append("Downloads");
-    ASSERT_TRUE(base::CreateDirectory(downloads_dir_));
-
-    chromeos::DBusThreadManager::Initialize();
-    ash::CiceroneClient::InitializeFake();
-    ash::ConciergeClient::InitializeFake();
-    ash::SeneschalClient::InitializeFake();
-
-    // Ensure Crostini is setup correctly.
-    crostini_manager_ =
-        crostini::CrostiniManager::GetForProfile(profile_.get());
-    crostini_manager_->AddRunningVmForTesting(crostini::kCrostiniDefaultVmName);
-    crostini_manager_->AddRunningContainerForTesting(
-        crostini::kCrostiniDefaultVmName,
-        crostini::ContainerInfo(crostini::kCrostiniDefaultContainerName,
-                                "testuser", "/remote/mount", "PLACEHOLDER_IP"));
-
-    crostini_dir_ = temp_dir_.GetPath().Append("crostini");
-    ASSERT_TRUE(base::CreateDirectory(crostini_dir_));
-
-    VolumeManagerFactory::GetInstance()->SetTestingFactory(
-        profile_.get(),
-        base::BindLambdaForTesting([this](content::BrowserContext* context) {
-          return std::unique_ptr<KeyedService>(std::make_unique<VolumeManager>(
-              Profile::FromBrowserContext(context), nullptr, nullptr,
-              &disk_mount_manager_, nullptr,
-              VolumeManager::GetMtpStorageInfoCallback()));
-        }));
-    crostini_remote_mount_ = base::FilePath("/remote/mount");
-    auto* volume_manager = VolumeManager::Get(profile_.get());
-    volume_manager->AddVolumeForTesting(
-        Volume::CreateForSshfsCrostini(crostini_dir_, crostini_remote_mount_));
-  }
-
-  void TearDown() override {
-    // Ensure any previously registered mount points for Downloads are revoked.
-    storage::ExternalMountPoints::GetSystemInstance()->RevokeAllFileSystems();
-    scoped_user_manager_.reset();
-    profile_.reset();
-    ash::SeneschalClient::Shutdown();
-    ash::ConciergeClient::Shutdown();
-    ash::CiceroneClient::Shutdown();
-    chromeos::DBusThreadManager::Shutdown();
-  }
-
-  drive::DriveIntegrationService* CreateDriveIntegrationService(
-      Profile* profile) {
-    base::ScopedAllowBlockingForTesting allow_blocking;
-    base::FilePath mount_point = temp_dir_.GetPath().Append("drivefs");
-    fake_drivefs_helper_ =
-        std::make_unique<drive::FakeDriveFsHelper>(profile, mount_point);
-    integration_service_ = new drive::DriveIntegrationService(
-        profile, "", mount_point,
-        fake_drivefs_helper_->CreateFakeDriveFsListenerFactory());
-    return integration_service_;
-  }
-
-  storage::FileSystemURL CreateFileSystemURL(
-      const base::FilePath& absolute_path) {
-    std::string relative_path = absolute_path.value();
-    EXPECT_TRUE(file_manager::util::ReplacePrefix(
-        &relative_path, temp_dir_.GetPath().AsEndingWithSeparator().value(),
-        ""));
-
-    return file_system_context_->CreateCrackedFileSystemURL(
-        kTestStorageKey, storage::kFileSystemTypeTest,
-        base::FilePath::FromUTF8Unsafe(relative_path));
-  }
-
-  const base::FilePath GenerateInfoPath(const std::string& file_name) {
-    return GenerateTrashPath(downloads_dir_.Append(kTrashFolderName),
-                             kInfoFolderName, file_name);
-  }
-
-  const base::FilePath GenerateFilesPath(const std::string& file_name) {
-    return GenerateTrashPath(downloads_dir_.Append(kTrashFolderName),
-                             kFilesFolderName, file_name);
-  }
-
-  const std::string CreateTrashInfoContentsFromPath(
-      const base::FilePath& file_path,
-      const base::FilePath& base_path,
-      const base::FilePath& prefix_path) {
-    std::string relative_restore_path = file_path.value();
-    EXPECT_TRUE(file_manager::util::ReplacePrefix(
-        &relative_restore_path, base_path.AsEndingWithSeparator().value(), ""));
-
-    base::FilePath prefix = (prefix_path.IsAbsolute())
-                                ? prefix_path
-                                : base::FilePath("/").Append(prefix_path);
-
-    return base::StrCat(
-        {"[Trash Info]\nPath=", prefix.AsEndingWithSeparator().value(),
-         relative_restore_path,
-         "\nDeletionDate=", base::TimeToISO8601(base::Time())});
-  }
-
-  const std::string CreateTrashInfoContentsFromPath(
-      const base::FilePath& file_path) {
-    return CreateTrashInfoContentsFromPath(file_path, my_files_dir_,
-                                           base::FilePath("/"));
-  }
-
-  bool EnsureTrashDirectorySetup(const base::FilePath& parent_path) {
-    base::FilePath trash_path = parent_path.Append(kTrashFolderName);
-    if (!base::CreateDirectory(trash_path.Append(kInfoFolderName))) {
-      return false;
-    }
-    if (!base::CreateDirectory(trash_path.Append(kFilesFolderName))) {
-      return false;
-    }
-    return true;
-  }
-
-  content::BrowserTaskEnvironment task_environment_;
-  std::unique_ptr<TestingProfile> profile_;
-  const blink::StorageKey kTestStorageKey =
-      blink::StorageKey::CreateFromStringForTesting("chrome-extension://abc");
-
-  // DriveFS setup methods to ensure the tests have access to a mock
-  // DriveIntegrationService tied to the TestingProfile.
-  std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
-  std::unique_ptr<drive::FakeDriveFsHelper> fake_drivefs_helper_;
-  drive::DriveIntegrationService* integration_service_ = nullptr;
-  drive::DriveIntegrationServiceFactory::FactoryCallback
-      create_drive_integration_service_;
-  std::unique_ptr<drive::DriveIntegrationServiceFactory::ScopedFactoryForTest>
-      service_factory_for_test_;
-
-  crostini::CrostiniManager* crostini_manager_;
-  file_manager::FakeDiskMountManager disk_mount_manager_;
-
-  base::ScopedTempDir temp_dir_;
-  base::FilePath downloads_dir_;
-  base::FilePath my_files_dir_;
-  base::FilePath drive_dir_;
-  base::FilePath crostini_dir_;
-  base::FilePath crostini_remote_mount_;
-  scoped_refptr<storage::FileSystemContext> file_system_context_;
+  TrashIOTaskTest(const TrashIOTaskTest&) = delete;
+  TrashIOTaskTest& operator=(const TrashIOTaskTest&) = delete;
 };
 
 void AssertTrashSetup(const base::FilePath& parent_path) {
diff --git a/chrome/browser/ash/file_manager/trash_unittest_base.cc b/chrome/browser/ash/file_manager/trash_unittest_base.cc
new file mode 100644
index 0000000..09dd8bd
--- /dev/null
+++ b/chrome/browser/ash/file_manager/trash_unittest_base.cc
@@ -0,0 +1,179 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ash/file_manager/trash_unittest_base.h"
+
+#include "base/files/file_util.h"
+#include "base/strings/strcat.h"
+#include "base/test/bind.h"
+#include "base/time/time_to_iso8601.h"
+#include "chrome/browser/ash/file_manager/path_util.h"
+#include "chrome/browser/ash/file_manager/trash_common_util.h"
+#include "chrome/browser/ash/file_manager/volume_manager.h"
+#include "chrome/browser/ash/file_manager/volume_manager_factory.h"
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
+#include "chromeos/ash/components/dbus/seneschal/seneschal_client.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "storage/browser/file_system/external_mount_points.h"
+#include "storage/browser/test/test_file_system_context.h"
+
+namespace file_manager {
+namespace io_task {
+
+TrashBaseTest::TrashBaseTest() = default;
+
+TrashBaseTest::~TrashBaseTest() = default;
+
+void TrashBaseTest::SetUp() {
+  ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+
+  // Pass in a mock factory method that sets up a fake
+  // DriveIntegrationService. This ensures the enabled paths contain the drive
+  // path.
+  create_drive_integration_service_ = base::BindRepeating(
+      &TrashBaseTest::CreateDriveIntegrationService, base::Unretained(this));
+  service_factory_for_test_ = std::make_unique<
+      drive::DriveIntegrationServiceFactory::ScopedFactoryForTest>(
+      &create_drive_integration_service_);
+  // Create the profile and add it to the user manager for DriveFS.
+  profile_ =
+      std::make_unique<TestingProfile>(base::FilePath(temp_dir_.GetPath()));
+  auto user_manager = std::make_unique<ash::FakeChromeUserManager>();
+  AccountId account_id =
+      AccountId::FromUserEmailGaiaId(profile_->GetProfileUserName(), "12345");
+  user_manager->AddUser(account_id);
+  user_manager->LoginUser(account_id);
+  scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>(
+      std::move(user_manager));
+
+  file_system_context_ =
+      storage::CreateFileSystemContextForTesting(nullptr, temp_dir_.GetPath());
+  my_files_dir_ = temp_dir_.GetPath().Append("MyFiles");
+  storage::ExternalMountPoints::GetSystemInstance()->RegisterFileSystem(
+      file_manager::util::GetDownloadsMountPointName(profile_.get()),
+      storage::kFileSystemTypeLocal, storage::FileSystemMountOption(),
+      my_files_dir_);
+
+  // Create Downloads inside the `temp_dir_` which will implicitly create the
+  // `my_files_dir_.
+  downloads_dir_ = my_files_dir_.Append("Downloads");
+  ASSERT_TRUE(base::CreateDirectory(downloads_dir_));
+
+  chromeos::DBusThreadManager::Initialize();
+  ash::CiceroneClient::InitializeFake();
+  ash::ConciergeClient::InitializeFake();
+  ash::SeneschalClient::InitializeFake();
+
+  // Ensure Crostini is setup correctly.
+  crostini_manager_ = crostini::CrostiniManager::GetForProfile(profile_.get());
+  crostini_manager_->AddRunningVmForTesting(crostini::kCrostiniDefaultVmName);
+  crostini_manager_->AddRunningContainerForTesting(
+      crostini::kCrostiniDefaultVmName,
+      crostini::ContainerInfo(crostini::kCrostiniDefaultContainerName,
+                              "testuser", "/remote/mount", "PLACEHOLDER_IP"));
+
+  crostini_dir_ = temp_dir_.GetPath().Append("crostini");
+  ASSERT_TRUE(base::CreateDirectory(crostini_dir_));
+
+  VolumeManagerFactory::GetInstance()->SetTestingFactory(
+      profile_.get(),
+      base::BindLambdaForTesting([this](content::BrowserContext* context) {
+        return std::unique_ptr<KeyedService>(std::make_unique<VolumeManager>(
+            Profile::FromBrowserContext(context), nullptr, nullptr,
+            &disk_mount_manager_, nullptr,
+            VolumeManager::GetMtpStorageInfoCallback()));
+      }));
+  crostini_remote_mount_ = base::FilePath("/remote/mount");
+  auto* volume_manager = VolumeManager::Get(profile_.get());
+  volume_manager->AddVolumeForTesting(
+      Volume::CreateForSshfsCrostini(crostini_dir_, crostini_remote_mount_));
+}
+
+void TrashBaseTest::TearDown() {
+  // Ensure any previously registered mount points for Downloads are revoked.
+  storage::ExternalMountPoints::GetSystemInstance()->RevokeAllFileSystems();
+  scoped_user_manager_.reset();
+  profile_.reset();
+  ash::SeneschalClient::Shutdown();
+  ash::ConciergeClient::Shutdown();
+  ash::CiceroneClient::Shutdown();
+  chromeos::DBusThreadManager::Shutdown();
+}
+
+drive::DriveIntegrationService* TrashBaseTest::CreateDriveIntegrationService(
+    Profile* profile) {
+  base::ScopedAllowBlockingForTesting allow_blocking;
+  base::FilePath mount_point = temp_dir_.GetPath().Append("drivefs");
+  fake_drivefs_helper_ =
+      std::make_unique<drive::FakeDriveFsHelper>(profile, mount_point);
+  integration_service_ = new drive::DriveIntegrationService(
+      profile, "", mount_point,
+      fake_drivefs_helper_->CreateFakeDriveFsListenerFactory());
+  return integration_service_;
+}
+
+storage::FileSystemURL TrashBaseTest::CreateFileSystemURL(
+    const base::FilePath& absolute_path) {
+  std::string relative_path = absolute_path.value();
+
+  // URLs in test are required to be relative to the `base_path_`. This ensures
+  // all FileSystemURLs in test are made relative.
+  EXPECT_TRUE(file_manager::util::ReplacePrefix(
+      &relative_path, temp_dir_.GetPath().AsEndingWithSeparator().value(), ""));
+
+  return file_system_context_->CreateCrackedFileSystemURL(
+      kTestStorageKey, storage::kFileSystemTypeTest,
+      base::FilePath::FromUTF8Unsafe(relative_path));
+}
+
+const base::FilePath TrashBaseTest::GenerateInfoPath(
+    const std::string& file_name) {
+  return GenerateTrashPath(downloads_dir_.Append(kTrashFolderName),
+                           kInfoFolderName, file_name);
+}
+
+const base::FilePath TrashBaseTest::GenerateFilesPath(
+    const std::string& file_name) {
+  return GenerateTrashPath(downloads_dir_.Append(kTrashFolderName),
+                           kFilesFolderName, file_name);
+}
+
+const std::string TrashBaseTest::CreateTrashInfoContentsFromPath(
+    const base::FilePath& file_path,
+    const base::FilePath& base_path,
+    const base::FilePath& prefix_path) {
+  std::string relative_restore_path = file_path.value();
+  EXPECT_TRUE(file_manager::util::ReplacePrefix(
+      &relative_restore_path, base_path.AsEndingWithSeparator().value(), ""));
+
+  base::FilePath prefix = (prefix_path.IsAbsolute())
+                              ? prefix_path
+                              : base::FilePath("/").Append(prefix_path);
+
+  return base::StrCat(
+      {"[Trash Info]\nPath=", prefix.AsEndingWithSeparator().value(),
+       relative_restore_path,
+       "\nDeletionDate=", base::TimeToISO8601(base::Time())});
+}
+
+const std::string TrashBaseTest::CreateTrashInfoContentsFromPath(
+    const base::FilePath& file_path) {
+  return CreateTrashInfoContentsFromPath(file_path, my_files_dir_,
+                                         base::FilePath("/"));
+}
+
+bool TrashBaseTest::EnsureTrashDirectorySetup(
+    const base::FilePath& parent_path) {
+  base::FilePath trash_path = parent_path.Append(kTrashFolderName);
+  if (!base::CreateDirectory(trash_path.Append(kInfoFolderName))) {
+    return false;
+  }
+  if (!base::CreateDirectory(trash_path.Append(kFilesFolderName))) {
+    return false;
+  }
+  return true;
+}
+
+}  // namespace io_task
+}  // namespace file_manager
diff --git a/chrome/browser/ash/file_manager/trash_unittest_base.h b/chrome/browser/ash/file_manager/trash_unittest_base.h
new file mode 100644
index 0000000..a86bcb7
--- /dev/null
+++ b/chrome/browser/ash/file_manager/trash_unittest_base.h
@@ -0,0 +1,90 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ASH_FILE_MANAGER_TRASH_UNITTEST_BASE_H_
+#define CHROME_BROWSER_ASH_FILE_MANAGER_TRASH_UNITTEST_BASE_H_
+
+#include <memory>
+
+#include "base/files/file_path.h"
+#include "base/files/scoped_temp_dir.h"
+#include "chrome/browser/ash/crostini/crostini_manager.h"
+#include "chrome/browser/ash/drive/drive_integration_service.h"
+#include "chrome/browser/ash/drive/drivefs_test_support.h"
+#include "chrome/browser/ash/file_manager/fake_disk_mount_manager.h"
+#include "chrome/test/base/testing_profile.h"
+#include "components/user_manager/scoped_user_manager.h"
+#include "content/public/test/browser_task_environment.h"
+#include "storage/browser/file_system/file_system_context.h"
+#include "storage/browser/file_system/file_system_url.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/storage_key/storage_key.h"
+
+namespace file_manager {
+namespace io_task {
+
+inline constexpr size_t kTestFileSize = 32;
+
+class TrashBaseTest : public testing::Test {
+  TrashBaseTest(const TrashBaseTest&) = delete;
+  TrashBaseTest& operator=(const TrashBaseTest&) = delete;
+
+ protected:
+  TrashBaseTest();
+  ~TrashBaseTest() override;
+
+  void SetUp() override;
+  void TearDown() override;
+
+  drive::DriveIntegrationService* CreateDriveIntegrationService(
+      Profile* profile);
+
+  storage::FileSystemURL CreateFileSystemURL(
+      const base::FilePath& absolute_path);
+
+  const base::FilePath GenerateInfoPath(const std::string& file_name);
+
+  const base::FilePath GenerateFilesPath(const std::string& file_name);
+
+  const std::string CreateTrashInfoContentsFromPath(
+      const base::FilePath& file_path,
+      const base::FilePath& base_path,
+      const base::FilePath& prefix_path);
+
+  const std::string CreateTrashInfoContentsFromPath(
+      const base::FilePath& file_path);
+
+  bool EnsureTrashDirectorySetup(const base::FilePath& parent_path);
+
+  content::BrowserTaskEnvironment task_environment_;
+  std::unique_ptr<TestingProfile> profile_;
+  const blink::StorageKey kTestStorageKey =
+      blink::StorageKey::CreateFromStringForTesting("chrome-extension://abc");
+
+  // DriveFS setup methods to ensure the tests have access to a mock
+  // DriveIntegrationService tied to the TestingProfile.
+  std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
+  std::unique_ptr<drive::FakeDriveFsHelper> fake_drivefs_helper_;
+  drive::DriveIntegrationService* integration_service_ = nullptr;
+  drive::DriveIntegrationServiceFactory::FactoryCallback
+      create_drive_integration_service_;
+  std::unique_ptr<drive::DriveIntegrationServiceFactory::ScopedFactoryForTest>
+      service_factory_for_test_;
+
+  crostini::CrostiniManager* crostini_manager_;
+  file_manager::FakeDiskMountManager disk_mount_manager_;
+
+  base::ScopedTempDir temp_dir_;
+  base::FilePath downloads_dir_;
+  base::FilePath my_files_dir_;
+  base::FilePath drive_dir_;
+  base::FilePath crostini_dir_;
+  base::FilePath crostini_remote_mount_;
+  scoped_refptr<storage::FileSystemContext> file_system_context_;
+};
+
+}  // namespace io_task
+}  // namespace file_manager
+
+#endif  // CHROME_BROWSER_ASH_FILE_MANAGER_TRASH_IO_TASK_H_
diff --git a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc
index ad208ae9..4335da7 100644
--- a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc
+++ b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc
@@ -17,6 +17,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
 #include "chrome/browser/ash/os_feedback/os_feedback_screenshot_manager.h"
+#include "chrome/browser/ash/system_web_apps/types/system_web_app_type.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/feedback/feedback_dialog_utils.h"
 #include "chrome/browser/feedback/feedback_uploader_chrome.h"
@@ -25,6 +26,7 @@
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/web_applications/system_web_app_ui_utils.h"
 #include "components/feedback/content/content_tracing_manager.h"
 #include "components/feedback/feedback_common.h"
 #include "components/feedback/feedback_data.h"
@@ -199,4 +201,9 @@
   std::move(callback).Run(send_status);
 }
 
+void ChromeOsFeedbackDelegate::OpenDiagnosticsApp() {
+  web_app::LaunchSystemWebAppAsync(profile_,
+                                   ash::SystemWebAppType::DIAGNOSTICS);
+}
+
 }  // namespace ash
diff --git a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.h b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.h
index cf36e4af..702af4e 100644
--- a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.h
+++ b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.h
@@ -41,6 +41,7 @@
   void GetScreenshotPng(GetScreenshotPngCallback callback) override;
   void SendReport(os_feedback_ui::mojom::ReportPtr report,
                   SendReportCallback callback) override;
+  void OpenDiagnosticsApp() override;
 
  private:
   void OnSendFeedbackDone(SendReportCallback callback, bool status);
diff --git a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc
index ffbe75d..91f5006 100644
--- a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc
+++ b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc
@@ -8,6 +8,7 @@
 #include <utility>
 #include <vector>
 
+#include "ash/webui/diagnostics_ui/url_constants.h"
 #include "base/bind.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/memory/ref_counted.h"
@@ -17,17 +18,21 @@
 #include "base/test/bind.h"
 #include "base/test/test_future.h"
 #include "chrome/browser/ash/os_feedback/os_feedback_screenshot_manager.h"
+#include "chrome/browser/ash/system_web_apps/system_web_app_manager.h"
+#include "chrome/browser/ash/system_web_apps/types/system_web_app_type.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/web_applications/system_web_app_ui_utils.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/feedback/feedback_report.h"
 #include "components/prefs/testing_pref_service.h"
 #include "components/signin/public/identity_manager/identity_test_utils.h"
 #include "content/public/test/browser_test.h"
+#include "content/public/test/test_navigation_observer.h"
 #include "extensions/browser/api/feedback_private/feedback_service.h"
 #include "extensions/browser/api/feedback_private/mock_feedback_service.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -105,6 +110,16 @@
     const unsigned char kData[] = {12, 11, 99};
     return base::MakeRefCounted<base::RefCountedBytes>(kData, std::size(kData));
   }
+
+  // Find the url of the active tab of the browser if any.
+  GURL FindActiveUrl(Browser* browser) {
+    if (browser) {
+      return browser->tab_strip_model()->GetActiveWebContents()->GetURL();
+    }
+    return GURL();
+  }
+
+  GURL diagnostics_url_ = GURL(ash::kChromeUIDiagnosticsAppUrl);
 };
 
 // Test GetApplicationLocale returns a valid locale.
@@ -221,4 +236,21 @@
   EXPECT_EQ(0, result.size());
 }
 
+// Test if Diagnostics app is opened.
+IN_PROC_BROWSER_TEST_F(ChromeOsFeedbackDelegateTest, OpenDiagnosticsApp) {
+  ChromeOsFeedbackDelegate feedback_delegate_(browser()->profile());
+  ash::SystemWebAppManager::GetForTest(browser()->profile())
+      ->InstallSystemAppsForTesting();
+
+  feedback_delegate_.OpenDiagnosticsApp();
+
+  web_app::FlushSystemWebAppLaunchesForTesting(browser()->profile());
+
+  Browser* app_browser = web_app::FindSystemWebAppBrowser(
+      browser()->profile(), ash::SystemWebAppType::DIAGNOSTICS);
+
+  EXPECT_TRUE(app_browser);
+  EXPECT_EQ(diagnostics_url_, FindActiveUrl(app_browser));
+}
+
 }  // namespace ash
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
index 966d6c389..f8c25e7 100644
--- a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
+++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
@@ -26,7 +26,6 @@
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/history/top_sites_factory.h"
 #include "chrome/browser/history_clusters/history_clusters_service_factory.h"
-#include "chrome/browser/ntp_tiles/chrome_most_visited_sites_factory.h"
 #include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
 #include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
@@ -44,8 +43,8 @@
 #include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
 #include "components/history/core/browser/history_service.h"
+#include "components/history/core/browser/top_sites.h"
 #include "components/language/core/browser/pref_names.h"
-#include "components/ntp_tiles/most_visited_sites.h"
 #include "components/omnibox/browser/actions/omnibox_pedal_provider.h"
 #include "components/omnibox/browser/autocomplete_classifier.h"
 #include "components/omnibox/browser/autocomplete_match.h"
@@ -160,15 +159,6 @@
   return TopSitesFactory::GetForProfile(profile_);
 }
 
-ntp_tiles::MostVisitedSites*
-ChromeAutocompleteProviderClient::GetNtpMostVisitedSites() {
-  if (!most_visited_sites_) {
-    most_visited_sites_ =
-        ChromeMostVisitedSitesFactory::NewForProfile(profile_);
-  }
-  return most_visited_sites_.get();
-}
-
 bookmarks::BookmarkModel* ChromeAutocompleteProviderClient::GetBookmarkModel() {
   return BookmarkModelFactory::GetForBrowserContext(profile_);
 }
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h
index e06b734..d5888a4 100644
--- a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h
+++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.h
@@ -52,7 +52,6 @@
   history_clusters::HistoryClustersService* GetHistoryClustersService()
       override;
   scoped_refptr<history::TopSites> GetTopSites() override;
-  ntp_tiles::MostVisitedSites* GetNtpMostVisitedSites() override;
   bookmarks::BookmarkModel* GetBookmarkModel() override;
   history::URLDatabase* GetInMemoryDatabase() override;
   InMemoryURLIndex* GetInMemoryURLIndex() override;
@@ -129,15 +128,6 @@
   TabMatcherDesktop tab_matcher_;
 #endif
 
-  // The |most_visited_sites_| is created upon request. It is created at
-  // most once by requesting in MostVisitedSitesProvider when the page
-  // classification of the input is
-  // metrics::OmniboxEventProto::START_SURFACE_HOMEPAGE or
-  // metrics::OmniboxEventProto::START_SURFACE_NEW_TAB. It remains empty for any
-  // ChromeAutocompleteProviderClient which doesn't have a
-  // MostVisitedSitesProvider.
-  std::unique_ptr<ntp_tiles::MostVisitedSites> most_visited_sites_;
-
   // Injectable storage partitiion, used for testing.
   raw_ptr<content::StoragePartition> storage_partition_;
 
diff --git a/chrome/browser/bluetooth/chrome_bluetooth_delegate_impl_client.cc b/chrome/browser/bluetooth/chrome_bluetooth_delegate_impl_client.cc
index 43f969d..7103e08 100644
--- a/chrome/browser/bluetooth/chrome_bluetooth_delegate_impl_client.cc
+++ b/chrome/browser/bluetooth/chrome_bluetooth_delegate_impl_client.cc
@@ -99,3 +99,21 @@
       u"");
 #endif
 }
+
+void ChromeBluetoothDelegateImplClient::ShowBluetoothDevicePairConfirmDialog(
+    content::RenderFrameHost* frame,
+    const std::u16string& device_identifier,
+    content::BluetoothDelegate::PairConfirmCallback callback) {
+#if PAIR_BLUETOOTH_ON_DEMAND()
+  chrome::ShowBluetoothDevicePairConfirmDialog(
+      content::WebContents::FromRenderFrameHost(frame), device_identifier,
+      std::move(callback));
+#else
+  // WebBluetoothServiceImpl will only start the pairing process (which prompts
+  // for confirmation) on devices that pair on demand. This should never be
+  // reached.
+  NOTREACHED();
+  std::move(callback).Run(
+      content::BluetoothDelegate::DevicePairConfirmPromptResult::kCancelled);
+#endif
+}
diff --git a/chrome/browser/bluetooth/chrome_bluetooth_delegate_impl_client.h b/chrome/browser/bluetooth/chrome_bluetooth_delegate_impl_client.h
index d8ec707..a8c74fc 100644
--- a/chrome/browser/bluetooth/chrome_bluetooth_delegate_impl_client.h
+++ b/chrome/browser/bluetooth/chrome_bluetooth_delegate_impl_client.h
@@ -45,6 +45,10 @@
       content::RenderFrameHost* frame,
       const std::u16string& device_identifier,
       content::BluetoothDelegate::CredentialsCallback callback) override;
+  void ShowBluetoothDevicePairConfirmDialog(
+      content::RenderFrameHost* frame,
+      const std::u16string& device_identifier,
+      content::BluetoothDelegate::PairConfirmCallback callback) override;
 };
 
 #endif  // CHROME_BROWSER_BLUETOOTH_CHROME_BLUETOOTH_DELEGATE_IMPL_CLIENT_H_
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 0af7b9b2..ec4cceb 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -739,6 +739,8 @@
     "../ash/file_manager/snapshot_manager.h",
     "../ash/file_manager/speedometer.cc",
     "../ash/file_manager/speedometer.h",
+    "../ash/file_manager/trash_common_util.cc",
+    "../ash/file_manager/trash_common_util.h",
     "../ash/file_manager/trash_io_task.cc",
     "../ash/file_manager/trash_io_task.h",
     "../ash/file_manager/url_util.cc",
@@ -3517,6 +3519,8 @@
     "../ash/file_manager/restore_io_task_unittest.cc",
     "../ash/file_manager/speedometer_unittest.cc",
     "../ash/file_manager/trash_io_task_unittest.cc",
+    "../ash/file_manager/trash_unittest_base.cc",
+    "../ash/file_manager/trash_unittest_base.h",
     "../ash/file_manager/url_util_unittest.cc",
     "../ash/file_manager/volume_manager_unittest.cc",
     "../ash/file_system_provider/fake_extension_provider.cc",
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 6549be7..2cff676 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -49,6 +49,7 @@
 #include "base/command_line.h"
 #include "base/compiler_specific.h"
 #include "base/feature_list.h"
+#include "base/i18n/base_i18n_switches.h"
 #include "base/json/json_reader.h"
 #include "base/lazy_instance.h"
 #include "base/no_destructor.h"
@@ -3566,7 +3567,21 @@
 
     api::autotest_private::App app;
     app.app_id = update.AppId();
-    app.name = update.Name();
+
+    // Assume that when `switches::kForceDirectionRTL` is enabled, the system
+    // language still follows the left-to-right fashion. Because the app names
+    // carried by `update` are adapted to RTL by inserting extra characters that
+    // indicate the text direction, we should recover the original app names
+    // before returning them as the result.
+    if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+            switches::kForceUIDirection) == switches::kForceDirectionRTL) {
+      std::u16string name = base::UTF8ToUTF16(update.Name());
+      base::i18n::UnadjustStringForLocaleDirection(&name);
+      app.name = base::UTF16ToUTF8(name);
+    } else {
+      app.name = update.Name();
+    }
+
     app.short_name = update.ShortName();
     app.publisher_id = update.PublisherId();
     app.additional_search_terms = update.AdditionalSearchTerms();
diff --git a/chrome/browser/dips/cookie_access_type.h b/chrome/browser/dips/cookie_access_type.h
index e36f550..6b8a3ec 100644
--- a/chrome/browser/dips/cookie_access_type.h
+++ b/chrome/browser/dips/cookie_access_type.h
@@ -11,4 +11,10 @@
 
 base::StringPiece CookieAccessTypeToString(CookieAccessType type);
 
+constexpr CookieAccessType operator|(CookieAccessType lhs,
+                                     CookieAccessType rhs) {
+  return static_cast<CookieAccessType>(static_cast<int>(lhs) |
+                                       static_cast<int>(rhs));
+}
+
 #endif  // CHROME_BROWSER_DIPS_COOKIE_ACCESS_TYPE_H_
diff --git a/chrome/browser/dips/dips_bounce_detector.cc b/chrome/browser/dips/dips_bounce_detector.cc
index 19e9f3b..dc41b69 100644
--- a/chrome/browser/dips/dips_bounce_detector.cc
+++ b/chrome/browser/dips/dips_bounce_detector.cc
@@ -4,35 +4,58 @@
 
 #include "chrome/browser/dips/dips_bounce_detector.h"
 
+#include <iostream>
 #include <vector>
 
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/strcat.h"
+#include "base/time/default_tick_clock.h"
+#include "base/time/time.h"
 #include "chrome/browser/dips/cookie_access_filter.h"
+#include "chrome/browser/dips/cookie_access_type.h"
 #include "chrome/browser/dips/cookie_mode.h"
 #include "chrome/browser/dips/dips_service.h"
+#include "chrome/browser/dips/dips_utils.h"
 #include "components/site_engagement/content/site_engagement_service.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/cookie_access_details.h"
 #include "content/public/browser/navigation_handle.h"
+#include "content/public/browser/navigation_handle_user_data.h"
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 
 using content::NavigationHandle;
 
 namespace {
 
-// BounceDetectionState gets attached to NavigationHandle (which is a
-// SupportsUserData subclass) to store data needed to detect stateful server
-// redirects.
-class BounceDetectionState : public base::SupportsUserData::Data {
+// ServerBounceDetectionState gets attached to NavigationHandle (which is a
+// SupportsUserData subclass) to store data needed to detect stateful
+// server-side redirects.
+class ServerBounceDetectionState
+    : public content::NavigationHandleUserData<ServerBounceDetectionState> {
  public:
   // The WebContents' previously committed URL at the time the navigation
   // started. Needed in case a parallel navigation commits.
   GURL initial_url;
   CookieAccessFilter filter;
+
+ private:
+  explicit ServerBounceDetectionState(
+      content::NavigationHandle& navigation_handle) {}
+
+  friend NavigationHandleUserData;
+  NAVIGATION_HANDLE_USER_DATA_KEY_DECL();
 };
 
-const char kBounceDetectionStateKey[] = "BounceDetectionState";
+// The amount of time since finishing navigation to a page that a client-side
+// redirect must happen within to count as a stateful bounce (provided that all
+// other criteria are met as well).
+const int kBounceThresholdSeconds = 10;
+NAVIGATION_HANDLE_USER_DATA_KEY_IMPL(ServerBounceDetectionState);
+
+// The TickClock that a new DIPSBounceDetector will use internally. Exposed as a
+// global so that browser tests (which don't call the DIPSBounceDetector
+// constructor directly) can inject a fake clock.
+base::TickClock* g_clock = nullptr;
 
 std::string GetSite(const GURL& url) {
   const auto domain = net::registry_controlled_domains::GetDomainAndRegistry(
@@ -58,12 +81,19 @@
 }
 
 inline void UmaHistogramBounceCategory(RedirectCategory category,
-                                       DIPSCookieMode mode) {
+                                       DIPSCookieMode mode,
+                                       DIPSRedirectType type) {
   const std::string histogram_name =
-      base::StrCat({"Privacy.DIPS.BounceCategory", GetHistogramSuffix(mode)});
+      base::StrCat({"Privacy.DIPS.BounceCategory", GetHistogramPiece(type),
+                    GetHistogramSuffix(mode)});
   base::UmaHistogramEnumeration(histogram_name, category);
 }
 
+inline void UmaHistogramTimeToBounce(base::TimeDelta sample) {
+  base::UmaHistogramTimes("Privacy.DIPS.TimeFromNavigationCommitToClientBounce",
+                          sample);
+}
+
 }  // namespace
 
 DIPSBounceDetector::DIPSBounceDetector(content::WebContents* web_contents)
@@ -72,17 +102,26 @@
       dips_service_(DIPSService::Get(web_contents->GetBrowserContext())),
       site_engagement_service_(site_engagement::SiteEngagementService::Get(
           web_contents->GetBrowserContext())),
-      // It's safe to use unretained because the callback is owned by this.
+      // It's safe to use unretained because these callbacks are owned by this.
+      stateful_client_redirect_handler_(
+          base::BindRepeating(&DIPSBounceDetector::HandleStatefulClientRedirect,
+                              base::Unretained(this))),
       stateful_server_redirect_handler_(
           base::BindRepeating(&DIPSBounceDetector::HandleStatefulServerRedirect,
                               base::Unretained(this))),
-      // It's safe to use unretained because the callback is owned by this.
       stateful_redirect_handler_(
           base::BindRepeating(&DIPSBounceDetector::HandleStatefulRedirect,
-                              base::Unretained(this))) {}
+                              base::Unretained(this))),
+      clock_(g_clock ? g_clock : base::DefaultTickClock::GetInstance()) {}
 
 DIPSBounceDetector::~DIPSBounceDetector() = default;
 
+/*static*/
+base::TickClock* DIPSBounceDetector::SetTickClockForTesting(
+    base::TickClock* clock) {
+  return std::exchange(g_clock, clock);
+}
+
 DIPSCookieMode DIPSBounceDetector::GetCookieMode() const {
   return GetDIPSCookieMode(
       web_contents()->GetBrowserContext()->IsOffTheRecord(),
@@ -92,7 +131,8 @@
 void DIPSBounceDetector::HandleStatefulRedirect(const GURL& prev_url,
                                                 const GURL& url,
                                                 const GURL& next_url,
-                                                CookieAccessType access) {
+                                                CookieAccessType access,
+                                                DIPSRedirectType type) {
   const std::string site = GetSite(url);
   // TODO(rtarpine): all the calls to HandleStatefulRedirect() for a redirect
   // chain call GetSite() on the same prev_url and next_url. Be more efficient.
@@ -103,7 +143,21 @@
 
   double score = site_engagement_service_->GetScore(url);
   RedirectCategory category = ClassifyRedirect(access, score);
-  UmaHistogramBounceCategory(category, GetCookieMode());
+  UmaHistogramBounceCategory(category, GetCookieMode(), type);
+}
+
+void DIPSBounceDetector::HandleStatefulClientRedirect(
+    const GURL& prev_url,
+    const GURL& url,
+    const GURL& next_url,
+    base::TimeDelta bounce_time,
+    CookieAccessType access) {
+  // Time between page load and client-side redirect starting is only tracked
+  // for stateful bounces.
+  if (access != CookieAccessType::kNone)
+    UmaHistogramTimeToBounce(bounce_time);
+  stateful_redirect_handler_.Run(prev_url, url, next_url, access,
+                                 DIPSRedirectType::kClient);
 }
 
 void DIPSBounceDetector::HandleStatefulServerRedirect(
@@ -117,18 +171,51 @@
   // XXX For 204 No Content responses, should we actually use `prev_url`, since
   // it's what the user actually sees?
   const GURL& next_url = navigation_handle->GetURL();
-  stateful_redirect_handler_.Run(prev_url, url, next_url, access);
+  stateful_redirect_handler_.Run(prev_url, url, next_url, access,
+                                 DIPSRedirectType::kServer);
 }
 
 void DIPSBounceDetector::DidStartNavigation(
     NavigationHandle* navigation_handle) {
-  if (!navigation_handle->IsInPrimaryMainFrame()) {
+  base::TimeTicks now = clock_->NowTicks();
+  if (!navigation_handle->IsInPrimaryMainFrame() ||
+      navigation_handle->IsSameDocument()) {
     return;
   }
 
-  auto state = std::make_unique<BounceDetectionState>();
-  state->initial_url = web_contents()->GetLastCommittedURL();
-  navigation_handle->SetUserData(kBounceDetectionStateKey, std::move(state));
+  if (client_detection_state_.has_value()) {
+    base::TimeDelta bounce_time = now - client_detection_state_->page_load_time;
+
+    if (!navigation_handle->HasUserGesture() &&
+        navigation_handle->IsRendererInitiated() &&
+        (bounce_time <
+         base::TimeDelta(base::Seconds(kBounceThresholdSeconds)))) {
+      stateful_client_redirect_handler_.Run(
+          client_detection_state_->previous_url,
+          web_contents()->GetLastCommittedURL(), navigation_handle->GetURL(),
+          bounce_time, client_detection_state_->cookie_access_type);
+    }
+  }
+
+  auto* server_state =
+      ServerBounceDetectionState::GetOrCreateForNavigationHandle(
+          *navigation_handle);
+  server_state->initial_url = web_contents()->GetLastCommittedURL();
+}
+
+void DIPSBounceDetector::OnCookiesAccessed(
+    content::RenderFrameHost* render_frame_host,
+    const content::CookieAccessDetails& details) {
+  if (!render_frame_host->IsInPrimaryMainFrame()) {
+    return;
+  }
+
+  if (client_detection_state_.has_value()) {
+    client_detection_state_->cookie_access_type =
+        client_detection_state_->cookie_access_type |
+        (details.type == Type::kChange ? CookieAccessType::kWrite
+                                       : CookieAccessType::kRead);
+  }
 }
 
 void DIPSBounceDetector::OnCookiesAccessed(
@@ -138,8 +225,8 @@
     return;
   }
 
-  auto* state = static_cast<BounceDetectionState*>(
-      navigation_handle->GetUserData(kBounceDetectionStateKey));
+  auto* state =
+      ServerBounceDetectionState::GetForNavigationHandle(*navigation_handle);
   if (state) {
     state->filter.AddAccess(details.url, details.type);
   }
@@ -147,18 +234,28 @@
 
 void DIPSBounceDetector::DidFinishNavigation(
     NavigationHandle* navigation_handle) {
-  if (!navigation_handle->IsInPrimaryMainFrame()) {
+  base::TimeTicks now = clock_->NowTicks();
+  if (!navigation_handle->IsInPrimaryMainFrame() ||
+      navigation_handle->IsSameDocument()) {
     return;
   }
 
-  // We can be sure OnCookiesAccessed() was called for all redirects at this
-  // point.
-  auto* state = static_cast<BounceDetectionState*>(
-      navigation_handle->GetUserData(kBounceDetectionStateKey));
-  if (state && !state->filter.is_empty()) {
-    std::vector<CookieAccessType> access_types;
-    if (!state->filter.Filter(navigation_handle->GetRedirectChain(),
-                              &access_types)) {
+  auto* server_state =
+      ServerBounceDetectionState::GetForNavigationHandle(*navigation_handle);
+  std::vector<CookieAccessType> access_types;
+
+  // Iff the primary page changed, reset the client detection state while
+  // storing the page load time and previous_url. A primary page change is
+  // verified by checking IsInPrimaryMainFrame, !IsSameDocument, and
+  // HasCommitted. HasCommitted is the only one not previously checked here.
+  if (navigation_handle->HasCommitted()) {
+    client_detection_state_ = ClientBounceDetectionState(
+        navigation_handle->GetPreviousMainFrameURL(), now);
+  }
+
+  if (server_state && !server_state->filter.is_empty()) {
+    if (!server_state->filter.Filter(navigation_handle->GetRedirectChain(),
+                                     &access_types)) {
       // We failed to map all the OnCookiesAccessed calls to the redirect chain.
       // TODO(rtarpine): find out why this happens.
       // TODO(rtarpine): report a metric to monitor.
@@ -167,9 +264,20 @@
 
     for (size_t i = 0; i < access_types.size() - 1; i++) {
       stateful_server_redirect_handler_.Run(
-          state->initial_url, navigation_handle, i, access_types[i]);
+          server_state->initial_url, navigation_handle, i, access_types[i]);
     }
+
+    // If the last url in the chain accessed cookies, the
+    // current page accessed cookies in the HTTP requerst/response.
+    if (navigation_handle->HasCommitted())
+      client_detection_state_->cookie_access_type = access_types.back();
   }
 }
 
+void DIPSBounceDetector::FrameReceivedUserActivation(
+    content::RenderFrameHost* render_frame_host) {
+  if (client_detection_state_.has_value())
+    client_detection_state_->received_user_activation = true;
+}
+
 WEB_CONTENTS_USER_DATA_KEY_IMPL(DIPSBounceDetector);
diff --git a/chrome/browser/dips/dips_bounce_detector.h b/chrome/browser/dips/dips_bounce_detector.h
index 8aa25bf..7f15c85 100644
--- a/chrome/browser/dips/dips_bounce_detector.h
+++ b/chrome/browser/dips/dips_bounce_detector.h
@@ -9,15 +9,39 @@
 #include "base/memory/raw_ptr.h"
 #include "chrome/browser/dips/cookie_access_type.h"
 #include "chrome/browser/dips/cookie_mode.h"
+#include "chrome/browser/dips/dips_utils.h"
+#include "content/public/browser/cookie_access_details.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
 
+namespace base {
+class TickClock;
+}
+
 namespace site_engagement {
 class SiteEngagementService;
 }
 
 class DIPSService;
 
+// ClientBounceDetectionState is owned by the DIPSBounceDetector and stores
+// data needed to detect stateful client-side redirects.
+class ClientBounceDetectionState {
+ public:
+  ClientBounceDetectionState() = delete;
+  explicit ClientBounceDetectionState(GURL url, base::TimeTicks load_time) {
+    this->previous_url = url;
+    this->page_load_time = load_time;
+  }
+
+  // The NavigationHandle's previously committed URL at the time the navigation
+  // finishes and commits.
+  GURL previous_url;
+  base::TimeTicks page_load_time;
+  bool received_user_activation = false;
+  CookieAccessType cookie_access_type = CookieAccessType::kNone;
+};
+
 class DIPSBounceDetector
     : public content::WebContentsObserver,
       public content::WebContentsUserData<DIPSBounceDetector> {
@@ -26,11 +50,27 @@
   DIPSBounceDetector(const DIPSBounceDetector&) = delete;
   DIPSBounceDetector& operator=(const DIPSBounceDetector&) = delete;
 
+  using RedirectHandler = base::RepeatingCallback<void(const GURL&,
+                                                       const GURL&,
+                                                       const GURL&,
+                                                       CookieAccessType,
+                                                       DIPSRedirectType)>;
+
+  using ClientRedirectHandler = base::RepeatingCallback<void(const GURL&,
+                                                             const GURL&,
+                                                             const GURL&,
+                                                             base::TimeDelta,
+                                                             CookieAccessType)>;
+
   using ServerRedirectHandler = base::RepeatingCallback<
       void(const GURL&, content::NavigationHandle*, int, CookieAccessType)>;
 
-  using RedirectHandler = base::RepeatingCallback<
-      void(const GURL&, const GURL&, const GURL&, CookieAccessType)>;
+  using Type = network::mojom::CookieAccessDetails::Type;
+
+  void SetStatefulClientRedirectHandlerForTesting(
+      ClientRedirectHandler handler) {
+    stateful_client_redirect_handler_ = handler;
+  }
 
   void SetStatefulServerRedirectHandlerForTesting(
       ServerRedirectHandler handler) {
@@ -41,6 +81,9 @@
     stateful_redirect_handler_ = handler;
   }
 
+  // This must be called prior to the DIPSBounceDetector being constructed.
+  static base::TickClock* SetTickClockForTesting(base::TickClock* clock);
+
  private:
   explicit DIPSBounceDetector(content::WebContents* web_contents);
   // So WebContentsUserData::CreateForWebContents() can call the constructor.
@@ -56,7 +99,13 @@
   void HandleStatefulRedirect(const GURL& prev_url,
                               const GURL& url,
                               const GURL& next_url,
-                              CookieAccessType access);
+                              CookieAccessType access,
+                              DIPSRedirectType type);
+  void HandleStatefulClientRedirect(const GURL& prev_url,
+                                    const GURL& url,
+                                    const GURL& next_url,
+                                    base::TimeDelta bounce_time,
+                                    CookieAccessType access);
   void HandleStatefulServerRedirect(
       const GURL& prev_url,
       content::NavigationHandle* navigation_handle,
@@ -65,10 +114,14 @@
 
   void DidStartNavigation(
       content::NavigationHandle* navigation_handle) override;
+  void OnCookiesAccessed(content::RenderFrameHost* render_frame_host,
+                         const content::CookieAccessDetails& details) override;
   void OnCookiesAccessed(content::NavigationHandle* navigation_handle,
                          const content::CookieAccessDetails& details) override;
   void DidFinishNavigation(
       content::NavigationHandle* navigation_handle) override;
+  void FrameReceivedUserActivation(
+      content::RenderFrameHost* render_frame_host) override;
 
   // raw_ptr<> is safe here DIPSService is a KeyedService, associated with the
   // BrowserContext/Profile which will outlive the WebContents that
@@ -76,12 +129,17 @@
   raw_ptr<DIPSService> dips_service_;
   // raw_ptr<> is safe here for the same reasons as above.
   raw_ptr<site_engagement::SiteEngagementService> site_engagement_service_;
+  absl::optional<ClientBounceDetectionState> client_detection_state_;
+  // By default, this just calls this->HandleStatefulClientRedirect(), but it
+  // can be overridden for tests.
+  ClientRedirectHandler stateful_client_redirect_handler_;
   // By default, this just calls this->HandleStatefulServerRedirect(), but it
   // can be overridden for tests.
   ServerRedirectHandler stateful_server_redirect_handler_;
   // By default, this just calls this->HandleStatefulRedirect(), but it
   // can be overridden for tests.
   RedirectHandler stateful_redirect_handler_;
+  raw_ptr<const base::TickClock> clock_;
 
   WEB_CONTENTS_USER_DATA_KEY_DECL();
 };
diff --git a/chrome/browser/dips/dips_bounce_detector_browsertest.cc b/chrome/browser/dips/dips_bounce_detector_browsertest.cc
index ea291547..1f5b780 100644
--- a/chrome/browser/dips/dips_bounce_detector_browsertest.cc
+++ b/chrome/browser/dips/dips_bounce_detector_browsertest.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/test/simple_test_tick_clock.h"
+#include "base/time/time.h"
 #include "chrome/browser/dips/dips_bounce_detector.h"
 
 #include "base/files/file_path.h"
@@ -14,6 +16,7 @@
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
+#include "content/public/test/hit_test_region_observer.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
@@ -28,6 +31,56 @@
 
 using content::NavigationHandle;
 
+namespace {
+
+class UserActivationObserver : public content::WebContentsObserver {
+ public:
+  explicit UserActivationObserver(content::WebContents* web_contents,
+                                  content::RenderFrameHost* render_frame_host)
+      : WebContentsObserver(web_contents),
+        render_frame_host_(render_frame_host) {}
+
+  // Wait until the frame receives user activation.
+  void Wait() { run_loop_.Run(); }
+
+  // WebContentsObserver override
+  void FrameReceivedUserActivation(
+      content::RenderFrameHost* render_frame_host) override {
+    if (render_frame_host_ == render_frame_host) {
+      run_loop_.Quit();
+    }
+  }
+
+ private:
+  raw_ptr<content::RenderFrameHost> const render_frame_host_;
+  base::RunLoop run_loop_;
+};
+
+class CookieAccessObserver : public content::WebContentsObserver {
+ public:
+  explicit CookieAccessObserver(content::WebContents* web_contents,
+                                content::RenderFrameHost* render_frame_host)
+      : WebContentsObserver(web_contents),
+        render_frame_host_(render_frame_host) {}
+
+  // Wait until the frame accesses cookies.
+  void Wait() { run_loop_.Run(); }
+
+  // WebContentsObserver override
+  void OnCookiesAccessed(content::RenderFrameHost* render_frame_host,
+                         const content::CookieAccessDetails& details) override {
+    if (render_frame_host_ == render_frame_host) {
+      run_loop_.Quit();
+    }
+  }
+
+ private:
+  content::RenderFrameHost* const render_frame_host_;
+  base::RunLoop run_loop_;
+};
+
+}  // namespace
+
 // Returns a simplified URL representation for ease of comparison in tests.
 // Just host+path.
 std::string FormatURL(const GURL& url) {
@@ -51,6 +104,8 @@
   friend class content::WebContentsUserData<WCOCallbackLogger>;
 
   void DidStartNavigation(NavigationHandle* navigation_handle) override;
+  void OnCookiesAccessed(content::RenderFrameHost* render_frame_host,
+                         const content::CookieAccessDetails& details) override;
   void OnCookiesAccessed(NavigationHandle* navigation_handle,
                          const content::CookieAccessDetails& details) override;
   void DidFinishNavigation(NavigationHandle* navigation_handle) override;
@@ -72,10 +127,27 @@
 }
 
 void WCOCallbackLogger::OnCookiesAccessed(
+    content::RenderFrameHost* render_frame_host,
+    const content::CookieAccessDetails& details) {
+  // Callbacks for favicons are ignored only in testing logs because their
+  // ordering is variable and would cause flakiness
+  if (!render_frame_host->IsInPrimaryMainFrame() ||
+      FormatURL(details.url).find("favicon.ico") != std::string::npos) {
+    return;
+  }
+
+  log_.push_back(base::StringPrintf(
+      "OnCookiesAccessed(RenderFrameHost, %s: %s)",
+      details.type == content::CookieAccessDetails::Type::kChange ? "Change"
+                                                                  : "Read",
+      FormatURL(details.url).c_str()));
+}
+
+void WCOCallbackLogger::OnCookiesAccessed(
     NavigationHandle* navigation_handle,
     const content::CookieAccessDetails& details) {
   log_.push_back(base::StringPrintf(
-      "OnCookiesAccessed(%s: %s)",
+      "OnCookiesAccessed(NavigationHandle, %s: %s)",
       details.type == content::CookieAccessDetails::Type::kChange ? "Change"
                                                                   : "Read",
       FormatURL(details.url).c_str()));
@@ -83,6 +155,12 @@
 
 void WCOCallbackLogger::DidFinishNavigation(
     NavigationHandle* navigation_handle) {
+  // Android testing produces callbacks for a finished navigation to "blank" at
+  // the beginning of a test. These should be ignored here.
+  if (FormatURL(navigation_handle->GetURL()) == "blank" ||
+      navigation_handle->GetPreviousMainFrameURL().is_empty()) {
+    return;
+  }
   log_.push_back(
       base::StringPrintf("DidFinishNavigation(%s)",
                          FormatURL(navigation_handle->GetURL()).c_str()));
@@ -92,6 +170,10 @@
 
 class DIPSBounceDetectorBrowserTest : public PlatformBrowserTest {
  protected:
+  void SetUpInProcessBrowserTestFixture() override {
+    DIPSBounceDetector::SetTickClockForTesting(&test_clock_);
+  }
+
   void SetUpOnMainThread() override {
     ASSERT_TRUE(embedded_test_server()->Start());
     host_resolver()->AddRule("a.test", "127.0.0.1");
@@ -102,13 +184,22 @@
         DIPSBounceDetector::FromWebContents(GetActiveWebContents());
   }
 
+  void TearDownInProcessBrowserTestFixture() override {
+    DIPSBounceDetector::SetTickClockForTesting(nullptr);
+  }
+
   content::WebContents* GetActiveWebContents() {
     return chrome_test_utils::GetActiveWebContents(this);
   }
 
   DIPSBounceDetector* bounce_detector() { return bounce_detector_; }
 
+  void SetDIPSTime(base::TimeTicks ticks) { test_clock_.SetNowTicks(ticks); }
+
+  void AdvanceDIPSTime(base::TimeDelta delta) { test_clock_.Advance(delta); }
+
  private:
+  base::SimpleTestTickClock test_clock_;
   raw_ptr<DIPSBounceDetector> bounce_detector_ = nullptr;
 };
 
@@ -169,21 +260,21 @@
       testing::ElementsAre(
           ("DidStartNavigation(a.test/cross-site/b.test/cross-site-with-cookie/"
            "c.test/cross-site-with-cookie/d.test/set-cookie)"),
-          ("OnCookiesAccessed(Read: "
+          ("OnCookiesAccessed(NavigationHandle, Read: "
            "a.test/cross-site/b.test/cross-site-with-cookie/c.test/"
            "cross-site-with-cookie/d.test/set-cookie)"),
-          ("OnCookiesAccessed(Read: "
+          ("OnCookiesAccessed(NavigationHandle, Read: "
            "b.test/cross-site-with-cookie/c.test/cross-site-with-cookie/d.test/"
            "set-cookie)"),
-          ("OnCookiesAccessed(Change: "
+          ("OnCookiesAccessed(NavigationHandle, Change: "
            "b.test/cross-site-with-cookie/c.test/cross-site-with-cookie/d.test/"
            "set-cookie)"),
-          ("OnCookiesAccessed(Read: "
+          ("OnCookiesAccessed(NavigationHandle, Read: "
            "c.test/cross-site-with-cookie/d.test/set-cookie)"),
-          ("OnCookiesAccessed(Change: "
+          ("OnCookiesAccessed(NavigationHandle, Change: "
            "c.test/cross-site-with-cookie/d.test/set-cookie)"),
-          "OnCookiesAccessed(Read: d.test/set-cookie)",
-          "OnCookiesAccessed(Change: d.test/set-cookie)",
+          "OnCookiesAccessed(NavigationHandle, Read: d.test/set-cookie)",
+          "OnCookiesAccessed(NavigationHandle, Change: d.test/set-cookie)",
           "DidFinishNavigation(d.test/set-cookie)"));
 }
 
@@ -199,7 +290,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(DIPSBounceDetectorBrowserTest,
-                       DetectStatefulServerRedirect) {
+                       DetectStatefulServerRedirect_URL) {
   GURL redirect_url = embedded_test_server()->GetURL(
       "a.test",
       "/cross-site-with-cookie/b.test/cross-site/c.test/cross-site/d.test/"
@@ -307,13 +398,82 @@
                     const GURL& prev_url,
                     const GURL& url,
                     const GURL& next_url,
-                    CookieAccessType access) {
+                    CookieAccessType access,
+                    DIPSRedirectType type) {
   if (access != CookieAccessType::kNone)
     redirects->push_back(
         base::StrCat({FormatURL(prev_url), " -> ", FormatURL(url), " -> ",
                       FormatURL(next_url)}));
 }
 
+// Tests that a stateful client-side redirect that occurs in less than
+// 10 seconds is recognized.
+IN_PROC_BROWSER_TEST_F(DIPSBounceDetectorBrowserTest,
+                       DetectStatefulRedirect_Client) {
+  GURL initial_url = embedded_test_server()->GetURL("a.test", "/title1.html");
+  GURL bounce_url = embedded_test_server()->GetURL("b.test", "/title1.html");
+  GURL final_url = embedded_test_server()->GetURL("c.test", "/title1.html");
+  content::WebContents* web_contents = GetActiveWebContents();
+  content::RenderFrameHost* frame;
+
+  std::vector<std::string> redirects;
+  bounce_detector()->SetStatefulRedirectHandlerForTesting(
+      base::BindRepeating(&AppendRedirect, &redirects));
+
+  // Start logging WebContentsObserver callbacks.
+  WCOCallbackLogger::CreateForWebContents(web_contents);
+  auto* logger = WCOCallbackLogger::FromWebContents(web_contents);
+
+  // Visit initial page
+  ASSERT_TRUE(content::NavigateToURL(web_contents, initial_url));
+  frame = web_contents->GetMainFrame();
+  // Wait for navigation to finish to initial page
+  EXPECT_TRUE(content::WaitForLoadStop(web_contents));
+  // Wait until we can click.
+  content::WaitForHitTestData(frame);
+  // Advance TimeTicks 10 seconds
+  AdvanceDIPSTime(base::TimeDelta(base::Seconds(10)));
+  // Navigate to interstitial page via "mouse click"
+  UserActivationObserver observer(web_contents, frame);
+  ASSERT_TRUE(content::ExecJs(
+      frame, content::JsReplace("window.location.href = $1;", bounce_url),
+      content::EXECUTE_SCRIPT_DEFAULT_OPTIONS));
+  observer.Wait();
+
+  // Wait for navigation to finish to interstitial page
+  EXPECT_TRUE(content::WaitForLoadStop(web_contents));
+  frame = web_contents->GetMainFrame();
+  // Advance TimeTicks by 1 second
+  AdvanceDIPSTime(base::TimeDelta(base::Seconds(1)));
+  // Write Cookie via JS on bounce page
+  CookieAccessObserver cookie_observer(web_contents, frame);
+  ASSERT_TRUE(content::ExecJs(frame, "document.cookie = 'foo=bar';",
+                              content::EXECUTE_SCRIPT_NO_USER_GESTURE));
+  cookie_observer.Wait();
+  // Initiate client-side redirect via JS without click
+  ASSERT_TRUE(content::ExecJs(
+      frame, content::JsReplace("window.location.href = $1;", final_url),
+      content::EXECUTE_SCRIPT_NO_USER_GESTURE));
+
+  // Wait for navigation to finish to final page
+  EXPECT_TRUE(content::WaitForLoadStop(web_contents));
+
+  EXPECT_THAT(logger->log(), testing::ElementsAre(
+                                 ("DidStartNavigation(a.test/title1.html)"),
+                                 ("DidFinishNavigation(a.test/title1.html)"),
+                                 ("DidStartNavigation(b.test/title1.html)"),
+                                 ("DidFinishNavigation(b.test/title1.html)"),
+                                 ("OnCookiesAccessed(RenderFrameHost, "
+                                  "Change: b.test/title1.html)"),
+                                 ("DidStartNavigation(c.test/title1.html)"),
+                                 ("DidFinishNavigation(c.test/title1.html)")));
+
+  EXPECT_THAT(
+      redirects,
+      testing::ElementsAre(
+          ("a.test/title1.html -> b.test/title1.html -> c.test/title1.html")));
+}
+
 IN_PROC_BROWSER_TEST_F(DIPSBounceDetectorBrowserTest,
                        DetectStatefulRedirect_Server) {
   GURL initial_url = embedded_test_server()->GetURL("a.test", "/title1.html");
@@ -355,8 +515,181 @@
                    "d.test/title1.html")));
 }
 
+// Tests behavior for recognizing stateful client-side redirect that happens
+// between stateful server-side redirects.
 IN_PROC_BROWSER_TEST_F(DIPSBounceDetectorBrowserTest,
-                       DetectStatefulRedirect_NoContent) {
+                       DetectStatefulRedirect_ServerClient) {
+  GURL initial1_url = embedded_test_server()->GetURL("a.test", "/title1.html");
+  GURL redirect1_url = embedded_test_server()->GetURL(
+      "a.test", "/cross-site-with-cookie/b.test/title1.html");
+  GURL bounce_url = embedded_test_server()->GetURL("b.test", "/title1.html");
+  GURL initial2_url = embedded_test_server()->GetURL("c.test", "/title1.html");
+  GURL redirect2_url = embedded_test_server()->GetURL(
+      "c.test", "/cross-site-with-cookie/d.test/title1.html");
+  GURL final_url = embedded_test_server()->GetURL("d.test", "/title1.html");
+  content::WebContents* web_contents = GetActiveWebContents();
+  content::RenderFrameHost* frame;
+
+  std::vector<std::string> redirects;
+  bounce_detector()->SetStatefulRedirectHandlerForTesting(
+      base::BindRepeating(&AppendRedirect, &redirects));
+
+  // Start logging WebContentsObserver callbacks.
+  WCOCallbackLogger::CreateForWebContents(web_contents);
+  auto* logger = WCOCallbackLogger::FromWebContents(web_contents);
+
+  // Visit initial page 1.
+  ASSERT_TRUE(content::NavigateToURL(web_contents, initial1_url));
+  // Visit the redirect (a.test -> b.test with cookies).
+  ASSERT_TRUE(content::NavigateToURL(web_contents, redirect1_url, bounce_url));
+
+  // Wait for navigation to finish to bounce page (b.test).
+  EXPECT_TRUE(content::WaitForLoadStop(web_contents));
+  frame = web_contents->GetMainFrame();
+  // Advance TimeTicks by 1 second.
+  AdvanceDIPSTime(base::TimeDelta(base::Seconds(1)));
+  // Write Cookie via JS on bounce page.
+  CookieAccessObserver cookie_observer(web_contents, frame);
+  ASSERT_TRUE(content::ExecJs(frame, "document.cookie = 'foo=bar';",
+                              content::EXECUTE_SCRIPT_NO_USER_GESTURE));
+  cookie_observer.Wait();
+  // Initiate client-side redirect via JS without click (to initial page 2).
+  ASSERT_TRUE(content::ExecJs(
+      frame, content::JsReplace("window.location.href = $1;", initial2_url),
+      content::EXECUTE_SCRIPT_NO_USER_GESTURE));
+
+  // Wait for navigation to finish to redirect page 2 (c.test).
+  EXPECT_TRUE(content::WaitForLoadStop(web_contents));
+  // Visit the redirect (c.test -> d.test with cookies).
+  ASSERT_TRUE(content::NavigateToURL(web_contents, redirect2_url, final_url));
+
+  EXPECT_THAT(logger->log(), testing::ElementsAre(
+                                 ("DidStartNavigation(a.test/title1.html)"),
+                                 ("DidFinishNavigation(a.test/title1.html)"),
+                                 ("DidStartNavigation(a.test/"
+                                  "cross-site-with-cookie/b.test/title1.html)"),
+                                 ("OnCookiesAccessed(NavigationHandle, "
+                                  "Change: a.test/cross-site-with-cookie/"
+                                  "b.test/title1.html)"),
+                                 ("DidFinishNavigation(b.test/title1.html)"),
+                                 ("OnCookiesAccessed(RenderFrameHost, "
+                                  "Change: b.test/title1.html)"),
+                                 ("DidStartNavigation(c.test/title1.html)"),
+                                 ("DidFinishNavigation(c.test/title1.html)"),
+                                 ("DidStartNavigation(c.test/"
+                                  "cross-site-with-cookie/d.test/title1.html)"),
+                                 ("OnCookiesAccessed(NavigationHandle, "
+                                  "Change: c.test/cross-site-with-cookie/"
+                                  "d.test/title1.html)"),
+                                 ("DidFinishNavigation(d.test/title1.html)")));
+
+  EXPECT_THAT(
+      redirects,
+      testing::ElementsAre(
+          ("a.test/title1.html -> "
+           "a.test/cross-site-with-cookie/b.test/title1.html -> "
+           "b.test/title1.html"),
+          ("a.test/title1.html -> b.test/title1.html -> c.test/title1.html"),
+          ("c.test/title1.html -> "
+           "c.test/cross-site-with-cookie/d.test/title1.html -> "
+           "d.test/title1.html")));
+}
+
+IN_PROC_BROWSER_TEST_F(DIPSBounceDetectorBrowserTest,
+                       DetectStatefulClientRedirect_Chain) {
+  GURL initial_url = embedded_test_server()->GetURL("a.test", "/title1.html");
+  GURL bounce1_url = embedded_test_server()->GetURL("b.test", "/title1.html");
+  GURL bounce2_url = embedded_test_server()->GetURL("c.test", "/title1.html");
+  GURL bounce3_url = embedded_test_server()->GetURL("d.test", "/title1.html");
+  GURL final_url = embedded_test_server()->GetURL("a.test", "/title1.html");
+  content::WebContents* web_contents = GetActiveWebContents();
+  content::RenderFrameHost* frame;
+
+  std::vector<std::string> redirects;
+  bounce_detector()->SetStatefulRedirectHandlerForTesting(
+      base::BindRepeating(&AppendRedirect, &redirects));
+
+  // Visit initial page.
+  ASSERT_TRUE(content::NavigateToURL(web_contents, initial_url));
+  // Wait for navigation to finish to initial page.
+  EXPECT_TRUE(content::WaitForLoadStop(web_contents));
+  frame = web_contents->GetMainFrame();
+  // Wait until we can click.
+  content::WaitForHitTestData(frame);
+  // Advance TimeTicks 10 seconds.
+  AdvanceDIPSTime(base::TimeDelta(base::Seconds(10)));
+  // Navigate to bounce page 1 via "mouse click".
+  UserActivationObserver observer(web_contents, frame);
+  ASSERT_TRUE(content::ExecJs(
+      frame, content::JsReplace("window.location.href = $1;", bounce1_url),
+      content::EXECUTE_SCRIPT_DEFAULT_OPTIONS));
+  observer.Wait();
+
+  // Wait for navigation to finish to bounce page 1.
+  EXPECT_TRUE(content::WaitForLoadStop(web_contents));
+  frame = web_contents->GetMainFrame();
+  // Wait until we can click.
+  content::WaitForHitTestData(frame);
+  // simulate mouse click
+  UserActivationObserver observer2(web_contents, frame);
+  SimulateMouseClick(web_contents, 0, blink::WebMouseEvent::Button::kLeft);
+  observer2.Wait();
+  // Advance TimeTicks by 1 second.
+  AdvanceDIPSTime(base::TimeDelta(base::Seconds(1)));
+  // Write Cookie via JS on bounce page 1.
+  CookieAccessObserver cookie_observer1(web_contents, frame);
+  ASSERT_TRUE(content::ExecJs(frame, "document.cookie = 'foo=bar';",
+                              content::EXECUTE_SCRIPT_NO_USER_GESTURE));
+  cookie_observer1.Wait();
+  // Initiate client-side redirect via JS without click.
+  ASSERT_TRUE(content::ExecJs(
+      frame, content::JsReplace("window.location.href = $1;", bounce2_url),
+      content::EXECUTE_SCRIPT_NO_USER_GESTURE));
+
+  // Wait for navigation to finish to bounce page 2.
+  EXPECT_TRUE(content::WaitForLoadStop(web_contents));
+  frame = web_contents->GetMainFrame();
+  // Advance TimeTicks by 1 second.
+  AdvanceDIPSTime(base::TimeDelta(base::Seconds(1)));
+  // Write Cookie via JS on bounce page 2.
+  CookieAccessObserver cookie_observer2(web_contents, frame);
+  ASSERT_TRUE(content::ExecJs(frame, "document.cookie = 'foo=bar';",
+                              content::EXECUTE_SCRIPT_NO_USER_GESTURE));
+  cookie_observer2.Wait();
+  // Initiate client-side redirect to via JS without click.
+  ASSERT_TRUE(content::ExecJs(
+      frame, content::JsReplace("window.location.href = $1;", bounce3_url),
+      content::EXECUTE_SCRIPT_NO_USER_GESTURE));
+
+  // Wait for navigation to finish to bounce page 3.
+  EXPECT_TRUE(content::WaitForLoadStop(web_contents));
+  frame = web_contents->GetMainFrame();
+  // Advance TimeTicks by 1 second.
+  AdvanceDIPSTime(base::TimeDelta(base::Seconds(1)));
+  // Write Cookie via JS on bounce page 3.
+  CookieAccessObserver cookie_observer3(web_contents, frame);
+  ASSERT_TRUE(content::ExecJs(frame, "document.cookie = 'foo=bar';",
+                              content::EXECUTE_SCRIPT_NO_USER_GESTURE));
+  cookie_observer3.Wait();
+  // Initiate client-side redirect to final page via JS without click.
+  ASSERT_TRUE(content::ExecJs(
+      frame, content::JsReplace("window.location.href = $1;", final_url),
+      content::EXECUTE_SCRIPT_NO_USER_GESTURE));
+
+  // Wait for navigation to finish to final page (a.test).
+  EXPECT_TRUE(content::WaitForLoadStop(web_contents));
+
+  // c.test and d.test are stateful bounces, but b.test is not counted as a
+  // bounce because it received user activation shortly before redirecting away.
+  EXPECT_THAT(
+      redirects,
+      testing::ElementsAre(
+          ("b.test/title1.html -> c.test/title1.html -> d.test/title1.html"),
+          ("c.test/title1.html -> d.test/title1.html -> a.test/title1.html")));
+}
+
+IN_PROC_BROWSER_TEST_F(DIPSBounceDetectorBrowserTest,
+                       DetectStatefulServerRedirect_NoContent) {
   GURL initial_url = embedded_test_server()->GetURL("a.test", "/title1.html");
   // The redirect chain ends in a 204 No Content response, which doesn't commit.
   GURL redirect_url = embedded_test_server()->GetURL(
@@ -398,7 +731,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(DIPSBounceDetectorBrowserTest,
-                       DetectStatefulRedirect_404Error) {
+                       DetectStatefulServerRedirect_404Error) {
   GURL initial_url = embedded_test_server()->GetURL("a.test", "/title1.html");
   // The redirect chain ends in a 404 error.
   GURL redirect_url = embedded_test_server()->GetURL(
@@ -442,7 +775,91 @@
 using base::Bucket;
 
 IN_PROC_BROWSER_TEST_F(DIPSBounceDetectorBrowserTest,
-                       Histograms_BounceCategory) {
+                       Histograms_BounceCategory_Client) {
+  GURL initial_url = embedded_test_server()->GetURL("a.test", "/title1.html");
+  GURL bounce1_url = embedded_test_server()->GetURL("b.test", "/title1.html");
+  GURL bounce2_url = embedded_test_server()->GetURL("c.test", "/title1.html");
+  GURL final_url = embedded_test_server()->GetURL("d.test", "/title1.html");
+  content::WebContents* web_contents = GetActiveWebContents();
+  content::RenderFrameHost* frame;
+
+  // Set cookies on b.test. Note that browser-initiated navigations like
+  // these are treated as a sign of user engagement.
+  ASSERT_TRUE(content::NavigateToURL(
+      web_contents,
+      embedded_test_server()->GetURL("b.test", "/set-cookie?name=value")));
+
+  // Set cookies on c.test without of user engagement signal.
+  ASSERT_TRUE(NavigateToURLFromRendererWithoutUserGesture(
+      web_contents->GetMainFrame(),
+      embedded_test_server()->GetURL("c.test", "/set-cookie?name=value")));
+
+  // Visit initial page.
+  ASSERT_TRUE(content::NavigateToURL(web_contents, initial_url));
+  // Wait for navigation to finish to initial page.
+  EXPECT_TRUE(content::WaitForLoadStop(web_contents));
+  frame = web_contents->GetMainFrame();
+  // Wait until we can click.
+  content::WaitForHitTestData(frame);
+  // Advance TimeTicks 10 seconds.
+  AdvanceDIPSTime(base::TimeDelta(base::Seconds(10)));
+  // Navigate to bounce page 1 via "mouse click" and monitor the histograms.
+  base::HistogramTester histograms;
+  UserActivationObserver observer(web_contents, frame);
+  ASSERT_TRUE(content::ExecJs(
+      frame, content::JsReplace("window.location.href = $1;", bounce1_url),
+      content::EXECUTE_SCRIPT_DEFAULT_OPTIONS));
+  observer.Wait();
+
+  // Wait for navigation to finish to bounce page 1.
+  EXPECT_TRUE(content::WaitForLoadStop(web_contents));
+  frame = web_contents->GetMainFrame();
+  // Wait until we can click.
+  content::WaitForHitTestData(frame);
+  // Advance TimeTicks by 1 second
+  AdvanceDIPSTime(base::TimeDelta(base::Seconds(1)));
+  // Initiate client-side redirect via JS without click.
+  ASSERT_TRUE(content::ExecJs(
+      frame, content::JsReplace("window.location.href = $1;", bounce2_url),
+      content::EXECUTE_SCRIPT_NO_USER_GESTURE));
+
+  // Wait for navigation to finish to bounce page 2.
+  EXPECT_TRUE(content::WaitForLoadStop(web_contents));
+  frame = web_contents->GetMainFrame();
+  // Advance TimeTicks by 1 second.
+  AdvanceDIPSTime(base::TimeDelta(base::Seconds(1)));
+  // Write Cookie via JS on bounce page 2 (c.test).
+  CookieAccessObserver cookie_observer(web_contents, frame);
+  ASSERT_TRUE(content::ExecJs(frame, "document.cookie = 'foo=bar';",
+                              content::EXECUTE_SCRIPT_NO_USER_GESTURE));
+  cookie_observer.Wait();
+  // Initiate client-side redirect to final page via JS without click.
+  ASSERT_TRUE(content::ExecJs(
+      frame, content::JsReplace("window.location.href = $1;", final_url),
+      content::EXECUTE_SCRIPT_NO_USER_GESTURE));
+
+  // Wait for navigation to finish to final page (d.test).
+  EXPECT_TRUE(content::WaitForLoadStop(web_contents));
+
+  // Verify the correct histogram was used for all samples.
+  base::HistogramTester::CountsMap expected_counts;
+  expected_counts["Privacy.DIPS.BounceCategoryClient.Standard"] = 2;
+  EXPECT_THAT(
+      histograms.GetTotalCountsForPrefix("Privacy.DIPS.BounceCategoryClient."),
+      testing::ContainerEq(expected_counts));
+  // Verify the proper values were recorded. b.test is a has user engagement
+  // and read cookies, while c.test has no user engagement and wrote cookies.
+  EXPECT_THAT(
+      histograms.GetAllSamples("Privacy.DIPS.BounceCategoryClient.Standard"),
+      testing::ElementsAre(
+          // c.test
+          Bucket((int)RedirectCategory::kReadWriteCookies_NoEngagement, 1),
+          // b.test
+          Bucket((int)RedirectCategory::kReadCookies_HasEngagement, 1)));
+}
+
+IN_PROC_BROWSER_TEST_F(DIPSBounceDetectorBrowserTest,
+                       Histograms_BounceCategory_Server) {
   GURL initial_url = embedded_test_server()->GetURL("a.test", "/title1.html");
   GURL redirect_url = embedded_test_server()->GetURL(
       "a.test",
@@ -469,14 +886,14 @@
 
   // Verify the correct histogram was used for all samples.
   base::HistogramTester::CountsMap expected_counts;
-  expected_counts["Privacy.DIPS.BounceCategory.Standard"] = 2;
+  expected_counts["Privacy.DIPS.BounceCategoryServer.Standard"] = 2;
   EXPECT_THAT(
-      histograms.GetTotalCountsForPrefix("Privacy.DIPS.BounceCategory."),
+      histograms.GetTotalCountsForPrefix("Privacy.DIPS.BounceCategoryServer."),
       testing::ContainerEq(expected_counts));
   // Verify the proper values were recorded. Note that the a.test redirect was
   // not reported because the previously committed page was also on a.test.
   EXPECT_THAT(
-      histograms.GetAllSamples("Privacy.DIPS.BounceCategory.Standard"),
+      histograms.GetAllSamples("Privacy.DIPS.BounceCategoryServer.Standard"),
       testing::ElementsAre(
           // c.test
           Bucket((int)RedirectCategory::kNoCookies_NoEngagement, 1),
diff --git a/chrome/browser/dips/dips_utils.cc b/chrome/browser/dips/dips_utils.cc
new file mode 100644
index 0000000..e695c56
--- /dev/null
+++ b/chrome/browser/dips/dips_utils.cc
@@ -0,0 +1,36 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/dips/dips_utils.h"
+
+#include "base/strings/strcat.h"
+#include "base/strings/string_piece.h"
+
+// TODO (jdh@): Move DIPSCookieMode and CookieAccessType into this file as well.
+
+base::StringPiece GetHistogramPiece(DIPSRedirectType type) {
+  // Any changes here need to be reflected in
+  // tools/metrics/histograms/metadata/privacy/histograms.xml
+  switch (type) {
+    case DIPSRedirectType::kClient:
+      return "Client";
+    case DIPSRedirectType::kServer:
+      return "Server";
+  }
+  DCHECK(false) << "Invalid DIPSRedirectType";
+  return base::StringPiece();
+}
+
+const char* DIPSRedirectTypeToString(DIPSRedirectType type) {
+  switch (type) {
+    case DIPSRedirectType::kClient:
+      return "Client";
+    case DIPSRedirectType::kServer:
+      return "Server";
+  }
+}
+
+std::ostream& operator<<(std::ostream& os, DIPSRedirectType type) {
+  return os << DIPSRedirectTypeToString(type);
+}
diff --git a/chrome/browser/dips/dips_utils.h b/chrome/browser/dips/dips_utils.h
new file mode 100644
index 0000000..91b9306
--- /dev/null
+++ b/chrome/browser/dips/dips_utils.h
@@ -0,0 +1,21 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_DIPS_DIPS_UTILS_H_
+#define CHROME_BROWSER_DIPS_DIPS_UTILS_H_
+
+#include <ostream>
+
+#include "base/strings/string_piece_forward.h"
+
+/* Redirect Type Methods */
+enum class DIPSRedirectType { kClient, kServer };
+
+base::StringPiece GetHistogramPiece(DIPSRedirectType type);
+
+const char* DIPSRedirectTypeToString(DIPSRedirectType type);
+
+std::ostream& operator<<(std::ostream& os, DIPSRedirectType type);
+
+#endif  // CHROME_BROWSER_DIPS_DIPS_UTILS_H_
diff --git a/chrome/browser/download/download_item_model.cc b/chrome/browser/download/download_item_model.cc
index be52f4a..8bc2889 100644
--- a/chrome/browser/download/download_item_model.cc
+++ b/chrome/browser/download/download_item_model.cc
@@ -848,7 +848,7 @@
           download_core_service->GetDownloadManagerDelegate();
       DCHECK(delegate);
       enterprise_connectors::AnalysisSettings settings;
-      settings.tags = {"malware"};
+      settings.tags = {{"malware", enterprise_connectors::TagSettings()}};
       protection_service->UploadForDeepScanning(
           download_,
           base::BindRepeating(
diff --git a/chrome/browser/download/download_stats.cc b/chrome/browser/download/download_stats.cc
index 445aaa80..d39eb05d 100644
--- a/chrome/browser/download/download_stats.cc
+++ b/chrome/browser/download/download_stats.cc
@@ -77,9 +77,9 @@
   base::UmaHistogramEnumeration("Download.CancelReason", reason);
 }
 
-void RecordDownloadShelfDragEvent(DownloadShelfDragEvent drag_event) {
-  base::UmaHistogramEnumeration("Download.Shelf.DragEvent", drag_event,
-                                DownloadShelfDragEvent::COUNT);
+void RecordDownloadShelfDragInfo(DownloadShelfDragInfo drag_info) {
+  base::UmaHistogramEnumeration("Download.Shelf.DragInfo", drag_info,
+                                DownloadShelfDragInfo::COUNT);
 }
 
 void RecordDownloadStartPerProfileType(Profile* profile) {
diff --git a/chrome/browser/download/download_stats.h b/chrome/browser/download/download_stats.h
index cff0825..8b1d388 100644
--- a/chrome/browser/download/download_stats.h
+++ b/chrome/browser/download/download_stats.h
@@ -150,23 +150,24 @@
 // Record download cancel reason.
 void RecordDownloadCancelReason(DownloadCancelReason reason);
 
-// Records drags of completed downloads from the shelf. Used in UMA, do not
-// remove, change or reuse existing entries. Update histograms.xml and
-// enums.xml when adding entries.
-enum class DownloadShelfDragEvent {
-  // A download was dragged. All platforms.
-  STARTED,
-  // The download was dropped somewhere that isn't a drag target. Currently
-  // only recorded on Mac.
-  CANCELED,
-  // The download was dropped somewhere useful (a folder, an application,
-  // etc.). Currently only recorded on Mac.
-  DROPPED,
+// Records information related to dragging completed downloads from the shelf.
+// Used in UMA. Do not remove, change or reuse existing entries. Update
+// histograms.xml and enums.xml when adding entries.
+enum class DownloadShelfDragInfo {
+  // A download starting to be dragged. It is possible the drag-and-drop will
+  // not complete depending on the user's actions.
+  DRAG_STARTED,
+  // As a point of reference for dragged downloads, this represents when a
+  // download completes on the shelf. This omits downloads that are immediately
+  // removed from the shelf when they complete.
+  DOWNLOAD_COMPLETE,
 
   COUNT
 };
 
-void RecordDownloadShelfDragEvent(DownloadShelfDragEvent drag_event);
+// Records either when a drag event is initiated by the user or, as a point of
+// reference, when a download completes on the shelf.
+void RecordDownloadShelfDragInfo(DownloadShelfDragInfo drag_info);
 
 void RecordDownloadStartPerProfileType(Profile* profile);
 
diff --git a/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc
index 874c729..b9a5c8e 100644
--- a/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc
+++ b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc
@@ -96,7 +96,7 @@
           value.FindStringKey(kKeyCustomMessagesLearnMoreUrl);
       data.learn_more_url = url ? GURL(*url) : GURL();
 
-      custom_message_data_[*tag] = data;
+      tags_[*tag].custom_message = std::move(data);
     }
   }
 
@@ -105,7 +105,7 @@
   if (require_justification_tags && require_justification_tags->is_list()) {
     for (const base::Value& tag :
          require_justification_tags->GetListDeprecated()) {
-      tags_requiring_justification_.insert(tag.GetString());
+      tags_[tag.GetString()].requires_justification = true;
     }
   }
 }
@@ -155,8 +155,6 @@
   settings.analysis_url = GURL(analysis_config_->url);
   DCHECK(settings.analysis_url.is_valid());
   settings.minimum_data_size = minimum_data_size_;
-  settings.custom_message_data = custom_message_data_;
-  settings.tags_requiring_justification = tags_requiring_justification_;
 
   return settings;
 }
@@ -169,32 +167,31 @@
 
 absl::optional<std::u16string> AnalysisServiceSettings::GetCustomMessage(
     const std::string& tag) {
-  const auto& element = custom_message_data_.find(tag);
+  const auto& element = tags_.find(tag);
 
-  if (!IsValid() || element == custom_message_data_.end() ||
-      element->second.message.empty()) {
+  if (!IsValid() || element == tags_.end() ||
+      element->second.custom_message.message.empty()) {
     return absl::nullopt;
   }
 
-  return element->second.message;
+  return element->second.custom_message.message;
 }
 
 absl::optional<GURL> AnalysisServiceSettings::GetLearnMoreUrl(
     const std::string& tag) {
-  const auto& element = custom_message_data_.find(tag);
+  const auto& element = tags_.find(tag);
 
-  if (!IsValid() || element == custom_message_data_.end() ||
-      element->second.learn_more_url.is_empty()) {
+  if (!IsValid() || element == tags_.end() ||
+      element->second.custom_message.learn_more_url.is_empty()) {
     return absl::nullopt;
   }
 
-  return element->second.learn_more_url;
+  return element->second.custom_message.learn_more_url;
 }
 
 absl::optional<bool> AnalysisServiceSettings::GetBypassJustificationRequired(
     const std::string& tag) {
-  return tags_requiring_justification_.find(tag) !=
-         tags_requiring_justification_.end();
+  return tags_.find(tag) != tags_.end() && tags_.at(tag).requires_justification;
 }
 
 void AnalysisServiceSettings::AddUrlPatternSettings(
@@ -237,7 +234,7 @@
     disabled_patterns_settings_[*id] = std::move(setting);
 }
 
-std::set<std::string> AnalysisServiceSettings::GetTags(
+std::map<std::string, TagSettings> AnalysisServiceSettings::GetTags(
     const std::set<base::MatcherStringPattern::ID>& matches) const {
   std::set<std::string> enable_tags;
   std::set<std::string> disable_tags;
@@ -264,7 +261,15 @@
   for (const std::string& tag_to_disable : disable_tags)
     enable_tags.erase(tag_to_disable);
 
-  return enable_tags;
+  std::map<std::string, TagSettings> output;
+  for (const std::string& tag : enable_tags) {
+    if (tags_.count(tag))
+      output[tag] = tags_.at(tag);
+    else
+      output[tag] = TagSettings();
+  }
+
+  return output;
 }
 
 bool AnalysisServiceSettings::IsValid() const {
diff --git a/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.h b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.h
index 05648cad..27c2a82 100644
--- a/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.h
+++ b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.h
@@ -76,7 +76,7 @@
 
   // Return tags found in |enabled_patterns_settings| corresponding to the
   // matches while excluding the ones in |disable_patterns_settings|.
-  std::set<std::string> GetTags(
+  std::map<std::string, TagSettings> GetTags(
       const std::set<base::MatcherStringPattern::ID>& matches) const;
 
   // The service provider matching the name given in a Connector policy. nullptr
@@ -107,10 +107,9 @@
   bool block_large_files_ = false;
   bool block_unsupported_file_types_ = false;
   size_t minimum_data_size_ = 100;
-  // A map from tag (dlp, malware, etc) to the custom message and "learn more"
-  // link associated with it.
-  std::map<std::string, CustomMessageData> custom_message_data_;
-  std::set<std::string> tags_requiring_justification_;
+  // A map from tag (dlp, malware, etc) to the custom message, "learn more" link
+  // and other settings associated to a specific tag.
+  std::map<std::string, TagSettings> tags_;
   std::string service_provider_name_;
 };
 
diff --git a/chrome/browser/enterprise/connectors/analysis/analysis_service_settings_unittest.cc b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings_unittest.cc
index 7dcce52..89e4d317 100644
--- a/chrome/browser/enterprise/connectors/analysis/analysis_service_settings_unittest.cc
+++ b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings_unittest.cc
@@ -149,15 +149,16 @@
 AnalysisSettings* OnlyEnabledSettings() {
   static base::NoDestructor<AnalysisSettings> settings([]() {
     AnalysisSettings settings;
-    settings.tags = {"dlp"};
+    settings.tags = {{"dlp", TagSettings()}};
     return settings;
   }());
   return settings.get();
 }
 
-AnalysisSettings NormalSettingsWithTags(std::set<std::string> tags) {
+AnalysisSettings NormalSettingsWithTags(
+    std::map<std::string, TagSettings> tags) {
   AnalysisSettings settings;
-  settings.tags = tags;
+  settings.tags = std::move(tags);
   settings.block_until_verdict = BlockUntilVerdict::BLOCK;
   settings.block_password_protected_files = true;
   settings.block_large_files = true;
@@ -168,27 +169,44 @@
 
 AnalysisSettings* NormalDlpSettings() {
   static base::NoDestructor<AnalysisSettings> settings(
-      NormalSettingsWithTags({"dlp"}));
+      NormalSettingsWithTags({{"dlp", TagSettings()}}));
   return settings.get();
 }
 
 AnalysisSettings* NormalMalwareSettings() {
   static base::NoDestructor<AnalysisSettings> settings(
-      NormalSettingsWithTags({"malware"}));
+      NormalSettingsWithTags({{"malware", TagSettings()}}));
   return settings.get();
 }
 
 AnalysisSettings* NormalDlpAndMalwareSettings() {
-  static base::NoDestructor<AnalysisSettings> settings(
-      NormalSettingsWithTags({"dlp", "malware"}));
+  static base::NoDestructor<AnalysisSettings> settings(NormalSettingsWithTags(
+      {{"dlp", TagSettings()}, {"malware", TagSettings()}}));
   return settings.get();
 }
 
 AnalysisSettings* NormalSettingsWithCustomMessage() {
   static base::NoDestructor<AnalysisSettings> settings([]() {
-    AnalysisSettings settings = NormalSettingsWithTags({"dlp", "malware"});
-    settings.custom_message_data["dlp"].message = u"dlpabcèéç";
-    settings.custom_message_data["malware"].message = u"malwareabcèéç";
+    AnalysisSettings settings = NormalSettingsWithTags({
+        {
+            "dlp",
+            {
+                .custom_message =
+                    {
+                        .message = u"dlpabcèéç",
+                    },
+            },
+        },
+        {
+            "malware",
+            {
+                .custom_message =
+                    {
+                        .message = u"malwareabcèéç",
+                    },
+            },
+        },
+    });
     return settings;
   }());
   return settings.get();
@@ -196,8 +214,15 @@
 
 AnalysisSettings* NormalSettingsDlpRequiresBypassJustification() {
   static base::NoDestructor<AnalysisSettings> settings([]() {
-    AnalysisSettings settings = NormalSettingsWithTags({"dlp", "malware"});
-    settings.tags_requiring_justification = {"dlp"};
+    AnalysisSettings settings = NormalSettingsWithTags({
+        {
+            "dlp",
+            {
+                .requires_justification = true,
+            },
+        },
+        {"malware", TagSettings()},
+    });
     return settings;
   }());
   return settings.get();
@@ -238,7 +263,6 @@
   auto analysis_settings = service_settings.GetAnalysisSettings(url());
   ASSERT_EQ((expected_settings() != nullptr), analysis_settings.has_value());
   if (analysis_settings.has_value()) {
-    ASSERT_EQ(analysis_settings.value().tags, expected_settings()->tags);
     ASSERT_EQ(analysis_settings.value().block_until_verdict,
               expected_settings()->block_until_verdict);
     ASSERT_EQ(analysis_settings.value().block_password_protected_files,
@@ -251,23 +275,24 @@
               expected_settings()->analysis_url);
     ASSERT_EQ(analysis_settings.value().minimum_data_size,
               expected_settings()->minimum_data_size);
-    for (const auto& entry : expected_settings()->custom_message_data) {
-      ASSERT_EQ(
-          entry.second.message,
-          analysis_settings.value().custom_message_data[entry.first].message);
-      ASSERT_EQ(kExpectedLearnMoreUrlSpecs.at(entry.first),
-                analysis_settings.value()
-                    .custom_message_data[entry.first]
-                    .learn_more_url.spec());
-
-      ASSERT_EQ(entry.second.message,
-                service_settings.GetCustomMessage(entry.first).value());
-      ASSERT_EQ(kExpectedLearnMoreUrlSpecs.at(entry.first),
-                service_settings.GetLearnMoreUrl(entry.first).value().spec());
+    for (const auto& entry : expected_settings()->tags) {
+      const std::string& tag = entry.first;
+      ASSERT_TRUE(analysis_settings.value().tags.count(entry.first));
+      ASSERT_EQ(analysis_settings.value().tags[tag].custom_message.message,
+                entry.second.custom_message.message);
+      if (!analysis_settings.value()
+               .tags[tag]
+               .custom_message.learn_more_url.is_empty()) {
+        ASSERT_EQ(kExpectedLearnMoreUrlSpecs.at(tag),
+                  analysis_settings.value()
+                      .tags[tag]
+                      .custom_message.learn_more_url.spec());
+        ASSERT_EQ(kExpectedLearnMoreUrlSpecs.at(tag),
+                  service_settings.GetLearnMoreUrl(tag).value().spec());
+      }
+      ASSERT_EQ(analysis_settings.value().tags[tag].requires_justification,
+                entry.second.requires_justification);
     }
-
-    ASSERT_EQ(analysis_settings.value().tags_requiring_justification,
-              expected_settings()->tags_requiring_justification);
   }
 }
 
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc
index 6ab83e1..01cdf89 100644
--- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc
+++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc
@@ -230,22 +230,22 @@
 
 absl::optional<std::u16string> ContentAnalysisDelegate::GetCustomMessage()
     const {
-  auto element = data_.settings.custom_message_data.find(final_result_tag_);
-  if (element != data_.settings.custom_message_data.end() &&
-      !element->second.message.empty()) {
+  auto element = data_.settings.tags.find(final_result_tag_);
+  if (element != data_.settings.tags.end() &&
+      !element->second.custom_message.message.empty()) {
     return l10n_util::GetStringFUTF16(IDS_DEEP_SCANNING_DIALOG_CUSTOM_MESSAGE,
-                                      element->second.message);
+                                      element->second.custom_message.message);
   }
 
   return absl::nullopt;
 }
 
 absl::optional<GURL> ContentAnalysisDelegate::GetCustomLearnMoreUrl() const {
-  auto element = data_.settings.custom_message_data.find(final_result_tag_);
-  if (element != data_.settings.custom_message_data.end() &&
-      element->second.learn_more_url.is_valid() &&
-      !element->second.learn_more_url.is_empty()) {
-    return element->second.learn_more_url;
+  auto element = data_.settings.tags.find(final_result_tag_);
+  if (element != data_.settings.tags.end() &&
+      element->second.custom_message.learn_more_url.is_valid() &&
+      !element->second.custom_message.learn_more_url.is_empty()) {
+    return element->second.custom_message.learn_more_url;
   }
 
   return absl::nullopt;
@@ -255,8 +255,8 @@
   if (!base::FeatureList::IsEnabled(kBypassJustificationEnabled))
     return false;
 
-  return data_.settings.tags_requiring_justification.count(final_result_tag_) >
-         0;
+  return data_.settings.tags.count(final_result_tag_) &&
+         data_.settings.tags.at(final_result_tag_).requires_justification;
 }
 
 std::u16string ContentAnalysisDelegate::GetBypassJustificationLabel() const {
@@ -646,8 +646,8 @@
   request->set_url(data_.url.spec());
   request->set_tab_url(data_.url);
   request->set_per_profile_request(data_.settings.per_profile);
-  for (const std::string& tag : data_.settings.tags)
-    request->add_tag(tag);
+  for (const auto& tag : data_.settings.tags)
+    request->add_tag(tag.first);
   if (data_.settings.client_metadata)
     request->set_client_metadata(*data_.settings.client_metadata);
 }
diff --git a/chrome/browser/enterprise/connectors/common.h b/chrome/browser/enterprise/connectors/common.h
index 2f4e8b9..867d03a 100644
--- a/chrome/browser/enterprise/connectors/common.h
+++ b/chrome/browser/enterprise/connectors/common.h
@@ -81,6 +81,13 @@
   GURL learn_more_url;
 };
 
+// A struct representing tag-specific settings that are applied to an analysis
+// which includes that tag.
+struct TagSettings {
+  CustomMessageData custom_message;
+  bool requires_justification = false;
+};
+
 // Structs representing settings to be used for an analysis or a report. These
 // settings should only be kept and considered valid for the specific
 // analysis/report they were obtained for.
@@ -91,13 +98,11 @@
   ~AnalysisSettings();
 
   GURL analysis_url;
-  std::set<std::string> tags;
+  std::map<std::string, TagSettings> tags;
   BlockUntilVerdict block_until_verdict = BlockUntilVerdict::NO_BLOCK;
   bool block_password_protected_files = false;
   bool block_large_files = false;
   bool block_unsupported_file_types = false;
-  std::map<std::string, CustomMessageData> custom_message_data;
-  std::set<std::string> tags_requiring_justification;
 
   // Minimum text size for BulkDataEntry scans. 0 means no minimum.
   size_t minimum_data_size = 100;
diff --git a/chrome/browser/enterprise/connectors/connectors_manager_unittest.cc b/chrome/browser/enterprise/connectors/connectors_manager_unittest.cc
index a1d72cb4..b0a4ff6e 100644
--- a/chrome/browser/enterprise/connectors/connectors_manager_unittest.cc
+++ b/chrome/browser/enterprise/connectors/connectors_manager_unittest.cc
@@ -113,7 +113,16 @@
     ASSERT_EQ(settings.block_large_files, expected_block_large_files_);
     ASSERT_EQ(settings.block_unsupported_file_types,
               expected_block_unsupported_file_types_);
-    ASSERT_EQ(settings.tags, expected_tags_);
+    for (const auto& expected_tag : expected_tags_) {
+      const std::string& tag = expected_tag.first;
+      ASSERT_TRUE(settings.tags.count(tag));
+      ASSERT_EQ(settings.tags.at(tag).requires_justification,
+                expected_tag.second.requires_justification);
+      ASSERT_EQ(settings.tags.at(tag).custom_message.message,
+                expected_tag.second.custom_message.message);
+      ASSERT_EQ(settings.tags.at(tag).custom_message.learn_more_url,
+                expected_tag.second.custom_message.learn_more_url);
+    }
   }
 
   void ValidateSettings(const ReportingSettings& settings) {
@@ -158,7 +167,7 @@
   GURL url_ = GURL("https://google.com");
 
   // Set to the default value of their legacy policy.
-  std::set<std::string> expected_tags_ = {};
+  std::map<std::string, TagSettings> expected_tags_ = {};
   BlockUntilVerdict expected_block_until_verdict_ = BlockUntilVerdict::NO_BLOCK;
   bool expected_block_password_protected_files_ = false;
   bool expected_block_large_files_ = false;
@@ -209,11 +218,11 @@
     settings.block_unsupported_file_types = true;
 
     if (url == kDlpAndMalwareUrl)
-      settings.tags = {"dlp", "malware"};
+      settings.tags = {{"dlp", TagSettings()}, {"malware", TagSettings()}};
     else if (url == kOnlyDlpUrl)
-      settings.tags = {"dlp"};
+      settings.tags = {{"dlp", TagSettings()}};
     else if (url == kOnlyMalwareUrl)
-      settings.tags = {"malware"};
+      settings.tags = {{"malware", TagSettings()}};
 
     return settings;
   }
@@ -313,7 +322,7 @@
     expected_block_password_protected_files_ = true;
     expected_block_large_files_ = true;
     expected_block_unsupported_file_types_ = true;
-    expected_tags_ = {"dlp", "malware"};
+    expected_tags_ = {{"dlp", TagSettings()}, {"malware", TagSettings()}};
     ValidateSettings(settings.value());
   }
 
diff --git a/chrome/browser/enterprise/connectors/device_trust/OWNERS b/chrome/browser/enterprise/connectors/device_trust/OWNERS
index 7d1b378..9aeb8c8 100644
--- a/chrome/browser/enterprise/connectors/device_trust/OWNERS
+++ b/chrome/browser/enterprise/connectors/device_trust/OWNERS
@@ -1,2 +1 @@
-rogerta@chromium.org
-seblalancette@chromium.org
\ No newline at end of file
+file://components/device_signals/OWNERS
diff --git a/chrome/browser/enterprise/signals/OWNERS b/chrome/browser/enterprise/signals/OWNERS
new file mode 100644
index 0000000..9aeb8c8
--- /dev/null
+++ b/chrome/browser/enterprise/signals/OWNERS
@@ -0,0 +1 @@
+file://components/device_signals/OWNERS
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
index 7ae523b..070bf22 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -382,8 +382,11 @@
     api::passwords_private::PasswordUiEntry entry;
     entry.urls = CreateUrlCollectionFromForm(*form);
     entry.username = base::UTF16ToUTF8(form->username_value);
+    const auto& note_itr = base::ranges::find_if(
+        form->notes, &std::u16string::empty,
+        &password_manager::PasswordNote::unique_display_name);
     entry.password_note =
-        form->notes.empty() ? "" : base::UTF16ToUTF8(form->notes[0].value);
+        note_itr == form->notes.end() ? "" : base::UTF16ToUTF8(note_itr->value);
     entry.id = password_id_generator_.GenerateId(
         password_manager::CreateSortKey(*form));
     entry.frontend_id = password_frontend_id_generator_.GenerateId(
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
index d0208fa..9480762 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
@@ -467,8 +467,11 @@
 
 TEST_F(PasswordsPrivateDelegateImplTest, ChangeSavedPasswordWithNote) {
   password_manager::PasswordForm sample_form = CreateSampleForm();
-  password_manager::PasswordNote note(u"example note", base::Time::Now());
-  sample_form.notes = {note};
+  sample_form.notes.emplace_back(
+      u"display name", u"note with non-empty display name",
+      /*date_created=*/base::Time::Now(), /*hide_by_default=*/true);
+  sample_form.notes.emplace_back(u"note with empty display name",
+                                 /*date_created=*/base::Time::Now());
   SetUpPasswordStore({sample_form});
 
   PasswordsPrivateDelegateImpl delegate(&profile_);
@@ -477,13 +480,13 @@
   base::RunLoop().RunUntilIdle();
 
   // Double check that the contents of the passwords list matches our
-  // expectation.
+  // expectation. The note with an empty `unique_display_name` is returned.
   base::MockCallback<PasswordsPrivateDelegate::UiEntriesCallback> callback;
   EXPECT_CALL(callback, Run(SizeIs(1)))
       .WillOnce([&](const PasswordsPrivateDelegate::UiEntries& passwords) {
         EXPECT_EQ(sample_form.username_value,
                   base::UTF8ToUTF16(passwords[0].username));
-        EXPECT_EQ(sample_form.notes[0].value,
+        EXPECT_EQ(sample_form.notes[1].value,
                   base::UTF8ToUTF16(passwords[0].password_note));
       });
   delegate.GetSavedPasswordsList(callback.Get());
diff --git a/chrome/browser/extensions/site_permissions_helper.cc b/chrome/browser/extensions/site_permissions_helper.cc
index 814827df..7c54fe7 100644
--- a/chrome/browser/extensions/site_permissions_helper.cc
+++ b/chrome/browser/extensions/site_permissions_helper.cc
@@ -68,14 +68,17 @@
     return SiteInteraction::kActive;
   }
 
+  if (HasActiveTabAndCanAccess(extension, url)) {
+    return SiteInteraction::kActiveTab;
+  }
+
   // TODO(tjudkins): Investigate if we need to check HasBeenBlocked() for this
   // case. We do know that extensions that have been blocked should always be
   // marked pending, but those cases should be covered by the withheld page
   // access checks.
   if (page_access == PermissionsData::PageAccess::kWithheld ||
       script_access == PermissionsData::PageAccess::kWithheld ||
-      HasBeenBlocked(extension, web_contents) ||
-      HasActiveTabAndCanAccess(extension, url)) {
+      HasBeenBlocked(extension, web_contents)) {
     return SiteInteraction::kPending;
   }
 
diff --git a/chrome/browser/extensions/site_permissions_helper.h b/chrome/browser/extensions/site_permissions_helper.h
index ad36e17..f8f561e 100644
--- a/chrome/browser/extensions/site_permissions_helper.h
+++ b/chrome/browser/extensions/site_permissions_helper.h
@@ -35,6 +35,9 @@
     // The extension would like access to the site, but is pending user
     // approval.
     kPending,
+    // The extension has activeTab permission to run on the site, but is pending
+    // user action to run.
+    kActiveTab,
     // The extension has permission to run on the site.
     kActive,
   };
diff --git a/chrome/browser/extensions/site_permissions_helper_unittest.cc b/chrome/browser/extensions/site_permissions_helper_unittest.cc
index 60a8e244..9c99c46 100644
--- a/chrome/browser/extensions/site_permissions_helper_unittest.cc
+++ b/chrome/browser/extensions/site_permissions_helper_unittest.cc
@@ -191,8 +191,8 @@
       /*host_permissions=*/{}, /*permissions=*/{"activeTab"});
 
   {
-    // Verify a non-restricted url has "on click" site access and "pending" site
-    // interaction when the extension only has active tab permission.
+    // Verify a non-restricted url has "on click" site access and "active tab"
+    // site interaction when the extension only has active tab permission.
     const GURL non_restricted_url("http://www.non-restricted.com");
     auto* web_contents = AddTab(non_restricted_url);
     EXPECT_EQ(
@@ -200,7 +200,7 @@
         SiteAccess::kOnClick);
     EXPECT_EQ(
         permissions_helper()->GetSiteInteraction(*extension, web_contents),
-        SiteInteraction::kPending);
+        SiteInteraction::kActiveTab);
   }
 
   {
@@ -235,7 +235,7 @@
   }
 
   {
-    // Verify a non-restricted url has "on click" site access and  "pending"
+    // Verify a non-restricted url has "on click" site access and  "active tab"
     // site interaction when the extension does not request it but has active
     // tab permission.
     const GURL non_requested_url("http://www.non-requested.com");
@@ -245,7 +245,7 @@
         SiteAccess::kOnClick);
     EXPECT_EQ(
         permissions_helper()->GetSiteInteraction(*extension, web_contents),
-        SiteInteraction::kPending);
+        SiteInteraction::kActiveTab);
   }
 }
 
diff --git a/chrome/browser/feed/android/feed_stream.cc b/chrome/browser/feed/android/feed_stream.cc
index e6bdf25..e71b2d9 100644
--- a/chrome/browser/feed/android/feed_stream.cc
+++ b/chrome/browser/feed/android/feed_stream.cc
@@ -319,5 +319,14 @@
   feed_stream_api_->ResetInfoCardStates(GetStreamType(), info_card_type);
 }
 
+void FeedStream::InvalidateContentCacheFor(JNIEnv* env,
+                                           const JavaParamRef<jobject>& obj,
+                                           jint stream_kind) {
+  if (!feed_stream_api_)
+    return;
+  feed_stream_api_->InvalidateContentCacheFor(
+      (static_cast<StreamKind>(stream_kind)));
+}
+
 }  // namespace android
 }  // namespace feed
diff --git a/chrome/browser/feed/android/feed_stream.h b/chrome/browser/feed/android/feed_stream.h
index e415b0f..0250e98 100644
--- a/chrome/browser/feed/android/feed_stream.h
+++ b/chrome/browser/feed/android/feed_stream.h
@@ -139,6 +139,11 @@
                            const base::android::JavaParamRef<jobject>& obj,
                            int info_card_type);
 
+  void InvalidateContentCacheFor(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& obj,
+      jint stream_kind);
+
  private:
   base::android::ScopedJavaGlobalRef<jobject> java_ref_;
   raw_ptr<FeedApi> feed_stream_api_;
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java
index e6fa30c..3026d9a 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java
@@ -44,6 +44,7 @@
 import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
 import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
 import org.chromium.chrome.browser.xsurface.FeedActionsHandler;
+import org.chromium.chrome.browser.xsurface.FeedActionsHandler.FeedIdentifier;
 import org.chromium.chrome.browser.xsurface.FeedLaunchReliabilityLogger;
 import org.chromium.chrome.browser.xsurface.FeedLaunchReliabilityLogger.StreamType;
 import org.chromium.chrome.browser.xsurface.HybridListRenderer;
@@ -426,6 +427,26 @@
             FeedStreamJni.get().resetInfoCardStates(mNativeFeedStream, FeedStream.this, type);
         }
 
+        private @StreamType int feedIdentifierToType(@FeedIdentifier int fid) {
+            switch (fid) {
+                case FeedIdentifier.MAIN_FEED:
+                    return StreamType.FOR_YOU;
+                case FeedIdentifier.FOLLOWING_FEED:
+                    return StreamType.WEB_FEED;
+            }
+            return StreamType.UNSPECIFIED;
+        }
+
+        @Override
+        public void invalidateContentCacheFor(@FeedIdentifier int feedToInvalidate) {
+            @StreamType
+            int feedKindToInvalidate = feedIdentifierToType(feedToInvalidate);
+            if (feedKindToInvalidate != StreamType.UNSPECIFIED) {
+                FeedStreamJni.get().invalidateContentCacheFor(
+                        mNativeFeedStream, FeedStream.this, feedKindToInvalidate);
+            }
+        }
+
         // Since the XSurface client strings are slightly different than the Feed strings, convert
         // the name from the XSurface format to the format that can be handled by the feedback
         // system.  Any new strings that are added on the XSurface side will need a code change
@@ -1269,5 +1290,7 @@
         void reportInfoCardClicked(long nativeFeedStream, FeedStream caller, int type);
         void reportInfoCardDismissedExplicitly(long nativeFeedStream, FeedStream caller, int type);
         void resetInfoCardStates(long nativeFeedStream, FeedStream caller, int type);
+        void invalidateContentCacheFor(
+                long nativeFeedStream, FeedStream caller, @StreamType int feedToInvalidate);
     }
 }
diff --git a/chrome/browser/media/webrtc/conditional_focus_browsertest.cc b/chrome/browser/media/webrtc/conditional_focus_browsertest.cc
index cc4f289..a3345a38 100644
--- a/chrome/browser/media/webrtc/conditional_focus_browsertest.cc
+++ b/chrome/browser/media/webrtc/conditional_focus_browsertest.cc
@@ -276,7 +276,7 @@
   // Test.
   CallFocusAndExpectError(
       "InvalidStateError: Failed to execute 'focus' on "
-      "'BrowserCaptureMediaStreamTrack': Method may only be called once.");
+      "'FocusableMediaStreamTrack': Method may only be called once.");
 }
 
 IN_PROC_BROWSER_TEST_F(ConditionalFocusBrowserTest,
@@ -291,7 +291,7 @@
   EXPECT_EQ(
       script_result,
       "InvalidStateError: Failed to execute 'focus' on "
-      "'BrowserCaptureMediaStreamTrack': Method may not be invoked on clones.");
+      "'FocusableMediaStreamTrack': Method may not be invoked on clones.");
 }
 
 IN_PROC_BROWSER_TEST_F(ConditionalFocusBrowserTest,
@@ -302,8 +302,8 @@
           /*on_correct_microtask=*/false,
           /*expected_result=*/
           "InvalidStateError: Failed to execute 'focus' on "
-          "'BrowserCaptureMediaStreamTrack': The microtask on which the "
-          "Promise was settled has terminated.");
+          "'FocusableMediaStreamTrack': The microtask on which the Promise was "
+          "settled has terminated.");
 }
 
 #endif  //  !BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc b/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc
index 48e753b..e36683c 100644
--- a/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc
+++ b/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc
@@ -754,30 +754,18 @@
     WebRtcTestBase::SetUpCommandLine(command_line);
 
     std::vector<std::string> enabled_blink_features;
-    std::vector<std::string> disabled_blink_features;
-
     if (conditional_focus_enabled_) {
       enabled_blink_features.push_back("ConditionalFocus");
     }
-
     if (region_capture_enabled_) {
       enabled_blink_features.push_back("RegionCapture");
-    } else {
-      disabled_blink_features.push_back("RegionCapture");
     }
-
     if (!enabled_blink_features.empty()) {
       command_line->AppendSwitchASCII(
           switches::kEnableBlinkFeatures,
           base::JoinString(enabled_blink_features, ","));
     }
 
-    if (!disabled_blink_features.empty()) {
-      command_line->AppendSwitchASCII(
-          switches::kDisableBlinkFeatures,
-          base::JoinString(disabled_blink_features, ","));
-    }
-
     command_line->AppendSwitch(switches::kUseFakeUIForMediaStream);
     command_line->AppendSwitchASCII(
         switches::kUseFakeDeviceForMediaStream,
@@ -822,8 +810,9 @@
                    : conditional_focus_enabled_ ? "FocusableMediaStreamTrack"
                                                 : "MediaStreamTrack";
       case DisplaySurfaceType::kWindow:
-        return conditional_focus_enabled_ ? "FocusableMediaStreamTrack"
-                                          : "MediaStreamTrack";
+        return conditional_focus_enabled_ || region_capture_enabled_
+                   ? "FocusableMediaStreamTrack"
+                   : "MediaStreamTrack";
       case DisplaySurfaceType::kScreen:
         return "MediaStreamTrack";
     }
diff --git a/chrome/browser/net/profile_network_context_service.cc b/chrome/browser/net/profile_network_context_service.cc
index cc0fdca..147f3a4d 100644
--- a/chrome/browser/net/profile_network_context_service.cc
+++ b/chrome/browser/net/profile_network_context_service.cc
@@ -63,6 +63,7 @@
 #include "services/cert_verifier/public/mojom/cert_verifier_service_factory.mojom.h"
 #include "services/network/public/cpp/cors/origin_access_list.h"
 #include "services/network/public/cpp/features.h"
+#include "services/network/public/mojom/first_party_sets_access_delegate.mojom.h"
 #include "services/network/public/mojom/network_context.mojom.h"
 #include "services/network/public/mojom/network_service.mojom.h"
 #include "third_party/blink/public/common/features.h"
@@ -961,6 +962,23 @@
   network_context_params->block_trust_tokens =
       !PrivacySandboxSettingsFactory::GetForProfile(profile_)
            ->IsTrustTokensAllowed();
+
+  // TODO(crbug.com/1325050): Use per-profile prefs to determine whether FPS is
+  // enabled for the given profile.
+  network_context_params->first_party_sets_access_delegate_params =
+      network::mojom::FirstPartySetsAccessDelegateParams::New();
+  network_context_params->first_party_sets_access_delegate_params->enabled =
+      true;
+
+  mojo::Remote<network::mojom::FirstPartySetsAccessDelegate>
+      fps_access_delegate_remote;
+  network_context_params->first_party_sets_access_delegate_receiver =
+      fps_access_delegate_remote.BindNewPipeAndPassReceiver();
+  // TODO(crbug.com/1325050): Call NotifyReady() here for now to match the
+  // existing behavior. NotifyReady() will be called by the remote handle owner
+  // in the follow up change.
+  fps_access_delegate_remote->NotifyReady();
+  fps_access_delegate_remote_set_.Add(std::move(fps_access_delegate_remote));
 }
 
 base::FilePath ProfileNetworkContextService::GetPartitionPath(
diff --git a/chrome/browser/net/profile_network_context_service.h b/chrome/browser/net/profile_network_context_service.h
index 6657018..fba4ee37 100644
--- a/chrome/browser/net/profile_network_context_service.h
+++ b/chrome/browser/net/profile_network_context_service.h
@@ -26,8 +26,10 @@
 #include "components/prefs/pref_member.h"
 #include "components/privacy_sandbox/privacy_sandbox_settings.h"
 #include "mojo/public/cpp/bindings/remote.h"
+#include "mojo/public/cpp/bindings/remote_set.h"
 #include "net/net_buildflags.h"
 #include "services/cert_verifier/public/mojom/cert_verifier_service_factory.mojom-forward.h"
+#include "services/network/public/mojom/first_party_sets_access_delegate.mojom-forward.h"
 #include "services/network/public/mojom/network_context.mojom.h"
 
 class PrefRegistrySimple;
@@ -205,6 +207,10 @@
       trial_comparison_cert_verifier_controller_;
 #endif
 
+  // TODO(crbug.com/1325050): Let FirstPartySetsHandlerImpl own it.
+  mojo::RemoteSet<network::mojom::FirstPartySetsAccessDelegate>
+      fps_access_delegate_remote_set_;
+
   // Used for testing.
   base::RepeatingCallback<std::unique_ptr<net::ClientCertStore>()>
       client_cert_store_factory_;
diff --git a/chrome/browser/password_manager/android/BUILD.gn b/chrome/browser/password_manager/android/BUILD.gn
index 221616e..ed76813 100644
--- a/chrome/browser/password_manager/android/BUILD.gn
+++ b/chrome/browser/password_manager/android/BUILD.gn
@@ -181,7 +181,6 @@
     "//base:base_java",
     "//base:base_java_test_support",
     "//base:base_junit_test_support",
-    "//chrome/android:chrome_java",
     "//chrome/browser/flags:java",
     "//chrome/browser/loading_modal/android:java",
     "//chrome/browser/profiles/android:java",
diff --git a/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelperTest.java b/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelperTest.java
index c8165a2..9b4a5df 100644
--- a/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelperTest.java
+++ b/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelperTest.java
@@ -4,9 +4,6 @@
 
 package org.chromium.chrome.browser.password_manager;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.anyInt;
 import static org.mockito.Mockito.doAnswer;
@@ -14,20 +11,18 @@
 import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.app.PendingIntent;
 import android.app.PendingIntent.CanceledException;
-import android.content.Context;
-import android.os.Bundle;
 
 import com.google.android.gms.common.api.ApiException;
 import com.google.android.gms.common.api.CommonStatusCodes;
 import com.google.android.gms.common.api.Status;
 import com.google.common.base.Optional;
 
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -52,15 +47,12 @@
 import org.chromium.chrome.browser.password_manager.CredentialManagerLauncher.CredentialManagerError;
 import org.chromium.chrome.browser.password_manager.PasswordCheckupClientHelper.PasswordCheckBackendException;
 import org.chromium.chrome.browser.password_manager.PasswordManagerHelper.PasswordCheckOperation;
-import org.chromium.chrome.browser.password_manager.settings.PasswordSettings;
 import org.chromium.chrome.browser.sync.SyncService;
 import org.chromium.chrome.test.util.browser.Features;
-import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.browser_ui.settings.SettingsLauncher;
 import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.components.signin.base.GoogleServiceAuthError;
-import org.chromium.components.signin.base.GoogleServiceAuthError.State;
 import org.chromium.components.sync.ModelType;
 import org.chromium.ui.modaldialog.ModalDialogManager;
 
@@ -151,15 +143,15 @@
     @Test
     public void testSyncCheckFeatureNotEnabled() {
         when(mSyncServiceMock.isSyncFeatureEnabled()).thenReturn(false);
-        assertFalse(PasswordManagerHelper.hasChosenToSyncPasswords(mSyncServiceMock));
-        assertFalse(PasswordManagerHelper.hasChosenToSyncPasswordsWithNoCustomPassphrase(
+        Assert.assertFalse(PasswordManagerHelper.hasChosenToSyncPasswords(mSyncServiceMock));
+        Assert.assertFalse(PasswordManagerHelper.hasChosenToSyncPasswordsWithNoCustomPassphrase(
                 mSyncServiceMock));
     }
 
     @Test
     public void testSyncCheckNoSyncConsent() {
         when(mSyncServiceMock.hasSyncConsent()).thenReturn(false);
-        assertFalse(
+        Assert.assertFalse(
                 PasswordManagerHelper.isSyncingPasswordsWithNoCustomPassphrase(mSyncServiceMock));
     }
 
@@ -167,8 +159,8 @@
     public void testSyncPasswordsDisabled() {
         when(mSyncServiceMock.isSyncFeatureEnabled()).thenReturn(true);
         when(mSyncServiceMock.getChosenDataTypes()).thenReturn(Collections.EMPTY_SET);
-        assertFalse(PasswordManagerHelper.hasChosenToSyncPasswords(mSyncServiceMock));
-        assertFalse(PasswordManagerHelper.hasChosenToSyncPasswordsWithNoCustomPassphrase(
+        Assert.assertFalse(PasswordManagerHelper.hasChosenToSyncPasswords(mSyncServiceMock));
+        Assert.assertFalse(PasswordManagerHelper.hasChosenToSyncPasswordsWithNoCustomPassphrase(
                 mSyncServiceMock));
     }
 
@@ -177,7 +169,7 @@
         when(mSyncServiceMock.isSyncFeatureEnabled()).thenReturn(true);
         when(mSyncServiceMock.getChosenDataTypes())
                 .thenReturn(CollectionUtil.newHashSet(ModelType.PASSWORDS));
-        assertTrue(PasswordManagerHelper.hasChosenToSyncPasswords(mSyncServiceMock));
+        Assert.assertTrue(PasswordManagerHelper.hasChosenToSyncPasswords(mSyncServiceMock));
     }
 
     @Test
@@ -187,8 +179,8 @@
                 .thenReturn(CollectionUtil.newHashSet(ModelType.PASSWORDS));
         when(mSyncServiceMock.isEngineInitialized()).thenReturn(true);
         when(mSyncServiceMock.isUsingExplicitPassphrase()).thenReturn(true);
-        assertTrue(PasswordManagerHelper.hasChosenToSyncPasswords(mSyncServiceMock));
-        assertFalse(PasswordManagerHelper.hasChosenToSyncPasswordsWithNoCustomPassphrase(
+        Assert.assertTrue(PasswordManagerHelper.hasChosenToSyncPasswords(mSyncServiceMock));
+        Assert.assertFalse(PasswordManagerHelper.hasChosenToSyncPasswordsWithNoCustomPassphrase(
                 mSyncServiceMock));
     }
 
@@ -199,7 +191,7 @@
                 .thenReturn(CollectionUtil.newHashSet(ModelType.PASSWORDS));
         when(mSyncServiceMock.isEngineInitialized()).thenReturn(true);
         when(mSyncServiceMock.isUsingExplicitPassphrase()).thenReturn(false);
-        assertTrue(
+        Assert.assertTrue(
                 PasswordManagerHelper.isSyncingPasswordsWithNoCustomPassphrase(mSyncServiceMock));
     }
 
@@ -210,72 +202,12 @@
                 .thenReturn(CollectionUtil.newHashSet(ModelType.PASSWORDS));
         when(mSyncServiceMock.isEngineInitialized()).thenReturn(true);
         when(mSyncServiceMock.isUsingExplicitPassphrase()).thenReturn(true);
-        assertFalse(
+        Assert.assertFalse(
                 PasswordManagerHelper.isSyncingPasswordsWithNoCustomPassphrase(mSyncServiceMock));
     }
 
     @Test
     @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID)
-    public void testCanUseUpmCheckup() {
-        SyncService.overrideForTests(mSyncServiceMock);
-        when(mSyncServiceMock.getChosenDataTypes())
-                .thenReturn(CollectionUtil.newHashSet(ModelType.PASSWORDS));
-        when(mSyncServiceMock.isSyncFeatureEnabled()).thenReturn(true);
-        when(mSyncServiceMock.isEngineInitialized()).thenReturn(true);
-        when(mSyncServiceMock.hasSyncConsent()).thenReturn(true);
-
-        assertTrue(PasswordManagerHelper.canUseUpmCheckup());
-        SyncService.resetForTests();
-    }
-
-    @Test
-    @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID)
-    public void testCanNotUseUpmCheckupWithoutPasswordType() {
-        SyncService.overrideForTests(mSyncServiceMock);
-        when(mSyncServiceMock.isSyncFeatureEnabled()).thenReturn(true);
-        when(mSyncServiceMock.isEngineInitialized()).thenReturn(true);
-        when(mSyncServiceMock.hasSyncConsent()).thenReturn(true);
-
-        assertFalse(PasswordManagerHelper.canUseUpmCheckup());
-        SyncService.resetForTests();
-    }
-
-    @Test
-    @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID)
-    public void testCanNotUseUpmCheckupWithoutSyncService() {
-        SyncService.overrideForTests(mSyncServiceMock);
-        when(mSyncServiceMock.isEngineInitialized()).thenReturn(false);
-        when(mSyncServiceMock.hasSyncConsent()).thenReturn(true);
-
-        assertFalse(PasswordManagerHelper.canUseUpmCheckup());
-        SyncService.resetForTests();
-    }
-
-    @Test
-    @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID)
-    public void testCanNotUseUpmCheckupWithoutSyncConsent() {
-        SyncService.overrideForTests(mSyncServiceMock);
-        when(mSyncServiceMock.isEngineInitialized()).thenReturn(true);
-        when(mSyncServiceMock.hasSyncConsent()).thenReturn(false);
-
-        assertFalse(PasswordManagerHelper.canUseUpmCheckup());
-        SyncService.resetForTests();
-    }
-
-    @Test
-    @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID)
-    public void testCanNotUseUpmCheckupWithAuthError() {
-        SyncService.overrideForTests(mSyncServiceMock);
-        when(mSyncServiceMock.isEngineInitialized()).thenReturn(true);
-        when(mSyncServiceMock.hasSyncConsent()).thenReturn(true);
-        when(mSyncServiceMock.getAuthError()).thenReturn(State.INVALID_GAIA_CREDENTIALS);
-
-        assertFalse(PasswordManagerHelper.canUseUpmCheckup());
-        SyncService.resetForTests();
-    }
-
-    @Test
-    @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID)
     public void testLaunchesCredentialManagerSync() {
         chooseToSyncPasswordsWithoutCustomPassphrase();
 
@@ -290,22 +222,6 @@
 
     @Test
     @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID)
-    public void testShowPasswordSettingsNoSyncLaunchesOldUI() {
-        when(mSyncServiceMock.isSyncFeatureEnabled()).thenReturn(false);
-        Context mockContext = mock(Context.class);
-
-        PasswordManagerHelper.showPasswordSettings(mockContext,
-                ManagePasswordsReferrer.CHROME_SETTINGS, mSettingsLauncherMock,
-                mCredentialManagerLauncherMock, mSyncServiceMock, mModalDialogManagerSupplier);
-
-        verify(mockContext).startActivity(any());
-        verify(mSettingsLauncherMock)
-                .createSettingsActivityIntent(
-                        eq(mockContext), eq(PasswordSettings.class.getName()), any(Bundle.class));
-    }
-
-    @Test
-    @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID)
     public void testRecordsSuccessMetricsForAccountIntent() {
         chooseToSyncPasswordsWithoutCustomPassphrase();
         setUpSuccessfulIntentFetchingForAccount();
@@ -313,16 +229,16 @@
         PasswordManagerHelper.showPasswordSettings(ContextUtils.getApplicationContext(),
                 ManagePasswordsReferrer.CHROME_SETTINGS, mSettingsLauncherMock,
                 mCredentialManagerLauncherMock, mSyncServiceMock, mModalDialogManagerSupplier);
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         ACCOUNT_GET_INTENT_LATENCY_HISTOGRAM, 0));
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         ACCOUNT_GET_INTENT_SUCCESS_HISTOGRAM, 1));
-        assertEquals(0,
+        Assert.assertEquals(0,
                 RecordHistogram.getHistogramTotalCountForTesting(
                         ACCOUNT_GET_INTENT_ERROR_HISTOGRAM));
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         ACCOUNT_LAUNCH_CREDENTIAL_MANAGER_SUCCESS_HISTOGRAM, 1));
     }
@@ -337,16 +253,16 @@
                 ManagePasswordsReferrer.CHROME_SETTINGS, mSettingsLauncherMock,
                 mCredentialManagerLauncherMock, mSyncServiceMock, mModalDialogManagerSupplier);
 
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         ACCOUNT_GET_INTENT_ERROR_HISTOGRAM, CredentialManagerError.API_ERROR));
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         ACCOUNT_GET_INTENT_SUCCESS_HISTOGRAM, 0));
-        assertEquals(0,
+        Assert.assertEquals(0,
                 RecordHistogram.getHistogramTotalCountForTesting(
                         ACCOUNT_GET_INTENT_LATENCY_HISTOGRAM));
-        assertEquals(0,
+        Assert.assertEquals(0,
                 RecordHistogram.getHistogramTotalCountForTesting(
                         ACCOUNT_LAUNCH_CREDENTIAL_MANAGER_SUCCESS_HISTOGRAM));
     }
@@ -362,38 +278,21 @@
                 ManagePasswordsReferrer.CHROME_SETTINGS, mSettingsLauncherMock,
                 mCredentialManagerLauncherMock, mSyncServiceMock, mModalDialogManagerSupplier);
 
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         ACCOUNT_GET_INTENT_LATENCY_HISTOGRAM, 0));
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         ACCOUNT_GET_INTENT_SUCCESS_HISTOGRAM, 1));
-        assertEquals(0,
+        Assert.assertEquals(0,
                 RecordHistogram.getHistogramTotalCountForTesting(
                         ACCOUNT_GET_INTENT_ERROR_HISTOGRAM));
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         ACCOUNT_LAUNCH_CREDENTIAL_MANAGER_SUCCESS_HISTOGRAM, 0));
     }
 
     @Test
-    @DisableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID)
-    public void testNoSyncShowPasswordCheckupImmediatelyReturns() {
-        SyncService.overrideForTests(mSyncServiceMock);
-        when(mSyncServiceMock.isSyncFeatureEnabled()).thenReturn(false);
-        when(mSyncServiceMock.hasSyncConsent()).thenReturn(false);
-        setUpSuccessfulIntentFetchingForAccount();
-
-        PasswordManagerHelper.showPasswordCheckup(ContextUtils.getApplicationContext(),
-                PasswordCheckReferrer.SAFETY_CHECK, mPasswordCheckupClientHelperMock,
-                mSyncServiceMock, mModalDialogManagerSupplier);
-
-        verify(mCredentialManagerLauncherMock, times(0))
-                .getCredentialManagerIntentForAccount(eq(ManagePasswordsReferrer.CHROME_SETTINGS),
-                        eq(TEST_EMAIL_ADDRESS), any(Callback.class), any(Callback.class));
-    }
-
-    @Test
     @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID)
     public void testLaunchesPasswordCheckupSync() {
         chooseToSyncPasswordsWithoutCustomPassphrase();
@@ -443,7 +342,7 @@
                 mSyncServiceMock, mModalDialogManagerSupplier);
         checkPasswordCheckupSuccessHistogramsForOperation(
                 PasswordCheckOperation.GET_PASSWORD_CHECKUP_INTENT);
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         PASSWORD_CHECKUP_LAUNCH_CREDENTIAL_MANAGER_SUCCESS_HISTOGRAM, 1));
     }
@@ -462,7 +361,7 @@
         checkPasswordCheckupFailureHistogramsForOperation(
                 PasswordCheckOperation.GET_PASSWORD_CHECKUP_INTENT,
                 CredentialManagerError.UNCATEGORIZED, OptionalInt.empty());
-        assertEquals(0,
+        Assert.assertEquals(0,
                 RecordHistogram.getHistogramTotalCountForTesting(
                         PASSWORD_CHECKUP_LAUNCH_CREDENTIAL_MANAGER_SUCCESS_HISTOGRAM));
     }
@@ -482,7 +381,7 @@
                 CredentialManagerError.API_ERROR,
                 OptionalInt.of(CommonStatusCodes.DEVELOPER_ERROR));
 
-        assertEquals(0,
+        Assert.assertEquals(0,
                 RecordHistogram.getHistogramTotalCountForTesting(
                         PASSWORD_CHECKUP_LAUNCH_CREDENTIAL_MANAGER_SUCCESS_HISTOGRAM));
     }
@@ -586,7 +485,7 @@
                 mSyncServiceMock, mModalDialogManagerSupplier);
         checkPasswordCheckupSuccessHistogramsForOperation(
                 PasswordCheckOperation.GET_PASSWORD_CHECKUP_INTENT);
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         PASSWORD_CHECKUP_LAUNCH_CREDENTIAL_MANAGER_SUCCESS_HISTOGRAM, 0));
     }
@@ -807,7 +706,7 @@
 
         verify(mLoadingModalDialogCoordinator).dismiss();
 
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_CREDENTIAL_MANAGER_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.NOT_SHOWN_LOADED));
@@ -826,7 +725,7 @@
         PasswordManagerHelper.launchTheCredentialManager(ManagePasswordsReferrer.CHROME_SETTINGS,
                 mCredentialManagerLauncherMock, mSyncServiceMock, mLoadingModalDialogCoordinator);
 
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_CREDENTIAL_MANAGER_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.SHOWN_LOADED));
@@ -848,12 +747,12 @@
         PasswordManagerHelper.launchTheCredentialManager(ManagePasswordsReferrer.CHROME_SETTINGS,
                 mCredentialManagerLauncherMock, mSyncServiceMock, mLoadingModalDialogCoordinator);
 
-        assertEquals(0,
+        Assert.assertEquals(0,
                 RecordHistogram.getHistogramTotalCountForTesting(
                         LOADING_DIALOG_CREDENTIAL_MANAGER_HISTOGRAM));
 
         mLoadingDialogCoordinatorObserver.onDismissable();
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_CREDENTIAL_MANAGER_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.SHOWN_LOADED));
@@ -874,7 +773,7 @@
         PasswordManagerHelper.launchTheCredentialManager(ManagePasswordsReferrer.CHROME_SETTINGS,
                 mCredentialManagerLauncherMock, mSyncServiceMock, mLoadingModalDialogCoordinator);
 
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_CREDENTIAL_MANAGER_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.SHOWN_CANCELLED));
@@ -892,7 +791,7 @@
         PasswordManagerHelper.launchTheCredentialManager(ManagePasswordsReferrer.CHROME_SETTINGS,
                 mCredentialManagerLauncherMock, mSyncServiceMock, mLoadingModalDialogCoordinator);
 
-        assertEquals(0,
+        Assert.assertEquals(0,
                 RecordHistogram.getHistogramTotalCountForTesting(
                         LOADING_DIALOG_CREDENTIAL_MANAGER_HISTOGRAM));
 
@@ -900,7 +799,7 @@
                 .thenReturn(LoadingModalDialogCoordinator.State.CANCELLED);
         mLoadingDialogCoordinatorObserver.onDismissedWithState(
                 LoadingModalDialogCoordinator.State.CANCELLED);
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_CREDENTIAL_MANAGER_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.SHOWN_CANCELLED));
@@ -917,7 +816,7 @@
         PasswordManagerHelper.launchTheCredentialManager(ManagePasswordsReferrer.CHROME_SETTINGS,
                 mCredentialManagerLauncherMock, mSyncServiceMock, mLoadingModalDialogCoordinator);
 
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_CREDENTIAL_MANAGER_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.SHOWN_TIMED_OUT));
@@ -935,7 +834,7 @@
         PasswordManagerHelper.launchTheCredentialManager(ManagePasswordsReferrer.CHROME_SETTINGS,
                 mCredentialManagerLauncherMock, mSyncServiceMock, mLoadingModalDialogCoordinator);
 
-        assertEquals(0,
+        Assert.assertEquals(0,
                 RecordHistogram.getHistogramTotalCountForTesting(
                         LOADING_DIALOG_CREDENTIAL_MANAGER_HISTOGRAM));
 
@@ -943,7 +842,7 @@
                 .thenReturn(LoadingModalDialogCoordinator.State.TIMED_OUT);
         mLoadingDialogCoordinatorObserver.onDismissedWithState(
                 LoadingModalDialogCoordinator.State.TIMED_OUT);
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_CREDENTIAL_MANAGER_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.SHOWN_TIMED_OUT));
@@ -963,7 +862,7 @@
 
         verify(mLoadingModalDialogCoordinator).dismiss();
 
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_CREDENTIAL_MANAGER_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.NOT_SHOWN_LOADED));
@@ -984,7 +883,7 @@
 
         verify(mLoadingModalDialogCoordinator).dismiss();
 
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_CREDENTIAL_MANAGER_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.NOT_SHOWN_LOADED));
@@ -1004,7 +903,7 @@
 
         verify(mLoadingModalDialogCoordinator).dismiss();
 
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_PASSWORD_CHECKUP_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.NOT_SHOWN_LOADED));
@@ -1026,7 +925,7 @@
         ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
         verify(mLoadingModalDialogCoordinator).dismiss();
 
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_PASSWORD_CHECKUP_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.SHOWN_LOADED));
@@ -1046,12 +945,12 @@
                 mPasswordCheckupClientHelperMock, Optional.of(TEST_EMAIL_ADDRESS),
                 mLoadingModalDialogCoordinator);
 
-        assertEquals(0,
+        Assert.assertEquals(0,
                 RecordHistogram.getHistogramTotalCountForTesting(
                         LOADING_DIALOG_PASSWORD_CHECKUP_HISTOGRAM));
 
         mLoadingDialogCoordinatorObserver.onDismissable();
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_PASSWORD_CHECKUP_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.SHOWN_LOADED));
@@ -1072,7 +971,7 @@
                 mPasswordCheckupClientHelperMock, Optional.of(TEST_EMAIL_ADDRESS),
                 mLoadingModalDialogCoordinator);
 
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_PASSWORD_CHECKUP_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.SHOWN_CANCELLED));
@@ -1091,7 +990,7 @@
                 mPasswordCheckupClientHelperMock, Optional.of(TEST_EMAIL_ADDRESS),
                 mLoadingModalDialogCoordinator);
 
-        assertEquals(0,
+        Assert.assertEquals(0,
                 RecordHistogram.getHistogramTotalCountForTesting(
                         LOADING_DIALOG_PASSWORD_CHECKUP_HISTOGRAM));
 
@@ -1099,7 +998,7 @@
                 .thenReturn(LoadingModalDialogCoordinator.State.CANCELLED);
         mLoadingDialogCoordinatorObserver.onDismissedWithState(
                 LoadingModalDialogCoordinator.State.CANCELLED);
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_PASSWORD_CHECKUP_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.SHOWN_CANCELLED));
@@ -1117,7 +1016,7 @@
                 mPasswordCheckupClientHelperMock, Optional.of(TEST_EMAIL_ADDRESS),
                 mLoadingModalDialogCoordinator);
 
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_PASSWORD_CHECKUP_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.SHOWN_TIMED_OUT));
@@ -1136,7 +1035,7 @@
                 mPasswordCheckupClientHelperMock, Optional.of(TEST_EMAIL_ADDRESS),
                 mLoadingModalDialogCoordinator);
 
-        assertEquals(0,
+        Assert.assertEquals(0,
                 RecordHistogram.getHistogramTotalCountForTesting(
                         LOADING_DIALOG_PASSWORD_CHECKUP_HISTOGRAM));
 
@@ -1144,7 +1043,7 @@
                 .thenReturn(LoadingModalDialogCoordinator.State.TIMED_OUT);
         mLoadingDialogCoordinatorObserver.onDismissedWithState(
                 LoadingModalDialogCoordinator.State.TIMED_OUT);
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_PASSWORD_CHECKUP_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.SHOWN_TIMED_OUT));
@@ -1166,7 +1065,7 @@
 
         verify(mLoadingModalDialogCoordinator).dismiss();
 
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_PASSWORD_CHECKUP_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.NOT_SHOWN_LOADED));
@@ -1187,7 +1086,7 @@
 
         verify(mLoadingModalDialogCoordinator).dismiss();
 
-        assertEquals(1,
+        Assert.assertEquals(1,
                 RecordHistogram.getHistogramValueCountForTesting(
                         LOADING_DIALOG_PASSWORD_CHECKUP_HISTOGRAM,
                         PasswordManagerHelper.LoadingDialogOutcome.NOT_SHOWN_LOADED));
@@ -1317,18 +1216,18 @@
             @PasswordCheckOperation int operation) {
         final String nameWithSuffix = PASSWORD_CHECKUP_HISTOGRAM_BASE + "."
                 + getPasswordCheckupHistogramSuffixForOperation(operation);
-        assertEquals(1,
+        Assert.assertEquals(1,
                 ShadowRecordHistogram.getHistogramValueCountForTesting(
                         nameWithSuffix + ".Success", 1));
-        assertEquals(1,
+        Assert.assertEquals(1,
                 ShadowRecordHistogram.getHistogramValueCountForTesting(
                         nameWithSuffix + ".Latency", 0));
-        assertEquals(0,
+        Assert.assertEquals(0,
                 ShadowRecordHistogram.getHistogramTotalCountForTesting(
                         nameWithSuffix + ".ErrorLatency"));
-        assertEquals(0,
+        Assert.assertEquals(0,
                 ShadowRecordHistogram.getHistogramTotalCountForTesting(nameWithSuffix + ".Error"));
-        assertEquals(0,
+        Assert.assertEquals(0,
                 ShadowRecordHistogram.getHistogramTotalCountForTesting(
                         nameWithSuffix + ".ApiError"));
     }
@@ -1337,24 +1236,24 @@
             @PasswordCheckOperation int operation, int errorCode, OptionalInt apiErrorCode) {
         final String nameWithSuffix = PASSWORD_CHECKUP_HISTOGRAM_BASE + "."
                 + getPasswordCheckupHistogramSuffixForOperation(operation);
-        assertEquals(1,
+        Assert.assertEquals(1,
                 ShadowRecordHistogram.getHistogramValueCountForTesting(
                         nameWithSuffix + ".Success", 0));
-        assertEquals(0,
+        Assert.assertEquals(0,
                 ShadowRecordHistogram.getHistogramTotalCountForTesting(
                         nameWithSuffix + ".Latency"));
-        assertEquals(1,
+        Assert.assertEquals(1,
                 ShadowRecordHistogram.getHistogramValueCountForTesting(
                         nameWithSuffix + ".ErrorLatency", 0));
-        assertEquals(1,
+        Assert.assertEquals(1,
                 ShadowRecordHistogram.getHistogramValueCountForTesting(
                         nameWithSuffix + ".Error", errorCode));
         apiErrorCode.ifPresentOrElse(apiError
-                -> assertEquals(1,
+                -> Assert.assertEquals(1,
                         ShadowRecordHistogram.getHistogramValueCountForTesting(
                                 nameWithSuffix + ".APIError", apiError)),
                 ()
-                        -> assertEquals(0,
+                        -> Assert.assertEquals(0,
                                 ShadowRecordHistogram.getHistogramTotalCountForTesting(
                                         nameWithSuffix + ".APIError")));
     }
diff --git a/chrome/browser/profiles/profile_keyed_service_browsertest.cc b/chrome/browser/profiles/profile_keyed_service_browsertest.cc
new file mode 100644
index 0000000..4032c802
--- /dev/null
+++ b/chrome/browser/profiles/profile_keyed_service_browsertest.cc
@@ -0,0 +1,430 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <sstream>
+
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/profile_waiter.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/keyed_service/core/dependency_graph.h"
+#include "components/keyed_service/core/keyed_service_base_factory.h"
+#include "content/public/test/browser_test.h"
+
+// Ash doesn't support System Profile.
+#if !BUILDFLAG(IS_CHROMEOS_ASH)
+namespace {
+
+// Constructs the Original System Profile for testing.
+Profile* GetSystemOriginalProfile() {
+  ProfileManager* profile_manager = g_browser_process->profile_manager();
+  ProfileWaiter profile_waiter;
+  profile_manager->CreateProfileAsync(ProfileManager::GetSystemProfilePath(),
+                                      {});
+  Profile* system_profile = profile_waiter.WaitForProfileAdded();
+  content::RunAllTasksUntilIdle();
+  return system_profile;
+}
+
+// Gets all the KeyedServices from the DependencyGraph.
+std::vector<KeyedServiceBaseFactory*> GetKeyedServiceBaseFactories() {
+  BrowserContextDependencyManager* dependency_manager =
+      BrowserContextDependencyManager::GetInstance();
+  DependencyGraph& dependency_graph =
+      dependency_manager->GetDependencyGraphForTesting();
+  std::vector<DependencyNode*> nodes;
+  bool success = dependency_graph.GetConstructionOrder(&nodes);
+  DCHECK(success);
+
+  std::vector<KeyedServiceBaseFactory*> keyedServiceFactories;
+  keyedServiceFactories.reserve(nodes.size());
+  std::transform(nodes.begin(), nodes.end(),
+                 std::back_inserter(keyedServiceFactories),
+                 [](DependencyNode* node) {
+                   return static_cast<KeyedServiceBaseFactory*>(node);
+                 });
+  return keyedServiceFactories;
+}
+
+std::string GetDifferenceString(const std::set<std::string>& set1,
+                                const std::set<std::string>& set2) {
+  std::vector<std::string> differences;
+  std::set_difference(set1.begin(), set1.end(), set2.begin(), set2.end(),
+                      std::back_inserter(differences));
+
+  return differences.empty() ? "None" : base::JoinString(differences, ", ");
+}
+
+// Helper function to properly display differences between expected and reached
+// service names.
+std::string DisplaySetDifference(
+    const std::set<std::string>& expected_active_services_names,
+    const std::set<std::string>& active_services_names) {
+  std::stringstream error;
+  error << "Differences between expected and reached services:" << std::endl;
+
+  error << "-- Missing Expected Services:" << std::endl;
+  error << GetDifferenceString(expected_active_services_names,
+                               active_services_names)
+        << std::endl;
+
+  error << "-- Added Extra Services:" << std::endl;
+  error << GetDifferenceString(active_services_names,
+                               expected_active_services_names)
+        << std::endl;
+
+  return error.str();
+}
+
+// The test comparing expected vs reached keyed services for the given profile.
+void TestKeyedProfileServicesActives(
+    Profile* profile,
+    const std::set<std::string>& expected_active_services_names) {
+  static const std::vector<KeyedServiceBaseFactory*> keyedServiceFactories =
+      GetKeyedServiceBaseFactories();
+
+  std::set<std::string> active_services_names;
+  for (KeyedServiceBaseFactory* factory : keyedServiceFactories) {
+    if (factory->IsServiceCreated(profile)) {
+      active_services_names.emplace(factory->name());
+    }
+  }
+
+  EXPECT_EQ(active_services_names, expected_active_services_names)
+      << DisplaySetDifference(active_services_names,
+                              expected_active_services_names);
+}
+
+}  // namespace
+
+// If you are adding a new keyed service and this test fails:
+// - determine if your service is intended to be created for the System profile
+// - if yes, add it to the list of allowed services
+// - if not, update your factory class so that the service is not created for
+// the system profile.
+//
+// Note: if your service should not be used on the system profile, but still has
+// to, because other services depend on it, add a comment explaining why.
+// Example:
+//   // FooService is required because BarService depends on it.
+//   // TODO(crbug.com/12345): Stop creating BarService for the system profile.
+class ProfileKeyedServiceBrowserTest : public InProcessBrowserTest {};
+
+IN_PROC_BROWSER_TEST_F(ProfileKeyedServiceBrowserTest,
+                       SystemProfileOTR_NeededServices) {
+  // clang-format off
+  std::set<std::string> system_otr_active_services {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+    "CleanupManagerLacros",
+    "DownloadCoreService",
+    "PolicyCertService",
+#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
+    "AlarmManager",
+    "BackgroundContentsService",
+    "BackgroundSyncService",
+    "BluetoothApiSocketManager",
+    "BluetoothSocketEventDispatcher",
+    "BrowsingDataLifetimeManager",
+    "CookieSettings",
+    "ExtensionSystem",
+    "ExtensionURLLoaderFactory::BrowserContextShutdownNotifierFactory",
+    "FeedbackPrivateAPI",
+    "FileSystemAccessPermissionContext",
+    "GeneratedPrefs",
+    "HeavyAdService",
+    "HidDeviceManager",
+    "HostContentSettingsMap",
+    "LastTabStandingTrackerKeyedService",
+    "MediaRouterUIService",
+    "NotificationDisplayService",
+    "OptimizationGuideKeyedService",
+    "PlatformNotificationService",
+    "PrefWatcher",
+    "PrivacySandboxSettings",
+    "ProcessManager",
+    "ProfileNetworkContextService",
+    "RendererUpdater",
+    "ResumableTCPServerSocketManager",
+    "ResumableTCPSocketManager",
+    "ResumableUDPSocketManager",
+    "RulesRegistryService",
+    "SerialConnectionManager",
+    "SettingsPrivateEventRouter",
+    "SiteDataCacheFacadeFactory",
+    "SiteEngagementService",
+    "SocketManager",
+    "StorageNotificationService",
+    "TCPServerSocketEventDispatcher",
+    "TCPSocketEventDispatcher",
+    "TabGroupsEventRouter",
+    "ToolbarActionsModel",
+    "UDPSocketEventDispatcher",
+    "UkmBackgroundRecorderService",
+    "UsbDeviceManager",
+    "UsbDeviceResourceManager",
+    "sct_reporting::Factory"
+  };
+  // clang-format on
+
+  Profile* system_profile = GetSystemOriginalProfile();
+  ASSERT_TRUE(system_profile->HasAnyOffTheRecordProfile());
+  std::vector<Profile*> otr_profiles =
+      system_profile->GetAllOffTheRecordProfiles();
+  ASSERT_EQ(otr_profiles.size(), 1u);
+
+  Profile* system_profile_otr = otr_profiles[0];
+  ASSERT_TRUE(system_profile_otr->IsOffTheRecord());
+  TestKeyedProfileServicesActives(system_profile_otr,
+                                  system_otr_active_services);
+}
+
+IN_PROC_BROWSER_TEST_F(ProfileKeyedServiceBrowserTest,
+                       SystemProfileParent_NeededServices) {
+  // clang-format off
+  std::set<std::string> system_active_services {
+#if BUILDFLAG(IS_WIN)
+    "ConnectorsService",
+#endif // !BUILDFLAG(IS_WIN)
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+    "ChildAccountService",
+    "CleanupManagerLacros",
+    "ClipboardAPI",
+    "DlpRulesManager",
+    "DownloadCoreService",
+    "ExternalLogoutRequestEventHandler",
+    "LacrosFirstRunServiceFactory",
+    "ManualTestHeartbeatEvent",
+    "PolicyCertService",
+    "RemoteAppsProxyLacros",
+    "SessionStateChangedEventDispatcher",
+    "SupervisedUserMetricsServiceFactory",
+    "SupervisedUserService",
+    "UserNetworkConfigurationUpdater",
+    "VpnService",
+#else // !BUILDFLAG(IS_CHROMEOS_LACROS)
+    "DownloadCoreService",
+    "HatsService",
+    "SystemIndicatorManager",
+#endif
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN)
+    "SpellcheckService",
+#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN)
+    "AboutSigninInternals",
+    "AboutThisSiteServiceFactory",
+    "AccessCodeSinkService",
+    "AccessContextAuditService",
+    "AccessibilityLabelsService",
+    "AccountConsistencyModeManager",
+    "AccountInvestigator",
+    "AccountPasswordStore",
+    "AccountReconcilor",
+    "ActivityLog",
+    "ActivityLogPrivateAPI",
+    "AdaptiveQuietNotificationPermissionUiEnabler",
+    "AdvancedProtectionStatusManager",
+    "AffiliationService",
+    "AlarmManager",
+    "AnnouncementNotificationService",
+    "AppLifetimeMonitor",
+    "AppLoadService",
+    "AppRestoreService",
+    "AppShortcutManager",
+    "AppTerminationObserver",
+    "AppWindowRegistry",
+    "AudioAPI",
+    "AutofillImageFetcher",
+    "AutofillPrivateEventRouter",
+    "AutofillStrikeDatabase",
+    "BackgroundContentsService",
+    "BackgroundFetchService",
+    "BackgroundSyncService",
+    "Blocklist",
+    "BluetoothAPI",
+    "BluetoothApiSocketManager",
+    "BluetoothLowEnergyAPI",
+    "BluetoothPrivateAPI",
+    "BluetoothSocketEventDispatcher",
+    "BookmarkManagerPrivateAPI",
+    "BookmarkModel",
+    "BookmarkSyncServiceFactory",
+    "BookmarkUndoService",
+    "BookmarksAPI",
+    "BookmarksApiWatcher",
+    "BrailleDisplayPrivateAPI",
+    "BreadcrumbManagerService",
+    "BrowsingDataHistoryObserverService",
+    "BrowsingDataLifetimeManager",
+    "BrowsingDataRemover",
+    "BrowsingTopicsService",
+    "ChromeSigninClient",
+    "CloudProfileReporting",
+    "CommandService",
+    "ConsentAuditor",
+    "ContentIndexProvider",
+    "ContentSettingsService",
+    "CookieSettings",
+    "CookiesAPI",
+    "CredentialsCleanerRunner",
+    "DeveloperPrivateAPI",
+    "DeviceInfoSyncService",
+    "DomainDiversityReporter",
+    "EventRouter",
+    "ExitTypeServiceFactory",
+    "ExtensionActionAPI",
+    "ExtensionActionManager",
+    "ExtensionCommandsGlobalRegistry",
+    "ExtensionGCMAppHandler",
+    "ExtensionGarbageCollector",
+    "ExtensionHostRegistry",
+    "ExtensionManagement",
+    "ExtensionPrefValueMap",
+    "ExtensionPrefs",
+    "ExtensionRegistry",
+    "ExtensionSyncService",
+    "ExtensionSystem",
+    "ExtensionSystemShared",
+    "ExtensionTelemetryService",
+    "ExtensionURLLoaderFactory::BrowserContextShutdownNotifierFactory",
+    "ExtensionWebUIOverrideRegistrar",
+    "FaviconService",
+    "FeedbackPrivateAPI",
+    "FileSystemAccessPermissionContext",
+    "FontPrefChangeNotifier",
+    "FontSettingsAPI",
+    "GAIAInfoUpdateService",
+    "GCMProfileService",
+    "GeneratedPrefs",
+    "HeavyAdService",
+    "HidDeviceManager",
+    "HistoryAPI",
+    "HistoryService",
+    "HostContentSettingsMap",
+    "HttpEngagementKeyService",
+    "IdentityAPI",
+    "IdentityManager",
+    "IdleManager",
+    "InstallStageTracker",
+    "InstallTracker",
+    "InstallVerifier",
+    "InstanceIDProfileService",
+    "InvalidationService",
+    "LanguageSettingsPrivateDelegate",
+    "LastTabStandingTrackerKeyedService",
+    "LazyBackgroundTaskQueue",
+    "LiveCaptionController",
+    "LoginUIServiceFactory",
+    "MDnsAPI",
+    "ManagedBookmarkService",
+    "ManagedConfigurationAPI",
+    "ManagementAPI",
+    "MediaRouter",
+    "MediaRouterUIService",
+    "MenuManager",
+    "ModelTypeStoreService",
+    "NavigationPredictorKeyedService",
+    "NetworkingPrivateEventRouter",
+    "NotificationDisplayService",
+    "NotifierStateTracker",
+    "OmniboxAPI",
+    "OptimizationGuideKeyedService",
+    "PageContentAnnotationsService",
+    "PasswordStore",
+    "PasswordsPrivateEventRouter",
+    "PermissionAuditingService",
+    "PermissionHelper",
+    "PermissionsUpdaterShutdownFactory",
+    "PersonalDataManager",
+    "PinnedTabService",
+    "PlatformNotificationService",
+    "PluginManager",
+    "PluginPrefs",
+    "PrefMetricsService",
+    "PrefWatcher",
+    "PreferenceAPI",
+    "PrimaryAccountPolicyManager",
+    "PrivacyMetricsService",
+    "PrivacySandboxService",
+    "PrivacySandboxSettings",
+    "ProcessManager",
+    "ProcessMap",
+    "ProcessesAPI",
+    "ProfileNetworkContextService",
+    "ProfileThemeUpdateServiceFactory",
+    "ProtocolHandlerRegistry",
+    "ReadingListModel",
+    "RendererStartupHelper",
+    "RendererUpdater",
+    "ResumableTCPServerSocketManager",
+    "ResumableTCPSocketManager",
+    "ResumableUDPSocketManager",
+    "RulesMonitorService",
+    "RulesRegistryService",
+    "RuntimeAPI",
+    "SafeBrowsingMetricsCollector",
+    "SafeBrowsingNetworkContextService",
+    "SafeBrowsingPrivateEventRouter",
+    "SafeBrowsingTailoredSecurityService",
+    "SecurityEventRecorder",
+    "SendTabToSelfClientService",
+    "SendTabToSelfSyncService",
+    "SerialConnectionManager",
+    "SessionDataService",
+    "SessionService",
+    "SessionSyncService",
+    "SessionsAPI",
+    "SettingsOverridesAPI",
+    "SettingsPrivateEventRouter",
+    "SharingMessageBridge",
+    "SharingService",
+    "ShoppingService",
+    "SigninErrorController",
+    "SigninManager",
+    "SigninProfileAttributesUpdater",
+    "SiteDataCacheFacadeFactory",
+    "SiteEngagementService",
+    "SocketManager",
+    "StorageFrontend",
+    "StorageNotificationService",
+    "SyncInvalidationsService",
+    "SyncService",
+    "SyncSessionsWebContentsRouter",
+    "SystemInfoAPI",
+    "TCPServerSocketEventDispatcher",
+    "TCPSocketEventDispatcher",
+    "TabGroupsEventRouter",
+    "TabsWindowsAPI",
+    "TemplateURLServiceFactory",
+    "ThemeService",
+    "ToolbarActionsModel",
+    "TranslateRanker",
+    "TriggeredProfileResetter",
+    "TrustSafetySentimentService",
+    "TtsAPI",
+    "UDPSocketEventDispatcher",
+    "UkmBackgroundRecorderService",
+    "UnifiedConsentService",
+    "UsbDeviceManager",
+    "UsbDeviceResourceManager",
+    "UserCloudPolicyInvalidator",
+    "UserEventService",
+    "UserPolicySigninService",
+    "WarningBadgeService",
+    "WarningService",
+    "WebAuthenticationProxyAPI",
+    "WebDataService",
+    "WebNavigationAPI",
+    "WebRequestAPI",
+    "WebRtcEventLogManagerKeyedService",
+    "WebrtcAudioPrivateEventService",
+    "feedback::FeedbackUploaderChrome",
+    "sct_reporting::Factory"
+  };
+  // clang-format on
+
+  Profile* system_profile = GetSystemOriginalProfile();
+  ASSERT_FALSE(system_profile->IsOffTheRecord());
+  TestKeyedProfileServicesActives(system_profile, system_active_services);
+}
+#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_apps_list.html b/chrome/browser/resources/chromeos/login/components/oobe_apps_list.html
index 48cd654..bbc8b94 100644
--- a/chrome/browser/resources/chromeos/login/components/oobe_apps_list.html
+++ b/chrome/browser/resources/chromeos/login/components/oobe_apps_list.html
@@ -10,6 +10,8 @@
 <link rel="import" href="chrome://resources/cr_elements/cr_scrollable_behavior.html">
 <link rel="import" href="chrome://resources/cr_elements/icons.html">
 
+<link rel="import" href="./behaviors/oobe_i18n_behavior.html">
+
 <!--
   OOBE polymer element which is used to show a list of recommended apps.
 -->
@@ -50,10 +52,12 @@
       }
 
       #appsListContainer .app-item:not(:first-child) {
-        border-top: 1px solid var(--cros-color-primary);
+        border-top: 1px solid var(--cros-color-primary-dark);
       }
 
       cr-checkbox {
+        --cr-checkbox-checked-box-background-color: none;
+        --cr-checkbox-mark-color: var(--cr-checked-color);
         --cr-checkbox-size: var(--checkbox-size);
       }
 
@@ -123,7 +127,7 @@
       }
 
       .app-tags ul>li::before {
-        content: '|';
+        content: '|' / '';
         margin-inline-end: 6px;
         margin-inline-start: 6px;
       }
@@ -169,9 +173,11 @@
       <div id="appsList">
         <template is="dom-repeat" items="[[appList]]">
           <div class="app-item">
-            <cr-checkbox checked="{{item.checked}}"
-                on-change="updateCount_"></cr-checkbox>
-            <webview class="app-icon" src="[[getWrappedIcon_(item.icon_url)]]"
+            <cr-checkbox checked="{{item.checked}}" class="no-label"
+                aria-description="[[item.title]]" on-change="updateCount_">
+            </cr-checkbox>
+            <webview role="img" class="app-icon"
+                src="[[getWrappedIcon_(item.icon_url)]]" aria-hidden="true"
                 tabindex="-1" on-contentload="onImageLoaded_">
             </webview>
             <div class="app-title">[[item.title]]</div>
@@ -186,7 +192,9 @@
               [[item.description]]
             </div>
             <div class="expand-button">
-              <cr-expand-button on-click="onExpandClicked_"></cr-expand-button>
+              <cr-expand-button on-click="onExpandClicked_"
+                  aria-label="[[getExpandButtonAriaLabel_(item.title)]]">
+              </cr-expand-button>
             </div>
           </div>
         </template>
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_apps_list.js b/chrome/browser/resources/chromeos/login/components/oobe_apps_list.js
index 6c13e0c..91ded14 100644
--- a/chrome/browser/resources/chromeos/login/components/oobe_apps_list.js
+++ b/chrome/browser/resources/chromeos/login/components/oobe_apps_list.js
@@ -7,9 +7,17 @@
 const MAX_IMG_LOADING_TIME_SEC = 7;
 
 /**
+ * @constructor
+ * @extends {PolymerElement}
+ * @implements {OobeI18nBehaviorInterface}
+ */
+const OobeAppsListBase =
+    Polymer.mixinBehaviors([OobeI18nBehavior], Polymer.Element);
+
+/**
  * @polymer
  */
-/* #export */ class OobeAppsList extends Polymer.Element {
+/* #export */ class OobeAppsList extends OobeAppsListBase {
   static get is() {
     return 'oobe-apps-list';
   }
@@ -109,6 +117,15 @@
   }
 
   /**
+   * @param {string} title the name of the application.
+   * @return {string} aria label for the expand button.
+   * @private
+   */
+  getExpandButtonAriaLabel_(title) {
+    return this.i18n('recommendAppsDescriptionExpand', title);
+  }
+
+  /**
    * After any change in selection update current counter.
    * @private
    */
diff --git a/chrome/browser/resources/settings/chromeos/keyboard_shortcut_banner/OWNERS b/chrome/browser/resources/settings/chromeos/keyboard_shortcut_banner/OWNERS
new file mode 100644
index 0000000..f5029f3
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/keyboard_shortcut_banner/OWNERS
@@ -0,0 +1 @@
+mlcui@google.com
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_clear_on_exit_fragment.html b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_clear_on_exit_fragment.html
index 87b6fcc..f78b8ad 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_clear_on_exit_fragment.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_clear_on_exit_fragment.html
@@ -34,17 +34,22 @@
     <div class=description-header>
       $i18n{privacyGuideFeatureDescriptionHeader}
     </div>
-    <privacy-guide-description-item
-        icon="settings20:delete-forever"
-        label="$i18n{privacyGuideClearOnExitFeatureDescription1}">
-    </privacy-guide-description-item>
-    <privacy-guide-description-item
-        icon="settings20:logout"
-        label-html="$i18nRaw{privacyGuideClearOnExitFeatureDescription2}">
-    </privacy-guide-description-item>
-    <privacy-guide-description-item
-        icon="settings20:check-circle-outline"
-        label="$i18n{privacyGuideClearOnExitFeatureDescription3}">
-    </privacy-guide-description-item>
+    <div role="list">
+      <privacy-guide-description-item
+          role="listitem"
+          icon="settings20:delete-forever"
+          label="$i18n{privacyGuideClearOnExitFeatureDescription1}">
+      </privacy-guide-description-item>
+      <privacy-guide-description-item
+          role="listitem"
+          icon="settings20:logout"
+          label-html="$i18nRaw{privacyGuideClearOnExitFeatureDescription2}">
+      </privacy-guide-description-item>
+      <privacy-guide-description-item
+          role="listitem"
+          icon="settings20:check-circle-outline"
+          label="$i18n{privacyGuideClearOnExitFeatureDescription3}">
+      </privacy-guide-description-item>
+    </div>
   </div>
 </div>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_completion_link_row.html b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_completion_link_row.html
index ccddd6d..1da7a16 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_completion_link_row.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_completion_link_row.html
@@ -1,4 +1,8 @@
 <style include="cr-shared-style cr-actionable-row-style">
+  :host {
+    padding-inline-start: 4px;
+  }
+
   #labelWrapper {
     flex: 1;
     padding-inline-start: 16px;
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_cookies_fragment.html b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_cookies_fragment.html
index 199915b..5c94859 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_cookies_fragment.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_cookies_fragment.html
@@ -38,27 +38,35 @@
           <div class=description-header>
             $i18n{privacyGuideFeatureDescriptionHeader}
           </div>
-          <privacy-guide-description-item
-              icon="settings20:shoppingcart"
-              label="$i18n{privacyGuideCookiesCardBlockTpcIncognitoFeatureDescription1}">
-          </privacy-guide-description-item>
-          <privacy-guide-description-item
-              icon="settings20:broken"
-              label="$i18n{privacyGuideCookiesCardBlockTpcIncognitoFeatureDescription2}">
-          </privacy-guide-description-item>
+          <div role="list">
+            <privacy-guide-description-item
+                role="listitem"
+                icon="settings20:shoppingcart"
+                label="$i18n{privacyGuideCookiesCardBlockTpcIncognitoFeatureDescription1}">
+            </privacy-guide-description-item>
+            <privacy-guide-description-item
+                role="listitem"
+                icon="settings20:broken"
+                label="$i18n{privacyGuideCookiesCardBlockTpcIncognitoFeatureDescription2}">
+            </privacy-guide-description-item>
+          </div>
         </div>
         <div class="description-column">
           <div class=description-header>
             $i18n{privacyGuideThingsToConsider}
           </div>
-          <privacy-guide-description-item
-              icon="settings20:block"
-              label="$i18n{privacyGuideCookiesCardBlockTpcIncognitoPrivacyDescription1}">
-          </privacy-guide-description-item>
-          <privacy-guide-description-item
-              icon="settings20:incognito-unfilled"
-              label="$i18n{privacyGuideCookiesCardBlockTpcIncognitoPrivacyDescription2}">
-          </privacy-guide-description-item>
+          <div role="list">
+            <privacy-guide-description-item
+                role="listitem"
+                icon="settings20:block"
+                label="$i18n{privacyGuideCookiesCardBlockTpcIncognitoPrivacyDescription1}">
+            </privacy-guide-description-item>
+            <privacy-guide-description-item
+                role="listitem"
+                icon="settings20:incognito-unfilled"
+                label="$i18n{privacyGuideCookiesCardBlockTpcIncognitoPrivacyDescription2}">
+            </privacy-guide-description-item>
+          </div>
         </div>
       </div>
     </settings-collapse-radio-button>
@@ -73,23 +81,30 @@
           <div class=description-header>
             $i18n{privacyGuideFeatureDescriptionHeader}
           </div>
-          <privacy-guide-description-item
-              icon="settings20:shoppingcart"
-              label="$i18n{privacyGuideCookiesCardBlockTpcFeatureDescription1}">
-          </privacy-guide-description-item>
-          <privacy-guide-description-item
-              icon="settings20:broken"
-              label="$i18n{privacyGuideCookiesCardBlockTpcFeatureDescription2}">
-          </privacy-guide-description-item>
+          <div role="list">
+            <privacy-guide-description-item
+                role="listitem"
+                icon="settings20:shoppingcart"
+                label="$i18n{privacyGuideCookiesCardBlockTpcFeatureDescription1}">
+            </privacy-guide-description-item>
+            <privacy-guide-description-item
+                role="listitem"
+                icon="settings20:broken"
+                label="$i18n{privacyGuideCookiesCardBlockTpcFeatureDescription2}">
+            </privacy-guide-description-item>
+          </div>
         </div>
         <div class="description-column">
           <div class=description-header>
             $i18n{privacyGuideThingsToConsider}
           </div>
-          <privacy-guide-description-item
-              icon="settings20:block"
-              label="$i18n{privacyGuideCookiesCardBlockTpcPrivacyDescription1}">
-          </privacy-guide-description-item>
+          <div role="list">
+            <privacy-guide-description-item
+                role="listitem"
+                icon="settings20:block"
+                label="$i18n{privacyGuideCookiesCardBlockTpcPrivacyDescription1}">
+            </privacy-guide-description-item>
+          </div>
         </div>
       </div>
     </settings-collapse-radio-button>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.html b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.html
index a8af97d..86148c642 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.html
@@ -36,23 +36,30 @@
       <div class=description-header>
         $i18n{privacyGuideFeatureDescriptionHeader}
       </div>
-      <privacy-guide-description-item
-          icon="settings20:history"
-          label="$i18n{privacyGuideHistorySyncFeatureDescription1}">
-      </privacy-guide-description-item>
-      <privacy-guide-description-item
-          icon="settings20:dns"
-          label="$i18n{privacyGuideHistorySyncFeatureDescription2}">
-      </privacy-guide-description-item>
+      <div role="list">
+        <privacy-guide-description-item
+            role="listitem"
+            icon="settings20:history"
+            label="$i18n{privacyGuideHistorySyncFeatureDescription1}">
+        </privacy-guide-description-item>
+        <privacy-guide-description-item
+            role="listitem"
+            icon="settings20:dns"
+            label="$i18n{privacyGuideHistorySyncFeatureDescription2}">
+        </privacy-guide-description-item>
+      </div>
     </div>
     <div class="description-column">
       <div class=description-header>
         $i18n{privacyGuideThingsToConsider}
       </div>
-      <privacy-guide-description-item
-          icon="settings20:link"
-          label="$i18n{privacyGuideHistorySyncPrivacyDescription1}">
-      </privacy-guide-description-item>
+      <div role="list">
+        <privacy-guide-description-item
+            role="listitem"
+            icon="settings20:link"
+            label="$i18n{privacyGuideHistorySyncPrivacyDescription1}">
+        </privacy-guide-description-item>
+      </div>
     </div>
   </div>
 </div>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_msbb_fragment.html b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_msbb_fragment.html
index e307f7e..432e3bf 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_msbb_fragment.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_msbb_fragment.html
@@ -34,27 +34,35 @@
       <div class=description-header>
         $i18n{privacyGuideFeatureDescriptionHeader}
       </div>
-      <privacy-guide-description-item
-          icon="settings20:flash-on"
-          label="$i18n{privacyGuideMsbbFeatureDescription1}">
-      </privacy-guide-description-item>
-      <privacy-guide-description-item
-          icon="settings20:lightbulb"
-          label="$i18n{privacyGuideMsbbFeatureDescription2}">
-      </privacy-guide-description-item>
+      <div role="list">
+        <privacy-guide-description-item
+            role="listitem"
+            icon="settings20:flash-on"
+            label="$i18n{privacyGuideMsbbFeatureDescription1}">
+        </privacy-guide-description-item>
+        <privacy-guide-description-item
+            role="listitem"
+            icon="settings20:lightbulb"
+            label="$i18n{privacyGuideMsbbFeatureDescription2}">
+        </privacy-guide-description-item>
+      </div>
     </div>
     <div class="description-column">
       <div class=description-header>
         $i18n{privacyGuideThingsToConsider}
       </div>
-      <privacy-guide-description-item
-          icon="settings20:link"
-          label="$i18n{privacyGuideMsbbPrivacyDescription1}">
-      </privacy-guide-description-item>
-      <privacy-guide-description-item
-          icon="settings20:data-connectors-system"
-          label="$i18n{privacyGuideMsbbPrivacyDescription2}">
-      </privacy-guide-description-item>
+      <div role="list">
+        <privacy-guide-description-item
+            role="listitem"
+            icon="settings20:link"
+            label="$i18n{privacyGuideMsbbPrivacyDescription1}">
+        </privacy-guide-description-item>
+        <privacy-guide-description-item
+            role="listitem"
+            icon="settings20:data-connectors-system"
+            label="$i18n{privacyGuideMsbbPrivacyDescription2}">
+        </privacy-guide-description-item>
+      </div>
     </div>
   </div>
 </div>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_safe_browsing_fragment.html b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_safe_browsing_fragment.html
index 34e36e0..36c222fc 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_safe_browsing_fragment.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_safe_browsing_fragment.html
@@ -40,39 +40,50 @@
             <div class=description-header>
               $i18n{privacyGuideFeatureDescriptionHeader}
             </div>
-            <privacy-guide-description-item
-                icon="settings20:security"
-                label="$i18n{safeBrowsingEnhancedBulOne}">
-            </privacy-guide-description-item>
-            <privacy-guide-description-item
-                icon="settings20:googleg"
-                label="$i18n{safeBrowsingEnhancedBulTwo}">
-            </privacy-guide-description-item>
-            <privacy-guide-description-item
-                icon="settings20:public"
-                label="$i18n{safeBrowsingEnhancedBulThree}">
-            </privacy-guide-description-item>
-            <privacy-guide-description-item
-                icon="settings20:vpn-key"
-                label="$i18n{safeBrowsingEnhancedBulFour}">
-            </privacy-guide-description-item>
+            <div role="list">
+              <privacy-guide-description-item
+                  role="listitem"
+                  icon="settings20:security"
+                  label="$i18n{safeBrowsingEnhancedBulOne}">
+              </privacy-guide-description-item>
+              <privacy-guide-description-item
+                  role="listitem"
+                  icon="settings20:googleg"
+                  label="$i18n{safeBrowsingEnhancedBulTwo}">
+              </privacy-guide-description-item>
+              <privacy-guide-description-item
+                  role="listitem"
+                  icon="settings20:public"
+                  label="$i18n{safeBrowsingEnhancedBulThree}">
+              </privacy-guide-description-item>
+              <privacy-guide-description-item
+                  role="listitem"
+                  icon="settings20:vpn-key"
+                  label="$i18n{safeBrowsingEnhancedBulFour}">
+              </privacy-guide-description-item>
+            </div>
           </div>
           <div class="description-column">
             <div class=description-header>
               $i18n{privacyGuideThingsToConsider}
             </div>
-            <privacy-guide-description-item
-                icon="settings20:data"
-                label="$i18n{privacyGuideSafeBrowsingCardEnhancedProtectionPrivacyDescription1}">
-            </privacy-guide-description-item>
-            <privacy-guide-description-item
-                icon="settings20:web-asset"
-                label="$i18n{privacyGuideSafeBrowsingCardEnhancedProtectionPrivacyDescription2}">
-            </privacy-guide-description-item>
-            <privacy-guide-description-item
-                icon="settings20:account-circle"
-                label="$i18n{privacyGuideSafeBrowsingCardEnhancedProtectionPrivacyDescription3}">
-            </privacy-guide-description-item>
+            <div role="list">
+              <privacy-guide-description-item
+                  role="listitem"
+                  icon="settings20:data"
+                  label="$i18n{privacyGuideSafeBrowsingCardEnhancedProtectionPrivacyDescription1}">
+              </privacy-guide-description-item>
+              <privacy-guide-description-item
+                  role="listitem"
+                  icon="settings20:web-asset"
+                  label="$i18n{privacyGuideSafeBrowsingCardEnhancedProtectionPrivacyDescription2}">
+              </privacy-guide-description-item>
+              <privacy-guide-description-item
+                  role="listitem"
+                  icon="settings20:account-circle"
+                  label="$i18n{privacyGuideSafeBrowsingCardEnhancedProtectionPrivacyDescription3}">
+              </privacy-guide-description-item>
+            </div>
           </div>
         </div>
     </settings-collapse-radio-button>
@@ -88,23 +99,30 @@
             <div class=description-header>
               $i18n{privacyGuideFeatureDescriptionHeader}
             </div>
-            <privacy-guide-description-item
-                icon="settings20:security"
-                label="$i18n{privacyGuideSafeBrowsingCardStandardProtectionFeatureDescription1}">
-            </privacy-guide-description-item>
-            <privacy-guide-description-item
-                icon="settings20:googleg"
-                label="$i18n{privacyGuideSafeBrowsingCardStandardProtectionFeatureDescription2}">
-            </privacy-guide-description-item>
+            <div role="list">
+              <privacy-guide-description-item
+                  role="listitem"
+                  icon="settings20:security"
+                  label="$i18n{privacyGuideSafeBrowsingCardStandardProtectionFeatureDescription1}">
+              </privacy-guide-description-item>
+              <privacy-guide-description-item
+                  role="listitem"
+                  icon="settings20:googleg"
+                  label="$i18n{privacyGuideSafeBrowsingCardStandardProtectionFeatureDescription2}">
+              </privacy-guide-description-item>
+            </div>
           </div>
           <div class="description-column">
             <div class=description-header>
               $i18n{privacyGuideThingsToConsider}
             </div>
-            <privacy-guide-description-item
-                icon="settings20:data"
-                label="$i18n{privacyGuideSafeBrowsingCardStandardProtectionPrivacyDescription1}">
-            </privacy-guide-description-item>
+            <div role="list">
+              <privacy-guide-description-item
+                  role="listitem"
+                  icon="settings20:data"
+                  label="$i18n{privacyGuideSafeBrowsingCardStandardProtectionPrivacyDescription1}">
+              </privacy-guide-description-item>
+            </div>
           </div>
         </div>
     </settings-collapse-radio-button>
diff --git a/chrome/browser/resources/signin/profile_customization/profile_customization_app.html b/chrome/browser/resources/signin/profile_customization/profile_customization_app.html
index ba221fa..fdadeb4 100644
--- a/chrome/browser/resources/signin/profile_customization/profile_customization_app.html
+++ b/chrome/browser/resources/signin/profile_customization/profile_customization_app.html
@@ -77,6 +77,7 @@
   }
 
   #nameInput {
+    --cr-input-error-display: none;
     --cr-input-placeholder-color: var(--google-grey-900);
     --cr-input-padding-bottom: 8px;
     --cr-input-padding-top: 8px;
@@ -105,6 +106,11 @@
     width: 111px;
   }
 
+  #title.in-dialog-design {
+    font-size: 20px;
+    line-height: 24px;
+  }
+
   .action-container.in-dialog-design {
     padding: 0 24px 24px;
   }
@@ -131,8 +137,18 @@
   </div>
 
   <div id="body">
-    <div id="title">[[welcomeTitle_]]</div>
-    <div id="content">$i18n{profileCustomizationText}</div>
+    <div id="title"
+        class$="[[getDialogDesignClass_(profileCustomizationInDialogDesign_)]]">
+      <template is="dom-if" if="[[!profileCustomizationInDialogDesign_]]">
+        [[welcomeTitle_]]
+      </template>
+      <template is="dom-if" if="[[profileCustomizationInDialogDesign_]]">
+        $i18n{profileCustomizationTitle}
+      </template>
+    </div>
+    <template is="dom-if" if="[[!profileCustomizationInDialogDesign_]]">
+      <div id="content">$i18n{profileCustomizationText}</div>
+    </template>
   </div>
 
   <cr-input id="nameInput" pattern=".*\\S.*" value="{{profileName_}}"
@@ -145,17 +161,17 @@
     </cr-customize-themes>
   </div>
 
-  <div
-    class$="[[getActionContainerClass_(profileCustomizationInDialogDesign_)]]">
+  <div class$="action-container 
+      [[getDialogDesignClass_(profileCustomizationInDialogDesign_)]]">
     <cr-button id="doneButton" class="action-button"
         disabled="[[isDoneButtonDisabled_(profileName_)]]"
         on-click="onDoneCustomizationClicked_" autofocus>
       $i18n{profileCustomizationDoneLabel}
     </cr-button>
     <template is="dom-if" if="[[profileCustomizationInDialogDesign_]]">
-      <!-- TODO: add action and i18n on Skip -->
+      <!-- TODO: add action on Skip -->
       <cr-button id="skipButton" class="cancel-button">
-        Skip
+        $i18n{profileCustomizationSkipLabel}
       </cr-button>
     </template>
   <div>
diff --git a/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts b/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts
index 7f9b7143..e48e05b 100644
--- a/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts
+++ b/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts
@@ -111,8 +111,8 @@
     this.welcomeTitle_ = profileInfo.welcomeTitle;
   }
 
-  private getActionContainerClass_(inDialogDesign: boolean): string {
-    return 'action-container' + (inDialogDesign ? ' in-dialog-design' : '');
+  private getDialogDesignClass_(inDialogDesign: boolean): string {
+    return inDialogDesign ? 'in-dialog-design' : '';
   }
 }
 
diff --git a/chrome/browser/safe_browsing/client_side_detection_service_browsertest.cc b/chrome/browser/safe_browsing/client_side_detection_service_browsertest.cc
index 0678bd2..30d1ab5 100644
--- a/chrome/browser/safe_browsing/client_side_detection_service_browsertest.cc
+++ b/chrome/browser/safe_browsing/client_side_detection_service_browsertest.cc
@@ -4,12 +4,12 @@
 
 #include "chrome/browser/safe_browsing/chrome_client_side_detection_service_delegate.h"
 
+#include "base/path_service.h"
 #include "base/test/bind.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/client_side_detection_service_factory.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/base/ui_test_utils.h"
+#include "chrome/common/chrome_paths.h"
+#include "chrome/test/base/chrome_test_utils.h"
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing/content/browser/client_side_detection_service.h"
 #include "components/safe_browsing/content/browser/client_side_phishing_model.h"
@@ -19,64 +19,244 @@
 #include "content/public/test/browser_test.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "testing/gmock/include/gmock/gmock.h"
+#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
+
+#if BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/ui/android/tab_model/tab_model.h"
+#include "chrome/browser/ui/android/tab_model/tab_model_list.h"
+#include "chrome/test/base/android/android_browser_test.h"
+#else
+#include "chrome/browser/ui/browser.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#endif  // defined (
 
 namespace safe_browsing {
 
+namespace {
+
+// Helper class used to wait until a phishing model has been set.
+class PhishingModelWaiter : public mojom::PhishingModelSetterTestObserver {
+ public:
+  explicit PhishingModelWaiter(
+      mojo::PendingReceiver<mojom::PhishingModelSetterTestObserver> receiver)
+      : receiver_(this, std::move(receiver)) {}
+
+  void SetCallback(base::OnceClosure callback) {
+    callback_ = std::move(callback);
+  }
+
+  // mojom::PhishingModelSetterTestObserver
+  void PhishingModelUpdated() override {
+    if (callback_)
+      std::move(callback_).Run();
+  }
+
+ private:
+  mojo::Receiver<mojom::PhishingModelSetterTestObserver> receiver_;
+  base::OnceClosure callback_;
+};
+
+}  // namespace
+
 using ::testing::_;
 using ::testing::ReturnRef;
 using ::testing::StrictMock;
 
-class ClientSideDetectionServiceBrowserTest : public InProcessBrowserTest {
-  void SetUpOnMainThread() override {}
+class ClientSideDetectionServiceBrowserTest : public PlatformBrowserTest {
+ protected:
+  void SetUpOnMainThread() override {
+    ASSERT_TRUE(embedded_test_server()->Start());
+  }
+
+  content::WebContents* web_contents() {
+    return chrome_test_utils::GetActiveWebContents(this);
+  }
+
+  std::unique_ptr<PhishingModelWaiter> CreatePhishingModelWaiter(
+      content::RenderProcessHost* rph) {
+    mojo::AssociatedRemote<mojom::PhishingModelSetter> model_setter;
+    rph->GetChannel()->GetRemoteAssociatedInterface(&model_setter);
+
+    mojo::PendingRemote<mojom::PhishingModelSetterTestObserver> observer;
+    auto waiter = std::make_unique<PhishingModelWaiter>(
+        observer.InitWithNewPipeAndPassReceiver());
+
+    {
+      base::RunLoop run_loop;
+      model_setter->SetTestObserver(std::move(observer),
+                                    run_loop.QuitClosure());
+      run_loop.Run();
+    }
+
+    return waiter;
+  }
 };
 
-// TODO(crbug.com/1217128): Re-enable this test, once we have a more reliable
-// method of ensuring the SetPhishingModel IPC comes before the
-// StartPhishingDetection IPC.
 IN_PROC_BROWSER_TEST_F(ClientSideDetectionServiceBrowserTest,
-                       DISABLED_NewHostGetsModel) {
-  browser()->profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled,
-                                               false);
-  ClientSideModel model;
-  model.set_max_words_per_term(0);
-  std::string model_str;
-  model.SerializeToString(&model_str);
+                       ModelUpdatesPropagated) {
+  GURL url(embedded_test_server()->GetURL("/empty.html"));
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), url));
 
-  ClientSidePhishingModel::GetInstance()->SetModelStrForTesting(model_str);
+  content::RenderFrameHost* rfh = web_contents()->GetMainFrame();
+  content::RenderProcessHost* rph = rfh->GetProcess();
 
-  // Enable Safe Browsing and the CSD service.
-  browser()->profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled,
-                                               true);
+  // Update the model and wait for confirmation
+  {
+    std::unique_ptr<PhishingModelWaiter> waiter =
+        CreatePhishingModelWaiter(rph);
 
-  base::RunLoop run_loop;
+    base::RunLoop run_loop;
+    waiter->SetCallback(run_loop.QuitClosure());
 
-  content::RenderFrameHost* rfh = browser()
-                                      ->tab_strip_model()
-                                      ->GetActiveWebContents()
-                                      ->GetPrimaryMainFrame();
-  mojo::Remote<mojom::PhishingDetector> phishing_detector;
-  rfh->GetRemoteInterfaces()->GetInterface(
-      phishing_detector.BindNewPipeAndPassReceiver());
+    ClientSideModel model;
+    model.set_version(123);
+    model.set_max_words_per_term(0);
+    std::string model_str;
+    model.SerializeToString(&model_str);
+    ClientSidePhishingModel::GetInstance()->SetModelTypeForTesting(
+        CSDModelType::kProtobuf);
+    ClientSidePhishingModel::GetInstance()->SetModelStrForTesting(model_str);
+    ClientSidePhishingModel::GetInstance()->NotifyCallbacksOfUpdateForTesting();
 
-  mojom::PhishingDetectorResult result;
-  std::string verdict;
-  phishing_detector->StartPhishingDetection(
-      GURL("about:blank"),
-      base::BindOnce(
-          [](base::RepeatingClosure quit_closure,
-             mojom::PhishingDetectorResult* out_result,
-             std::string* out_verdict, mojom::PhishingDetectorResult result,
-             const std::string& verdict) {
-            *out_result = result;
-            *out_verdict = verdict;
-            quit_closure.Run();
-          },
-          run_loop.QuitClosure(), &result, &verdict));
+    run_loop.Run();
+  }
 
-  run_loop.Run();
+  // Check that the update was successful
+  {
+    base::RunLoop run_loop;
 
-  // The model classification will run, but will return an invalid score.
-  EXPECT_EQ(result, mojom::PhishingDetectorResult::INVALID_SCORE);
+    mojo::AssociatedRemote<mojom::PhishingDetector> phishing_detector;
+    rfh->GetRemoteAssociatedInterfaces()->GetInterface(&phishing_detector);
+
+    mojom::PhishingDetectorResult result;
+    std::string verdict;
+    phishing_detector->StartPhishingDetection(
+        url,
+        base::BindOnce(
+            [](base::RepeatingClosure quit_closure,
+               mojom::PhishingDetectorResult* out_result,
+               std::string* out_verdict, mojom::PhishingDetectorResult result,
+               const std::string& verdict) {
+              *out_result = result;
+              *out_verdict = verdict;
+              quit_closure.Run();
+            },
+            run_loop.QuitClosure(), &result, &verdict));
+
+    run_loop.Run();
+
+    EXPECT_EQ(result, mojom::PhishingDetectorResult::SUCCESS);
+
+    ClientPhishingRequest request;
+    ASSERT_TRUE(request.ParseFromString(verdict));
+    EXPECT_EQ(123, request.model_version());
+  }
+}
+
+IN_PROC_BROWSER_TEST_F(ClientSideDetectionServiceBrowserTest,
+                       TfLiteClassification) {
+  GURL url(embedded_test_server()->GetURL("/empty.html"));
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), url));
+
+  content::RenderFrameHost* rfh = web_contents()->GetMainFrame();
+  content::RenderProcessHost* rph = rfh->GetProcess();
+
+  // Update the model and wait for confirmation
+  {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+
+    std::unique_ptr<PhishingModelWaiter> waiter =
+        CreatePhishingModelWaiter(rph);
+
+    base::RunLoop run_loop;
+    waiter->SetCallback(run_loop.QuitClosure());
+
+    ClientSideModel model;
+    model.set_version(123);
+    model.set_max_words_per_term(0);
+
+    model.mutable_tflite_metadata()->set_input_width(48);
+    model.mutable_tflite_metadata()->set_input_height(48);
+
+    std::vector<std::pair<std::string, double>> thresholds{
+        {"502fd246eb6fad3eae0387c54e4ebe74", 2.0},
+        {"7c4065b088444b37d273872b771e6940", 2.0},
+        {"712036bd72bf185a2a4f88de9141d02d", 2.0},
+        {"9e9c15bfa7cb3f8699e2271116a4175c", 2.0},
+        {"6c2cb3f559e7a03f37dd873fc007dc65", 2.0},
+        {"1cbeb74661a5e7e05c993f2524781611", 2.0},
+        {"989790016b6adca9d46b9c8ec6b8fe3a", 2.0},
+        {"501067590331ca2d243c669e6084c47e", 2.0},
+        {"40aed7e33c100058e54c73af3ed49524", 2.0},
+        {"62f53ea23c7ad2590db711235a45fd38", 2.0},
+        {"ee6fb9baa44f192bc3c53d8d3c6f7a3d", 2.0},
+        {"ea54b0830d871286e2b4023bbb431710", 2.0},
+        {"25645a55b844f970337218ea8f1f26b7", 2.0},
+        {"c9a8640be09f97f170f1a2708058c48f", 2.0},
+        {"953255ea26aa8578d06593ff33e99298", 2.0}};
+    for (const auto& label_and_threshold : thresholds) {
+      TfLiteModelMetadata::Threshold* threshold =
+          model.mutable_tflite_metadata()->add_thresholds();
+      threshold->set_label(label_and_threshold.first);
+      threshold->set_threshold(label_and_threshold.second);
+    }
+
+    base::FilePath tflite_path;
+    ASSERT_TRUE(base::PathService::Get(chrome::DIR_TEST_DATA, &tflite_path));
+#if BUILDFLAG(IS_ANDROID)
+    tflite_path = tflite_path.AppendASCII("safe_browsing")
+                      .AppendASCII("visual_model_android.tflite");
+#else
+    tflite_path = tflite_path.AppendASCII("safe_browsing")
+                      .AppendASCII("visual_model_desktop.tflite");
+#endif
+    base::File tflite_model(tflite_path,
+                            base::File::FLAG_OPEN | base::File::FLAG_READ);
+    ASSERT_TRUE(tflite_model.IsValid());
+
+    std::string model_str;
+    model.SerializeToString(&model_str);
+    ClientSidePhishingModel::GetInstance()->SetModelTypeForTesting(
+        CSDModelType::kProtobuf);
+    ClientSidePhishingModel::GetInstance()->SetModelStrForTesting(model_str);
+    ClientSidePhishingModel::GetInstance()->SetVisualTfLiteModelForTesting(
+        std::move(tflite_model));
+    ClientSidePhishingModel::GetInstance()->NotifyCallbacksOfUpdateForTesting();
+
+    run_loop.Run();
+  }
+
+  // Check that the update was successful
+  {
+    base::RunLoop run_loop;
+
+    mojo::AssociatedRemote<mojom::PhishingDetector> phishing_detector;
+    rfh->GetRemoteAssociatedInterfaces()->GetInterface(&phishing_detector);
+
+    mojom::PhishingDetectorResult result;
+    std::string verdict;
+    phishing_detector->StartPhishingDetection(
+        url,
+        base::BindOnce(
+            [](base::RepeatingClosure quit_closure,
+               mojom::PhishingDetectorResult* out_result,
+               std::string* out_verdict, mojom::PhishingDetectorResult result,
+               const std::string& verdict) {
+              *out_result = result;
+              *out_verdict = verdict;
+              quit_closure.Run();
+            },
+            run_loop.QuitClosure(), &result, &verdict));
+
+    run_loop.Run();
+
+    EXPECT_EQ(result, mojom::PhishingDetectorResult::SUCCESS);
+
+    ClientPhishingRequest request;
+    ASSERT_TRUE(request.ParseFromString(verdict));
+    EXPECT_EQ(123, request.model_version());
+  }
 }
 
 }  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc
index 897dfc3..8e53256 100644
--- a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc
+++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc
@@ -465,8 +465,8 @@
     request->set_content_type(file_metadata_.at(path).mime_type);
   }
 
-  for (const std::string& tag : analysis_settings_.tags)
-    request->add_tag(tag);
+  for (const auto& tag : analysis_settings_.tags)
+    request->add_tag(tag.first);
 }
 
 void DeepScanningRequest::PrepareClientDownloadRequest(
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc
index 8011e604..2b3aefc 100644
--- a/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc
@@ -287,13 +287,20 @@
     ASSERT_TRUE(settings.has_value());
 
     enterprise_connectors::AnalysisSettings default_settings;
-    default_settings.tags = {"malware"};
+    default_settings.tags = {{"malware", enterprise_connectors::TagSettings()}};
     default_settings.analysis_url =
         GURL("https://safebrowsing.google.com/safebrowsing/uploads/scan");
     default_settings.block_until_verdict =
         enterprise_connectors::BlockUntilVerdict::BLOCK;
 
-    ASSERT_EQ(settings.value().tags, default_settings.tags);
+    for (const auto& tag : settings.value().tags) {
+      ASSERT_EQ(tag.second.requires_justification,
+                default_settings.tags[tag.first].requires_justification);
+      ASSERT_EQ(tag.second.custom_message.message,
+                default_settings.tags[tag.first].custom_message.message);
+      ASSERT_EQ(tag.second.custom_message.learn_more_url,
+                default_settings.tags[tag.first].custom_message.learn_more_url);
+    }
     ASSERT_EQ(settings.value().block_large_files,
               default_settings.block_large_files);
     ASSERT_EQ(settings.value().block_password_protected_files,
@@ -359,7 +366,8 @@
   // should be sent to show features work correctly.
   auto dlp_and_malware_settings = []() {
     enterprise_connectors::AnalysisSettings settings;
-    settings.tags = {"dlp", "malware"};
+    settings.tags = {{"dlp", enterprise_connectors::TagSettings()},
+                     {"malware", enterprise_connectors::TagSettings()}};
     settings.block_until_verdict =
         enterprise_connectors::BlockUntilVerdict::BLOCK;
     return settings;
@@ -545,7 +553,7 @@
 
 TEST_P(DeepScanningAPPRequestTest, GeneratesCorrectRequestForAPP) {
   enterprise_connectors::AnalysisSettings settings;
-  settings.tags = {"malware"};
+  settings.tags = {{"malware", enterprise_connectors::TagSettings()}};
   DeepScanningRequest request(
       &item_, DeepScanningRequest::DeepScanTrigger::TRIGGER_APP_PROMPT,
       DownloadCheckResult::SAFE, base::DoNothing(),
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/ShareDelegate.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/ShareDelegate.java
index 37f18f6..642278b 100644
--- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/ShareDelegate.java
+++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/ShareDelegate.java
@@ -17,7 +17,8 @@
     // should never be reused.
     @IntDef({ShareOrigin.OVERFLOW_MENU, ShareOrigin.TOP_TOOLBAR, ShareOrigin.CONTEXT_MENU,
             ShareOrigin.WEBSHARE_API, ShareOrigin.MOBILE_ACTION_MODE, ShareOrigin.EDIT_URL,
-            ShareOrigin.TAB_GROUP, ShareOrigin.WEBAPP_NOTIFICATION, ShareOrigin.FEED})
+            ShareOrigin.TAB_GROUP, ShareOrigin.WEBAPP_NOTIFICATION, ShareOrigin.FEED,
+            ShareOrigin.COUNT})
     public @interface ShareOrigin {
         int OVERFLOW_MENU = 0;
         int TOP_TOOLBAR = 1;
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinator.java
index db8db4a..74033555 100644
--- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinator.java
+++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinator.java
@@ -20,10 +20,6 @@
 import org.chromium.content_public.browser.UiThreadTaskTraits;
 import org.chromium.url.GURL;
 
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
 /**
  * Handles the Link To Text action in the Sharing Hub.
  */
@@ -48,9 +44,6 @@
     private static final String SHARE_TEXT_TEMPLATE = "\"%s\"\n";
     private static final String INVALID_SELECTOR = "";
     private static final int TIMEOUT_MS = 100;
-    private static final Set<String> AMP_VIEWER_DOMAINS =
-            new HashSet<>(Arrays.asList("google.com/amp/", "bing.com/amp"));
-    private static final int LENGTH_AMP_DOMAIN = 15;
     private static final int PREVIEW_MAX_LENGTH = 35;
     private static final int PREVIEW_SELECTED_TEXT_CUTOFF_LENGTH = 32;
     private static final String PREVIEW_ELLIPSIS = "...";
@@ -67,7 +60,7 @@
     private ShareParams mShareTextParams;
     public @RemoteRequestStatus int mRemoteRequestStatus;
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     LinkToTextCoordinator() {}
 
     public LinkToTextCoordinator(Tab tab, ChromeOptionShareCallback chromeOptionShareCallback,
@@ -77,7 +70,7 @@
                 visibleUrl, selectedText);
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     void initLinkToTextCoordinator(Tab tab, ChromeOptionShareCallback chromeOptionShareCallback,
             ChromeShareExtras chromeShareExtras, long shareStartTime, String visibleUrl,
             String selectedText) {
@@ -134,10 +127,7 @@
             return mSelectedText;
         }
 
-        StringBuilder sb = new StringBuilder();
-        sb.append(mSelectedText.substring(0, PREVIEW_SELECTED_TEXT_CUTOFF_LENGTH));
-        sb.append(PREVIEW_ELLIPSIS);
-        return sb.toString();
+        return mSelectedText.substring(0, PREVIEW_SELECTED_TEXT_CUTOFF_LENGTH) + PREVIEW_ELLIPSIS;
     }
 
     private void startRequestSelector() {
@@ -158,7 +148,7 @@
         requestSelector();
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     void reshareHighlightedText() {
         setTextFragmentReceiver();
         if (mProducer == null) {
@@ -175,7 +165,7 @@
         });
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     void onReshareSelectorsRemoteRequestCompleted(String selectors) {
         if (mRemoteRequestStatus == RemoteRequestStatus.CANCELLED) return;
         if (selectors.isEmpty()) {
@@ -191,7 +181,7 @@
         });
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     void reshareRequestCompleted(String selectors) {
         if (mRemoteRequestStatus == RemoteRequestStatus.CANCELLED) return;
 
@@ -229,7 +219,7 @@
         }
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     void onRemoteRequestCompleted(String selector, Integer error, Integer readyStatus) {
         if (mRemoteRequestStatus == RemoteRequestStatus.CANCELLED) return;
 
@@ -259,7 +249,7 @@
         LinkToTextBridge.logLinkRequestedBeforeStatus(status, readyStatus.intValue());
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     void requestSelector() {
         LinkToTextMetricsHelper.recordLinkToTextDiagnoseStatus(
                 LinkToTextMetricsHelper.LinkToTextDiagnoseStatus.REQUEST_SELECTOR);
@@ -309,7 +299,7 @@
         mTab.removeObserver(this);
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     void timeout() {
         assert (mRemoteRequestStatus == RemoteRequestStatus.REQUESTED
                 || mRemoteRequestStatus == RemoteRequestStatus.COMPLETED);
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java
index 03a21bad..58af7e3 100644
--- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java
+++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java
@@ -208,9 +208,6 @@
         }
         if (mActivity == null) return;
 
-        // Current tab information is necessary to create the first party options.
-        if (!mExcludeFirstParty && (mTabProvider == null || mTabProvider.get() == null)) return;
-
         if (mWindowAndroid == null) {
             mWindowAndroid = params.getWindow();
             if (mWindowAndroid != null) {
@@ -296,11 +293,9 @@
                         LinkToTextMetricsHelper.LinkToTextDiagnoseStatus
                                 .SHOW_SHARINGHUB_FOR_HIGHLIGHT);
             }
-            String tabUrl =
-                    mTabProvider.get().isInitialized() ? mTabProvider.get().getUrl().getSpec() : "";
             mLinkToTextCoordinator = new LinkToTextCoordinator(mTabProvider.get(), this,
-                    chromeShareExtras, shareStartTime,
-                    getUrlToShare(params, chromeShareExtras, tabUrl), params.getText());
+                    chromeShareExtras, shareStartTime, getUrlToShare(params, chromeShareExtras),
+                    params.getText());
         }
         mShareSheetLinkToggleCoordinator = new ShareSheetLinkToggleCoordinator(
                 params, chromeShareExtras, mLinkToTextCoordinator);
@@ -327,10 +322,7 @@
         mChromeProvidedSharingOptionsProvider = new ChromeProvidedSharingOptionsProvider(activity,
                 mWindowAndroid, mTabProvider, mBottomSheetController, mBottomSheet, shareParams,
                 mPrintTabCallback, mIsIncognito, mShareStartTime, this, mImageEditorModuleProvider,
-                mFeatureEngagementTracker,
-                getUrlToShare(shareParams, chromeShareExtras,
-                        mTabProvider.get().isInitialized() ? mTabProvider.get().getUrl().getSpec()
-                                                           : ""),
+                mFeatureEngagementTracker, getUrlToShare(shareParams, chromeShareExtras),
                 mLinkGenerationStatusForMetrics, mLinkToggleMetricsDetails, mProfile);
         mIsMultiWindow = ApiCompatibilityUtils.isInMultiWindowMode(activity);
 
@@ -573,14 +565,15 @@
      * useful for {@link LinkToTextCoordinator} that needs URL but it cannot be provided through
      * {@link ShareParams}.
      */
-    private String getUrlToShare(
-            ShareParams shareParams, ChromeShareExtras chromeShareExtras, String tabUrl) {
+    private String getUrlToShare(ShareParams shareParams, ChromeShareExtras chromeShareExtras) {
         if (!TextUtils.isEmpty(shareParams.getUrl())) {
             return shareParams.getUrl();
         } else if (!chromeShareExtras.getImageSrcUrl().isEmpty()) {
             return chromeShareExtras.getImageSrcUrl().getSpec();
+        } else if (mTabProvider.hasValue() && mTabProvider.get().isInitialized()) {
+            return mTabProvider.get().getUrl().getSpec();
         }
-        return tabUrl;
+        return "";
     }
 
     // ActivityStateObserver
diff --git a/chrome/browser/signin/chrome_signin_client_unittest.cc b/chrome/browser/signin/chrome_signin_client_unittest.cc
index 7ea9c0f..c59c7c6 100644
--- a/chrome/browser/signin/chrome_signin_client_unittest.cc
+++ b/chrome/browser/signin/chrome_signin_client_unittest.cc
@@ -295,6 +295,8 @@
     case signin_metrics::ProfileSignout::
         USER_CLICKED_SIGNOUT_FROM_USER_POLICY_NOTIFICATION_DIALOG:
       return false;
+    case signin_metrics::ProfileSignout::ACCOUNT_EMAIL_UPDATED:
+      return true;
     case signin_metrics::ProfileSignout::NUM_PROFILE_SIGNOUT_METRICS:
       NOTREACHED();
       return false;
@@ -436,7 +438,7 @@
     signin_metrics::ProfileSignout::SIGNIN_RETRIGGERD_FROM_WEB_SIGNIN,
     signin_metrics::ProfileSignout::
         USER_CLICKED_SIGNOUT_FROM_USER_POLICY_NOTIFICATION_DIALOG,
-
+    signin_metrics::ProfileSignout::ACCOUNT_EMAIL_UPDATED,
 };
 static_assert(std::size(kSignoutSources) ==
                   signin_metrics::ProfileSignout::NUM_PROFILE_SIGNOUT_METRICS,
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java
index 8d2b9cd..0b5200d 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninChecker.java
@@ -117,7 +117,7 @@
     }
 
     private void resigninAfterAccountRename(String newAccountName, boolean shouldEnableSync) {
-        mSigninManager.signOut(SignoutReason.USER_CLICKED_SIGNOUT_SETTINGS, () -> {
+        mSigninManager.signOut(SignoutReason.ACCOUNT_EMAIL_UPDATED, () -> {
             if (shouldEnableSync) {
                 mSigninManager.signinAndEnableSync(SigninAccessPoint.ACCOUNT_RENAMED,
                         AccountUtils.createAccountFromName(newAccountName), new SignInCallback() {
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_am.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_am.xtb
index 97e1bcf..7561764 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_am.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_am.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">ሲነካ የሚሞሉ የመግቢያ ማስረጃዎች ዝርዝር።</translation>
 <translation id="3653689374478248324">በመለያ ወደ <ph name="SITE_NAME" /> ይገባሉ</translation>
 <translation id="3950820424414687140">በመለያ ይግቡ</translation>
+<translation id="5014228528537508015">ወደዚህ ጣቢያ ይግቡ?</translation>
 <translation id="5441504010984421144">በሙሉ ቁመት ላይ ሲነካ የሚሞሉ የመግቢያ ማስረጃዎች ዝርዝር።</translation>
 <translation id="5624120631404540903">የይለፍ ቃሎችን አስተዳድር</translation>
 <translation id="804577341878669140">ከመለያ ጋር ቀጥል</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ar.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ar.xtb
index 8b4617a..a3a1b12 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ar.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ar.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">قائمة ببيانات الاعتماد التي يتم ملؤها باللمس</translation>
 <translation id="3653689374478248324">سيتم تسجيل دخولك إلى <ph name="SITE_NAME" />.</translation>
 <translation id="3950820424414687140">تسجيل الدخول</translation>
+<translation id="5014228528537508015">هل تريد تسجيل الدخول إلى هذا الموقع الإلكتروني؟</translation>
 <translation id="5441504010984421144">تم فتح قائمة بيانات الاعتماد التي يجب ملؤها باللمس على طول الشاشة.</translation>
 <translation id="5624120631404540903">إدارة كلمات المرور</translation>
 <translation id="804577341878669140">المتابعة باستخدام حساب</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_as.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_as.xtb
index 8e0c6c38..e798045 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_as.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_as.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">স্পৰ্শ কৰিলে পূৰ হ’বলগীয়া ক্ৰিডেনশ্বিয়েলৰ সূচী।</translation>
 <translation id="3653689374478248324">আপুনি <ph name="SITE_NAME" />ত ছাইন ইন কৰিব</translation>
 <translation id="3950820424414687140">ছাইন ইন কৰক</translation>
+<translation id="5014228528537508015">এই ছাইটটোত ছাইন ইন কৰিবনে?</translation>
 <translation id="5441504010984421144">স্পৰ্শ কৰিলে পূৰ হ’বলগীয়া ক্ৰিডেনশ্বিয়েলৰ সূচীখন সম্পূৰ্ণ উচ্চতাত খোল খাইছে।</translation>
 <translation id="5624120631404540903">পাছৱৰ্ড সলনি কৰক</translation>
 <translation id="804577341878669140">একাউণ্টটোৰ সৈতে অব্যাহত ৰাখক</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_az.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_az.xtb
index 840864d..38a600b 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_az.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_az.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Toxunuşla doldurulacaq kredensialların siyahısı.</translation>
 <translation id="3653689374478248324"><ph name="SITE_NAME" /> saytına daxil olacaqsınız</translation>
 <translation id="3950820424414687140">Giriş</translation>
+<translation id="5014228528537508015">Bu sayta giriş edilsin?</translation>
 <translation id="5441504010984421144">Tam hündürlükdə açılan toxunuşla doldurulacaq kredensialların siyahısı.</translation>
 <translation id="5624120631404540903">Parolları idarə edin</translation>
 <translation id="804577341878669140">Hesaba davam edin</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ca.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ca.xtb
index 0e517b6..6a12a85 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ca.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ca.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Llista de credencials que s'emplenaran amb un toc.</translation>
 <translation id="3653689374478248324">Iniciaràs la sessió a <ph name="SITE_NAME" /></translation>
 <translation id="3950820424414687140">Inicia la sessió</translation>
+<translation id="5014228528537508015">Vols iniciar la sessió en aquest lloc web?</translation>
 <translation id="5441504010984421144">La llista de credencials que s'emplenaran amb un toc s'ha obert a alçada completa.</translation>
 <translation id="5624120631404540903">Gestiona les contrasenyes</translation>
 <translation id="804577341878669140">Continua amb el compte</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_da.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_da.xtb
index a3644e25..c209541 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_da.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_da.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Liste over loginoplysninger, der udfyldes ved berøring.</translation>
 <translation id="3653689374478248324">Du logger ind på <ph name="SITE_NAME" /></translation>
 <translation id="3950820424414687140">Log ind</translation>
+<translation id="5014228528537508015">Vil du logge ind på dette website?</translation>
 <translation id="5441504010984421144">Listen over loginoplysninger, der udfyldes ved berøring, er åbnet i fuld højde.</translation>
 <translation id="5624120631404540903">Administrer adgangskoder</translation>
 <translation id="804577341878669140">Fortsæt med konto</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fa.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fa.xtb
index ef61421..70efb87 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fa.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fa.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">فهرست اطلاعات کاربری که باید با لمس کردن تکمیل شود.</translation>
 <translation id="3653689374478248324">به سیستم <ph name="SITE_NAME" /> وارد خواهید شد</translation>
 <translation id="3950820424414687140">ورود به سیستم</translation>
+<translation id="5014228528537508015">به سیستم این سایت وارد می‌شوید؟</translation>
 <translation id="5441504010984421144">فهرست اطلاعات کاربری که باید با لمس کردن تکمیل شود کاملاً باز شد.</translation>
 <translation id="5624120631404540903">مدیریت گذرواژه‌ها</translation>
 <translation id="804577341878669140">ادامه دادن با حساب</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_gu.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_gu.xtb
index 816a5e0..e1f3a84 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_gu.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_gu.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Touch પર લૉગ ઇન વિગતો ભરવાની સૂચિ.</translation>
 <translation id="3653689374478248324">તમે <ph name="SITE_NAME" />માં સાઇન ઇન કરશો</translation>
 <translation id="3950820424414687140">સાઇન ઇન</translation>
+<translation id="5014228528537508015">આ સાઇટમાં સાઇન ઇન કરીએ?</translation>
 <translation id="5441504010984421144">Touch પર લૉગ ઇન વિગતો ભરવાની સૂચિ સંપૂર્ણ ઊંચાઈએ ખૂલી.</translation>
 <translation id="5624120631404540903">પાસવર્ડ્સનું સંચાલન કરો</translation>
 <translation id="804577341878669140">એકાઉન્ટ સાથે ચાલુ રાખો</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hu.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hu.xtb
index 7e7b99bc..9feff1a 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hu.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hu.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Az érintéssel kitöltendő hitelesítő adatok listája.</translation>
 <translation id="3653689374478248324">Bejelentkezik ide: <ph name="SITE_NAME" /></translation>
 <translation id="3950820424414687140">Bejelentkezés</translation>
+<translation id="5014228528537508015">Bejelentkezik ezen a webhelyen?</translation>
 <translation id="5441504010984421144">Az érintéssel kitöltendő hitelesítő adatok listája teljes magasságban megnyitva.</translation>
 <translation id="5624120631404540903">Jelszavak kezelése</translation>
 <translation id="804577341878669140">Folytatás ezzel a fiókkal</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb
index 30f35d3..10256cfb 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Daftar kredensial yang terisi dengan gestur sentuhan.</translation>
 <translation id="3653689374478248324">Anda akan login ke <ph name="SITE_NAME" /></translation>
 <translation id="3950820424414687140">Login</translation>
+<translation id="5014228528537508015">Login ke situs ini?</translation>
 <translation id="5441504010984421144">Daftar kredensial yang terisi dengan gestur sentuhan sedang terbuka sepenuhnya.</translation>
 <translation id="5624120631404540903">Kelola sandi</translation>
 <translation id="804577341878669140">Lanjutkan dengan akun</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_is.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_is.xtb
index 5ee10c00..1f2a7bbf 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_is.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_is.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Listi yfir innskráningarupplýsingar sem eru færðar inn við snertingu.</translation>
 <translation id="3653689374478248324">Þú skráir þig inn á <ph name="SITE_NAME" /></translation>
 <translation id="3950820424414687140">Skrá inn</translation>
+<translation id="5014228528537508015">Skrá inn á þetta vefsvæði?</translation>
 <translation id="5441504010984421144">Listi yfir innskráningarupplýsingar sem eru færðar inn við snertingu opinn í fullri hæð.</translation>
 <translation id="5624120631404540903">Stjórna aðgangsorðum</translation>
 <translation id="804577341878669140">Halda áfram með reikning</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ja.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ja.xtb
index 60c2740..5cba2d79 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ja.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ja.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">タップ操作で入力する認証情報のリスト。</translation>
 <translation id="3653689374478248324"><ph name="SITE_NAME" /> にログインします</translation>
 <translation id="3950820424414687140">ログイン</translation>
+<translation id="5014228528537508015">このサイトにログインしますか?</translation>
 <translation id="5441504010984421144">タップ操作で入力する認証情報のリストが画面全体に表示されています。</translation>
 <translation id="5624120631404540903">パスワードを管理</translation>
 <translation id="804577341878669140">次のアカウントで続行</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_kn.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_kn.xtb
index a80ff0b3..1f48e1f 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_kn.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_kn.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">ಸ್ಪರ್ಶಿಸಿ ಭರ್ತಿಮಾಡುವ ರುಜುವಾತುಗಳ ಪಟ್ಟಿ.</translation>
 <translation id="3653689374478248324">ನೀವು <ph name="SITE_NAME" /> ಗೆ ಸೈನ್ ಇನ್ ಮಾಡುತ್ತೀರಿ</translation>
 <translation id="3950820424414687140">ಸೈನ್ ಇನ್</translation>
+<translation id="5014228528537508015">ಈ ಸೈಟ್‌ಗೆ ಸೈನ್ ಇನ್ ಮಾಡುವುದೇ?</translation>
 <translation id="5441504010984421144">ಸ್ಪರ್ಶಿಸಿ ಭರ್ತಿಮಾಡುವ ರುಜುವಾತುಗಳ ಪಟ್ಟಿಯನ್ನು ಸಂಪೂರ್ಣ ಎತ್ತರದಲ್ಲಿ ತೆರೆಯಲಾಗಿದೆ.</translation>
 <translation id="5624120631404540903">ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation>
 <translation id="804577341878669140">ಖಾತೆ ಬಳಸಿಕೊಂಡು ಮುಂದುವರಿಸಿ</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb
index baf2709..8534108 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">터치 시 작성되는 사용자 인증 정보 목록입니다.</translation>
 <translation id="3653689374478248324"><ph name="SITE_NAME" />에 로그인합니다</translation>
 <translation id="3950820424414687140">로그인</translation>
+<translation id="5014228528537508015">사이트에 로그인하시겠습니까?</translation>
 <translation id="5441504010984421144">터치 시 작성되는 사용자 인증 정보 목록이 전체 높이로 열렸습니다.</translation>
 <translation id="5624120631404540903">비밀번호 관리</translation>
 <translation id="804577341878669140">계정을 사용하여 로그인</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ky.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ky.xtb
index 918e18ec..682f8fc 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ky.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ky.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Эсептик дайындардын басып коюп толтурула турган тизмеси.</translation>
 <translation id="3653689374478248324"><ph name="SITE_NAME" /> сайтына киресиз</translation>
 <translation id="3950820424414687140">Кирүү</translation>
+<translation id="5014228528537508015">Бул сайтка киресизби?</translation>
 <translation id="5441504010984421144">Эсептик дайындардын басып коюп толтурула турган тизмеси толугу менен ачылды.</translation>
 <translation id="5624120631404540903">Сырсөздөрдү башкаруу</translation>
 <translation id="804577341878669140">Аккаунт менен улантуу</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lo.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lo.xtb
index d0d5e3d..685cbb41 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lo.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lo.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">ລາຍການຂໍ້ມູນປະຈຳຕົວທີ່ຕ້ອງຕື່ມເມື່ອແຕະ.</translation>
 <translation id="3653689374478248324">ທ່ານຈະເຂົ້າສູ່ລະບົບຫາ <ph name="SITE_NAME" /></translation>
 <translation id="3950820424414687140">ລົງຊື່ເຂົ້າ​ໃຊ້</translation>
+<translation id="5014228528537508015">ເຂົ້າສູ່ລະບົບຫາເວັບໄຊນີ້ບໍ?</translation>
 <translation id="5441504010984421144">ລາຍການຂໍ້ມູນປະຈຳຕົວທີ່ຈະຕື່ມເມື່ອແຕະເປີດຢູ່ລະດັບລວງສູງເຕັມຈໍ.</translation>
 <translation id="5624120631404540903">ຈັດການລະ​ຫັດ​ຜ່ານ​</translation>
 <translation id="804577341878669140">ສືບຕໍ່ດ້ວຍບັນຊີ</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lt.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lt.xtb
index dc33e5b5..c41740d 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lt.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lt.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Prisijungimo duomenų, kuriuos galima užpildyti palietus, sąrašas.</translation>
 <translation id="3653689374478248324">Prisijungsite prie svetainės <ph name="SITE_NAME" /></translation>
 <translation id="3950820424414687140">Prisijungti</translation>
+<translation id="5014228528537508015">Prisijungti prie šios svetainės?</translation>
 <translation id="5441504010984421144">Prisijungimo duomenų, kuriuos galima užpildyti palietus, sąrašas atidarytas per visą ekrano aukštį.</translation>
 <translation id="5624120631404540903">Tvarkyti slaptažodžius</translation>
 <translation id="804577341878669140">Tęsti naudojant paskyrą</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lv.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lv.xtb
index abc45f09..c2f2a3e 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lv.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lv.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Pieskaroties aizpildāmo akreditācijas datu saraksts.</translation>
 <translation id="3653689374478248324">Jūs pierakstīsieties vietnē <ph name="SITE_NAME" /></translation>
 <translation id="3950820424414687140">Pierakstīties</translation>
+<translation id="5014228528537508015">Vai pierakstīties šajā vietnē?</translation>
 <translation id="5441504010984421144">Pieskaroties aizpildāmo akreditācijas datu saraksts ir atvērts pilna ekrāna augstumā.</translation>
 <translation id="5624120631404540903">Pārvaldīt paroles</translation>
 <translation id="804577341878669140">Lai turpinātu, apstipriniet kontu</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_nl.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_nl.xtb
index 5af0353f..f48d784 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_nl.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_nl.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">De lijst met gegevens die moeten worden ingevuld als je tikt.</translation>
 <translation id="3653689374478248324">Je logt in bij <ph name="SITE_NAME" /></translation>
 <translation id="3950820424414687140">Inloggen</translation>
+<translation id="5014228528537508015">Inloggen bij deze site?</translation>
 <translation id="5441504010984421144">De lijst met gegevens die moeten worden ingevuld als je tikt, is op volledige hoogte geopend.</translation>
 <translation id="5624120631404540903">Wachtwoorden beheren</translation>
 <translation id="804577341878669140">Doorgaan met dit account</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_or.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_or.xtb
index e33f66a..0e2cbda 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_or.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_or.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Touchରେ ପୂରଣ ହେବାକୁ ଥିବା କ୍ରେଡେନ୍‍ସିଆଲ୍‍ଗୁଡ଼ିକର ତାଲିକା।</translation>
 <translation id="3653689374478248324">ଆପଣ <ph name="SITE_NAME" />ରେ ସାଇନ ଇନ କରିବେ</translation>
 <translation id="3950820424414687140">ସାଇନ୍ ଇନ୍ କରନ୍ତୁ</translation>
+<translation id="5014228528537508015">ଏହି ସାଇଟରେ ସାଇନ ଇନ କରିବେ?</translation>
 <translation id="5441504010984421144">ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ୍‍‍ରେ ଖୋଲିଥିବା Touchରେ ପୂରଣ ହେବାକୁ ଥିବା କ୍ରେଡେନ୍‍ସିଆଲ୍‍ଗୁଡ଼ିକର ତାଲିକା।</translation>
 <translation id="5624120631404540903">ପାସ୍‌ୱର୍ଡଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ</translation>
 <translation id="804577341878669140">ଆକାଉଣ୍ଟ ସହ ଜାରି ରଖନ୍ତୁ</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pl.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pl.xtb
index 1e4806f..1beb113 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pl.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pl.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Lista uprawnień do wypełnienia po kliknięciu.</translation>
 <translation id="3653689374478248324">Zalogujesz się w witrynie <ph name="SITE_NAME" /></translation>
 <translation id="3950820424414687140">Zaloguj się</translation>
+<translation id="5014228528537508015">Chcesz się zalogować na tej stronie?</translation>
 <translation id="5441504010984421144">Lista uprawnień do wypełnienia po kliknięciu jest otwarta na całą wysokość.</translation>
 <translation id="5624120631404540903">Zarządzaj hasłami</translation>
 <translation id="804577341878669140">Kontynuuj na koncie</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ro.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ro.xtb
index 82a28cc..3881772 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ro.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ro.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Lista datelor de conectare care trebuie completate la atingere.</translation>
 <translation id="3653689374478248324">Te vei conecta la <ph name="SITE_NAME" /></translation>
 <translation id="3950820424414687140">Conectează-te</translation>
+<translation id="5014228528537508015">Te conectezi la acest site?</translation>
 <translation id="5441504010984421144">Lista datelor de conectare care trebuie completate la atingere este deschisă la înălțimea completă.</translation>
 <translation id="5624120631404540903">Gestionați parolele</translation>
 <translation id="804577341878669140">Accesează contul</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ru.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ru.xtb
index d7105fe..5863918 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ru.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ru.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Список учетных данных, которые можно ввести прикосновением.</translation>
 <translation id="3653689374478248324">Будет выполнен вход на сайте <ph name="SITE_NAME" /></translation>
 <translation id="3950820424414687140">Вход</translation>
+<translation id="5014228528537508015">Войти на сайт?</translation>
 <translation id="5441504010984421144">Список учетных данных, которые можно ввести прикосновением, развернут на весь экран.</translation>
 <translation id="5624120631404540903">Настройки паролей</translation>
 <translation id="804577341878669140">Вход с аккаунтом</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_si.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_si.xtb
index 504994e..b32331c 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_si.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_si.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">ස්පර්ශය මත පිරවිය යුතු අක්තපත්‍ර ලැයිස්තුව.</translation>
 <translation id="3653689374478248324">ඔබ <ph name="SITE_NAME" /> වෙත පුරනු ඇත</translation>
 <translation id="3950820424414687140">පුරන්න</translation>
+<translation id="5014228528537508015">මෙම අඩවියට පුරන්නද?</translation>
 <translation id="5441504010984421144">ස්පර්ශය මත පිරවිය යුතු අක්තපත්‍ර ලැයිස්තුව පූර්ණ උසින් විවෘත වී ඇත.</translation>
 <translation id="5624120631404540903">මුරපද පාලනය</translation>
 <translation id="804577341878669140">ගිණුම සමඟ ඉදිරියට යන්න</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sl.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sl.xtb
index 8a34ee1..80d6b95 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sl.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sl.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Seznam poverilnic, ki naj se izpolnijo ob dotiku.</translation>
 <translation id="3653689374478248324">Prijavili se boste na spletnem mestu <ph name="SITE_NAME" /></translation>
 <translation id="3950820424414687140">Prijava</translation>
+<translation id="5014228528537508015">Se želite prijaviti na tem spletnem mestu?</translation>
 <translation id="5441504010984421144">Seznam poverilnic, ki naj se izpolnijo ob dotiku, odprt pri polni višini.</translation>
 <translation id="5624120631404540903">Upravljanje gesel</translation>
 <translation id="804577341878669140">Nadaljujte z računom</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ta.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ta.xtb
index a13aaacb..a547832 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ta.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ta.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">தொட்டால் நிரப்பப்பட வேண்டிய அனுமதிச் சான்றுகளின் பட்டியல்.</translation>
 <translation id="3653689374478248324"><ph name="SITE_NAME" /> என்ற தளத்தில் உள்நுழைவீர்கள்</translation>
 <translation id="3950820424414687140">உள்நுழைக</translation>
+<translation id="5014228528537508015">இந்தத் தளத்தில் உள்நுழையவா?</translation>
 <translation id="5441504010984421144">தொட்டால் நிரப்பப்பட வேண்டிய அனுமதிச் சான்றுகளின் பட்டியல் முழுத் திரையில் திறக்கப்பட்டுள்ளது.</translation>
 <translation id="5624120631404540903">கடவுச்சொற்களை நிர்வகி</translation>
 <translation id="804577341878669140">இந்தக் கணக்கு மூலம் தொடர்க</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ur.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ur.xtb
index fa50b92b..5e260ac 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ur.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ur.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">ٹچ پر پُر کی جانے والی اسناد کی فہرست۔</translation>
 <translation id="3653689374478248324">آپ <ph name="SITE_NAME" /> میں سائن ان ہو جائیں گے</translation>
 <translation id="3950820424414687140">سائن ان کریں</translation>
+<translation id="5014228528537508015">اس سائٹ میں سائن ان کریں؟</translation>
 <translation id="5441504010984421144">ٹچ پر پُر کی جانے والی اسناد کی فہرست مکمل اونچائی پر کھلی ہوئی ہے۔</translation>
 <translation id="5624120631404540903">پاس ورڈز کا نظم کریں</translation>
 <translation id="804577341878669140">اکاؤنٹ کے ساتھ جاری رکھیں</translation>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zu.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zu.xtb
index 0524db2d..ce8ba7a 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zu.xtb
+++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zu.xtb
@@ -9,6 +9,7 @@
 <translation id="3399357656427473483">Uhlu lokuqinisekisa oluzogcwaliswa ekuthinteni.</translation>
 <translation id="3653689374478248324">Uzongena ngemvume ku-<ph name="SITE_NAME" /></translation>
 <translation id="3950820424414687140">Ngena ngemvume</translation>
+<translation id="5014228528537508015">Ngena ngemvume kule sayithi?</translation>
 <translation id="5441504010984421144">Uhlu lokuqinisekisa oluzogcwaliswa ekuthinteni livulwe ngobude obugcwele.</translation>
 <translation id="5624120631404540903">Phatha amaphasiwedi</translation>
 <translation id="804577341878669140">Siqhubeka ne-akhawunti</translation>
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 75592a8..efc65cf0 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -5133,6 +5133,8 @@
       sources += [
         "views/bluetooth_device_credentials_view.cc",
         "views/bluetooth_device_credentials_view.h",
+        "views/bluetooth_device_pair_confirm_view.cc",
+        "views/bluetooth_device_pair_confirm_view.h",
       ]
     }
 
diff --git a/chrome/browser/ui/android/overlay/overlay_window_android.cc b/chrome/browser/ui/android/overlay/overlay_window_android.cc
index 5583b0e..8644909 100644
--- a/chrome/browser/ui/android/overlay/overlay_window_android.cc
+++ b/chrome/browser/ui/android/overlay/overlay_window_android.cc
@@ -167,6 +167,8 @@
 void OverlayWindowAndroid::UpdateNaturalSize(const gfx::Size& natural_size) {
   if (java_ref_.is_uninitialized()) {
     video_size_ = natural_size;
+    // This isn't guaranteed to be right, but it's better than (0,0).
+    bounds_.set_size(natural_size);
     return;
   }
 
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
index b0f4f87c..6d062a4 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">ዕልባቶች እና የድር ታሪክ</translation>
 <translation id="1513814250881909472">የእርስዎን ትሮች ከሌሎች መሣሪያዎችዎ ለማግኘት ያስምሩ</translation>
 <translation id="1513858653616922153">የይለፍ ቃል ሰርዝ</translation>
+<translation id="1514552811327923157">የግላዊነት Sandbox ጥያቄ በሙሉ ቁመት ተከፍቷል</translation>
 <translation id="1518421282666914498">የስሜት GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">ገባሪ ዛሬ</translation>
 <translation id="1538801903729528855">በድር ላይ የተሻለ የድምፅ ተሞክሮ ያግኙ</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">ሙከራዎች</translation>
 <translation id="2718352093833049315">በWi-Fi ላይ ብቻ</translation>
 <translation id="2718846868787000099">በመረጡት ቋንቋዎች ውስጥ ይዘትን ለማሳየት፣ የሚጎበኟቸው ጣቢያዎች ምርጫዎችዎን ማየት ይችላሉ</translation>
+<translation id="2722945394406572875">የግላዊነት Sandbox ጥያቄ ተዘግቷል</translation>
 <translation id="2723001399770238859">ድምጽ</translation>
 <translation id="2732063072010454421">የተሻለ የድምፅ ተሞክሮ ያግኙ</translation>
 <translation id="2739256783402597439">2ጂ</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">የፈቃድ ጥያቄዎች</translation>
 <translation id="5355191726083956201">የተሻሻለ ጥበቃ በርቷል</translation>
 <translation id="5368227114232678694">በዚህ መሳሪያ ላይ በግል ለማሰስ፣ ማንነት የማያሳውቅን ይሞክሩ</translation>
+<translation id="5371717687506906963">የግላዊነት Sandbox ጥያቄ</translation>
 <translation id="5375577065097716013">በ Google ሌንስ <ph name="BEGIN_NEW" />አዲስ<ph name="END_NEW" /> ምስል ይፈልጉ</translation>
 <translation id="5376898820269806588">ምላሽ ተቀይሯል</translation>
 <translation id="5401851137404501592">ለመቀጠል <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> የእርስዎን ስም፣ ኢሜይል አድራሻ እና የመገለጫ ሥዕል ለዚህ ጣቢያ ያጋራል።</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">የጣቢያዎችን ዩአርኤሎች ማወቅ Google ረዳት ስራዎችን እንዲያጠናቅቁ እንዲያግዘዎት ያስችለዋል። ረዳትን በChrome ቅንብሮች ላይ ማጥፋት ይችላሉ።</translation>
 <translation id="5916664084637901428">በርቷል</translation>
 <translation id="5919204609460789179">ስምረትን ለመጀመር <ph name="PRODUCT_NAME" />ን ያዘምኑ</translation>
+<translation id="593625682991400408">በሙከራዎች ጊዜ Chrome አይፈለጌ መልዕክትን፣ ማጭበርበርን እና በጣቢያዎች መካከል መጋራትን የሚገድብባቸውን መንገዶች ያስሳል። Chrome እንዲሁም ጣቢያዎች ማስታወቂያዎችን ለእርስዎ ለማሳየት ሊጠቀሙባቸው የሚችሏቸውን <ph name="BEGIN_LINK" />የእርስዎን ዝንባሌዎች ይገምታል<ph name="END_LINK" />። የእርስዎን ዝንባሌዎች በቅንብሮች ውስጥ ማቀናበር ይችላሉ።</translation>
 <translation id="5938820472109305350"><ph name="INTEREST" />ን አክል</translation>
 <translation id="5942872142862698679">ለፍለጋ Googleን መጠቀም</translation>
 <translation id="5945035219773565305">የአሁኑ ምክር፦  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">የዕልባት ማስቀመጥ ፍሰት ተዘግቷል</translation>
 <translation id="9108312223223904744">ስልክ እንደ የደህንነት ቁልፍ ድጋፍ</translation>
 <translation id="9108808586816295166">ደህንነቱ የተጠበቀ ዲኤንኤስ ሁልጊዜ ሊገኝ የሚችል ላይሆን ይችላል</translation>
+<translation id="9128984223251192329">የግላዊነት Sandbox ጥያቄ በግማሽ ቁመት ተከፍቷል</translation>
 <translation id="9133397713400217035">ከመስመር ውጭ ያስሱ</translation>
 <translation id="9137013805542155359">የመጀመሪያውን አሳይ</translation>
 <translation id="9148126808321036104">እንደገና ይግቡ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
index 89cd8da..b42ef6bc 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">الإشارات المرجعية وسجلّ الويب</translation>
 <translation id="1513814250881909472">يمكنك تفعيل المزامنة للحصول على علامات التبويب من أجهزتك الأخرى.</translation>
 <translation id="1513858653616922153">حذف كلمة المرور</translation>
+<translation id="1514552811327923157">تم فتح إشعار "مبادرة حماية الخصوصية" بطول الشاشة.</translation>
 <translation id="1518421282666914498">‏رمز تعبيري بتنسيق GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">نشط اليوم</translation>
 <translation id="1538801903729528855">الحصول على تجربة صوت أفضل على الإنترنت</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">الإصدارات التجريبية</translation>
 <translation id="2718352093833049315">‏باستخدام شبكة Wi-Fi فقط</translation>
 <translation id="2718846868787000099">يمكن للمواقع التي تزورها الاطّلاع على إعداداتك المفضّلة لتتمكن من عرض المحتوى بلغاتك المفضّلة.</translation>
+<translation id="2722945394406572875">تم إغلاق إشعار "مبادرة حماية الخصوصية".</translation>
 <translation id="2723001399770238859">الصوت</translation>
 <translation id="2732063072010454421">تحسين تجربة البحث الصوتي</translation>
 <translation id="2739256783402597439">شبكة الجيل الثاني</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">طلبات الإذن</translation>
 <translation id="5355191726083956201">الحماية المُحسّنة مفعّلة.</translation>
 <translation id="5368227114232678694">للتصفّح بخصوصية تامّة على هذا الجهاز، يمكنك استخدام وضع التصفّح المتخفي.</translation>
+<translation id="5371717687506906963">إشعار "مبادرة حماية الخصوصية"</translation>
 <translation id="5375577065097716013">‏ابحث في الصور عبر "عدسة Google‏" <ph name="BEGIN_NEW" />جديد<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">تم تغيير الرمز التعبيري للتفاعل.</translation>
 <translation id="5401851137404501592">للمتابعة، سيشارك <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> اسمك وعنوان بريدك الإلكتروني وصورة ملفك الشخصي مع هذا الموقع الإلكتروني.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">‏عند معرفة عناوين URL الخاصة بالمواقع الإلكترونية، يَسهُل على "مساعد Google" مساعدتك في إكمال المهام. ويمكنك إيقاف "مساعد Google" في إعدادات Chrome.</translation>
 <translation id="5916664084637901428">مفعّل</translation>
 <translation id="5919204609460789179">تحديث <ph name="PRODUCT_NAME" /> لبدء المزامنة</translation>
+<translation id="593625682991400408">‏يعمل Chrome خلال الفترات التجريبية على إيجاد طرق للحد من المحتوى غير المرغوب فيه وعمليات الاحتيال وعمليات مشاركة البيانات بين المواقع الإلكترونية. ويقدِّم Chrome أيضًا <ph name="BEGIN_LINK" />تقديرات حول اهتماماتك<ph name="END_LINK" /> التي يمكن للمواقع الإلكترونية استخدامها لعرض إعلانات لك. ويمكنك إدارة اهتماماتك من خلال الإعدادات.</translation>
 <translation id="5938820472109305350">إضافة <ph name="INTEREST" /></translation>
 <translation id="5942872142862698679">‏استخدام محرك Google للبحث</translation>
 <translation id="5945035219773565305">الاقتراح الحالي:  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">تم إغلاق مسار حفظ الإشارات المرجعية.</translation>
 <translation id="9108312223223904744">إتاحة استخدام الهاتف كمفتاح أمان</translation>
 <translation id="9108808586816295166">قد لا يكون نظام أسماء النطاقات الآمن متاحًا طوال الوقت.</translation>
+<translation id="9128984223251192329">تم فتح إشعار "مبادرة حماية الخصوصية" في نصف الشاشة.</translation>
 <translation id="9133397713400217035">الاطّلاع بلا اتصال بالإنترنت</translation>
 <translation id="9137013805542155359">إظهار الصفحة الأصلية</translation>
 <translation id="9148126808321036104">تسجيل الدخول مرة أخرى</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
index 3d6e9dc..6ac13f5 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">বুকমার্কবোৰ আৰু ৱেব ইতিহাস</translation>
 <translation id="1513814250881909472">আপোনাৰ অন্য ডিভাইচৰ পৰা নিজৰ টেবসমূহ পাবলৈ ছিংক কৰক</translation>
 <translation id="1513858653616922153">পাছৱৰ্ড মচক</translation>
+<translation id="1514552811327923157">গোপনীয়তা বিষয়ক ছেণ্ডবক্সৰ প্ৰম্প্‌টটো সম্পূৰ্ণ উচ্চতাত খোলা হৈছে</translation>
 <translation id="1518421282666914498">আৱেগ দেখুওৱা GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">আজি সক্ৰিয় হৈছে</translation>
 <translation id="1538801903729528855">ৱেবত এটা উন্নত কণ্ঠধ্বনিৰ অভিজ্ঞতা লাভ কৰক</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">ট্ৰায়েল</translation>
 <translation id="2718352093833049315">কেৱল ৱাই-ফাইত</translation>
 <translation id="2718846868787000099">আপুনি অগ্ৰাধিকাৰ দিয়া ভাষাত সমল দেখুৱাবলৈ আপুনি চোৱা ছাইটসমূহে আপোনাৰ অগ্ৰাধিকাৰসমূহ চাব পাৰে</translation>
+<translation id="2722945394406572875">গোপনীয়তা বিষয়ক ছেণ্ডবক্সৰ প্ৰম্প্‌টটো বন্ধ কৰা হৈছে</translation>
 <translation id="2723001399770238859">অডিঅ’</translation>
 <translation id="2732063072010454421">এটা উন্নত কণ্ঠধ্বনিৰ অভিজ্ঞতা লাভ কৰক</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">অনুমতিৰ অনুৰোধবোৰ</translation>
 <translation id="5355191726083956201">বৰ্ধিত সুৰক্ষা অন আছে</translation>
 <translation id="5368227114232678694">এই ব্ৰাউজাৰটোত ব্যক্তিগতভাৱে ব্ৰাউজ কৰিবলৈ, ইনক’গনিট’ টেবটো ব্যৱহাৰ কৰি চাওক</translation>
+<translation id="5371717687506906963">গোপনীয়তা বিষয়ক ছেণ্ডবক্সৰ প্ৰম্প্‌ট</translation>
 <translation id="5375577065097716013">Google Lensৰে প্ৰতিচ্ছবি সন্ধান কৰক <ph name="BEGIN_NEW" />নতুন<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">প্ৰতিক্ৰিয়া সলনি কৰা হৈছে</translation>
 <translation id="5401851137404501592">অব্যাহত ৰাখিবলৈ, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" />এ আপোনাৰ নাম, ইমেইল, ঠিকনা আৰু প্ৰ’ফাইল চিত্ৰ এই ছাইটটোৰ সৈতে শ্বেয়াৰ কৰিব।</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">ছাইটৰ URL জনাটোৱে Google Assistantক কার্য সম্পূর্ণ কৰাৰ ক্ষেত্ৰত আপোনাক সহায় কৰিবলৈ দিয়ে। আপুনি Chromeৰ ছেটিঙত Assistant অফ কৰিব পাৰে।</translation>
 <translation id="5916664084637901428">অন আছে</translation>
 <translation id="5919204609460789179">ছিংক আৰম্ভ কৰিবলৈ <ph name="PRODUCT_NAME" /> আপডে'ট কৰক</translation>
+<translation id="593625682991400408">ট্ৰায়েলৰ সময়ত Chromeএ স্পাম, প্ৰৱঞ্চনা আৰু ছাইটৰ মাজত শ্বেয়াৰ কৰাটো সীমিত কৰাৰ উপায় বিচাৰি আছে। Chromeএ <ph name="BEGIN_LINK" />আপোনাৰ আগ্ৰহসমূহো অনুমান কৰে<ph name="END_LINK" /> যাক ছাইটসমূহে আপোনাক বিজ্ঞাপন দেখুৱাবলৈ ব্যৱহাৰ কৰিব পাৰে। ছেটিঙত আপুনি আপোনাৰ আগ্ৰহ পৰিচালনা কৰিব পাৰে।</translation>
 <translation id="5938820472109305350"><ph name="INTEREST" /> যোগ দিয়ক</translation>
 <translation id="5942872142862698679">সন্ধান কৰিবলৈ Google ব্যৱহাৰ কৰি থকা হৈছে</translation>
 <translation id="5945035219773565305">বৰ্তমানৰ চুপাৰিছ:  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">বুকমাৰ্ক ছেভ কৰাৰ ফ্ল’ বন্ধ আছে</translation>
 <translation id="9108312223223904744">এটা সুৰক্ষা সম্পৰ্কীয় চাবিৰ সহায় হিচাপে ফ’ন</translation>
 <translation id="9108808586816295166">সকলো সময়তে সুৰক্ষিত DNS উপলব্ধ নহ'ব পাৰে</translation>
+<translation id="9128984223251192329">গোপনীয়তা বিষয়ক ছেণ্ডবক্সৰ প্ৰম্প্‌টটো অৰ্ধ উচ্চতাত খোলা হৈছে</translation>
 <translation id="9133397713400217035">অফলাইন অৱস্থাত অন্বেষণ কৰক</translation>
 <translation id="9137013805542155359">মূল সংস্কৰণ দেখুৱাওক</translation>
 <translation id="9148126808321036104">আকৌ ছাইন ইন কৰক</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
index c085592..6bf4f48 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">Əlfəcin və veb tarixçəsi</translation>
 <translation id="1513814250881909472">Tablarınızı digər cihazlarınızdan əldə etmək üçün sinxronizasiya edin</translation>
 <translation id="1513858653616922153">Parolu silin</translation>
+<translation id="1514552811327923157">Məxfilik Sendboksu göstərişi tam hündürlükdə açılıb</translation>
 <translation id="1518421282666914498">Emosiya GIF'i: <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">Bu gün aktivdir</translation>
 <translation id="1538801903729528855">Vebdə daha yaxşı səs təcrübəsi əldə edin</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">Sınaqlar</translation>
 <translation id="2718352093833049315">Yalnız Wi-Fi üzərindən</translation>
 <translation id="2718846868787000099">Tərcih etdiyiniz dillərdə məzmunu göstərmək üçün ziyarət etdiyiniz saytlar tərcihlərinizi görə bilər</translation>
+<translation id="2722945394406572875">Məxfilik Sendboksu göstərişi bağlanıb</translation>
 <translation id="2723001399770238859">audio</translation>
 <translation id="2732063072010454421">Daha yaxşı səs təcrübəsi əldə edin</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">İcazə sorğuları</translation>
 <translation id="5355191726083956201">Qabaqcıl Qoruma aktivdir</translation>
 <translation id="5368227114232678694">Bu cihazda məxfi şəkildə axtarış etmək üçün Anonim rejimi sınayın</translation>
+<translation id="5371717687506906963">Məxfilik Sendboksu göstərişi</translation>
 <translation id="5375577065097716013">Google Linza ilə şəkil axtarın <ph name="BEGIN_NEW" />Yeni<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Reaksiya dəyişdirilib</translation>
 <translation id="5401851137404501592">Davam etmək üçün <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ad, e-poçt ünvanı və profil şəklinizi bu sayt ilə paylaşacaq.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">Saytların URL-lərini bilmək Google Assistentə tapşırıqları yerinə yetirməkdə sizə kömək etmək imkanı verir. Assistenti Chrome ayarlarında deaktiv edə bilərsiniz.</translation>
 <translation id="5916664084637901428">Aktiv</translation>
 <translation id="5919204609460789179">Sinxronizasiyanı başlatmaq üçün <ph name="PRODUCT_NAME" /> məhsulunu yeniləyin</translation>
+<translation id="593625682991400408">Sınaqlar zamanı Chrome spam, fırıldaqçılıq və saytlar arasında paylaşımı məhdudlaşdırmaq yollarını araşdırır. Chrome həmçinin saytların sizə reklam göstərmək üçün istifadə edə biləcəyi <ph name="BEGIN_LINK" />maraqlarınızı təxmin edir<ph name="END_LINK" />. Maraqlarınızı Ayarlarda idarə edə bilərsiniz.</translation>
 <translation id="5938820472109305350"><ph name="INTEREST" /> əlavə edin</translation>
 <translation id="5942872142862698679">Axtarış üçün Google istifadə edilir</translation>
 <translation id="5945035219773565305">Cari tövsiyə: <ph name="RECOMMENDATION" /></translation>
@@ -1510,6 +1514,7 @@
 <translation id="9106148373857059373">Əlfəcin saxlama prosesi bağlanıb</translation>
 <translation id="9108312223223904744">Təhlükəsizlik Açarı Dəstəyi kimi telefon</translation>
 <translation id="9108808586816295166">Təhlükəsiz DNS hər zaman əlçatan olmaya bilər</translation>
+<translation id="9128984223251192329">Məxfilik Sendboksu göstərişi yarı hündürlükdə açılıb</translation>
 <translation id="9133397713400217035">Oflayn araşdırın</translation>
 <translation id="9137013805542155359">Originalı göstərin</translation>
 <translation id="9148126808321036104">Yenidən daxil olun</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
index fbdd0ec1..624a11c7 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">Adreces interès i historial web</translation>
 <translation id="1513814250881909472">Sincronitza per obtenir les pestanyes dels teus altres dispositius</translation>
 <translation id="1513858653616922153">Suprimeix la contrasenya</translation>
+<translation id="1514552811327923157">La sol·licitud de Privacy Sandbox s'ha obert a alçada completa</translation>
 <translation id="1518421282666914498">GIF d'emocions <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">Actiu avui</translation>
 <translation id="1538801903729528855">Gaudeix d'una millor experiència de veu al web</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">Proves</translation>
 <translation id="2718352093833049315">Només amb Wi-Fi</translation>
 <translation id="2718846868787000099">Els llocs web que visites poden veure les teves preferències per mostrar-te contingut en els teus idiomes preferits</translation>
+<translation id="2722945394406572875">S'ha tancat la sol·licitud de Privacy Sandbox</translation>
 <translation id="2723001399770238859">àudio</translation>
 <translation id="2732063072010454421">Gaudeix d'una experiència de veu millor</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">Sol·licituds de permís</translation>
 <translation id="5355191726083956201">Està activada la protecció millorada</translation>
 <translation id="5368227114232678694">Per navegar de manera privada en aquest dispositiu, prova el mode d'incògnit</translation>
+<translation id="5371717687506906963">Sol·licitud de Privacy Sandbox</translation>
 <translation id="5375577065097716013">Cerca la imatge amb Lens <ph name="BEGIN_NEW" />Novetat<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">La reacció s'ha canviat</translation>
 <translation id="5401851137404501592">Per continuar, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> compartirà el teu nom, la teva adreça electrònica i la teva foto de perfil amb aquest lloc web.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">Saber els URL dels llocs web permet que l'Assistent de Google t'ajudi a completar tasques. Pots desactivar l'Assistent a la configuració de Chrome.</translation>
 <translation id="5916664084637901428">Activat</translation>
 <translation id="5919204609460789179">Actualitza <ph name="PRODUCT_NAME" /> per iniciar la sincronització</translation>
+<translation id="593625682991400408">Durant les proves, Chrome explora maneres de limitar el contingut brossa, el frau i la compartició entre llocs web. També <ph name="BEGIN_LINK" />estima els teus interessos<ph name="END_LINK" />, que els llocs web poden utilitzar per mostrar-te anuncis. Pots gestionar els teus interessos a la configuració.</translation>
 <translation id="5938820472109305350">Afegeix <ph name="INTEREST" /></translation>
 <translation id="5942872142862698679">S'utilitza Google per a la cerca</translation>
 <translation id="5945035219773565305">Recomanació actual: <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">Flux per desar l'adreça d'interès tancat</translation>
 <translation id="9108312223223904744">el telèfon com a clau de seguretat</translation>
 <translation id="9108808586816295166">És possible que el DNS segur no estigui disponible en tot moment</translation>
+<translation id="9128984223251192329">La sol·licitud de Privacy Sandbox s'ha obert a mitja alçada</translation>
 <translation id="9133397713400217035">Explora sense connexió</translation>
 <translation id="9137013805542155359">Mostra l'original</translation>
 <translation id="9148126808321036104">Torna a iniciar la sessió</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
index 5f8e861..41ca19d 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">Bogmærker og webhistorik</translation>
 <translation id="1513814250881909472">Synkroniser for at få dine faner fra dine andre enheder</translation>
 <translation id="1513858653616922153">Slet adgangskoden</translation>
+<translation id="1514552811327923157">Privacy Sandbox-meddelelsen er åbnet i fuld højde</translation>
 <translation id="1518421282666914498">Følelses-gif <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">Aktiv i dag</translation>
 <translation id="1538801903729528855">Få en bedre stemmestyret brugeroplevelse på nettet</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">Prøveperioder</translation>
 <translation id="2718352093833049315">Kun på Wi-Fi</translation>
 <translation id="2718846868787000099">For at vise indhold på dine foretrukne sprog kan de websites, du besøger, se dine præferencer</translation>
+<translation id="2722945394406572875">Privacy Sandbox-meddelelsen er lukket</translation>
 <translation id="2723001399770238859">lyd</translation>
 <translation id="2732063072010454421">Få en bedre brugeroplevelse med stemmesøgning</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">Anmodninger om tilladelse</translation>
 <translation id="5355191726083956201">Forbedret beskyttelse er aktiveret</translation>
 <translation id="5368227114232678694">Hvis du vil bruge nettet privat på denne enhed, kan du prøve at bruge inkognitotilstand</translation>
+<translation id="5371717687506906963">Privacy Sandbox-meddelelse</translation>
 <translation id="5375577065097716013">Søg efter billedet med Google Lens <ph name="BEGIN_NEW" />Nyhed<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Reaktionen er ændret</translation>
 <translation id="5401851137404501592">For at fortsætte deler <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> dit navn, din mailadresse, og dit profilbillede med dette website.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">Hvis Google Assistent får indsigt i sidernes webadresser, kan du få hjælp med at udføre opgaver. Du kan deaktivere Assistent i indstillingerne for Chrome.</translation>
 <translation id="5916664084637901428">Til</translation>
 <translation id="5919204609460789179">Opdater <ph name="PRODUCT_NAME" /> for at starte synkroniseringen</translation>
+<translation id="593625682991400408">Under prøveperioder kigger Chrome nærmere på, hvordan spam, svindel og deling mellem websites kan begrænses. Chrome <ph name="BEGIN_LINK" />estimerer også dine interesser<ph name="END_LINK" />, som websites kan bruge til at vise dig annoncer. Du kan administrere dine interesser i indstillingerne.</translation>
 <translation id="5938820472109305350">Tilføj <ph name="INTEREST" /></translation>
 <translation id="5942872142862698679">Søgning via Google</translation>
 <translation id="5945035219773565305">Aktuel anbefaling:  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">Flow til lagring af bogmærker er lukket</translation>
 <translation id="9108312223223904744">Understøttelse af telefonen som en sikkerhedsnøgle</translation>
 <translation id="9108808586816295166">Sikre DNS-servere er muligvis ikke altid tilgængelige</translation>
+<translation id="9128984223251192329">Privacy Sandbox-meddelelsen er åbnet i halv højde</translation>
 <translation id="9133397713400217035">Udforsk offline</translation>
 <translation id="9137013805542155359">Vis oprindelig</translation>
 <translation id="9148126808321036104">Log ind igen</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
index eaf7be9..f191f96 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">نشانک‌ها و سابقه وب</translation>
 <translation id="1513814250881909472">برای دریافت برگه‌هایتان از دستگاه‌های دیگر، همگام‌سازی کنید</translation>
 <translation id="1513858653616922153">حذف گذرواژه</translation>
+<translation id="1514552811327923157">درخواست «جعبه ایمنی حریم خصوصی» به‌صورت کامل باز شده است</translation>
 <translation id="1518421282666914498">‏فایل شکلک GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">امروز فعال بود</translation>
 <translation id="1538801903729528855">تجربه گفتاری بهتری در وب داشته باشید</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">دوره‌های آزمایشی</translation>
 <translation id="2718352093833049315">‏فقط در Wi-Fi</translation>
 <translation id="2718846868787000099">برای نشان دادن محتوا به زبان‌های دلخواهتان، سایت‌هایی که بازدید می‌کنید می‌توانند اولویت‌هایتان را ببینند</translation>
+<translation id="2722945394406572875">درخواست «جعبه ایمنی حریم خصوصی» بسته شد</translation>
 <translation id="2723001399770238859">صدا</translation>
 <translation id="2732063072010454421">صدای بهتری را تجربه کنید</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">درخواست‌های مجوز</translation>
 <translation id="5355191726083956201">«محافظت بهبودیافته» روشن است</translation>
 <translation id="5368227114232678694">برای مرور خصوصی در این دستگاه،‌ حالت «ناشناس» را امتحان کنید</translation>
+<translation id="5371717687506906963">درخواست «جعبه ایمنی حریم خصوصی»</translation>
 <translation id="5375577065097716013">‏جستجوی تصویر با «لنز Google» <ph name="BEGIN_NEW" />جدید<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">واکنش تغییر کرد</translation>
 <translation id="5401851137404501592">برای ادامه دادن، <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> نام، نشانی ایمیل، و عکس نمایه‌تان را با این سایت هم‌رسانی خواهد کرد.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">‏دانستن نشانی وب‌سایت‌ها به «دستیار Google» امکان می‌دهد در تکمیل تکالیف به شما کمک کند. می‌توانید «دستیار» را در «تنظیمات Chrome» خاموش کنید.</translation>
 <translation id="5916664084637901428">روشن</translation>
 <translation id="5919204609460789179">برای شروع همگام‌سازی، <ph name="PRODUCT_NAME" /> را به‌روزرسانی کنید</translation>
+<translation id="593625682991400408">‏در طول دوره آزمایشی، Chrome به‌کاوش راه‌هایی برای محدود کردن هرزنامه، کلاهبرداری، و هم‌رسانی بین سایت‌ها مشغول خواهد بود. Chrome همچنین <ph name="BEGIN_LINK" />علایقتان را تخمین می‌زند<ph name="END_LINK" /> که سایت‌ها می‌توانند براساس آن‌ها به شما آگهی نشان دهند. می‌توانید علایقتان را در تنظیمات مدیریت کنید.</translation>
 <translation id="5938820472109305350">افزودن <ph name="INTEREST" /></translation>
 <translation id="5942872142862698679">‏استفاده از Google برای جستجو</translation>
 <translation id="5945035219773565305">توصیه کنونی:  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">جریان ذخیره نشانک بسته شده است</translation>
 <translation id="9108312223223904744">«تلفن» به‌عنوان «پشتیبان کلید امنیتی»</translation>
 <translation id="9108808586816295166">‏ممکن است DNS ایمن همیشه در دسترس نباشد</translation>
+<translation id="9128984223251192329">درخواست «جعبه ایمنی حریم خصوصی» به‌صورت نیمه باز شده است</translation>
 <translation id="9133397713400217035">کاوش درحالت آفلاین</translation>
 <translation id="9137013805542155359">نمایش مورد اصلی</translation>
 <translation id="9148126808321036104">ورود مجدد به سیستم</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
index 24d57a6..a1c6ba332 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">બુકમાર્ક અને વેબ ઇતિહાસ</translation>
 <translation id="1513814250881909472">તમારા અન્ય ડિવાઇસમાંની તમારી બધી ટૅબ મેળવવા માટે, સિંક કરો</translation>
 <translation id="1513858653616922153">પાસવર્ડ ડિલીટ કરો</translation>
+<translation id="1514552811327923157">પ્રાઇવસી સૅન્ડબૉક્સનો સંકેત પૂરી ઊંચાઈએ ખોલ્યો</translation>
 <translation id="1518421282666914498">મનોભાવ GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">આજે સક્રિય છે</translation>
 <translation id="1538801903729528855">વેબ પર બહેતર વૉઇસ અનુભવ મેળવો</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">અજમાયશો</translation>
 <translation id="2718352093833049315">ફક્ત વાઇ-ફાઇ પર</translation>
 <translation id="2718846868787000099">તમારી પસંદગીની ભાષાઓમાં કન્ટેન્ટ બતાવવા માટે, તમે મુલાકાત લો તે સાઇટ તમારી પસંદગીઓ જોઈ શકશે</translation>
+<translation id="2722945394406572875">પ્રાઇવસી સૅન્ડબૉક્સનો સંકેત બંધ કર્યો</translation>
 <translation id="2723001399770238859">ઑડિઓ</translation>
 <translation id="2732063072010454421">વૉઇસનો બહેતર અનુભવ મેળવો</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">પરવાનગીની વિનંતી કરી</translation>
 <translation id="5355191726083956201">વિગતવાર સુરક્ષા ચાલુ છે</translation>
 <translation id="5368227114232678694">આ ડિવાઇસ પર ખાનગી રીતે બ્રાઉઝ કરવા માટે, છૂપો મોડ અજમાવી જુઓ</translation>
+<translation id="5371717687506906963">પ્રાઇવસી સૅન્ડબૉક્સનો સંકેત</translation>
 <translation id="5375577065097716013">Google Lens વડે છબી શોધો <ph name="BEGIN_NEW" />નવું<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">પ્રતિક્રિયા બદલાઈ ગઈ</translation>
 <translation id="5401851137404501592">આગળ વધવા માટે, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> તમારું નામ, ઇમેઇલ ઍડ્રેસ અને પ્રોફાઇલ ફોટો આ સાઇટ સાથે શેર કરશે.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">જો Google Assistant URLs જાણતું હોય, તો તે કાર્યો પૂર્ણ કરવામાં સહાય કરી શકે છે. તમે Assistantને Chromeના સેટિંગમાં બંધ કરી શકો છો.</translation>
 <translation id="5916664084637901428">ચાલુ</translation>
 <translation id="5919204609460789179">સમન્વયન પ્રારંભ કરવા માટે <ph name="PRODUCT_NAME" /> અપડેટ કરો</translation>
+<translation id="593625682991400408">અજમાયશોની અવધિ દરમિયાન, Chrome સ્પામ, કપટ અને સાઇટ વચ્ચેના શેરિંગને મર્યાદિત કરવાની રીતોની શોધખોળ કરી રહ્યું છે. Chrome તમને જાહેરાતો બતાવવા માટે સાઇટ જેનો ઉપયોગ કરી શકે, એવી <ph name="BEGIN_LINK" />તમારી રુચિઓનું અનુમાન પણ લગાવે છે<ph name="END_LINK" />. સેટિંગમાં જઈને તમે તમારી રુચિઓ મેનેજ કરી શકો છો.</translation>
 <translation id="5938820472109305350"><ph name="INTEREST" /> ઉમેરો</translation>
 <translation id="5942872142862698679">શોધવા માટે Googleનો ઉપયોગ કરી રહ્યાં છે</translation>
 <translation id="5945035219773565305">હાલનો સુઝાવ:  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">બુકમાર્ક સાચવવાનો ફ્લો બંધ છે</translation>
 <translation id="9108312223223904744">સિક્યુરિટી કી તરીકે ફોનનો ઉપયોગ</translation>
 <translation id="9108808586816295166">સુરક્ષિત DNS હંમેશાં ઉપલબ્ધ ન હોઈ શકે</translation>
+<translation id="9128984223251192329">પ્રાઇવસી સૅન્ડબૉક્સનો સંકેત અડધી ઊંચાઈએ ખોલ્યો</translation>
 <translation id="9133397713400217035">ઑફલાઇનમાં શોધખોળ કરો</translation>
 <translation id="9137013805542155359">મૂળ બતાવો</translation>
 <translation id="9148126808321036104">ફરીથી સાઇન ઇન કરો </translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
index dd77e0a..e893838b 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">Könyvjelzők és webes előzmények</translation>
 <translation id="1513814250881909472">Szinkronizáljon, hogy hozzájusson a többi eszközén megnyitott lapokhoz</translation>
 <translation id="1513858653616922153">Jelszó törlése</translation>
+<translation id="1514552811327923157">A Privacy Sandbox üzenete teljes magasságban megnyitva</translation>
 <translation id="1518421282666914498">Hangulat GIF (<ph name="CURRENT_DATE_ISO" />)</translation>
 <translation id="1521774566618522728">Ma volt aktív</translation>
 <translation id="1538801903729528855">Jobb felhasználói élmény a weben hangalapú keresésnél</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">Próbaidőszakok</translation>
 <translation id="2718352093833049315">Csak Wi-Fi-n</translation>
 <translation id="2718846868787000099">A felkeresett webhelyek láthatják az Ön preferenciáit, hogy a kívánt nyelveken jeleníthessék meg a tartalmakat</translation>
+<translation id="2722945394406572875">A Privacy Sandbox üzenete bezárult</translation>
 <translation id="2723001399770238859">audio</translation>
 <translation id="2732063072010454421">Jobb hangalapú élményben lehet része</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">Engedélykérések</translation>
 <translation id="5355191726083956201">A Speciális védelem be van kapcsolva</translation>
 <translation id="5368227114232678694">Ha privát böngészést szeretne végezni ezen az eszközön, próbálja ki az Inkognitó módot</translation>
+<translation id="5371717687506906963">A Privacy Sandbox üzenete</translation>
 <translation id="5375577065097716013">Képkeresés – Google Lens <ph name="BEGIN_NEW" />Új<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Reakció módosítva</translation>
 <translation id="5401851137404501592">A folytatáshoz a(z) <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> megosztja az Ön nevét, e-mail-címét és profilképét ezzel a webhellyel.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">A webhelyek URL-jeinek ismerete lehetővé teszi a Google Segédnek, hogy segítsen bizonyos műveletek elvégzésében. A Segédet a Chrome beállításai között kapcsolhatja ki.</translation>
 <translation id="5916664084637901428">Be</translation>
 <translation id="5919204609460789179">A szinkronizálás megkezdéséhez frissítse a következőt: <ph name="PRODUCT_NAME" /></translation>
+<translation id="593625682991400408">A próbaidőszakok során a Chrome a spam, a csalás és a webhelyek közötti megosztás korlátozására szolgáló módszereket próbál ki. A Chrome emellett <ph name="BEGIN_LINK" />meghatározza az Ön érdeklődési köreit<ph name="END_LINK" />, amelyeket más webhelyek arra használhatnak fel, hogy hirdetéseket jelenítsenek meg Önnek. Érdeklődési köreit a beállításokban kezelheti.</translation>
 <translation id="5938820472109305350"><ph name="INTEREST" /> hozzáadása</translation>
 <translation id="5942872142862698679">A Google használata a kereséshez</translation>
 <translation id="5945035219773565305">Aktuális javaslat:  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">A könyvjelzőmentési folyamat lezárult</translation>
 <translation id="9108312223223904744">Telefon a biztonsági hardverkulcs támogatásaként</translation>
 <translation id="9108808586816295166">Előfordulhat, hogy a biztonságos DNS nem mindig áll rendelkezésre</translation>
+<translation id="9128984223251192329">A Privacy Sandbox üzenete félmagasságban megnyitva</translation>
 <translation id="9133397713400217035">Offline felfedezés</translation>
 <translation id="9137013805542155359">Eredeti megjelenítése</translation>
 <translation id="9148126808321036104">Jelentkezzen be újra</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
index bfc43520..7e28051 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">Bookmark dan histori web</translation>
 <translation id="1513814250881909472">Sinkronkan untuk mengakses tab Anda dari perangkat lainnya</translation>
 <translation id="1513858653616922153">Hapus sandi</translation>
+<translation id="1514552811327923157">Perintah Privacy Sandbox terbuka sepenuhnya</translation>
 <translation id="1518421282666914498">GIF Emotikon <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">Aktif hari ini</translation>
 <translation id="1538801903729528855">Dapatkan pengalaman penelusuran suara yang lebih baik di web</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">Uji coba</translation>
 <translation id="2718352093833049315">Hanya melalui Wi-Fi</translation>
 <translation id="2718846868787000099">Untuk menampilkan konten dalam bahasa pilihan Anda, situs yang dikunjungi dapat melihat preferensi Anda</translation>
+<translation id="2722945394406572875">Perintah Privacy Sandbox ditutup</translation>
 <translation id="2723001399770238859">audio</translation>
 <translation id="2732063072010454421">Dapatkan pengalaman suara yang lebih baik</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">Permintaan izin</translation>
 <translation id="5355191726083956201">Perlindungan yang Ditingkatkan aktif</translation>
 <translation id="5368227114232678694">Untuk menjelajah secara pribadi di perangkat ini, coba mode Samaran</translation>
+<translation id="5371717687506906963">Perintah Privacy Sandbox</translation>
 <translation id="5375577065097716013">Telusuri dengan Lens <ph name="BEGIN_NEW" />Baru<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Reaksi diubah</translation>
 <translation id="5401851137404501592">Untuk melanjutkan, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> akan membagikan nama, alamat email, dan foto profil Anda ke situs ini.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">Dengan mengetahui URL situs, Asisten Google dapat membantu Anda menyelesaikan tugas. Anda dapat menonaktifkan Asisten di setelan Chrome.</translation>
 <translation id="5916664084637901428">Aktif</translation>
 <translation id="5919204609460789179">Perbarui <ph name="PRODUCT_NAME" /> untuk memulai sinkronisasi</translation>
+<translation id="593625682991400408">Selama uji coba, Chrome mengembangkan cara untuk membatasi spam, penipuan, dan berbagi antar-situs. Chrome juga <ph name="BEGIN_LINK" />memperkirakan minat Anda<ph name="END_LINK" /> yang dapat digunakan oleh situs untuk menampilkan iklan kepada Anda. Anda dapat mengubah minat di setelan.</translation>
 <translation id="5938820472109305350">Tambahkan <ph name="INTEREST" /></translation>
 <translation id="5942872142862698679">Menggunakan Google untuk penelusuran</translation>
 <translation id="5945035219773565305">Rekomendasi saat ini:  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">Alur penyimpanan bookmark ditutup</translation>
 <translation id="9108312223223904744">Dukungan Ponsel sebagai Kunci Keamanan</translation>
 <translation id="9108808586816295166">DNS aman mungkin tidak tersedia sepanjang waktu</translation>
+<translation id="9128984223251192329">Perintah Privacy Sandbox terbuka setengah</translation>
 <translation id="9133397713400217035">Jelajahi Offline</translation>
 <translation id="9137013805542155359">Perlihatkan halaman asli</translation>
 <translation id="9148126808321036104">Login sekali lagi</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
index 15d5c76..4fc7a2a5 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">Bókamerki og vefferill</translation>
 <translation id="1513814250881909472">Samstilltu til að sækja flipana þína úr öðrum tækjum</translation>
 <translation id="1513858653616922153">Eyða aðgangsorði</translation>
+<translation id="1514552811327923157">Privacy Sandbox tilkynning opnuð í fullri hæð</translation>
 <translation id="1518421282666914498">Tilfinninga-GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">Virkt í dag</translation>
 <translation id="1538801903729528855">Láttu röddina þjóna þér betur á vefnum</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">Prufuútgáfur</translation>
 <translation id="2718352093833049315">Aðeins um Wi-Fi</translation>
 <translation id="2718846868787000099">Vefsvæðin sem þú opnar geta séð kjörstillingarnar þínar til að sýna þér efni á þeim tungumálum sem þú hefur valið.</translation>
+<translation id="2722945394406572875">Privacy Sandbox tilkynningu lokað</translation>
 <translation id="2723001399770238859">hljóð</translation>
 <translation id="2732063072010454421">Láttu röddina þjóna þér betur</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">Heimildabeiðnir</translation>
 <translation id="5355191726083956201">Kveikt er á aukinni vörn</translation>
 <translation id="5368227114232678694">Prófaðu huliðsstillingu til að vafra í næði í þessu tæki</translation>
+<translation id="5371717687506906963">Privacy Sandbox tilkynning</translation>
 <translation id="5375577065097716013">Leita að mynd með Google linsu <ph name="BEGIN_NEW" />Nýtt<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Viðbrögðum breytt</translation>
 <translation id="5401851137404501592">Til að halda áfram mun <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> deila nafni þínu, netfangi og prófílmynd með þessu vefsvæði.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">Þegar Google hjálparinn fær upplýsingar um vefslóðir vefsvæða getur hann aðstoðað þig við að ljúka verkefnum. Þú getur slökkt á Hjálparanum í stillingum Chrome.</translation>
 <translation id="5916664084637901428">Kveikt</translation>
 <translation id="5919204609460789179">Uppfærðu <ph name="PRODUCT_NAME" /> til að hefja samstillingu</translation>
+<translation id="593625682991400408">Chrome nýtir prufuáskriftir til að kanna leiðir til að takmarka ruslefni, svik og deilingu á milli vefsvæða. Chrome <ph name="BEGIN_LINK" />áætlar einnig áhugasvið þitt<ph name="END_LINK" /> sem vefsvæði geta notað til að birta þér auglýsingar. Þú getur stjórnað áhugasviðunum þínum í stillingunum.</translation>
 <translation id="5938820472109305350">Bæta <ph name="INTEREST" /> við</translation>
 <translation id="5942872142862698679">Notar Google fyrir leit</translation>
 <translation id="5945035219773565305">Núverandi tillaga:  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">Vistun bókamerkja lokað</translation>
 <translation id="9108312223223904744">Aðstoð með síma sem öryggislykil</translation>
 <translation id="9108808586816295166">Ekki er víst að hægt sé að nota örugg DNS alltaf</translation>
+<translation id="9128984223251192329">Privacy Sandbox tilkynning opnuð í hálfri hæð</translation>
 <translation id="9133397713400217035">Skoða ónettengt</translation>
 <translation id="9137013805542155359">Sýna frumtexta</translation>
 <translation id="9148126808321036104">Skrá inn aftur</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
index 3fcae52..69b5a60 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">ブックマークとウェブ履歴</translation>
 <translation id="1513814250881909472">同期すると、他のデバイスで開いたタブを使用できます</translation>
 <translation id="1513858653616922153">パスワードを削除</translation>
+<translation id="1514552811327923157">プライバシー サンドボックスに関するメッセージが画面全体に表示されています</translation>
 <translation id="1518421282666914498">感情 GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">最終同期: 今日</translation>
 <translation id="1538801903729528855">ウェブにおける音声操作の利便性を向上</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">試用版</translation>
 <translation id="2718352093833049315">Wi-Fi接続時のみ</translation>
 <translation id="2718846868787000099">ご希望の言語でコンテンツを表示するため、アクセス先のサイトには設定内容が伝えられます</translation>
+<translation id="2722945394406572875">プライバシー サンドボックスに関するメッセージを閉じました</translation>
 <translation id="2723001399770238859">音声</translation>
 <translation id="2732063072010454421">音声操作の利便性を向上</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">権限のリクエスト</translation>
 <translation id="5355191726083956201">保護強化機能がオンになっています</translation>
 <translation id="5368227114232678694">このデバイスで記録を残さずに閲覧するには、シークレット モードを使用してください</translation>
+<translation id="5371717687506906963">プライバシー サンドボックスに関するメッセージ</translation>
 <translation id="5375577065097716013">Google レンズで画像を検索 <ph name="BEGIN_NEW" />New<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">リアクションを変更しました</translation>
 <translation id="5401851137404501592">続行すると、<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> からこのサイトに名前、メールアドレス、プロフィール画像が共有されます。</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">サイトの URL を送信して、Google アシスタントでタスクをサポートできるようにします。アシスタントは、Chrome の設定で無効にできます。</translation>
 <translation id="5916664084637901428">オン</translation>
 <translation id="5919204609460789179">同期を開始するには <ph name="PRODUCT_NAME" /> を更新してください</translation>
+<translation id="593625682991400408">トライアル期間中、Chrome はスパムや不正行為、サイト間の共有を制限する方法を検証します。また、ユーザーの<ph name="BEGIN_LINK" />興味 / 関心を推定<ph name="END_LINK" />して、サイトに広告を表示します。興味 / 関心は設定で管理できます。</translation>
 <translation id="5938820472109305350"><ph name="INTEREST" /> を追加</translation>
 <translation id="5942872142862698679">検索に Google を使用します</translation>
 <translation id="5945035219773565305">現在の推奨設定: <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">ブックマーク保存フローは閉じています</translation>
 <translation id="9108312223223904744">スマートフォンをセキュリティ キーのサポートとして使用する</translation>
 <translation id="9108808586816295166">セキュア DNS は使用できない場合があります</translation>
+<translation id="9128984223251192329">プライバシー サンドボックスに関するメッセージが画面の下半分に表示されています</translation>
 <translation id="9133397713400217035">オフライン コンテンツ</translation>
 <translation id="9137013805542155359">原文のページを表示</translation>
 <translation id="9148126808321036104">もう一度ログインする</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
index eccccf02..ae90b95 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು ಮತ್ತು ವೆಬ್ ಇತಿಹಾಸ</translation>
 <translation id="1513814250881909472">ನಿಮ್ಮ ಇತರ ಸಾಧನಗಳಿಂದ ನಿಮ್ಮ ಟ್ಯಾಬ್‌ಗಳನ್ನು ಪಡೆಯಲು ಸಿಂಕ್ ಮಾಡಿ</translation>
 <translation id="1513858653616922153">ಪಾಸ್‌ವರ್ಡ್ ಅಳಿಸಿ</translation>
+<translation id="1514552811327923157">ಪ್ರೈವೆಸಿ ಸ್ಯಾಂಡ್‌ಬಾಕ್ಸ್ ಪ್ರಾಂಪ್ಟ್ ಅನ್ನು ಪೂರ್ಣ ಎತ್ತರದಲ್ಲಿ ತೆರೆಯಲಾಗಿದೆ</translation>
 <translation id="1518421282666914498">ಭಾವುಕತೆ GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">ಇಂದು ಸಕ್ರಿಯ</translation>
 <translation id="1538801903729528855">ವೆಬ್‌ನಲ್ಲಿ ಉತ್ತಮವಾದ ಧ್ವನಿ ಅನುಭವವನ್ನು ಪಡೆಯಿರಿ</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">ಪ್ರಯೋಗಗಳು</translation>
 <translation id="2718352093833049315">ಕೇವಲ ವೈ-ಫೈ ಮಾತ್ರ</translation>
 <translation id="2718846868787000099">ವಿಷಯವನ್ನು ನಿಮ್ಮ ಆದ್ಯತೆಯ ಭಾಷೆಗಳಲ್ಲಿ ತೋರಿಸಲು, ನೀವು ಭೇಟಿ ನೀಡುವ ಸೈಟ್‌ಗಳು ನಿಮ್ಮ ಆದ್ಯತೆಗಳನ್ನು ನೋಡಬಹುದು</translation>
+<translation id="2722945394406572875">ಪ್ರೈವೆಸಿ ಸ್ಯಾಂಡ್‌ಬಾಕ್ಸ್ ಪ್ರಾಂಪ್ಟ್ ಅನ್ನು ಮುಚ್ಚಲಾಗಿದೆ</translation>
 <translation id="2723001399770238859">ಆಡಿಯೋ</translation>
 <translation id="2732063072010454421">ಉತ್ತಮ ಧ್ವನಿ ಅನುಭವವನ್ನು ಪಡೆಯಿರಿ</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -790,6 +792,7 @@
 <translation id="5342314432463739672">ಅನುಮತಿ ವಿನಂತಿಗಳು</translation>
 <translation id="5355191726083956201">ಸುಧಾರಿತ ಸಂರಕ್ಷಣೆ ಆನ್ ಆಗಿದೆ</translation>
 <translation id="5368227114232678694">ಈ ಸಾಧನದಲ್ಲಿ ಖಾಸಗಿಯಾಗಿ ಬ್ರೌಸ್ ಮಾಡಲು, ಅಜ್ಞಾತ ಮೋಡ್ ಪ್ರಯತ್ನಿಸಿ ನೋಡಿ</translation>
+<translation id="5371717687506906963">ಪ್ರೈವೆಸಿ ಸ್ಯಾಂಡ್‌ಬಾಕ್ಸ್ ಪ್ರಾಂಪ್ಟ್</translation>
 <translation id="5375577065097716013">Google Lens ಬಳಸಿ ಚಿತ್ರವನ್ನು ಹುಡುಕಿ <ph name="BEGIN_NEW" />ಹೊಸತು<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">ಪ್ರತಿಕ್ರಿಯೆ ಬದಲಾಗಿದೆ</translation>
 <translation id="5401851137404501592">ಮುಂದುವರಿಸಲು, ಈ ಸೈಟ್‌ನ ಜೊತೆಗೆ <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ನಿಮ್ಮ ಹೆಸರು, ಇಮೇಲ್ ವಿಳಾಸ ಮತ್ತು ಪ್ರೊಫೈಲ್ ಚಿತ್ರವನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತದೆ.</translation>
@@ -893,6 +896,7 @@
 <translation id="5906513782029855931">ಸೈಟ್‌ಗಳ URL ಗಳ ಬಗ್ಗೆ ತಿಳಿದುಕೊಳ್ಳುವುದರಿಂದ, ಕಾರ್ಯಗಳನ್ನು ಪೂರ್ಣಗೊಳಿಸುವುದಕ್ಕೆ ನಿಮಗೆ ಸಹಾಯ ಮಾಡಲು Google Assistant ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ. Assistant ಅನ್ನು Chrome ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಆಫ್ ಮಾಡಬಹುದು.</translation>
 <translation id="5916664084637901428">ಆನ್‌</translation>
 <translation id="5919204609460789179">ಸಿಂಕ್ ಪ್ರಾರಂಭಿಸಲು <ph name="PRODUCT_NAME" /> ಅಪ್‌ಡೇಟ್ ಮಾಡಿ</translation>
+<translation id="593625682991400408">ಟ್ರಯಲ್‌ಗಳ ಅವಧಿಯಲ್ಲಿ, ಸ್ಪ್ಯಾಮ್, ವಂಚನೆ ಮತ್ತು ಸೈಟ್‌ಗಳ ನಡುವೆ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಮಿತಿಗೊಳಿಸುವ ವಿದಾನಗಳನ್ನು Chrome ಅನ್ವೇಷಿಸುತ್ತಿದೆ. ನಿಮಗೆ ಜಾಹೀರಾತುಗಳನ್ನು ತೋರಿಸಲು Chrome ಸೈಟ್‌ಗಳು ಬಳಸಬಹುದಾದ ನಿಮ್ಮ <ph name="BEGIN_LINK" />ಆಸಕ್ತಿಗಳನ್ನು ಅಂದಾಜು ಮಾಡುತ್ತದೆ<ph name="END_LINK" />. ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ನಿಮ್ಮ ಆಸಕ್ತಿಗಳನ್ನು ನೀವು ನಿರ್ವಹಿಸಬಹುದು.</translation>
 <translation id="5938820472109305350"><ph name="INTEREST" /> ಸೇರಿಸಿ</translation>
 <translation id="5942872142862698679">ಹುಡುಕಲು Google ಬಳಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="5945035219773565305">ಪ್ರಸ್ತುತ ಶಿಫಾರಸು:  <ph name="RECOMMENDATION" /></translation>
@@ -1511,6 +1515,7 @@
 <translation id="9106148373857059373">ಬುಕ್‌ಮಾರ್ಕ್ ಉಳಿಸಿ ಫ್ಲೋ ಅನ್ನು ಮುಚ್ಚಲಾಗಿದೆ</translation>
 <translation id="9108312223223904744">ಸುರಕ್ಷತಾ ಕೀ ಬೆಂಬಲವಾಗಿ ಫೋನ್</translation>
 <translation id="9108808586816295166">ಸುರಕ್ಷಿತ DNS ಎಲ್ಲಾ ಸಮಯದಲ್ಲೂ ಲಭ್ಯವಿಲ್ಲದಿರಬಹುದು.</translation>
+<translation id="9128984223251192329">ಪ್ರೈವೆಸಿ ಸ್ಯಾಂಡ್‌ಬಾಕ್ಸ್ ಪ್ರಾಂಪ್ಟ್ ಅನ್ನು ಅರ್ಧ ಎತ್ತರದಲ್ಲಿ ತೆರೆಯಲಾಗಿದೆ</translation>
 <translation id="9133397713400217035">ಆಫ್‌ಲೈನ್‌ನಲ್ಲಿ ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಮಾಡಿ</translation>
 <translation id="9137013805542155359">ಮೂಲವನ್ನು ತೋರಿಸಿ</translation>
 <translation id="9148126808321036104">ಪುನಃ ಸೈನ್ ಇನ್  ಆಗಿ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
index 9ef43d3..72d145c 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">북마크 및 방문 기록</translation>
 <translation id="1513814250881909472">동기화하여 다른 기기에서 탭을 가져오세요.</translation>
 <translation id="1513858653616922153">비밀번호 삭제</translation>
+<translation id="1514552811327923157">개인 정보 보호 샌드박스 메시지가 전체 높이로 열림</translation>
 <translation id="1518421282666914498">감정 GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">오늘 사용</translation>
 <translation id="1538801903729528855">웹에서의 음성 사용 환경 개선하기</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">무료 체험</translation>
 <translation id="2718352093833049315">Wi-Fi 연결 시</translation>
 <translation id="2718846868787000099">콘텐츠를 기본 언어로 표시하기 위해 방문하는 사이트에서 기본 설정을 확인할 수 있습니다.</translation>
+<translation id="2722945394406572875">개인 정보 보호 샌드박스 메시지 닫힘</translation>
 <translation id="2723001399770238859">오디오</translation>
 <translation id="2732063072010454421">더 나은 음성 검색 환경을 경험해 보세요</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">권한 요청</translation>
 <translation id="5355191726083956201">향상된 보호 모드를 사용 중입니다.</translation>
 <translation id="5368227114232678694">이 기기에서 비공개로 인터넷을 사용하려면 시크릿 모드를 사용하세요.</translation>
+<translation id="5371717687506906963">개인 정보 보호 샌드박스 메시지</translation>
 <translation id="5375577065097716013">Google 렌즈로 이미지 검색 <ph name="BEGIN_NEW" />New<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">반응 변경됨</translation>
 <translation id="5401851137404501592">계속하려면 <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" />에서 내 이름, 이메일 주소, 프로필 사진을 이 사이트와 공유해야 합니다.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">사이트의 URL을 알려 주시면 Google 어시스턴트가 작업을 도와드릴 수 있습니다. Chrome 설정에서 어시스턴트를 사용 중지하실 수 있습니다.</translation>
 <translation id="5916664084637901428">사용</translation>
 <translation id="5919204609460789179"><ph name="PRODUCT_NAME" />을(를) 업데이트하여 동기화를 시작합니다.</translation>
+<translation id="593625682991400408">무료 체험 기간 동안 Chrome에서는 스팸, 사기 및 사이트 간 공유를 제한하는 방법을 탐색합니다. 또한 Chrome은 사이트에서 광고를 표시하는 데 사용할 수 있는 <ph name="BEGIN_LINK" />관심분야를 예측<ph name="END_LINK" />합니다. 설정에서 관심분야를 관리할 수 있습니다.</translation>
 <translation id="5938820472109305350"><ph name="INTEREST" /> 추가</translation>
 <translation id="5942872142862698679">검색할 때 Google 사용</translation>
 <translation id="5945035219773565305">현재 추천: <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">북마크 저장 흐름 닫힘</translation>
 <translation id="9108312223223904744">휴대전화를 보안 키로 사용 지원</translation>
 <translation id="9108808586816295166">보안 DNS가 항상 제공되지는 않을 수도 있습니다.</translation>
+<translation id="9128984223251192329">개인 정보 보호 샌드박스 메시지가 절반 높이로 열림</translation>
 <translation id="9133397713400217035">오프라인 탐색</translation>
 <translation id="9137013805542155359">원본 보기</translation>
 <translation id="9148126808321036104">다시 로그인</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
index d1e474c..923bfe0c 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">Кыстармалар жана издөө таржымалы</translation>
 <translation id="1513814250881909472">Башка түзмөктөрдөгү өтмөктөрдү колдонуу үчүн шайкештирүүнү иштетиңиз</translation>
 <translation id="1513858653616922153">Сырсөздү жок кылуу</translation>
+<translation id="1514552811327923157">Privacy Sandbox кеңеши толук экранда ачылды</translation>
 <translation id="1518421282666914498">GIF быйтыкчасы: <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">Соңку аракеттер: бүгүн</translation>
 <translation id="1538801903729528855">Вебде оозеки издегенде жакшыраак натыйжаларды алыңыз</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">Сыноо мезгилдери</translation>
 <translation id="2718352093833049315">Wi-Fi'да гана</translation>
 <translation id="2718846868787000099">Мазмунду тандаган тилдериңизде көрсөтүү үчүн сиз баш баккан сайттар параметрлериңизди көрө алат</translation>
+<translation id="2722945394406572875">Privacy Sandbox кеңеши жабылды</translation>
 <translation id="2723001399770238859">audio</translation>
 <translation id="2732063072010454421">Оозеки издөөнү жеңилдетиңиз</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">Уруксат сурамдары</translation>
 <translation id="5355191726083956201">Өркүндөтүлгөн коргоо күйүк</translation>
 <translation id="5368227114232678694">Бул түзмөктө купуя карап чыгуу үчүн Жашыруун режимди колдонуңуз</translation>
+<translation id="5371717687506906963">Privacy Sandbox кеңеши</translation>
 <translation id="5375577065097716013">Google Lens аркылуу издөө <ph name="BEGIN_NEW" />Жаңы<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Реакция өзгөртүлдү</translation>
 <translation id="5401851137404501592">Улантуу үчүн <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> аты-жөнүңүздү, электрондук почтаңыздын дарегин жана профилиңиздин сүрөтүн ушул сайт менен бөлүшөт.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">Сайттардын URL даректери Google Жардамчыга тапшырмаларды аткарууга жардам берет. Жардамчыны Chrome'дун жөндөөлөрүнөн өчүрсөңүз болот.</translation>
 <translation id="5916664084637901428">Күйүк</translation>
 <translation id="5919204609460789179">Шайкештирүүнү баштоо үчүн <ph name="PRODUCT_NAME" /> жаңыртыңыз</translation>
+<translation id="593625682991400408">Сыноо версияларында Chrome cпам, шылуундук жана сайттардын арасында маалымат бөлүшүү аракеттерин чектөө жолдорун изилдейт. Ошондой эле, Chrome сайттар жарнамаларды көрсөтүү үчүн колдоно турган <ph name="BEGIN_LINK" />кызыккан нерселериңизди божомолдойт<ph name="END_LINK" />. Кызыккан нерселериңизди параметрлерден башкара аласыз.</translation>
 <translation id="5938820472109305350"><ph name="INTEREST" /> кошуу</translation>
 <translation id="5942872142862698679">Издөө үчүн Google колдонулууда</translation>
 <translation id="5945035219773565305">Учурдагы сунуш:  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">Тематикасына жараша сакталган кыстармалар жабылды</translation>
 <translation id="9108312223223904744">Телефон коопсуздук ачкыч колдоосу катары</translation>
 <translation id="9108808586816295166">Коопсуз DNS ар дайым жеткиликтүү болбошу мүмкүн</translation>
+<translation id="9128984223251192329">Privacy Sandbox кеңеши жарым экранда ачылды</translation>
 <translation id="9133397713400217035">Оффлайн режиминде изилдөө</translation>
 <translation id="9137013805542155359">Түпверсиясын көрсөтүү</translation>
 <translation id="9148126808321036104">Кайра кириңиз</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
index 05042866..15d4ec2 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">ບຸກມາກສ໌ ​ແລະ​ປະ​ຫວັດ​ເວັບ​</translation>
 <translation id="1513814250881909472">ຊິ້ງຂໍ້ມູນເພື່ອໃຊ້ແຖບຂອງທ່ານຈາກອຸປະກອນອື່ນຂອງທ່ານ</translation>
 <translation id="1513858653616922153">ລຶບລະຫັດຜ່ານ</translation>
+<translation id="1514552811327923157">ເປີດກ່ອງຂໍ້ຄວາມ Privacy Sandbox ແບບເຕັມຄວາມສູງແລ້ວ</translation>
 <translation id="1518421282666914498">GIF ອີໂມຊັນ <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">ເປີດນຳໃຊ້ມື້ນີ້</translation>
 <translation id="1538801903729528855">ມີປະສົບການສຽງທີ່ດີກວ່າໃນເວັບ</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">ການທົດລອງໃຊ້</translation>
 <translation id="2718352093833049315">​ສະເພາະ Wi​-Fi ເທົ່ານັ້ນ</translation>
 <translation id="2718846868787000099">ເພື່ອສະແດງເນື້ອຫາເປັນພາສາທີ່ຕ້ອງການ, ເວັບໄຊທີ່ທ່ານເຂົ້າເບິ່ງສາມາດເຫັນການຕັ້ງຄ່າຂອງທ່ານໄດ້</translation>
+<translation id="2722945394406572875">ປິດກ່ອງຂໍ້ຄວາມ Privacy Sandbox ແລ້ວ</translation>
 <translation id="2723001399770238859">ສຽງ</translation>
 <translation id="2732063072010454421">ຮັບປະສົບການສຽງທີ່ດີຂຶ້ນ</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">ຄຳຂໍການອະນຸຍາດ</translation>
 <translation id="5355191726083956201">ການປົກປ້ອງທີ່ປັບປຸງດີຂຶ້ນເປີດຢູ່</translation>
 <translation id="5368227114232678694">ເພື່ອທ່ອງເວັບແບບສ່ວນຕົວຢູ່ອຸປະກອນນີ້, ໃຫ້ລອງໃຊ້ໂໝດບໍ່ເປີດເຜີຍຕົວຕົນ</translation>
+<translation id="5371717687506906963">ກ່ອງຂໍ້ຄວາມ Privacy Sandbox</translation>
 <translation id="5375577065097716013">ຊອກຫາຮູບພາບດ້ວຍ Google Lens <ph name="BEGIN_NEW" />ໃໝ່<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">ປ່ຽນຣີແອັກຊັນແລ້ວ</translation>
 <translation id="5401851137404501592">ເພື່ອສືບຕໍ່, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ຈະແບ່ງປັນຊື່, ທີ່ຢູ່ອີເມວ ແລະ ຮູບໂປຣໄຟລ໌ຂອງທ່ານໃຫ້ກັບເວັບໄຊນີ້.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">ການຮູ້ URL ຂອງເວັບໄຊຈະເຮັດໃຫ້ຜູ້ຊ່ວຍ Google ຊ່ວຍທ່ານເຮັດໜ້າວຽກຕ່າງໆໃຫ້ສຳເລັດໄດ້. ທ່ານສາມາດປິດຜູ້ຊ່ວຍໄດ້ໃນການຕັ້ງຄ່າ Chrome.</translation>
 <translation id="5916664084637901428">ເປີດ</translation>
 <translation id="5919204609460789179">ອັບເດດ <ph name="PRODUCT_NAME" /> ເພື່ອເລີ່ມການຊິ້ງຂໍ້ມູນ</translation>
+<translation id="593625682991400408">ໃນລະຫວ່າງການທົດລອງໃຊ້, Chrome ກຳລັງສຳຫຼວດວິທີຈຳກັດສະແປມ, ການສໍ້ໂກງ ແລະ ການແບ່ງປັນລະຫວ່າງເວັບໄຊ. ນອກຈາກນັ້ນ, Chrome ຍັງຈະ <ph name="BEGIN_LINK" />ຄາດຄະເນຄວາມສົນໃຈຂອງທ່ານ<ph name="END_LINK" /> ທີ່ເວັບໄຊຕ່າງໆຈະໃຊ້ເພື່ອສະແດງໂຄສະນາໃຫ້ທ່ານເຫັນນຳ. ທ່ານສາມາດຈັດການຄວາມສົນໃຈຂອງທ່ານໄດ້ໃນການຕັ້ງຄ່າ.</translation>
 <translation id="5938820472109305350">ເພີ່ມ <ph name="INTEREST" /></translation>
 <translation id="5942872142862698679">ກຳລັງໃຊ້ Google ສຳລັບການຊອກຫາ</translation>
 <translation id="5945035219773565305">ການແນະນຳປັດຈຸບັນ:  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">ປິດຂັ້ນຕອນການບັນທຶກບຸກມາກແລ້ວ</translation>
 <translation id="9108312223223904744">ການຮອງຮັບໂທລະສັບເປັນກະແຈຄວາມປອດໄພ</translation>
 <translation id="9108808586816295166">DNS ທີ່ປອດໄພອາດຈະບໍ່ສາມາດໃຊ້ໄດ້ຕະຫຼອດເວລາ</translation>
+<translation id="9128984223251192329">ເປີດກ່ອງຂໍ້ຄວາມ Privacy Sandbox ແບບເຄິ່ງຄວາມສູງແລ້ວ</translation>
 <translation id="9133397713400217035">ສຳຫຼວດອອບລາຍ</translation>
 <translation id="9137013805542155359">ສະແດງຕົ້ນສະບັບ</translation>
 <translation id="9148126808321036104">ລົງຊື່ເຂົ້າ​ໃຊ້ອີກ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
index 48a9315..2974a28 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">Žymių ir žiniatinklio istorija</translation>
 <translation id="1513814250881909472">Sinchronizuokite, kad gautumėte skirtukus iš kitų įrenginių</translation>
 <translation id="1513858653616922153">Ištrinti slaptažodį</translation>
+<translation id="1514552811327923157">Privatumo „sandbox“ (smėlio dėžės) raginimas atidarytas per visą ekrano aukštį</translation>
 <translation id="1518421282666914498">Emocijos GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">Aktyvus šiandien</translation>
 <translation id="1538801903729528855">Dar geriau išnaudokite veiksmų balsu galimybes žiniatinklyje</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">Bandomieji laikotarpiai</translation>
 <translation id="2718352093833049315">Tik su „Wi–Fi“</translation>
 <translation id="2718846868787000099">Kad turinys būtų rodomas pageidaujamomis kalbomis, svetainės, kuriose lankotės, gali matyti jūsų nuostatas</translation>
+<translation id="2722945394406572875">Privatumo „sandbox“ (smėlio dėžės) raginimas uždarytas</translation>
 <translation id="2723001399770238859">garso įrašas</translation>
 <translation id="2732063072010454421">Ieškoti balsu gali būti dar patogiau</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">Leidimų užklausos</translation>
 <translation id="5355191726083956201">Sustiprinta apsauga įjungta</translation>
 <translation id="5368227114232678694">Jei norite naršyti privačiai šiame įrenginyje, išbandykite inkognito režimą</translation>
+<translation id="5371717687506906963">Privatumo „sandbox“ (smėlio dėžės) raginimas</translation>
 <translation id="5375577065097716013">Ieškoti vaizdo su „Google Lens“ <ph name="BEGIN_NEW" />Nauja<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Reakcija pakeista</translation>
 <translation id="5401851137404501592">Kad būtų galima tęsti, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> bendrins jūsų vardą ir pavardę, el. pašto adresą ir profilio nuotrauką su šia svetaine.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">Žinodamas svetainių URL, „Google“ padėjėjas gali padėti jums atlikti užduotis. Padėjėją galite išjungti „Chrome“ nustatymuose.</translation>
 <translation id="5916664084637901428">Įjungta</translation>
 <translation id="5919204609460789179">Atnaujinkite „<ph name="PRODUCT_NAME" />“, kad galėtumėte pradėti sinchronizuoti</translation>
+<translation id="593625682991400408">Per bandomuosius laikotarpius „Chrome“ ieško būdų, kaip apriboti šlamštą, apgaules ir bendrinimą tarp svetainių. Be to, „Chrome“ <ph name="BEGIN_LINK" />atsižvelgia į jūsų pomėgius<ph name="END_LINK" />, kuriuos svetainės gali naudoti skelbimams rodyti. Galite tvarkyti savo pomėgius nustatymuose.</translation>
 <translation id="5938820472109305350">Pridėti „<ph name="INTEREST" />“</translation>
 <translation id="5942872142862698679">Atliekant paiešką naudojama „Google“</translation>
 <translation id="5945035219773565305">Dabartinė rekomendacija: <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">Žymių išsaugojimo srautas uždarytas</translation>
 <translation id="9108312223223904744">Telefonas kaip saugos raktas</translation>
 <translation id="9108808586816295166">Saugi DNS gali būti pasiekiama ne visą laiką</translation>
+<translation id="9128984223251192329">Privatumo „sandbox“ (smėlio dėžės) raginimas atidarytas iki pusės ekrano aukščio</translation>
 <translation id="9133397713400217035">Naršyti neprisijungus</translation>
 <translation id="9137013805542155359">Rodyti originalą</translation>
 <translation id="9148126808321036104">Prisijungti dar kartą</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
index 9055076..40d2fff 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">Grāmatzīmes un tīmekļa vēsture</translation>
 <translation id="1513814250881909472">Veiciet sinhronizāciju, lai iegūtu cilnes no savām pārējām ierīcēm</translation>
 <translation id="1513858653616922153">Dzēst paroli</translation>
+<translation id="1514552811327923157">Konfidencialitātes smilškastes uzvedne ir atvērta pilnā augstumā</translation>
 <translation id="1518421282666914498">Emociju GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">Aktīvs šodien</translation>
 <translation id="1538801903729528855">Labākas balss izmantošanas iespējas tīmeklī</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">Izmēģinājuma versijas</translation>
 <translation id="2718352093833049315">Tikai Wi-Fi</translation>
 <translation id="2718846868787000099">Apmeklētajām vietnēm ir atļauta piekļuve jūsu preferencēm, lai nodrošinātu satura rādīšanu jūsu izvēlētajā valodā.</translation>
+<translation id="2722945394406572875">Konfidencialitātes smilškastes uzvedne ir aizvērta</translation>
 <translation id="2723001399770238859">audio</translation>
 <translation id="2732063072010454421">Labāka pieredze meklēšanā ar balsi</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">Atļauju pieprasījumi</translation>
 <translation id="5355191726083956201">Uzlabota aizsardzība ir ieslēgta</translation>
 <translation id="5368227114232678694">Lai pārlūkotu tīmekli privāti šajā ierīcē, izmēģiniet inkognito režīmu.</translation>
+<translation id="5371717687506906963">Konfidencialitātes smilškastes uzvedne</translation>
 <translation id="5375577065097716013">Meklēt attēlu ar Google Lens <ph name="BEGIN_NEW" />Jaunums<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Reakcija ir mainīta</translation>
 <translation id="5401851137404501592">Lai turpinātu, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> kopīgos jūsu vārdu, e-pasta adresi un profila attēlu ar šo vietni.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">Zinot vietņu vietrāžus URL, Google asistents var palīdzēt jums veikt uzdevumus. Chrome iestatījumos varat izslēgt Asistentu.</translation>
 <translation id="5916664084637901428">Iesl.</translation>
 <translation id="5919204609460789179">Lai sāktu sinhronizēšanu, atjauniniet <ph name="PRODUCT_NAME" /></translation>
+<translation id="593625682991400408">Izmēģinājumu laikā Chrome komanda pēta veidus, kā ierobežot nevēlamu saturu, krāpšanu un kopīgošanu starp vietnēm. Turklāt pārlūkā Chrome tiek <ph name="BEGIN_LINK" />aptuveni noteiktas jūsu intereses<ph name="END_LINK" />, ko var izmantot vietnēs, lai rādītu jums reklāmas. Intereses varat pārvaldīt iestatījumos.</translation>
 <translation id="5938820472109305350">Pievienot interesi “<ph name="INTEREST" />”</translation>
 <translation id="5942872142862698679">Tiek izmantota meklētājprogramma Google</translation>
 <translation id="5945035219773565305">Pašreizējais ieteikums: <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">Grāmatzīmes saglabāšanas plūsma ir aizvērta</translation>
 <translation id="9108312223223904744">Atbalsts, kas var palīdzēt izmantot tālruni kā drošības atslēgu</translation>
 <translation id="9108808586816295166">Drošs DNS serveris var nebūt pieejams visu laiku.</translation>
+<translation id="9128984223251192329">Konfidencialitātes smilškastes uzvedne ir atvērta pusekrāna augstumā</translation>
 <translation id="9133397713400217035">Izpētīt bezsaisti</translation>
 <translation id="9137013805542155359">Rādīt oriģinālo</translation>
 <translation id="9148126808321036104">Pierakstieties vēlreiz</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
index 92b3990..225fbec 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">Bookmarks en webgeschiedenis</translation>
 <translation id="1513814250881909472">Voer een synchronisatie uit om de tabbladen van je andere apparaten op te halen</translation>
 <translation id="1513858653616922153">Wachtwoord verwijderen</translation>
+<translation id="1514552811327923157">Prompt voor Privacy Sandbox is op volledige hoogte geopend</translation>
 <translation id="1518421282666914498">Emotie-gif <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">Vandaag actief</translation>
 <translation id="1538801903729528855">Betere spraakfunctionaliteit op internet</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">Proeven</translation>
 <translation id="2718352093833049315">Alleen via wifi</translation>
 <translation id="2718846868787000099">Bezochte sites kunnen je voorkeuren bekijken, zodat ze content in je voorkeurstalen kunnen bekijken</translation>
+<translation id="2722945394406572875">Prompt voor Privacy Sandbox is gesloten</translation>
 <translation id="2723001399770238859">audio</translation>
 <translation id="2732063072010454421">Krijg betere spraakfunctionaliteit</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">Rechtenverzoeken</translation>
 <translation id="5355191726083956201">Geoptimaliseerde beveiliging staat aan</translation>
 <translation id="5368227114232678694">Gebruik de incognitomodus als je privé wilt browsen op dit apparaat</translation>
+<translation id="5371717687506906963">Prompt voor Privacy Sandbox</translation>
 <translation id="5375577065097716013">Afbeelding zoeken met Google Lens <ph name="BEGIN_NEW" />Nieuw<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Reactie gewijzigd</translation>
 <translation id="5401851137404501592"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> deelt je naam, e-mailadres en profielfoto met deze site om door te gaan.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">Als de Google Assistent de URL's van sites weet, kan deze je helpen taken af te ronden. Je kunt de Assistent uitzetten in de instellingen van Chrome.</translation>
 <translation id="5916664084637901428">Aan</translation>
 <translation id="5919204609460789179">Update <ph name="PRODUCT_NAME" /> om de synchronisatie te starten</translation>
+<translation id="593625682991400408">Tijdens proefperioden verkent Chrome manieren om spam, fraude en het delen tussen sites te beperken. Chrome <ph name="BEGIN_LINK" />schat ook je interesses<ph name="END_LINK" /> die sites kunnen gebruiken om advertenties te laten zien. Je kunt je interesses beheren in de instellingen.</translation>
 <translation id="5938820472109305350"><ph name="INTEREST" /> toevoegen</translation>
 <translation id="5942872142862698679">Google wordt gebruikt om te zoeken</translation>
 <translation id="5945035219773565305">Huidige aanbeveling: <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">Proces voor bookmark opslaan is gesloten</translation>
 <translation id="9108312223223904744">Telefoon als ondersteuning voor beveiligingssleutel</translation>
 <translation id="9108808586816295166">Beveiligde DNS is mogelijk niet altijd beschikbaar</translation>
+<translation id="9128984223251192329">Prompt voor Privacy Sandbox is op halve hoogte geopend</translation>
 <translation id="9133397713400217035">Offline ontdekken</translation>
 <translation id="9137013805542155359">Origineel bekijken</translation>
 <translation id="9148126808321036104">Opnieuw inloggen</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
index 0a47bf0..d1de273 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">ବୁକ୍‌ମାର୍କ ଏବଂ ୱେବ୍ ଇତିବୃତ୍ତି</translation>
 <translation id="1513814250881909472">ଆପଣଙ୍କ ଅନ୍ୟ ଡିଭାଇସଗୁଡ଼ିକରୁ ଆପଣଙ୍କର ଟାବଗୁଡ଼ିକ ପାଇବାକୁ ସିଙ୍କ କରନ୍ତୁ</translation>
 <translation id="1513858653616922153">ପାସ୍‍ୱାର୍ଡକୁ ଡିଲିଟ୍ କରନ୍ତୁ</translation>
+<translation id="1514552811327923157">ପ୍ରାଇଭେସି ସେଣ୍ଡବକ୍ସ ପ୍ରମ୍ପ୍ଟ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନରେ ଖୋଲାଯାଇଛି</translation>
 <translation id="1518421282666914498">ଇମୋସନ GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">ଆଜି ସକ୍ରିୟ ଅଛି</translation>
 <translation id="1538801903729528855">ୱେବରେ ଏକ ଉନ୍ନତ ଭଏସ୍ ଅନୁଭୂତି ପାଆନ୍ତୁ</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">ଟ୍ରାଏଲଗୁଡ଼ିକ</translation>
 <translation id="2718352093833049315">କେବଳ ୱାଇ-ଫାଇରେ</translation>
 <translation id="2718846868787000099">ଆପଣଙ୍କ ପସନ୍ଦର ଭାଷାଗୁଡ଼ିକରେ ବିଷୟବସ୍ତୁ ଦେଖାଇବା ପାଇଁ, ଆପଣ ଭିଜିଟ୍ କରୁଥିବା ସାଇଟଗୁଡ଼ିକ ଆପଣଙ୍କ ପସନ୍ଦଗୁଡ଼ିକୁ ଦେଖିପାରିବ</translation>
+<translation id="2722945394406572875">ପ୍ରାଇଭେସି ସେଣ୍ଡବକ୍ସ ପ୍ରମ୍ପ୍ଟକୁ ବନ୍ଦ କରାଯାଇଛି</translation>
 <translation id="2723001399770238859">ଅଡିଓ</translation>
 <translation id="2732063072010454421">ଏକ ଉନ୍ନତ ଭଏସ ଅନୁଭୂତି ପାଆନ୍ତୁ</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">ଅନୁମତି ଅନୁରୋଧଗୁଡ଼ିକ</translation>
 <translation id="5355191726083956201">ଉନ୍ନତ ସୁରକ୍ଷା ଚାଲୁ ଅଛି</translation>
 <translation id="5368227114232678694">ଏହି ଡିଭାଇସରେ ବ୍ୟକ୍ତିଗତ ଭାବେ ବ୍ରାଉଜ କରିବା ପାଇଁ ଇନକଗ୍ନିଟୋ ମୋଡ ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ</translation>
+<translation id="5371717687506906963">ପ୍ରାଇଭେସି ସେଣ୍ଡବକ୍ସ ପ୍ରମ୍ପ୍ଟ</translation>
 <translation id="5375577065097716013">Google Lens ସହ ଛବି ଖୋଜନ୍ତୁ <ph name="BEGIN_NEW" />ନୂଆ<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">ପ୍ରତିକ୍ରିୟାକୁ ପରିବର୍ତ୍ତନ କରାଯାଇଛି</translation>
 <translation id="5401851137404501592">ଜାରି ରଖିବାକୁ, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ଏହି ସାଇଟ ସହ ଆପଣଙ୍କ ନାମ, ଇମେଲ ଠିକଣା ଏବଂ ପ୍ରୋଫାଇଲ ଛବିକୁ ସେୟାର କରିବ।</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">ସାଇଟଗୁଡ଼ିକର URL ଜାଣିବା, Google Assistantକୁ ଟାସ୍କଗୁଡ଼ିକୁ ସମ୍ପୂର୍ଣ୍ଣ କରିବାରେ ଆପଣଙ୍କୁ ସାହାଯ୍ୟ କରିବାକୁ ଦିଏ। ଆପଣ Chrome ସେଟିଂସରେ Assistantକୁ ବନ୍ଦ କରିପାରିବେ।</translation>
 <translation id="5916664084637901428">ଚାଲୁ</translation>
 <translation id="5919204609460789179">ସିଙ୍କ ଆରମ୍ଭ କରିବା ପାଇଁ <ph name="PRODUCT_NAME" /> ଅପ୍‍‍ଡେଟ୍ କରନ୍ତୁ</translation>
+<translation id="593625682991400408">ଟ୍ରାଏଲ ସମୟରେ ସ୍ପାମ, ଠକାମୀ ଏବଂ ସାଇଟଗୁଡ଼ିକ ମଧ୍ୟରେ ସେୟାରିଂକୁ ସୀମିତ କରିବାର ଉପାୟଗୁଡ଼ିକୁ Chrome ଏକ୍ସପ୍ଲୋର କରୁଛି। Chrome ମଧ୍ୟ <ph name="BEGIN_LINK" />ଆପଣଙ୍କ ରୁଚିଗୁଡ଼ିକୁ ଆକଳନ କରେ<ph name="END_LINK" /> ଯାହାକୁ ସାଇଟଗୁଡ଼ିକ ଆପଣଙ୍କ ବିଜ୍ଞାପନଗୁଡ଼ିକୁ ଦେଖାଇବା ପାଇଁ ବ୍ୟବହାର କରିପାରିବେ। ଆପଣ ସେଟିଂସରେ ଆପଣଙ୍କ ରୁଚିଗୁଡ଼ିକୁ ପରିଚାଳନା କରିପାରିବେ।</translation>
 <translation id="5938820472109305350"><ph name="INTEREST" /> ଯୋଗ କରନ୍ତୁ</translation>
 <translation id="5942872142862698679">ସନ୍ଧାନ ପାଇଁ Google ବ୍ୟବହାର କରାଯାଉଛି</translation>
 <translation id="5945035219773565305">ବର୍ତ୍ତମାନର ସୁପାରିଶଗୁଡ଼ିକ:  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">ବୁକମାର୍କ ସେଭ ଫ୍ଲୋକୁ ବନ୍ଦ କରାଯାଇଛି</translation>
 <translation id="9108312223223904744">ଏକ ସୁରକ୍ଷା କୀ ସପୋର୍ଟ ଭାବେ ଫୋନର ବ୍ୟବହାର</translation>
 <translation id="9108808586816295166">ସୁରକ୍ଷିତ DNS ସବୁ ସମୟରେ ଉପଲବ୍ଧ ହୋଇନପାରେ</translation>
+<translation id="9128984223251192329">ପ୍ରାଇଭେସି ସେଣ୍ଡବକ୍ସ ପ୍ରମ୍ପ୍ଟ ଅଧା ସ୍କ୍ରିନରେ ଖୋଲାଯାଇଛି</translation>
 <translation id="9133397713400217035">ଅଫ୍‌ଲାଇନ୍‌ରେ ଏକ୍ସପ୍ଲୋର୍ କରନ୍ତୁ</translation>
 <translation id="9137013805542155359">ମୂଳ ଲେଖା ଦେଖାନ୍ତୁ</translation>
 <translation id="9148126808321036104">ପୁଣି ସାଇନ୍ ଇନ୍ କରନ୍ତୁ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
index 03de2fa..bc34f29 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">Zakładki i historia online</translation>
 <translation id="1513814250881909472">Aby zobaczyć karty z innych urządzeń, włącz synchronizację</translation>
 <translation id="1513858653616922153">Usuń hasło</translation>
+<translation id="1514552811327923157">Okno Piaskownicy prywatności jest otwarte na całą wysokość</translation>
 <translation id="1518421282666914498">GIF z emotikonem <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">Aktywność: dzisiaj</translation>
 <translation id="1538801903729528855">Korzystaj z dodatkowych możliwości funkcji głosowych w internecie</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">Wersje próbne</translation>
 <translation id="2718352093833049315">Tylko przez Wi-Fi</translation>
 <translation id="2718846868787000099">Odwiedzane witryny będą miały dostęp do Twoich ustawień, by mogły pokazywać zawartość w wybranym przez Ciebie języku</translation>
+<translation id="2722945394406572875">Okno piaskownicy prywatności zostało zamknięte</translation>
 <translation id="2723001399770238859">dźwięk</translation>
 <translation id="2732063072010454421">Wyszukiwanie głosowe może być jeszcze wygodniejsze</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">Prośby o uprawnienia</translation>
 <translation id="5355191726083956201">Włączona jest silniejsza ochrona</translation>
 <translation id="5368227114232678694">Wypróbuj tryb incognito do prywatnego przeglądania internetu na tym urządzeniu</translation>
+<translation id="5371717687506906963">Okno piaskownicy prywatności</translation>
 <translation id="5375577065097716013">Szukaj z Obiektywem Google <ph name="BEGIN_NEW" />Nowe<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Reakcja została zmieniona</translation>
 <translation id="5401851137404501592"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> udostępni teraz witrynie Twoje imię i nazwisko, adres e-mail i zdjęcie profilowe.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">Znając adresy URL stron internetowych, Asystent Google będzie mógł pomagać Ci w wykonywaniu zadań. Możesz go wyłączyć w ustawieniach Chrome.</translation>
 <translation id="5916664084637901428">Włączone</translation>
 <translation id="5919204609460789179">Zaktualizuj przeglądarkę <ph name="PRODUCT_NAME" />, by rozpocząć synchronizację</translation>
+<translation id="593625682991400408">Podczas testów Chrome sprawdza, w jaki sposób można ograniczyć spam, oszustwa i udostępnianie treści między witrynami. Chrome <ph name="BEGIN_LINK" />określa w przybliżeniu Twoje zainteresowania<ph name="END_LINK" />, na podstawie których strony mogą wyświetlać Ci reklamy. Swoimi zainteresowaniami możesz zarządzać w ustawieniach.</translation>
 <translation id="5938820472109305350">Dodaj: <ph name="INTEREST" /></translation>
 <translation id="5942872142862698679">Korzystam z wyszukiwarki Google</translation>
 <translation id="5945035219773565305">Obecne zalecenie: <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">Procedura zapisywania zakładki została zamknięta</translation>
 <translation id="9108312223223904744">Telefon jako klucz bezpieczeństwa</translation>
 <translation id="9108808586816295166">Bezpieczny DNS może nie być dostępny przez cały czas</translation>
+<translation id="9128984223251192329">Okno Piaskownicy prywatności jest otwarte do połowy wysokości</translation>
 <translation id="9133397713400217035">Przeglądaj offline</translation>
 <translation id="9137013805542155359">Pokaż tekst oryginalny</translation>
 <translation id="9148126808321036104">Zaloguj się ponownie</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
index 5f3c4116..160ef80 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">Marcaje și istoric web</translation>
 <translation id="1513814250881909472">Sincronizează pentru a accesa filele de pe celelalte dispozitive</translation>
 <translation id="1513858653616922153">Șterge parola</translation>
+<translation id="1514552811327923157">Solicitarea Privacy Sandbox s-a deschis la înălțime completă</translation>
 <translation id="1518421282666914498">GIF emoție <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">Activ astăzi</translation>
 <translation id="1538801903729528855">Bucură-te de o experiență vocală mai bună pe web</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">Versiuni de încercare</translation>
 <translation id="2718352093833049315">Numai prin Wi-Fi</translation>
 <translation id="2718846868787000099">Site-urile pe care le accesezi îți pot vedea preferințele pentru a afișa conținut în limbile tale preferate</translation>
+<translation id="2722945394406572875">Solicitarea privind Privacy Sandbox a fost închisă</translation>
 <translation id="2723001399770238859">audio</translation>
 <translation id="2732063072010454421">Beneficiază de o experiență vocală mai bună</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">Solicitări de permisiuni</translation>
 <translation id="5355191726083956201">Protecția îmbunătățită este activată</translation>
 <translation id="5368227114232678694">Ca să navighezi în privat pe acest dispozitiv, încearcă Incognito</translation>
+<translation id="5371717687506906963">Solicitare privind Privacy Sandbox</translation>
 <translation id="5375577065097716013">Caută imaginea cu Google Lens <ph name="BEGIN_NEW" />Nou<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Reacția a fost modificată</translation>
 <translation id="5401851137404501592">Pentru a continua, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> va permite accesul site-ului la numele, adresa de e-mail și fotografia ta de profil.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">Dacă știe adresele URL ale site-urilor, Asistentul Google te poate ajuta să finalizezi activități. Poți să dezactivezi Asistentul din setările Chrome.</translation>
 <translation id="5916664084637901428">Activat</translation>
 <translation id="5919204609460789179">Actualizează <ph name="PRODUCT_NAME" /> pentru a începe sincronizarea</translation>
+<translation id="593625682991400408">În perioadele de încercare, Chrome explorează moduri de a limita spamul, frauda și transferul între site-uri. Chrome îți <ph name="BEGIN_LINK" />estimează interesele<ph name="END_LINK" /> pe care le pot folosi site-urile pentru a-ți afișa anunțuri. Îți poți gestiona interesele din setări.</translation>
 <translation id="5938820472109305350">Adaugă <ph name="INTEREST" /></translation>
 <translation id="5942872142862698679">Pentru căutare se folosește Google</translation>
 <translation id="5945035219773565305">Recomandare actuală:  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">Fluxul de salvare a marcajului închis</translation>
 <translation id="9108312223223904744">Compatibilitatea folosirii telefonului ca pe o cheie de securitate</translation>
 <translation id="9108808586816295166">Este posibil să nu fie disponibil oricând un DNS securizat</translation>
+<translation id="9128984223251192329">Solicitarea Privacy Sandbox s-a deschis la jumătate din înălțime</translation>
 <translation id="9133397713400217035">Explorează offline</translation>
 <translation id="9137013805542155359">Afișează originalul</translation>
 <translation id="9148126808321036104">Conectează-te din nou</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
index 7929fc8..f217eb91 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">Закладки и история поиска</translation>
 <translation id="1513814250881909472">Чтобы стали доступны вкладки с других устройств, выполните синхронизацию.</translation>
 <translation id="1513858653616922153">Удалить пароль</translation>
+<translation id="1514552811327923157">Уведомление Privacy Sandbox открыто на весь экран</translation>
 <translation id="1518421282666914498">GIF со смайликом <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">Последние действия: сегодня</translation>
 <translation id="1538801903729528855">Сделайте голосовой поиск в Интернете удобнее</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">Эксперименты</translation>
 <translation id="2718352093833049315">Только Wi-Fi</translation>
 <translation id="2718846868787000099">Сайты, которые вы посещаете, могут видеть выбранные вами настройки, чтобы показывать контент на нужном языке.</translation>
+<translation id="2722945394406572875">Уведомление Privacy Sandbox закрыто</translation>
 <translation id="2723001399770238859">аудио</translation>
 <translation id="2732063072010454421">Улучшенный голосовой поиск</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">Запросы разрешений</translation>
 <translation id="5355191726083956201">Улучшенная защита включена.</translation>
 <translation id="5368227114232678694">Чтобы анонимно работать в интернете на этом устройстве, воспользуйтесь режимом инкогнито.</translation>
+<translation id="5371717687506906963">Уведомление Privacy Sandbox</translation>
 <translation id="5375577065097716013">Найти через Google Объектив <ph name="BEGIN_NEW" />Новинка<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Отклик изменен</translation>
 <translation id="5401851137404501592">Чтобы продолжить, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> передаст ваше имя, адрес электронной почты и фото профиля на этот сайт.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">Ассистент сможет больше вам помогать, если получит доступ к URL сайтов. Отключить Ассистента можно в настройках Chrome.</translation>
 <translation id="5916664084637901428">ВКЛ</translation>
 <translation id="5919204609460789179">Обновите <ph name="PRODUCT_NAME" />, чтобы начать синхронизацию</translation>
+<translation id="593625682991400408">Во время эксперимента Chrome изучает способы ограничения спама, мошенничества и обмена информацией между сайтами. Браузер также <ph name="BEGIN_LINK" />оценивает ваши интересы<ph name="END_LINK" />, чтобы на их основе сайты показывали вам рекламу. Параметры этой функции можно задать в настройках.</translation>
 <translation id="5938820472109305350">Добавить интерес "<ph name="INTEREST" />"</translation>
 <translation id="5942872142862698679">Google используется как поисковая система по умолчанию</translation>
 <translation id="5945035219773565305">Рекомендуется: <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">Страница сохранения закладки закрыта</translation>
 <translation id="9108312223223904744">Поддержка телефона в качестве электронного ключа</translation>
 <translation id="9108808586816295166">Иногда безопасный DNS-сервер может быть недоступен.</translation>
+<translation id="9128984223251192329">Уведомление Privacy Sandbox открыто на половину экрана</translation>
 <translation id="9133397713400217035">Офлайн-контент</translation>
 <translation id="9137013805542155359">Показать оригинал</translation>
 <translation id="9148126808321036104">Повторите вход</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
index 35e925d..904052a 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">පිටුසන් සහ වෙබ් ඉතිහාසය</translation>
 <translation id="1513814250881909472">ඔබගේ අනෙකුත් උපාංගවලින් ඔබගේ ටැබ් ලබා ගැනීමට සමමුහුර්ත කරන්න</translation>
 <translation id="1513858653616922153">මුරපදය මකන්න</translation>
+<translation id="1514552811327923157">රහස්‍යතා සෑන්ඩ්බොක්ස් ප්‍රේරකය සම්පූර්ණ උසකින් විවෘත විය</translation>
 <translation id="1518421282666914498">හැඟීම් GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">අද ක්‍රියාත්මකයි</translation>
 <translation id="1538801903729528855">වෙබයෙහි වඩා හොඳ හඬ අත්දැකීමක් ලබා ගන්න</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">අත්හදා බැලීම්</translation>
 <translation id="2718352093833049315">Wi-Fi මත පමනි</translation>
 <translation id="2718846868787000099">ඔබ කැමති භාෂාවලින් අන්තර්ගතය පෙන්වීමට, ඔබ පිවිසෙන අඩවිවලට ඔබේ මනාප දැකිය හැකිය</translation>
+<translation id="2722945394406572875">රහස්‍යතා සෑන්ඩ්බොක්ස් ප්‍රේරකය වසා ඇත</translation>
 <translation id="2723001399770238859">ශ්‍රව්‍ය</translation>
 <translation id="2732063072010454421">වඩා හොඳ හඬ අත්දැකීමක් ලබා ගන්න</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">අවසර ඉල්ලීම්</translation>
 <translation id="5355191726083956201">වැඩිදියුණු කළ ආරක්ෂාව සක්‍රීයයි</translation>
 <translation id="5368227114232678694">මෙම උපාංගයේ පුද්ගලිකව බ්‍රවුස් කිරීමට, අප්‍රසිද්ධ උත්සාහ කරන්න</translation>
+<translation id="5371717687506906963">රහස්‍යතා සෑන්ඩ්බොක්ස් ප්‍රේරකය</translation>
 <translation id="5375577065097716013">Google Lens සමග රූපය සොයන්න <ph name="BEGIN_NEW" />නව<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">ප්‍රතිචාරය වෙනස් කරන ලදි</translation>
 <translation id="5401851137404501592">ඉදිරියට යාමට, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ඔබගේ නම, ඉ-තැපැල් ලිපිනය සහ පැතිකඩ පින්තූරය මෙම අඩවිය සමග බෙදා ගනු ඇත.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">අඩවිවල URL දැන ගැනීම Google සහායකට ඔබට කාර්යයන් සම්පූර්ණ කිරීමට උදවු කිරීමට ඉඩ සලසයි. ඔබට Chrome සැකසීම් තුළ සහායක ක්‍රියාවිරහිත කළ හැකිය.</translation>
 <translation id="5916664084637901428">ක්‍රියාත්මකයි</translation>
 <translation id="5919204609460789179">සමමුහුර්ත වීම ආරම්භ කිරීමට <ph name="PRODUCT_NAME" /> යාවත්කාලීන කරන්න</translation>
+<translation id="593625682991400408">අත්හදා බැලීම් අතරතුර, Chrome අයාචිත තැපැල්, වංචා සහ අඩවි අතර බෙදා ගැනීම සීමා කිරීමට ක්‍රම ගවේෂණය කරයි. Chrome ඔබට වෙළඳ දැන්වීම් පෙන්වීමට අඩවි භාවිත කළ හැකි <ph name="BEGIN_LINK" />ඔබගේ ලැදිකම්ද ඇස්තමේන්තු කරයි<ph name="END_LINK" />. ඔබට සැකසීම් තුළ ඔබගේ ලැදිකම් කළමනාකරණය කළ හැකිය.</translation>
 <translation id="5938820472109305350"><ph name="INTEREST" /> එක් කරන්න</translation>
 <translation id="5942872142862698679">සෙවීම සඳහා Google භාවිත කරමින්</translation>
 <translation id="5945035219773565305">වත්මන් නිර්දේශය:  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">පිටුසන් සුරැකීම් ප්‍රවාහය වසා ඇත</translation>
 <translation id="9108312223223904744">දුරකථනය ආරක්ෂක යතුරු සහයක් ලෙස</translation>
 <translation id="9108808586816295166">සුරක්‍ෂිත DNS සැම විටම ලද නොහැකි වීමට ඉඩ ඇත</translation>
+<translation id="9128984223251192329">රහස්‍යතා සෑන්ඩ්බොක්ස් ප්‍රේරකය අර්ධ උසකින් විවෘත විය</translation>
 <translation id="9133397713400217035">නොබැඳිව ගවේෂණ කරන්න</translation>
 <translation id="9137013805542155359">මූලිකය පෙන්වන්න</translation>
 <translation id="9148126808321036104">නැවත පිවිසෙන්න</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
index 0fd3cf2..abfce11 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">Zaznamki in spletna zgodovina</translation>
 <translation id="1513814250881909472">S sinhronizacijo si zagotovite zavihke iz drugih naprav.</translation>
 <translation id="1513858653616922153">Izbris gesla</translation>
+<translation id="1514552811327923157">Poziv za Zasebni peskovnik, odprt pri polni višini.</translation>
 <translation id="1518421282666914498">GIF za čustveni simbol <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">Aktivno danes</translation>
 <translation id="1538801903729528855">Boljša glasovna izkušnja v spletu</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">Preizkusi</translation>
 <translation id="2718352093833049315">Samo v omrežju Wi-Fi</translation>
 <translation id="2718846868787000099">Če želite prikazati vsebino v prednostnih jezikih, lahko spletna mesta, ki jih obiščete, vidijo vaše nastavitve.</translation>
+<translation id="2722945394406572875">Poziv za Zasebni peskovnik je zaprt</translation>
 <translation id="2723001399770238859">zvok</translation>
 <translation id="2732063072010454421">Do boljše glasovne izkušnje</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">Zahteve za dovoljenja</translation>
 <translation id="5355191726083956201">Izboljšana zaščita je vklopljena</translation>
 <translation id="5368227114232678694">Če želite zasebno brskati v tej napravi, preizkusite anonimni način.</translation>
+<translation id="5371717687506906963">Poziv za Zasebni peskovnik</translation>
 <translation id="5375577065097716013">Išči sliko z Googlom Lens <ph name="BEGIN_NEW" />Novo<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Odziv je bil spremenjen</translation>
 <translation id="5401851137404501592">Če želite nadaljevati, bo ponudnik <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> delil vaše ime, e-poštni naslov in profilno sliko s tem spletnim mestom.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">Če Pomočnik Google pozna URL-je spletnih mest, vam lahko pomaga dokončati opravila. Pomočnika lahko izklopite v nastavitvah Chroma.</translation>
 <translation id="5916664084637901428">Vklopljeno</translation>
 <translation id="5919204609460789179">Posodobite izdelek <ph name="PRODUCT_NAME" />, če želite začeti sinhronizacijo</translation>
+<translation id="593625682991400408">Med preizkusi Chrome raziskuje načine, kako omejiti neželeno vsebino, prevare in deljenja med spletnimi mesti. Chrome tudi <ph name="BEGIN_LINK" />oceni vaša zanimanja<ph name="END_LINK" />, ki jih spletna mesta lahko uporabijo pri prikazovanju oglasov. Zanimanja lahko upravljate v nastavitvah.</translation>
 <translation id="5938820472109305350">Dodajanje: <ph name="INTEREST" /></translation>
 <translation id="5942872142862698679">Uporaba iskalnika Google za iskanje</translation>
 <translation id="5945035219773565305">Trenutno priporočilo:  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">Postopek shranjevanja zaznamka je zaprt</translation>
 <translation id="9108312223223904744">Podpora za telefon kot varnostni ključ</translation>
 <translation id="9108808586816295166">Varni DNS morda ni na voljo ves čas</translation>
+<translation id="9128984223251192329">Poziv za Zasebni peskovnik, odprt pri polovični višini.</translation>
 <translation id="9133397713400217035">Raziščite vsebino brez povezave</translation>
 <translation id="9137013805542155359">Pokaži izvirno besedilo</translation>
 <translation id="9148126808321036104">Prijavite se znova</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
index 20401e4..a9eb87a 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">புத்தகக்குறிகளும் இணைய வரலாறும்</translation>
 <translation id="1513814250881909472">உங்கள் பிற சாதனங்களின் உலாவிப் பக்கங்களில் உள்ளவற்றைப் பெற ஒத்திசையுங்கள்</translation>
 <translation id="1513858653616922153">கடவுச்சொல்லை நீக்கு</translation>
+<translation id="1514552811327923157">தனியுரிமை சாண்ட்பாக்ஸ் அறிவிப்பு முழுத் திரையில் திறக்கப்பட்டுள்ளது</translation>
 <translation id="1518421282666914498">எமோடிகான் GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">இன்று பயன்படுத்தியுள்ளார்</translation>
 <translation id="1538801903729528855">இன்னும் சிறப்பான குரல் அனுபவத்தை இணையத்தில் பெறுங்கள்</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">சோதனைகள்</translation>
 <translation id="2718352093833049315">வைஃபையில் மட்டும்</translation>
 <translation id="2718846868787000099">உங்களுக்கு விருப்பமான மொழியில் உள்ளடக்கத்தைக் காட்டுவதற்காக நீங்கள் பார்க்கும் தளங்கள் உங்கள் விருப்பத்தேர்வுகளை அணுகலாம்</translation>
+<translation id="2722945394406572875">தனியுரிமை சாண்ட்பாக்ஸ் அறிவிப்பு மூடப்பட்டது</translation>
 <translation id="2723001399770238859">ஆடியோ</translation>
 <translation id="2732063072010454421">சிறந்த குரல் அனுபவத்தைப் பெறுங்கள்</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">அனுமதிக் கோரிக்கைகள்</translation>
 <translation id="5355191726083956201">மேம்படுத்தப்பட்ட பாதுகாப்பு இயக்கப்பட்டுள்ளது</translation>
 <translation id="5368227114232678694">இந்தச் சாதனத்தில் தனிப்பட்ட முறையில் உலாவ, மறைநிலைப் பயன்முறையைப் பயன்படுத்திப் பாருங்கள்</translation>
+<translation id="5371717687506906963">தனியுரிமை சாண்ட்பாக்ஸ் அறிவிப்பு</translation>
 <translation id="5375577065097716013">Google Lens மூலம் படத்தைத் தேடு <ph name="BEGIN_NEW" />புதிது<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">உணர்வு வெளிப்பாடு மாற்றப்பட்டது</translation>
 <translation id="5401851137404501592">தொடர உங்கள் பெயர், மின்னஞ்சல் முகவரி, சுயவிவரப் படம் ஆகியவற்றை இந்தத் தளத்தில் <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> பகிரும்.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">தளங்களின் URLகளை அறிந்துகொள்வதன் மூலம் Google Assistant உங்கள் பணிகளை நிறைவுசெய்ய உதவும். Chrome அமைப்புகளுக்குச் சென்று Assistantடை முடக்கலாம்.</translation>
 <translation id="5916664084637901428">இயக்கு</translation>
 <translation id="5919204609460789179">ஒத்திசைவைத் தொடங்க, <ph name="PRODUCT_NAME" />ஐப் புதுப்பிக்கவும்</translation>
+<translation id="593625682991400408">கட்டணமற்ற உபயோகக் காலத்தின்போது ஸ்பேம், மோசடி, தளங்களுக்கு இடையே பகிர்தல் போன்றவற்றைக் குறைப்பதற்கான வழிகளை Chrome ஆராய்கிறது. Chrome <ph name="BEGIN_LINK" />உங்கள் ஆர்வங்களையும் கணிக்கும்<ph name="END_LINK" />. அவற்றின் அடிப்படையில் விளம்பரங்களை உங்களுக்குக் காட்ட தளங்கள் அவற்றைப் பயன்படுத்தலாம். அமைப்புகளுக்குச் சென்று உங்கள் ஆர்வங்களை நிர்வகிக்கலாம்.</translation>
 <translation id="5938820472109305350"><ph name="INTEREST" /> ஐச் சேர்க்கும்</translation>
 <translation id="5942872142862698679">தேடலுக்கு Googleளைப் பயன்படுத்துகிறீர்கள்</translation>
 <translation id="5945035219773565305">தற்போது பரிந்துரைக்கப்படுவது: <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">புக்மார்க் சேமிப்புச் செயல்முறை மூடப்பட்டது</translation>
 <translation id="9108312223223904744">பாதுகாப்பு விசையாக ஃபோன் பயன்படுத்தப்படும்</translation>
 <translation id="9108808586816295166">பாதுகாப்பான DNS எப்போதும் கிடைக்காமல் போகலாம்</translation>
+<translation id="9128984223251192329">தனியுரிமை சாண்ட்பாக்ஸ் அறிவிப்பு பாதித் திரையில் திறக்கப்பட்டுள்ளது</translation>
 <translation id="9133397713400217035">ஆஃப்லைனில் கண்டறியுங்கள்</translation>
 <translation id="9137013805542155359">அசலைக் காண்பி</translation>
 <translation id="9148126808321036104">மீண்டும் உள்நுழைக</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
index 3793d61..b71da648 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">بُک مارکس اور ویب سرگزشت</translation>
 <translation id="1513814250881909472">اپنے دوسرے آلات سے اپنے ٹیبز حاصل کرنے کے لیے مطابقت پذیری کریں</translation>
 <translation id="1513858653616922153">پاس ورڈ حذف کریں</translation>
+<translation id="1514552811327923157">رازداری سینڈ باکس پرامٹ کی نیچے کی شیٹ مکمل اونچائی پر کھلی ہوئی ہے</translation>
 <translation id="1518421282666914498">‏جذباتی GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">آج فعال کیا گیا</translation>
 <translation id="1538801903729528855">ویب پر ایک بہتر صوتی تجربہ حاصل کریں</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">ٹرائلز</translation>
 <translation id="2718352093833049315">‏صرف Wi-Fi پر</translation>
 <translation id="2718846868787000099">اپنی ترجیحی زبانوں میں مواد دکھانے کے لیے، آپ جو سائٹس ملاحظہ کرتے ہیں وہ آپ کی ترجیحات دیکھ سکتی ہیں</translation>
+<translation id="2722945394406572875">رازداری سینڈ باکس پرامٹ بند ہے</translation>
 <translation id="2723001399770238859">آڈیو</translation>
 <translation id="2732063072010454421">ایک بہتر صوتی تجربہ حاصل کریں</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">اجازت کی درخواستیں</translation>
 <translation id="5355191726083956201">بہتر کردہ تحفظ آن ہے</translation>
 <translation id="5368227114232678694">اس آلے پر نجی طور پر براؤز کرنے کے لیے پوشیدگی آزمائیں</translation>
+<translation id="5371717687506906963">رازداری سینڈ باکس پرامٹ</translation>
 <translation id="5375577065097716013">‏Google لینز سے تصویر تلاش کریں <ph name="BEGIN_NEW" />نیا<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">ردعمل کو تبدیل کیا گیا</translation>
 <translation id="5401851137404501592">جاری رکھنے کے لیے، <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> اس سائٹ کے ساتھ آپ کے نام، ای میل پتہ اور پروفائل کی تصویر کا اشتراک کرے گا۔</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">‏سائٹس کے URLs کو جاننے سے Google اسسٹنٹ ٹاسکس مکمل کرنے میں آپ کی مدد کر سکتی ہے۔ آپ Chrome کی ترتیبات میں اسسٹنٹ کو آف کر سکتے ہیں۔</translation>
 <translation id="5916664084637901428">آن</translation>
 <translation id="5919204609460789179">مطابقت پذیری شروع کرنے کیلئے <ph name="PRODUCT_NAME" /> کو اپ ڈیٹ کریں</translation>
+<translation id="593625682991400408">‏ٹرائلز کے دوران، Chrome اسپام، دھوکہ اور سائٹس کے درمیان اشتراک کو محدود کرنے کے طریقے دریافت کر رہا ہے۔ Chrome <ph name="BEGIN_LINK" />آپ کی دلچسپیوں کا تخمینہ<ph name="END_LINK" /> بھی لگاتا ہے سائٹس جن کا استعمال آپ کو اشتہارات دکھانے کے لیے کر سکتی ہیں۔ آپ ترتیبات میں اپنی دلچسپیوں کا نظم کر سکتے ہیں۔</translation>
 <translation id="5938820472109305350"><ph name="INTEREST" /> شامل کریں</translation>
 <translation id="5942872142862698679">‏تلاش کیلئے Google کا استعمال کیا جا رہا ہے</translation>
 <translation id="5945035219773565305">موجودہ تجویز: <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">بُک مارک محفوظ کرنے کا فلو بند ہے</translation>
 <translation id="9108312223223904744">سیکیورٹی کلید سپورٹ کے بطور فون</translation>
 <translation id="9108808586816295166">‏ممکن ہے کہ محفوظ DNS ہر وقت دستیاب نہ ہو</translation>
+<translation id="9128984223251192329">رازداری سینڈ باکس پرامٹ کی نیچے کی شیٹ آدھی اونچائی پر کھلی ہوئی ہے</translation>
 <translation id="9133397713400217035">آف لائن دریافت کریں</translation>
 <translation id="9137013805542155359">اصل دکھائیں</translation>
 <translation id="9148126808321036104">دوبارہ سائن ان کریں</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
index affa16e..c363294 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -110,7 +110,7 @@
 <translation id="1513352483775369820">書籤和網頁記錄</translation>
 <translation id="1513814250881909472">進行同步處理,取得您在其他裝置上的分頁</translation>
 <translation id="1513858653616922153">刪除密碼</translation>
-<translation id="1514552811327923157">Privacy Sandbox 提示已開啟,顯示於整個畫面</translation>
+<translation id="1514552811327923157">私隱沙箱提示宜家顯示喺成個畫面</translation>
 <translation id="1518421282666914498">表情符號 GIF <ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">今天已使用</translation>
 <translation id="1538801903729528855">獲得更佳的網上語音體驗</translation>
@@ -322,7 +322,7 @@
 <translation id="2711073837061989559">試用功能</translation>
 <translation id="2718352093833049315">僅限 Wi-Fi 連線時</translation>
 <translation id="2718846868787000099">為了要以您偏好的語言顯示內容,您瀏覽的網站將能看到偏好設定</translation>
-<translation id="2722945394406572875">Privacy Sandbox 提示已關閉</translation>
+<translation id="2722945394406572875">閂咗私隱沙箱提示</translation>
 <translation id="2723001399770238859">音效檔案</translation>
 <translation id="2732063072010454421">獲得更佳的語音體驗</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -793,7 +793,7 @@
 <translation id="5342314432463739672">權限要求</translation>
 <translation id="5355191726083956201">已開啟「強化保護功能」</translation>
 <translation id="5368227114232678694">如要在此裝置上私密瀏覽,請使用「無痕模式」</translation>
-<translation id="5371717687506906963">Privacy Sandbox 提示</translation>
+<translation id="5371717687506906963">私隱沙箱提示</translation>
 <translation id="5375577065097716013">使用「Google 智能鏡頭」搜尋圖片 <ph name="BEGIN_NEW" />新功能<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">已經變更咗反應</translation>
 <translation id="5401851137404501592">如要繼續,<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> 將會與此網站分享您的姓名、電郵地址和個人檔案相片。</translation>
@@ -897,7 +897,7 @@
 <translation id="5906513782029855931">如果「Google 助理」知道網站的網址,便能夠助您完成工作。您可在 Chrome 設定中關閉「Google 助理」。</translation>
 <translation id="5916664084637901428">開啟</translation>
 <translation id="5919204609460789179">更新 <ph name="PRODUCT_NAME" /> 即可開始同步處理</translation>
-<translation id="593625682991400408">在試用期間,Chrome 會探索如何防範垃圾內容和詐欺行為,以及限制網站之間分享資訊的方法。Chrome 還會<ph name="BEGIN_LINK" />推測你的興趣喜好<ph name="END_LINK" />,讓網站能夠顯示廣告。你可以前往設定管理自己的興趣喜好。</translation>
+<translation id="593625682991400408">在試用期間,Chrome 會研究如何防範垃圾郵件和欺詐行為,以及限制網站之間分享資訊的方法。Chrome 亦會<ph name="BEGIN_LINK" />推斷您的興趣<ph name="END_LINK" />,讓網站能顯示廣告。您可在設定中管理興趣。</translation>
 <translation id="5938820472109305350">新增<ph name="INTEREST" /></translation>
 <translation id="5942872142862698679">使用 Google 搜尋內容</translation>
 <translation id="5945035219773565305">目前的建議:<ph name="RECOMMENDATION" /></translation>
@@ -1516,7 +1516,7 @@
 <translation id="9106148373857059373">閂咗書籤儲存流程</translation>
 <translation id="9108312223223904744">支援「讓手機作為安全密鑰」</translation>
 <translation id="9108808586816295166">可能無法隨時使用安全 DNS</translation>
-<translation id="9128984223251192329">Privacy Sandbox 提示已開啟,顯示在畫面下半部</translation>
+<translation id="9128984223251192329">私隱沙箱提示宜家顯示喺畫面下半部</translation>
 <translation id="9133397713400217035">離線探索</translation>
 <translation id="9137013805542155359">顯示原文</translation>
 <translation id="9148126808321036104">重新登入</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
index b99d724..7717cf7f 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -110,6 +110,7 @@
 <translation id="1513352483775369820">Amabhukhimakhi nomlando wendawo</translation>
 <translation id="1513814250881909472">Vumelanisa ukuze uthole amathebhu akho kwamanye amadivaysi akho</translation>
 <translation id="1513858653616922153">Susa iphasiwedi</translation>
+<translation id="1514552811327923157">Ukwaziswa kwe-Privacy Sandbox kuvulwe ngobude obugcwele</translation>
 <translation id="1518421282666914498">I-GIF Yomuzwa i-<ph name="CURRENT_DATE_ISO" /></translation>
 <translation id="1521774566618522728">Iyasebenza namhlanje</translation>
 <translation id="1538801903729528855">Thola umuzwa ongcono wezwi kuwebhu</translation>
@@ -321,6 +322,7 @@
 <translation id="2711073837061989559">Ukuzama</translation>
 <translation id="2718352093833049315">Ku-Wi-Fi kuphela</translation>
 <translation id="2718846868787000099">Ukuze abonise okuqukethwe ngezilimi ozithandayo, amasayithi owavakashelayo angabona okuncanyelwayo kwakho</translation>
+<translation id="2722945394406572875">Ukwaziswa kwe-Privacy Sandbox kuvaliwe</translation>
 <translation id="2723001399770238859">umsindo</translation>
 <translation id="2732063072010454421">Thola umuzwa ongcono wezwi</translation>
 <translation id="2739256783402597439">2G</translation>
@@ -791,6 +793,7 @@
 <translation id="5342314432463739672">Izicelo zemvume</translation>
 <translation id="5355191726083956201">Ukuvikelwa Okuthuthukisiwe kuvuliwe</translation>
 <translation id="5368227114232678694">Ukuze ubhrawuze ngokugodliwe kule divayisi, zama i-Incognito</translation>
+<translation id="5371717687506906963">Ukwaziswa kwe-Privacy Sandbox</translation>
 <translation id="5375577065097716013">Sesha isithombe Ngama-Google Lens<ph name="BEGIN_NEW" />Entsha<ph name="END_NEW" /></translation>
 <translation id="5376898820269806588">Ukusabela kushintshiwe</translation>
 <translation id="5401851137404501592">Ukuze uqhubeke, i-<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> izokwabelana ngegama lakho, ikheli le-imeyili, nesithombe sephrofayela nale sayithi.</translation>
@@ -894,6 +897,7 @@
 <translation id="5906513782029855931">Ukwazi ama-URL wamasayithi kuvumela i-Google Assistant ukuthi ikusize uqedele imisebenzi. Ungavala i-Assistant kumasethingi we-Chrome.</translation>
 <translation id="5916664084637901428">Vuliwe</translation>
 <translation id="5919204609460789179">Buyekeza i-<ph name="PRODUCT_NAME" /> ukuze uqale ukuvumelanisa</translation>
+<translation id="593625682991400408">Ngesikhathi sokuzama, i-Chrome ihlola izindlela zokukhawulela ogaxekile, ukukhwabanisa, nokwabelana phakathi kwamasayithi. I-Chrome ibuye ilinganise <ph name="BEGIN_LINK" />ongaba nentshisekelo kukho<ph name="END_LINK" /> amasayithi angakusebenzisa ukukubonisa izikhangiso. Ungaphatha ongaba nentshisekelo kukho kumasethingi.</translation>
 <translation id="5938820472109305350">Faka i-<ph name="INTEREST" /></translation>
 <translation id="5942872142862698679">Isebenzisa i-Google ukuze iseshe</translation>
 <translation id="5945035219773565305">Isincomo samanje:  <ph name="RECOMMENDATION" /></translation>
@@ -1512,6 +1516,7 @@
 <translation id="9106148373857059373">Ukugeleza kokulondolozwa kwebhukhimakhi kuvaliwe</translation>
 <translation id="9108312223223904744">Ifoni njengosekelo lokhiye wokuqinisekisa ubunikazi</translation>
 <translation id="9108808586816295166">Ukuvikela i-DNS kungenzeka kungatholakali ngaso sonke isikhathi</translation>
+<translation id="9128984223251192329">Ukwaziswa kwe-Privacy Sandbox kuvulwe ngobude obuyisigamu</translation>
 <translation id="9133397713400217035">Hlola okungaxhunyiwe ku-inthanethi</translation>
 <translation id="9137013805542155359">Bonisa okwangempela</translation>
 <translation id="9148126808321036104">Phinda ungene ngemvume</translation>
diff --git a/chrome/browser/ui/browser_dialogs.h b/chrome/browser/ui/browser_dialogs.h
index df9f83d..2a003b4 100644
--- a/chrome/browser/ui/browser_dialogs.h
+++ b/chrome/browser/ui/browser_dialogs.h
@@ -138,6 +138,15 @@
     content::WebContents* web_contents,
     const std::u16string& device_identifier,
     content::BluetoothDelegate::CredentialsCallback close_callback);
+
+// Shows the dialog to let user confirm to pair with the device
+// identified by |device_identifier|. |device_identifier| is the most
+// appropriate string to display to the user for device identification
+// (e.g. name, MAC address).
+void ShowBluetoothDevicePairConfirmDialog(
+    content::WebContents* web_contents,
+    const std::u16string& device_identifier,
+    content::BluetoothDelegate::PairConfirmCallback close_callback);
 #endif  // PAIR_BLUETOOTH_ON_DEMAND()
 
 // Callback used to indicate whether a user has accepted the installation of a
diff --git a/chrome/browser/ui/extensions/extension_action_view_controller.cc b/chrome/browser/ui/extensions/extension_action_view_controller.cc
index ea65bd16..c0266ac3 100644
--- a/chrome/browser/ui/extensions/extension_action_view_controller.cc
+++ b/chrome/browser/ui/extensions/extension_action_view_controller.cc
@@ -193,6 +193,7 @@
       // No string for neither having nor wanting access.
       break;
     case extensions::SitePermissionsHelper::SiteInteraction::kPending:
+    case extensions::SitePermissionsHelper::SiteInteraction::kActiveTab:
       site_interaction_description_id = IDS_EXTENSIONS_WANTS_ACCESS_TO_SITE;
       break;
     case extensions::SitePermissionsHelper::SiteInteraction::kActive:
@@ -219,10 +220,15 @@
   if (!ExtensionIsValid())
     return false;
 
+  extensions::SitePermissionsHelper::SiteInteraction site_interaction =
+      GetSiteInteraction(web_contents);
+
   return extension_action_->GetIsVisible(
              sessions::SessionTabHelper::IdForTab(web_contents).id()) ||
-         GetSiteInteraction(web_contents) ==
-             extensions::SitePermissionsHelper::SiteInteraction::kPending;
+         site_interaction ==
+             extensions::SitePermissionsHelper::SiteInteraction::kPending ||
+         site_interaction ==
+             extensions::SitePermissionsHelper::SiteInteraction::kActiveTab;
 }
 
 bool ExtensionActionViewController::IsShowingPopup() const {
diff --git a/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc b/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc
index 697eafb..02eaebf 100644
--- a/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc
+++ b/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc
@@ -657,7 +657,7 @@
   content::WebContents* web_contents = GetActiveWebContents();
 
   {
-    EXPECT_EQ(SiteInteraction::kPending,
+    EXPECT_EQ(SiteInteraction::kActiveTab,
               controller->GetSiteInteraction(web_contents));
     EXPECT_TRUE(controller->IsEnabled(web_contents));
     std::unique_ptr<IconWithBadgeImageSource> image_source =
@@ -702,8 +702,8 @@
   }
 }
 
-// Tests that an extension with the activeTab permission is shown to be pending
-// user approval for normal web pages, but not for restricted URLs.
+// Tests that an extension with the activeTab permission has active tab site
+// interaction except for restricted URLs.
 TEST_F(ExtensionActionViewControllerUnitTest, GetSiteInteractionWithActiveTab) {
   auto extension = CreateAndAddExtensionWithGrantedHostPermissions(
       "active tab", extensions::ActionInfo::TYPE_BROWSER, {"activeTab"});
@@ -717,7 +717,7 @@
   ASSERT_TRUE(controller);
   content::WebContents* web_contents = GetActiveWebContents();
 
-  EXPECT_EQ(SiteInteraction::kPending,
+  EXPECT_EQ(SiteInteraction::kActiveTab,
             controller->GetSiteInteraction(web_contents));
 
   // Click on the action, which grants activeTab and allows the extension to
@@ -738,8 +738,8 @@
             controller->GetSiteInteraction(web_contents));
 }
 
-// Tests that file URLs only show as pending user approval for activeTab
-// extensions if the extension has file URL access.
+// Tests that file URLs only have active tab site interaction if the extension
+// has active tab permission and file URL access.
 TEST_F(ExtensionActionViewControllerUnitTest,
        GetSiteInteractionActiveTabWithFileURL) {
   // We need to use a TestExtensionDir here to allow for the reload when giving
@@ -786,7 +786,7 @@
   ASSERT_TRUE(extension);
   // Refresh the controller as the extension has been reloaded.
   controller = GetViewControllerForId(extension->id());
-  EXPECT_EQ(SiteInteraction::kPending,
+  EXPECT_EQ(SiteInteraction::kActiveTab,
             controller->GetSiteInteraction(web_contents));
   controller->ExecuteUserAction(
       ToolbarActionViewController::InvocationSource::kToolbarButton);
diff --git a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
index 6d708c2d..36f5590c 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
@@ -698,6 +698,78 @@
 #endif
   }
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+  Browser* ExpectBlockLaunchAndLaunchAnyways(const std::string& app_id,
+                                             bool force_install_dialog,
+                                             bool tab_launch_expected) {
+    EXPECT_EQ(2u, chrome::GetBrowserCount(browser()->profile()));
+    auto waiter = views::NamedWidgetShownWaiter(
+        views::test::AnyWidgetTestPasskey{},
+        force_install_dialog ? "ForceInstalledDeprecatedAppsDialogView"
+                             : "DeprecatedAppsDialogView");
+    // Should have opened the requested homepage about:blank in 1st window.
+    TabStripModel* tab_strip = browser()->tab_strip_model();
+    EXPECT_EQ(1, tab_strip->count());
+    EXPECT_FALSE(browser()->is_type_app());
+    EXPECT_TRUE(browser()->is_type_normal());
+    EXPECT_EQ(GURL(url::kAboutBlankURL),
+              tab_strip->GetWebContentsAt(0)->GetLastCommittedURL());
+    // Should have opened the chrome://apps unsupported app flow in 2nd window.
+    Browser* other_browser = FindOneOtherBrowser(browser());
+    DCHECK(other_browser);
+    TabStripModel* other_tab_strip = other_browser->tab_strip_model();
+    EXPECT_EQ(1, other_tab_strip->count());
+    EXPECT_FALSE(other_browser->is_type_app());
+    EXPECT_TRUE(other_browser->is_type_normal());
+
+    GURL expected_url =
+        force_install_dialog
+            ? GURL(chrome::kChromeUIAppsWithForceInstalledDeprecationDialogURL +
+                   app_id)
+            : GURL(chrome::kChromeUIAppsWithDeprecationDialogURL + app_id);
+    EXPECT_EQ(expected_url,
+              other_tab_strip->GetWebContentsAt(0)->GetVisibleURL());
+
+    std::set<Browser*> initial_browsers;
+    for (auto* initial_browser : *BrowserList::GetInstance())
+      initial_browsers.insert(initial_browser);
+
+    content::TestNavigationObserver same_tab_observer(
+        other_tab_strip->GetActiveWebContents(), 1,
+        content::MessageLoopRunner::QuitMode::DEFERRED,
+        /*ignore_uncommitted_navigations=*/false);
+
+    // Verify that the Deprecated Apps Dialog View also shows up.
+    auto* dialog = waiter.WaitIfNeededAndGet();
+    EXPECT_TRUE(dialog != nullptr);
+    if (force_install_dialog) {
+      // The 'accept' option in the force-install dialog is "launch anyways".
+      dialog->widget_delegate()->AsDialogDelegate()->Accept();
+    } else {
+      // The 'cancel' option in the deprecation dialog is "launch anyways".
+      dialog->widget_delegate()->AsDialogDelegate()->Cancel();
+    }
+    if (tab_launch_expected) {
+      same_tab_observer.Wait();
+      return other_browser;
+    } else {
+      Browser* app_browser =
+          ui_test_utils::GetBrowserNotInSet(initial_browsers);
+      if (!app_browser) {
+        app_browser = ui_test_utils::WaitForBrowserToOpen();
+        // The new browser should never be in |excluded_browsers|.
+        DCHECK(!base::Contains(initial_browsers, app_browser));
+      }
+      DCHECK(app_browser);
+      TabStripModel* app_tab_strip = app_browser->tab_strip_model();
+      EXPECT_EQ(1, app_tab_strip->count());
+      EXPECT_TRUE(app_browser->is_type_app());
+      EXPECT_FALSE(app_browser->is_type_normal());
+      return app_browser;
+    }
+  }
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
   bool IsExpectedToAllowLaunch() {
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
     BUILDFLAG(IS_FUCHSIA)
@@ -922,6 +994,176 @@
                           )),
     ChromeAppDeprecationFeatureValueToString);
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
+using StartupBrowserCreatorChromeAppShortcutTestWithLaunch =
+    StartupBrowserCreatorChromeAppShortcutTest;
+
+IN_PROC_BROWSER_TEST_P(StartupBrowserCreatorChromeAppShortcutTestWithLaunch,
+                       OpenAppShortcutNoPref) {
+  // Load an app with launch.container = 'tab'.
+  const Extension* extension_app = nullptr;
+  ASSERT_NO_FATAL_FAILURE(LoadApp("app_with_tab_container", &extension_app));
+
+  // When we start, the browser should already have an open tab.
+  TabStripModel* tab_strip = browser()->tab_strip_model();
+  EXPECT_EQ(1, tab_strip->count());
+  ui_test_utils::TabAddedWaiter tab_waiter(browser());
+
+  // Add --app-id=<extension->id()> to the command line.
+  base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
+  command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
+
+  ASSERT_TRUE(StartupBrowserCreator().ProcessCmdLineImpl(
+      command_line, base::FilePath(), chrome::startup::IsProcessStartup::kNo,
+      {browser()->profile(), StartupProfileMode::kBrowserWindow}, {}));
+
+  Browser* tabbed_browser =
+      ExpectBlockLaunchAndLaunchAnyways(extension_app->id(),
+                                        /*force_install_dialog=*/false,
+                                        /*tab_launch_expected=*/true);
+
+  // When we block the launch, we always create a new browser window to
+  // display chrome://apps and the dialog. After launch, the tab should open to
+  // the extension.
+  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile()));
+  tab_strip = tabbed_browser->tab_strip_model();
+  EXPECT_EQ(1, tab_strip->count());
+
+  // It should be a standard tabbed window, not an app window.
+  EXPECT_FALSE(tabbed_browser->is_type_app());
+  EXPECT_TRUE(tabbed_browser->is_type_normal());
+}
+
+IN_PROC_BROWSER_TEST_P(StartupBrowserCreatorChromeAppShortcutTestWithLaunch,
+                       OpenAppShortcutWindowPref) {
+  const Extension* extension_app = nullptr;
+  ASSERT_NO_FATAL_FAILURE(LoadApp("app_with_tab_container", &extension_app));
+
+  // Set a pref indicating that the user wants to open this app in a window.
+  SetAppLaunchPref(extension_app->id(), extensions::LAUNCH_TYPE_WINDOW);
+
+  base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
+  command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
+
+  ui_test_utils::BrowserChangeObserver browser_waiter(
+      nullptr, ui_test_utils::BrowserChangeObserver::ChangeType::kAdded);
+  ASSERT_TRUE(StartupBrowserCreator().ProcessCmdLineImpl(
+      command_line, base::FilePath(), chrome::startup::IsProcessStartup::kNo,
+      {browser()->profile(), StartupProfileMode::kBrowserWindow}, {}));
+
+  Browser* app_browser =
+      ExpectBlockLaunchAndLaunchAnyways(extension_app->id(),
+                                        /*force_install_dialog=*/false,
+                                        /*tab_launch_expected=*/false);
+  // When we block the launch, we always create a new browser window to
+  // display chrome://apps and the dialog, and then another to launch the app.
+  ASSERT_EQ(3u, chrome::GetBrowserCount(browser()->profile()));
+
+  // Pref was set to open in a window, so the app should have opened in a
+  // window.  The launch should have created a new browser. Find the new
+  // browser.
+  ASSERT_TRUE(app_browser);
+
+  // Expect an app window.
+  EXPECT_TRUE(app_browser->is_type_app());
+
+  // The browser's app_name should include the app's ID.
+  EXPECT_NE(app_browser->app_name().find(extension_app->id()),
+            std::string::npos)
+      << app_browser->app_name();
+}
+
+IN_PROC_BROWSER_TEST_P(StartupBrowserCreatorChromeAppShortcutTestWithLaunch,
+                       OpenAppShortcutTabPref) {
+  // When we start, the browser should already have an open tab.
+  TabStripModel* tab_strip = browser()->tab_strip_model();
+  EXPECT_EQ(1, tab_strip->count());
+  ui_test_utils::TabAddedWaiter tab_waiter(browser());
+
+  // Load an app with launch.container = 'tab'.
+  const Extension* extension_app = nullptr;
+  ASSERT_NO_FATAL_FAILURE(LoadApp("app_with_tab_container", &extension_app));
+
+  // Set a pref indicating that the user wants to open this app in a tab.
+  SetAppLaunchPref(extension_app->id(), extensions::LAUNCH_TYPE_REGULAR);
+
+  base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
+  command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
+  ASSERT_TRUE(StartupBrowserCreator().ProcessCmdLineImpl(
+      command_line, base::FilePath(), chrome::startup::IsProcessStartup::kNo,
+      {browser()->profile(), StartupProfileMode::kBrowserWindow}, {}));
+
+  Browser* tabbed_browser =
+      ExpectBlockLaunchAndLaunchAnyways(extension_app->id(),
+                                        /*force_install_dialog=*/false,
+                                        /*tab_launch_expected=*/true);
+  // When we block the launch, we always create a new browser window to
+  // display chrome://apps and the dialog.
+  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile()));
+  tab_strip = tabbed_browser->tab_strip_model();
+  EXPECT_EQ(1, tab_strip->count());
+
+  // The browser's app_name should not include the app's ID: it is in a normal
+  // tabbed browser.
+  EXPECT_EQ(tabbed_browser->app_name().find(extension_app->id()),
+            std::string::npos)
+      << browser()->app_name();
+}
+
+IN_PROC_BROWSER_TEST_P(StartupBrowserCreatorChromeAppShortcutTestWithLaunch,
+                       OpenPolicyForcedAppShortcut) {
+  // Load an app with launch.container = 'tab'.
+  const Extension* extension_app = nullptr;
+  ASSERT_NO_FATAL_FAILURE(LoadApp("app_with_tab_container", &extension_app));
+
+  // Install a test policy provider which will mark the app as force-installed.
+  extensions::TestManagementPolicyProvider policy_provider(
+      extensions::TestManagementPolicyProvider::MUST_REMAIN_INSTALLED);
+  extensions::ExtensionSystem* extension_system =
+      extensions::ExtensionSystem::Get(browser()->profile());
+  extension_system->management_policy()->RegisterProvider(&policy_provider);
+
+  // When we start, the browser should already have an open tab.
+  TabStripModel* tab_strip = browser()->tab_strip_model();
+  EXPECT_EQ(1, tab_strip->count());
+  ui_test_utils::TabAddedWaiter tab_waiter(browser());
+
+  // Add --app-id=<extension->id()> to the command line.
+  base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
+  command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
+
+  ASSERT_TRUE(StartupBrowserCreator().ProcessCmdLineImpl(
+      command_line, base::FilePath(), chrome::startup::IsProcessStartup::kNo,
+      {browser()->profile(), StartupProfileMode::kBrowserWindow}, {}));
+
+  Browser* tabbed_browser =
+      ExpectBlockLaunchAndLaunchAnyways(extension_app->id(),
+                                        /*force_install_dialog=*/true,
+                                        /*tab_launch_expected=*/true);
+  // When we block the launch, we always create a new browser window to
+  // display chrome://apps and the dialog.
+  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile()));
+  tab_strip = tabbed_browser->tab_strip_model();
+  EXPECT_EQ(1, tab_strip->count());
+
+  // It should be a standard tabbed window, not an app window.
+  EXPECT_FALSE(tabbed_browser->is_type_app());
+  EXPECT_TRUE(tabbed_browser->is_type_normal());
+}
+
+// These tests are specifically for testing what happens when the "Launch
+// Anyways" button is pressed.
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    StartupBrowserCreatorChromeAppShortcutTestWithLaunch,
+    ::testing::Combine(
+        ::testing::Values(ChromeAppDeprecationFeatureValue::kEnabled),
+        ::testing::Values(ChromeAppsEnabledPrefValue::kDisabled)),
+    ChromeAppDeprecationFeatureValueToString);
+
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if BUILDFLAG(IS_WIN)
diff --git a/chrome/browser/ui/views/bluetooth_device_pair_confirm_view.cc b/chrome/browser/ui/views/bluetooth_device_pair_confirm_view.cc
new file mode 100644
index 0000000..a65dbb4
--- /dev/null
+++ b/chrome/browser/ui/views/bluetooth_device_pair_confirm_view.cc
@@ -0,0 +1,140 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/bluetooth_device_pair_confirm_view.h"
+
+#include <cwctype>
+
+#include "base/bind.h"
+#include "base/callback_helpers.h"
+#include "chrome/browser/ui/views/chrome_layout_provider.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/constrained_window/constrained_window_views.h"
+#include "components/vector_icons/vector_icons.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/color/color_id.h"
+#include "ui/compositor/layer.h"
+#include "ui/views/controls/image_view.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/layout/flex_layout.h"
+
+using ::content::BluetoothDelegate;
+
+namespace chrome {
+
+void ShowBluetoothDevicePairConfirmDialog(
+    content::WebContents* web_contents,
+    const std::u16string& device_identifier,
+    BluetoothDelegate::PairConfirmCallback close_callback) {
+  // This dialog owns itself. DialogDelegateView will delete |dialog| instance.
+  auto* dialog = new BluetoothDevicePairConfirmView(device_identifier,
+                                                    std::move(close_callback));
+  constrained_window::ShowWebModalDialogViews(dialog, web_contents);
+}
+
+}  // namespace chrome
+
+BluetoothDevicePairConfirmView::BluetoothDevicePairConfirmView(
+    const std::u16string& device_identifier,
+    BluetoothDelegate::PairConfirmCallback close_callback)
+    : close_callback_(std::move(close_callback)) {
+  SetModalType(ui::MODAL_TYPE_CHILD);
+  set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType(
+      views::DialogContentType::kText, views::DialogContentType::kText));
+  SetAcceptCallback(
+      base::BindOnce(&BluetoothDevicePairConfirmView::OnDialogAccepted,
+                     base::Unretained(this)));
+  auto canceled = [](BluetoothDevicePairConfirmView* dialog) {
+    std::move(dialog->close_callback_)
+        .Run(BluetoothDelegate::DevicePairConfirmPromptResult::kCancelled);
+  };
+  SetCancelCallback(base::BindOnce(canceled, base::Unretained(this)));
+  SetCloseCallback(base::BindOnce(canceled, base::Unretained(this)));
+  SetButtonEnabled(ui::DIALOG_BUTTON_OK, true);
+  InitControls(device_identifier);
+}
+
+BluetoothDevicePairConfirmView::~BluetoothDevicePairConfirmView() = default;
+
+void BluetoothDevicePairConfirmView::InitControls(
+    const std::u16string& device_identifier) {
+  //
+  // Create the following layout:
+  //
+  // ┌───────────────┬──────────────────────────────────────────────────────────────┐
+  // │               │ Pair Confirmation                                            │
+  // │ ┌───────────┐ │                                                              │
+  // │ │           │ │ Bluetooth device <device name> would like permission to pair.│
+  // │ │ Bluetooth │ │                                                              │
+  // │ │    icon   │ │                                                              │
+  // │ │           │ │                                                              │
+  // │ └───────────┘ │                                        ┌──────┐  ┌────────┐  │
+  // │               │                                        │  OK  │  │ Cancel │  │
+  // │               │                                        └──────┘  └────────┘  │
+  // └───────────────┴──────────────────────────────────────────────────────────────┘
+  //
+  //
+
+  SetLayoutManager(std::make_unique<views::FlexLayout>())
+      ->SetCrossAxisAlignment(views::LayoutAlignment::kCenter);
+
+  // The vertical space that must exist on the top and the bottom of the item
+  // to ensure the proper spacing is maintained between items when stacking
+  // vertically.
+  const int vertical_spacing = ChromeLayoutProvider::Get()->GetDistanceMetric(
+                                   DISTANCE_CONTROL_LIST_VERTICAL) /
+                               2;
+  constexpr int horizontal_spacing = 0;
+
+  constexpr int kIconSize = 30;  // width and height.
+  auto icon_view = std::make_unique<views::ImageView>();
+  icon_view->SetImage(ui::ImageModel::FromVectorIcon(
+      vector_icons::kBluetoothIcon, ui::kColorIcon, kIconSize));
+  icon_view_ = AddChildView(std::move(icon_view));
+
+  auto contents_wrapper = std::make_unique<views::View>();
+  contents_wrapper->SetProperty(
+      views::kMarginsKey,
+      gfx::Insets::VH(vertical_spacing, horizontal_spacing));
+
+  contents_wrapper->SetLayoutManager(std::make_unique<views::FlexLayout>())
+      ->SetOrientation(views::LayoutOrientation::kVertical)
+      .SetMainAxisAlignment(views::LayoutAlignment::kCenter);
+  contents_wrapper->SetProperty(
+      views::kFlexBehaviorKey,
+      views::FlexSpecification(views::MinimumFlexSizeRule::kScaleToZero,
+                               views::MaximumFlexSizeRule::kUnbounded));
+
+  {
+    auto passkey_prompt_label =
+        std::make_unique<views::Label>(l10n_util::GetStringFUTF16(
+            IDS_BLUETOOTH_DEVICE_PAIR_CONFIRM_LABEL, device_identifier));
+
+    passkey_prompt_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+    passkey_prompt_label->SetMultiLine(true);
+    contents_wrapper->AddChildView(std::move(passkey_prompt_label));
+  }
+
+  contents_wrapper_ = AddChildView(std::move(contents_wrapper));
+}
+
+gfx::Size BluetoothDevicePairConfirmView::CalculatePreferredSize() const {
+  constexpr int kDialogWidth = 360;
+  int height =
+      GetLayoutManager()->GetPreferredHeightForWidth(this, kDialogWidth);
+  return gfx::Size(kDialogWidth, height);
+}
+
+std::u16string BluetoothDevicePairConfirmView::GetWindowTitle() const {
+  return l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_PAIR_CONFIRM_TITLE);
+}
+
+void BluetoothDevicePairConfirmView::OnDialogAccepted() {
+  std::move(close_callback_)
+      .Run(BluetoothDelegate::DevicePairConfirmPromptResult::kSuccess);
+}
+
+BEGIN_METADATA(BluetoothDevicePairConfirmView, views::DialogDelegateView)
+END_METADATA
diff --git a/chrome/browser/ui/views/bluetooth_device_pair_confirm_view.h b/chrome/browser/ui/views/bluetooth_device_pair_confirm_view.h
new file mode 100644
index 0000000..8a95657
--- /dev/null
+++ b/chrome/browser/ui/views/bluetooth_device_pair_confirm_view.h
@@ -0,0 +1,50 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_BLUETOOTH_DEVICE_PAIR_CONFIRM_VIEW_H_
+#define CHROME_BROWSER_UI_VIEWS_BLUETOOTH_DEVICE_PAIR_CONFIRM_VIEW_H_
+
+#include <string>
+
+#include "base/memory/raw_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/ui/browser_dialogs.h"
+#include "content/public/browser/bluetooth_delegate.h"
+#include "ui/views/controls/textfield/textfield.h"
+#include "ui/views/controls/textfield/textfield_controller.h"
+#include "ui/views/window/dialog_delegate.h"
+
+// A dialog allowing the user to enter Bluetooth credentials (i.e. a PIN).
+class BluetoothDevicePairConfirmView : public views::DialogDelegateView,
+                                       public views::TextfieldController {
+ public:
+  METADATA_HEADER(BluetoothDevicePairConfirmView);
+  BluetoothDevicePairConfirmView(
+      const std::u16string& device_identifier,
+      content::BluetoothDelegate::PairConfirmCallback close_callback);
+  BluetoothDevicePairConfirmView(const BluetoothDevicePairConfirmView&) =
+      delete;
+  BluetoothDevicePairConfirmView& operator=(
+      const BluetoothDevicePairConfirmView&) = delete;
+  ~BluetoothDevicePairConfirmView() override;
+
+  // Initialize the controls on the dialog.
+  void InitControls(const std::u16string& device_identifier);
+
+  // View:
+  gfx::Size CalculatePreferredSize() const override;
+
+  std::u16string GetWindowTitle() const override;
+
+ private:
+  void OnDialogAccepted();
+
+  content::BluetoothDelegate::PairConfirmCallback close_callback_;
+  raw_ptr<views::Textfield> passkey_text_ = nullptr;
+  raw_ptr<views::View> icon_view_ = nullptr;
+  raw_ptr<views::View> contents_wrapper_ = nullptr;
+  base::WeakPtrFactory<BluetoothDevicePairConfirmView> weak_ptr_factory_{this};
+};
+
+#endif  // CHROME_BROWSER_UI_VIEWS_BLUETOOTH_DEVICE_PAIR_CONFIRM_VIEW_H_
diff --git a/chrome/browser/ui/views/bluetooth_device_pair_confirm_view_browsertest.cc b/chrome/browser/ui/views/bluetooth_device_pair_confirm_view_browsertest.cc
new file mode 100644
index 0000000..4dd96851
--- /dev/null
+++ b/chrome/browser/ui/views/bluetooth_device_pair_confirm_view_browsertest.cc
@@ -0,0 +1,44 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/callback_helpers.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_dialogs.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/test/test_browser_dialog.h"
+#include "content/public/browser/bluetooth_delegate.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test.h"
+
+#if PAIR_BLUETOOTH_ON_DEMAND()
+
+namespace {
+
+constexpr char16_t kDeviceIdentifier[] = u"test-device";
+
+}  // namespace
+
+class BluetoothDevicePairConfirmViewBrowserTest : public DialogBrowserTest {
+ public:
+  BluetoothDevicePairConfirmViewBrowserTest() = default;
+  BluetoothDevicePairConfirmViewBrowserTest(
+      const BluetoothDevicePairConfirmViewBrowserTest&) = delete;
+  BluetoothDevicePairConfirmViewBrowserTest& operator=(
+      const BluetoothDevicePairConfirmViewBrowserTest&) = delete;
+  ~BluetoothDevicePairConfirmViewBrowserTest() override = default;
+
+  void ShowUi(const std::string& name) override {
+    chrome::ShowBluetoothDevicePairConfirmDialog(
+        browser()->tab_strip_model()->GetActiveWebContents(), kDeviceIdentifier,
+        base::NullCallback());
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(BluetoothDevicePairConfirmViewBrowserTest,
+                       InvokeUi_default) {
+  ShowAndVerifyUi();
+}
+
+#endif  // PAIR_BLUETOOTH_ON_DEMAND()
diff --git a/chrome/browser/ui/views/download/download_item_view.cc b/chrome/browser/ui/views/download/download_item_view.cc
index afc774a..2a9145e 100644
--- a/chrome/browser/ui/views/download/download_item_view.cc
+++ b/chrome/browser/ui/views/download/download_item_view.cc
@@ -445,7 +445,7 @@
     // TODO(shaktisahu): Make DragDownloadItem work with a model.
     DragDownloadItem(model_->download(), file_icon,
                      widget ? widget->GetNativeView() : nullptr);
-    RecordDownloadShelfDragEvent(DownloadShelfDragEvent::STARTED);
+    RecordDownloadShelfDragInfo(DownloadShelfDragInfo::DRAG_STARTED);
   }
   return true;
 }
@@ -503,6 +503,14 @@
     tooltip_text_ = new_tooltip_text;
     TooltipTextChanged();
   }
+
+  // OnDownloadUpdated can be called multiple times while the state is complete.
+  // One example of this is if the file gets removed.
+  if (!has_download_completion_been_logged_ &&
+      model_->GetState() == download::DownloadItem::COMPLETE) {
+    RecordDownloadShelfDragInfo(DownloadShelfDragInfo::DOWNLOAD_COMPLETE);
+    has_download_completion_been_logged_ = true;
+  }
 }
 
 void DownloadItemView::OnDownloadOpened() {
diff --git a/chrome/browser/ui/views/download/download_item_view.h b/chrome/browser/ui/views/download/download_item_view.h
index 0f6b8df..a9b1250e 100644
--- a/chrome/browser/ui/views/download/download_item_view.h
+++ b/chrome/browser/ui/views/download/download_item_view.h
@@ -328,6 +328,10 @@
   // button was pressed.
   bool dropdown_button_pressed_recorded_ = false;
 
+  // Whether the download's completion has already been logged. This is used to
+  // avoid inaccurate repeated logging.
+  bool has_download_completion_been_logged_ = false;
+
   // Method factory used to delay reenabling of the item when opening the
   // downloaded file.
   base::WeakPtrFactory<DownloadItemView> weak_ptr_factory_{this};
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_view.cc b/chrome/browser/ui/views/extensions/extensions_menu_view.cc
index 0af7c4f..dc94e06 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_view.cc
+++ b/chrome/browser/ui/views/extensions/extensions_menu_view.cc
@@ -262,6 +262,7 @@
       section = &cant_access_;
       break;
     case extensions::SitePermissionsHelper::SiteInteraction::kPending:
+    case extensions::SitePermissionsHelper::SiteInteraction::kActiveTab:
       section = &wants_access_;
       break;
     case extensions::SitePermissionsHelper::SiteInteraction::kActive:
diff --git a/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.cc b/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.cc
index 3ea9423..f0aef18 100644
--- a/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.cc
+++ b/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.cc
@@ -624,9 +624,7 @@
 
   // Extensions with no current site interaction don't belong to a site access
   // section and therefore do not need a site access item view.
-  auto site_interaction =
-      controller->GetSiteInteraction(GetActiveWebContents());
-  auto* section = GetSectionForSiteInteraction(site_interaction);
+  auto* section = GetSectionForAction(controller.get());
   if (!section)
     return;
 
@@ -684,8 +682,7 @@
     }
 
     DCHECK(section);
-    auto* new_section = GetSectionForSiteInteraction(
-        item->view_controller()->GetSiteInteraction(GetActiveWebContents()));
+    auto* new_section = GetSectionForAction(item->view_controller());
 
     // Remove item when it is no section at all.
     if (!new_section) {
@@ -815,15 +812,32 @@
 }
 
 ExtensionsTabbedMenuView::SiteAccessSection*
-ExtensionsTabbedMenuView::GetSectionForSiteInteraction(
-    extensions::SitePermissionsHelper::SiteInteraction status) {
-  switch (status) {
+ExtensionsTabbedMenuView::GetSectionForAction(
+    ToolbarActionViewController* action) {
+  content::WebContents* web_contents = GetActiveWebContents();
+
+  auto site_interaction = action->GetSiteInteraction(web_contents);
+  switch (site_interaction) {
     case extensions::SitePermissionsHelper::SiteInteraction::kNone:
       // Extensions with no interaction with the current site don't belong to a
       // site access section.
       return nullptr;
     case extensions::SitePermissionsHelper::SiteInteraction::kPending:
       return &requests_access_;
+    case extensions::SitePermissionsHelper::SiteInteraction::kActiveTab:
+      // When all extensions have access, activeTab extensions are labeled as
+      // having access even though they still will only run when clicked. This
+      // is because from a user's perspective, clicking on these extensions
+      // becomes an activation process to perform an action, rather than a
+      // process by which permission is granted.
+      extensions::PermissionsManager::UserSiteSetting site_setting;
+      site_setting =
+          extensions::PermissionsManager::Get(browser_->profile())
+              ->GetUserSiteSetting(
+                  web_contents->GetMainFrame()->GetLastCommittedOrigin());
+      if (site_setting == UserSiteSetting::kGrantAllExtensions)
+        return &has_access_;
+      return &requests_access_;
     case extensions::SitePermissionsHelper::SiteInteraction::kActive:
       return &has_access_;
   }
diff --git a/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.h b/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.h
index ca1508a..41f394e 100644
--- a/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.h
+++ b/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view.h
@@ -189,8 +189,7 @@
   void UpdateSiteAccessSectionsVisibility(bool show_combobox);
 
   // Returns the section corresponding to `site_interaction`, or nullptr.
-  SiteAccessSection* GetSectionForSiteInteraction(
-      extensions::SitePermissionsHelper::SiteInteraction site_interaction);
+  SiteAccessSection* GetSectionForAction(ToolbarActionViewController* action);
 
   // Returns the currently-showing menu items for `section` in the
   // site access tab, if any exists.
diff --git a/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view_unittest.cc b/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view_unittest.cc
index 957cf6f..aa4f37c7 100644
--- a/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view_unittest.cc
+++ b/chrome/browser/ui/views/extensions/extensions_tabbed_menu_view_unittest.cc
@@ -1170,6 +1170,40 @@
   EXPECT_FALSE(site_access_message()->GetVisible());
 }
 
+// Test extensions with activeTab are placed in the correct site access section.
+TEST_F(ExtensionsTabbedMenuViewUnitTest, SiteAccessTab_ActiveTabExtension) {
+  InstallExtensionWithPermissions("Extension", {"activeTab"});
+
+  const GURL url("http://www.url.com");
+  web_contents_tester()->NavigateAndCommit(url);
+
+  ShowSiteAccessTabInMenu();
+  ASSERT_EQ(
+      GetUserSiteSetting(url),
+      extensions::PermissionsManager::UserSiteSetting::kCustomizeByExtension);
+
+  // activeTab extensions are labeled as requesting access since they still need
+  // a click to run.
+  EXPECT_FALSE(IsHasAccessSectionDisplayed());
+  EXPECT_TRUE(IsRequestsAccessSectionDisplayed());
+  EXPECT_FALSE(site_access_message()->GetVisible());
+
+  SelectSiteSetting(kGrantAllExtensionsIndex);
+
+  // activeTab extensions are labeled as having access but  will only run when
+  // clicked.
+  EXPECT_TRUE(IsHasAccessSectionDisplayed());
+  EXPECT_FALSE(IsRequestsAccessSectionDisplayed());
+  EXPECT_FALSE(site_access_message()->GetVisible());
+
+  SelectSiteSetting(kBlockAllExtensionsIndex);
+
+  // activeTab extensions are labeled as blocked as the rest of extensions.
+  EXPECT_FALSE(IsHasAccessSectionDisplayed());
+  EXPECT_FALSE(IsRequestsAccessSectionDisplayed());
+  EXPECT_TRUE(site_access_message()->GetVisible());
+}
+
 TEST_F(ExtensionsTabbedMenuViewUnitTest, WindowTitle) {
   InstallExtension("Test Extension");
 
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc
index 0b8cb3d2..64e065a71 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc
@@ -869,11 +869,6 @@
       ExtensionActionViewController::AnyActionHasCurrentSiteAccess(
           actions_, web_contents));
 
-  // TODO(crbug.com/1239772): The request access button should only include
-  // extensions that are requesting access to a restricted site.
-  // `SiteInteraction::kPending` includes extensions with activeTab, that can
-  // request access to restricted or non-restricted sites. Need to update the
-  // method to not take into account activeTab extensions.
   std::vector<ToolbarActionViewController*> extensions_requesting_access;
   for (const auto& action : actions_) {
     if (action->IsRequestingSiteAccess(web_contents))
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc
index 5acab38..28cdd8e 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc
@@ -292,3 +292,17 @@
 
 // TODO(crbug.com/3671898): Add a test that checks the correct dialog is open
 // when clicking on request access button.
+
+// Tests that extensions with active tab are not taken into account for the
+// request access button visibility.
+TEST_F(ExtensionsToolbarControlsUnitTest,
+       RequestAccessButtonVisibility_ActiveTabExtensions) {
+  content::WebContentsTester* web_contents_tester =
+      AddWebContentsAndGetTester();
+  const GURL url("http://www.url.com");
+
+  web_contents_tester->NavigateAndCommit(url);
+
+  InstallExtensionWithPermissions("Extension", {"activeTab"});
+  EXPECT_FALSE(IsRequestAccessButtonVisible());
+}
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc
index 6b4aec8b..e85bd71 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc
@@ -51,16 +51,32 @@
 
 scoped_refptr<const extensions::Extension>
 ExtensionsToolbarUnitTest::InstallExtension(const std::string& name) {
-  return InstallExtensionWithHostPermissions(name, {});
+  return InstallExtension(name, {}, {});
 }
 
 scoped_refptr<const extensions::Extension>
 ExtensionsToolbarUnitTest::InstallExtensionWithHostPermissions(
     const std::string& name,
     const std::vector<std::string>& host_permissions) {
+  return InstallExtension(name, {}, host_permissions);
+}
+
+scoped_refptr<const extensions::Extension>
+ExtensionsToolbarUnitTest::InstallExtensionWithPermissions(
+    const std::string& name,
+    const std::vector<std::string>& permissions) {
+  return InstallExtension(name, permissions, {});
+}
+
+scoped_refptr<const extensions::Extension>
+ExtensionsToolbarUnitTest::InstallExtension(
+    const std::string& name,
+    const std::vector<std::string>& permissions,
+    const std::vector<std::string>& host_permissions) {
   scoped_refptr<const extensions::Extension> extension =
       extensions::ExtensionBuilder(name)
           .SetManifestVersion(3)
+          .AddPermissions(permissions)
           .SetManifestKey("host_permissions", ToListValue(host_permissions))
           .SetID(crx_file::id_util::GenerateId(name))
           .Build();
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h
index 55d05f3..55c13d5 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h
@@ -40,7 +40,7 @@
     return browser_view()->toolbar()->extensions_container();
   }
 
-  // Adds the specified `extension` with no host permissions.
+  // Adds the specified `extension`.
   scoped_refptr<const extensions::Extension> InstallExtension(
       const std::string& name);
 
@@ -50,6 +50,18 @@
       const std::string& name,
       const std::vector<std::string>& host_permissions);
 
+  // Adds the specified `extension` with the given `permissions`.
+  scoped_refptr<const extensions::Extension> InstallExtensionWithPermissions(
+      const std::string& name,
+      const std::vector<std::string>& permissions);
+
+  // Adds the specified `extension` with the given `host_permissions` and
+  // `permissions`.
+  scoped_refptr<const extensions::Extension> InstallExtension(
+      const std::string& name,
+      const std::vector<std::string>& permissions,
+      const std::vector<std::string>& host_permissions);
+
   // Reloads the extension of the given `extension_id`.
   void ReloadExtension(const extensions::ExtensionId& extension_id);
 
diff --git a/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
index e90eea3..0393d11 100644
--- a/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
@@ -69,6 +69,8 @@
                IDS_LOGIN_RECOMMEND_APPS_SCREEN_WAS_INSTALLED);
   builder->Add("recommendAppsContainsAds",
                IDS_LOGIN_RECOMMEND_APPS_SCREEN_CONTAINS_ADS);
+  builder->Add("recommendAppsDescriptionExpand",
+               IDS_LOGIN_RECOMMEND_APPS_SCREEN_DESCRIPTION_EXPAND_BUTTON);
 }
 
 void RecommendAppsScreenHandler::GetAdditionalParameters(
diff --git a/chrome/browser/ui/webui/discards/discards_ui.cc b/chrome/browser/ui/webui/discards/discards_ui.cc
index f75878c..6e117df 100644
--- a/chrome/browser/ui/webui/discards/discards_ui.cc
+++ b/chrome/browser/ui/webui/discards/discards_ui.cc
@@ -223,8 +223,11 @@
   }
 
   void ToggleBatterySaverMode() override {
-    // TODO(anthonyvd): Check the finch feature and toggle the pref if it's on.
-    NOTREACHED();
+    if (base::FeatureList::IsEnabled(
+            performance_manager::features::kBatterySaverModeAvailable)) {
+      ToggleLocalStatePref(
+          performance_manager::user_tuning::prefs::kBatterySaverModeEnabled);
+    }
   }
 
  private:
diff --git a/chrome/browser/ui/webui/signin/profile_customization_ui.cc b/chrome/browser/ui/webui/signin/profile_customization_ui.cc
index a197af7..8fa13af 100644
--- a/chrome/browser/ui/webui/signin/profile_customization_ui.cc
+++ b/chrome/browser/ui/webui/signin/profile_customization_ui.cc
@@ -52,8 +52,11 @@
   static constexpr webui::LocalizedString kLocalizedStrings[] = {
       {"profileCustomizationDoneLabel",
        IDS_PROFILE_CUSTOMIZATION_DONE_BUTTON_LABEL},
+      {"profileCustomizationSkipLabel",
+       IDS_PROFILE_CUSTOMIZATION_SKIP_BUTTON_LABEL},
       {"profileCustomizationInputLabel", IDS_PROFILE_CUSTOMIZATION_INPUT_LABEL},
       {"profileCustomizationText", IDS_PROFILE_CUSTOMIZATION_TEXT},
+      {"profileCustomizationTitle", IDS_PROFILE_CUSTOMIZATION_TITLE_V2},
 
       // Color picker strings:
       {"colorPickerLabel", IDS_NTP_CUSTOMIZE_COLOR_PICKER_LABEL},
diff --git a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/FeedActionsHandler.java b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/FeedActionsHandler.java
index f03a6d63..2545db55 100644
--- a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/FeedActionsHandler.java
+++ b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/FeedActionsHandler.java
@@ -142,21 +142,25 @@
      */
     default void reportNoticeDismissed(String key) {}
 
-    /** Types of feeds that can be invalidated. */
-    @IntDef({FeedIdentifier.ALL_FEEDS, FeedIdentifier.MAIN_FEED, FeedIdentifier.FOLLOWING_FEED})
+    /**
+     * Types of feeds that can be invalidated. These values must match the privately defined values
+     * of InvalidateCacheData.FeedType.
+     */
+    @IntDef({FeedIdentifier.UNSPECIFIED, FeedIdentifier.MAIN_FEED, FeedIdentifier.FOLLOWING_FEED})
     @Retention(RetentionPolicy.SOURCE)
     public @interface FeedIdentifier {
-        int ALL_FEEDS = 0;
+        int UNSPECIFIED = 0;
         int MAIN_FEED = 1;
         int FOLLOWING_FEED = 2;
     }
 
     /**
-     * Requests that the cache of one or all feeds should be invalidated so that that their contents
-     * are re-fetched the next time the feed is shown.
-     * @param toInvalidate Identifies which feed or feeds should have their caches invalidated.
+     * Requests that the cache a feed be invalidated so that its contents are re-fetched the next
+     * time the feed is shown/loaded.
+     * @param feedToInvalidate Identifies which feed should have its cache invalidated. The request
+     *         will be dropped if set to FeedIdentifier.UNSPECIFIED.
      */
-    default void invalidateContentCacheFor(@FeedIdentifier int toInvalidate) {}
+    default void invalidateContentCacheFor(@FeedIdentifier int feedToInvalidate) {}
 
     /**
      * Reports that the info card is being tracked for its full visibility.
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 0585784..749d61c 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1654678108-b654f5c2b5a7a3768455503ebea5b09101c3fbf4.profdata
+chrome-win32-main-1654688617-b12696b2ebae3cba2c1685f5db6223c90a0e76bf.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 3896525..d9b3079 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1654667317-afa9375656b40db85fb6a08c81df9e90b652c011.profdata
+chrome-win64-main-1654688617-f10d5947dd2e7b0cbff1717a90b672c2ebc01c81.profdata
diff --git a/chrome/common/profiler/main_thread_stack_sampling_profiler.cc b/chrome/common/profiler/main_thread_stack_sampling_profiler.cc
index 5cf1be1..55b98fb 100644
--- a/chrome/common/profiler/main_thread_stack_sampling_profiler.cc
+++ b/chrome/common/profiler/main_thread_stack_sampling_profiler.cc
@@ -9,6 +9,7 @@
 #include "base/threading/platform_thread.h"
 #include "chrome/common/profiler/process_type.h"
 #include "chrome/common/profiler/thread_profiler.h"
+#include "components/metrics/call_stack_profile_builder.h"
 #include "components/metrics/call_stack_profile_metrics_provider.h"
 #include "content/public/common/content_switches.h"
 
@@ -21,8 +22,9 @@
 
   // TODO(wittman): Do this for other process types too.
   if (process == metrics::CallStackProfileParams::Process::kBrowser) {
-    ThreadProfiler::SetBrowserProcessReceiverCallback(base::BindRepeating(
-        &metrics::CallStackProfileMetricsProvider::ReceiveProfile));
+    metrics::CallStackProfileBuilder::SetBrowserProcessReceiverCallback(
+        base::BindRepeating(
+            &metrics::CallStackProfileMetricsProvider::ReceiveProfile));
     return ThreadProfiler::CreateAndStartOnMainThread();
   }
 
diff --git a/chrome/common/profiler/thread_profiler.cc b/chrome/common/profiler/thread_profiler.cc
index d35b540..b8bf41a 100644
--- a/chrome/common/profiler/thread_profiler.cc
+++ b/chrome/common/profiler/thread_profiler.cc
@@ -333,22 +333,12 @@
 }
 
 // static
-void ThreadProfiler::SetBrowserProcessReceiverCallback(
-    const base::RepeatingCallback<void(base::TimeTicks,
-                                       metrics::SampledProfile)>& callback) {
-  CallStackProfileBuilder::SetBrowserProcessReceiverCallback(callback);
-}
-
-// static
-void ThreadProfiler::SetCollectorForChildProcess(
-    mojo::PendingRemote<metrics::mojom::CallStackProfileCollector> collector) {
-  if (!ThreadProfilerConfiguration::Get()->IsProfilerEnabledForCurrentProcess())
-    return;
-
-  DCHECK_NE(CallStackProfileParams::Process::kBrowser,
-            GetProfileParamsProcess(*base::CommandLine::ForCurrentProcess()));
-  CallStackProfileBuilder::SetParentProfileCollectorForChildProcess(
-      std::move(collector));
+bool ThreadProfiler::ShouldCollectProfilesForChildProcess() {
+  CallStackProfileParams::Process process =
+      GetProfileParamsProcess(*base::CommandLine::ForCurrentProcess());
+  DCHECK_NE(CallStackProfileParams::Process::kBrowser, process);
+  return ThreadProfilerConfiguration::Get()
+      ->IsProfilerEnabledForCurrentProcess();
 }
 
 // ThreadProfiler implementation synopsis:
diff --git a/chrome/common/profiler/thread_profiler.h b/chrome/common/profiler/thread_profiler.h
index f18add5..86f5205 100644
--- a/chrome/common/profiler/thread_profiler.h
+++ b/chrome/common/profiler/thread_profiler.h
@@ -16,9 +16,6 @@
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 #include "components/metrics/call_stack_profile_params.h"
-#include "components/metrics/public/mojom/call_stack_profile_collector.mojom.h"
-#include "mojo/public/cpp/bindings/pending_remote.h"
-#include "third_party/metrics_proto/sampled_profile.pb.h"
 
 // PeriodicSamplingScheduler repeatedly schedules periodic sampling of the
 // thread through calls to GetTimeToNextCollection(). This class is exposed
@@ -92,23 +89,15 @@
   static void StartOnChildThread(
       metrics::CallStackProfileParams::Thread thread);
 
-  // Sets the callback to use for reporting browser process profiles. This
-  // indirection is required to avoid a dependency on unnecessary metrics code
-  // in child processes.
-  static void SetBrowserProcessReceiverCallback(
-      const base::RepeatingCallback<void(base::TimeTicks,
-                                         metrics::SampledProfile)>& callback);
-
-  // This function must be called within child processes to supply the Service
-  // Manager's connector, to bind the interface through which a profile is sent
+  // Returns true if called within a child process that will collect profiles
+  // through a CallStackProfileCollector. If so,
+  // metrics::CallStackProfileBuilder::SetParentProfileCollectorForChildProcess
+  // must be called to to bind the interface through which a profile is sent
   // back to the browser process.
   //
   // Note that the metrics::CallStackProfileCollector interface also must be
-  // exposed to the child process, and metrics::mojom::CallStackProfileCollector
-  // declared in chrome_content_browser_manifest_overlay.json, for the binding
-  // to succeed.
-  static void SetCollectorForChildProcess(
-      mojo::PendingRemote<metrics::mojom::CallStackProfileCollector> collector);
+  // exposed to the child process.
+  static bool ShouldCollectProfilesForChildProcess();
 
  private:
   class WorkIdRecorder;
diff --git a/chrome/gpu/chrome_content_gpu_client.cc b/chrome/gpu/chrome_content_gpu_client.cc
index 92a619a..129d5b4e 100644
--- a/chrome/gpu/chrome_content_gpu_client.cc
+++ b/chrome/gpu/chrome_content_gpu_client.cc
@@ -14,6 +14,7 @@
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/gpu/browser_exposed_gpu_interfaces.h"
+#include "components/metrics/call_stack_profile_builder.h"
 #include "content/public/child/child_thread.h"
 #include "content/public/common/content_switches.h"
 #include "media/media_buildflags.h"
@@ -56,14 +57,16 @@
   if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kSingleProcess) &&
       !base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kInProcessGPU)) {
+          switches::kInProcessGPU) &&
+      ThreadProfiler::ShouldCollectProfilesForChildProcess()) {
     ThreadProfiler::SetMainThreadTaskRunner(
         base::ThreadTaskRunnerHandle::Get());
 
     mojo::PendingRemote<metrics::mojom::CallStackProfileCollector> collector;
     content::ChildThread::Get()->BindHostReceiver(
         collector.InitWithNewPipeAndPassReceiver());
-    ThreadProfiler::SetCollectorForChildProcess(std::move(collector));
+    metrics::CallStackProfileBuilder::SetParentProfileCollectorForChildProcess(
+        std::move(collector));
   }
 }
 
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn
index 617b6d9..1125e1c5c 100644
--- a/chrome/renderer/BUILD.gn
+++ b/chrome/renderer/BUILD.gn
@@ -142,6 +142,7 @@
     "//components/feed:feature_list",
     "//components/feed/content/renderer:feed_renderer",
     "//components/history_clusters/core",
+    "//components/metrics:child_call_stack_profile_builder",
     "//components/network_hints/renderer",
     "//components/no_state_prefetch/common",
     "//components/no_state_prefetch/renderer",
diff --git a/chrome/renderer/DEPS b/chrome/renderer/DEPS
index 026590f..8eb364b 100644
--- a/chrome/renderer/DEPS
+++ b/chrome/renderer/DEPS
@@ -26,7 +26,7 @@
   "+components/grit",
   "+components/guest_view/renderer",
   "+components/history_clusters/core/config.h",
-  "+components/metrics/child_call_stack_profile_collector.h",
+  "+components/metrics/call_stack_profile_builder.h",
   "+components/nacl/common",
   "+components/nacl/renderer",
   "+components/network_hints/renderer",
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index 55d7ec2..d211091 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -84,6 +84,7 @@
 #include "components/feed/buildflags.h"
 #include "components/grit/components_scaled_resources.h"
 #include "components/history_clusters/core/config.h"
+#include "components/metrics/call_stack_profile_builder.h"
 #include "components/network_hints/renderer/web_prescient_networking_impl.h"
 #include "components/no_state_prefetch/common/prerender_url_loader_throttle.h"
 #include "components/no_state_prefetch/renderer/no_state_prefetch_client.h"
@@ -499,11 +500,14 @@
   if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kSingleProcess)) {
     // This doesn't work in single-process mode.
-    ThreadProfiler::SetMainThreadTaskRunner(
-        base::ThreadTaskRunnerHandle::Get());
-    mojo::PendingRemote<metrics::mojom::CallStackProfileCollector> collector;
-    thread->BindHostReceiver(collector.InitWithNewPipeAndPassReceiver());
-    ThreadProfiler::SetCollectorForChildProcess(std::move(collector));
+    if (ThreadProfiler::ShouldCollectProfilesForChildProcess()) {
+      ThreadProfiler::SetMainThreadTaskRunner(
+          base::ThreadTaskRunnerHandle::Get());
+      mojo::PendingRemote<metrics::mojom::CallStackProfileCollector> collector;
+      thread->BindHostReceiver(collector.InitWithNewPipeAndPassReceiver());
+      metrics::CallStackProfileBuilder::
+          SetParentProfileCollectorForChildProcess(std::move(collector));
+    }
 
     // This is superfluous in single-process mode and triggers a DCHECK
     blink::IdentifiabilityStudySettings::SetGlobalProvider(
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index ce438ef..f845554 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -846,6 +846,7 @@
       "../browser/policy/policy_prefs_browsertest.cc",
       "../browser/prefetch/search_prefetch/search_preload_unified_browsertest.cc",
       "../browser/profiles/profile_browsertest_android.cc",
+      "../browser/safe_browsing/client_side_detection_service_browsertest.cc",
       "../browser/safe_browsing/test_safe_browsing_database_helper.cc",
       "../browser/safe_browsing/test_safe_browsing_database_helper.h",
       "../browser/ssl/chrome_security_state_client_browsertest.cc",
@@ -880,6 +881,8 @@
       "//components/password_manager/content/browser:browser",
       "//components/policy:chrome_settings_proto_generated_compile",
       "//components/policy/core/browser:test_support",
+      "//components/safe_browsing/content/browser:client_side_detection",
+      "//components/safe_browsing/content/common:interfaces",
       "//components/safe_browsing/content/renderer/phishing_classifier:phishing_classifier",
       "//components/safe_browsing/core/common/fbs:client_model",
       "//components/safe_browsing/core/common/proto:client_model_proto",
@@ -1949,6 +1952,7 @@
       "../browser/profiles/incognito_profile_containment_browsertest.cc",
       "../browser/profiles/profile_activity_metrics_recorder_browsertest.cc",
       "../browser/profiles/profile_browsertest.cc",
+      "../browser/profiles/profile_keyed_service_browsertest.cc",
       "../browser/profiles/profile_list_desktop_browsertest.cc",
       "../browser/profiles/profile_manager_browsertest.cc",
       "../browser/profiles/profile_theme_update_service_browsertest.cc",
@@ -2145,6 +2149,7 @@
       "../browser/ui/update_chrome_dialog_browsertest.cc",
       "../browser/ui/views/apps/app_info_dialog/app_info_dialog_views_browsertest.cc",
       "../browser/ui/views/bluetooth_device_credentials_view_browsertest.cc",
+      "../browser/ui/views/bluetooth_device_pair_confirm_view_browsertest.cc",
       "../browser/ui/views/bookmarks/bookmark_bar_view_browsertest.cc",
       "../browser/ui/views/bookmarks/bookmark_bar_view_test_helper.h",
       "../browser/ui/views/confirm_bubble_views_browsertest.cc",
diff --git a/chrome/test/base/interactive_test_utils_mac.mm b/chrome/test/base/interactive_test_utils_mac.mm
index 7dd3787..a53d1cc 100644
--- a/chrome/test/base/interactive_test_utils_mac.mm
+++ b/chrome/test/base/interactive_test_utils_mac.mm
@@ -18,6 +18,11 @@
 #include "ui/events/cocoa/cocoa_event_utils.h"
 #include "ui/events/event_constants.h"
 
+@interface NSApplication (Private)
+// (Apparently) forces the application to activate itself.
+- (void)_handleActivatedEvent:(id)arg1;
+@end
+
 namespace {
 
 // A helper singleton for sending key events as Quartz events to the window
@@ -166,7 +171,11 @@
   // Make sure an unbundled program can get the input focus.
   ProcessSerialNumber psn = { 0, kCurrentProcess };
   TransformProcessType(&psn,kProcessTransformToForegroundApplication);
-  [[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
+  // We used to call [NSApp activateIgnoringOtherApps:YES] but this
+  // would not reliably activate the app, causing the window to never
+  // become key. This bit of private API appears to be the secret
+  // incantation that gets us what we want. See crbug.com/1215570 .
+  [[NSApplication sharedApplication] _handleActivatedEvent:nil];
 
   base::scoped_nsobject<WindowedNSNotificationObserver> async_waiter;
   if (![window isKeyWindow]) {
diff --git a/chrome/test/data/media/picture-in-picture/window-size.html b/chrome/test/data/media/picture-in-picture/window-size.html
index 4f5bb1f..ff0ae2b 100644
--- a/chrome/test/data/media/picture-in-picture/window-size.html
+++ b/chrome/test/data/media/picture-in-picture/window-size.html
@@ -32,8 +32,15 @@
     await _waitForMetadata();
     const pip_window = await video.requestPictureInPicture();
 
+    // If the video size were 0,0 then this might not be true, but it isn't.
+    if (pip_window.width == 0 || pip_window.height == 0)
+      throw '0 is not a good initial size for a PiP window';
+
     pip_window.addEventListener('resize', () => {
-      document.title = 'resized';
+      // Do not accept zero, and fail the test if so.
+      if (pip_window.width == 0 || pip_window.height == 0)
+        throw '0 is not a good updated size for a PiP window';
+      document.title = 'resized'
     }, { once: true });
 
     video.addEventListener('leavepictureinpicture', () => {
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/confirmation_page_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/confirmation_page_test.js
index dc488d1..a603b6c 100644
--- a/chrome/test/data/webui/chromeos/os_feedback_ui/confirmation_page_test.js
+++ b/chrome/test/data/webui/chromeos/os_feedback_ui/confirmation_page_test.js
@@ -3,8 +3,10 @@
 // found in the LICENSE file.
 
 import {ConfirmationPageElement} from 'chrome://os-feedback/confirmation_page.js';
+import {FakeFeedbackServiceProvider} from 'chrome://os-feedback/fake_feedback_service_provider.js';
 import {FeedbackFlowState} from 'chrome://os-feedback/feedback_flow.js';
 import {SendReportStatus} from 'chrome://os-feedback/feedback_types.js';
+import {setFeedbackServiceProviderForTesting} from 'chrome://os-feedback/mojo_interface_provider.js';
 import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
@@ -30,8 +32,14 @@
   /** @type {?ConfirmationPageElement} */
   let page = null;
 
+  /** @type {?FakeFeedbackServiceProvider} */
+  let feedbackServiceProvider = null;
+
   setup(() => {
     document.body.innerHTML = '';
+
+    feedbackServiceProvider = new FakeFeedbackServiceProvider();
+    setFeedbackServiceProviderForTesting(feedbackServiceProvider);
   });
 
   teardown(() => {
@@ -205,4 +213,16 @@
 
     assertEquals(1, windowCloseCalled);
   });
+
+  // Test clicking diagnostics app link.
+  test('openDiagnosticsApp', async () => {
+    await initializePage();
+
+    assertEquals(0, feedbackServiceProvider.getOpenDiagnosticsAppCallCount());
+
+    const link = getElement(page, '#diagnostics');
+    link.click();
+
+    assertEquals(1, feedbackServiceProvider.getOpenDiagnosticsAppCallCount());
+  });
 }
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/file_attachment_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/file_attachment_test.js
index b5d56f0..8abbe28 100644
--- a/chrome/test/data/webui/chromeos/os_feedback_ui/file_attachment_test.js
+++ b/chrome/test/data/webui/chromeos/os_feedback_ui/file_attachment_test.js
@@ -11,6 +11,8 @@
 import {assertArrayEquals, assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 import {eventToPromise, flushTasks, isVisible} from '../../test_util.js';
 
+const MAX_ATTACH_FILE_SIZE = 10 * 1024 * 1024;
+
 export function fileAttachmentTestSuite() {
   /** @type {?FileAttachmentElement} */
   let page = null;
@@ -62,6 +64,8 @@
     assertTrue(isVisible(getElement('#addFileContainer')));
     // The replaceFileContainer should be invisible when no file is selected.
     assertFalse(isVisible(getElement('#replaceFileContainer')));
+
+    assertTrue(!!getElement('#fileTooBigErrorMessage'));
   });
 
   // Test that when the add file label is clicked, the file dialog is opened.
@@ -157,7 +161,10 @@
     const selectFileCheckbox = getElement('#selectFileCheckbox');
     // Set selected file manually.
     /** @type {!File} */
-    const fakeFile = /** @type {!File} */ ({name: 'fake.zip'});
+    const fakeFile = /** @type {!File} */ ({
+      name: 'fake.zip',
+      size: MAX_ATTACH_FILE_SIZE,
+    });
     page.setSelectedFileForTesting(fakeFile);
     selectFileCheckbox.checked = false;
 
@@ -173,12 +180,12 @@
     await initializePage();
 
     const selectFileCheckbox = getElement('#selectFileCheckbox');
-
     const fakeData = [12, 11, 99];
 
     /** @type {!File} */
     const fakeFile = /** @type {!File} */ ({
       name: 'fake.zip',
+      size: MAX_ATTACH_FILE_SIZE,
       arrayBuffer: async () => {
         return new Uint8Array(fakeData).buffer;
       },
@@ -198,4 +205,32 @@
     // Verify the fileName field.
     assertEquals('fake.zip', attachedFile.fileName.path.path);
   });
+
+  // Test that chosen file can' exceed 10MB.
+  test('fileTooBig', async () => {
+    await initializePage();
+
+    const selectFileCheckbox = getElement('#selectFileCheckbox');
+    const fakeData = [12, 11, 99];
+
+    /** @type {!File} */
+    const fakeFile = /** @type {!File} */ ({
+      name: 'fake.zip',
+      size: MAX_ATTACH_FILE_SIZE + 1,
+      arrayBuffer: async () => {
+        return new Uint8Array(fakeData).buffer;
+      },
+    });
+    // Set selected file manually. It should be ignored.
+    page.setSelectedFileForTesting(fakeFile);
+    selectFileCheckbox.checked = true;
+
+    // Error message should be visible.
+    assertTrue(getElement('#fileTooBigErrorMessage').open);
+    // There should not be a selected file.
+    assertEquals('', getElementContent('#selectedFileName'));
+    const attachedFile = await page.getAttachedFile();
+    // AttachedFile should be null.
+    assertTrue(!attachedFile);
+  });
 }
diff --git a/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts
index 02e0041..6aa419f1 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts
@@ -301,8 +301,8 @@
         assertEquals(
             AnimationTheme.kFeelTheBreeze, feelTheBreeze.animationTheme);
 
-        assertEquals(feelTheBreeze.ariaSelected, 'false');
-        assertEquals(slideshow.ariaSelected, 'true');
+        assertEquals(feelTheBreeze.ariaChecked, 'false');
+        assertEquals(slideshow.ariaChecked, 'true');
 
         personalizationStore.expectAction(
             AmbientActionName.SET_ANIMATION_THEME);
diff --git a/chrome/test/data/webui/signin/profile_customization_test.ts b/chrome/test/data/webui/signin/profile_customization_test.ts
index feed39d..18d72e6 100644
--- a/chrome/test/data/webui/signin/profile_customization_test.ts
+++ b/chrome/test/data/webui/signin/profile_customization_test.ts
@@ -25,6 +25,7 @@
     const AVATAR_URL_2 = 'chrome://theme/IDR_PROFILE_AVATAR_2';
     const WELCOME_TEXT_1 = 'Welcome, Bob';
     const WELCOME_TEXT_2 = 'Hi, Elisa';
+    const STATIC_TITLE = 'Customize your Chromium profile';
 
     setup(function() {
       loadTimeData.overrideValues({
@@ -98,7 +99,9 @@
     test('ProfileInfo', function() {
       const header = app.shadowRoot!.querySelector<HTMLElement>('#header')!;
       // Check initial info.
-      assertEquals(app.$.title.innerText, WELCOME_TEXT_1);
+      assertEquals(
+          app.$.title.innerText,
+          inDialogDesign ? STATIC_TITLE : WELCOME_TEXT_1);
       assertEquals('rgb(0, 255, 0)', getComputedStyle(header).backgroundColor);
       checkImageUrl('#avatar', AVATAR_URL_1);
       assertFalse(isChildVisible(app, '#badge'));
@@ -110,7 +113,9 @@
         isManaged: true,
         welcomeTitle: WELCOME_TEXT_2,
       });
-      assertEquals(app.$.title.innerText, WELCOME_TEXT_2);
+      assertEquals(
+          app.$.title.innerText,
+          inDialogDesign ? STATIC_TITLE : WELCOME_TEXT_2);
       assertEquals(color2, getComputedStyle(header).backgroundColor);
       checkImageUrl('#avatar', AVATAR_URL_2);
       assertTrue(isChildVisible(app, '#badge'));
diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn
index 538d81f..c383793 100644
--- a/chrome/utility/BUILD.gn
+++ b/chrome/utility/BUILD.gn
@@ -39,6 +39,7 @@
     "//chrome/common:mojo_bindings",
     "//chrome/services/qrcode_generator",
     "//chrome/services/speech/buildflags",
+    "//components/metrics:child_call_stack_profile_builder",
     "//components/mirroring/service:mirroring_service",
     "//components/paint_preview/buildflags",
     "//components/safe_browsing:buildflags",
diff --git a/chrome/utility/DEPS b/chrome/utility/DEPS
index 4ca9337f..12efbfa9 100644
--- a/chrome/utility/DEPS
+++ b/chrome/utility/DEPS
@@ -38,6 +38,7 @@
   "+chromeos/services/tts",
   "+components/crash/core/common/crash_keys.h",
   "+components/device_signals/core/common/mojom",
+  "+components/metrics/call_stack_profile_builder.h",
   "+components/mirroring/mojom",
   "+components/mirroring/service",
   "+components/paint_preview/buildflags",
diff --git a/chrome/utility/chrome_content_utility_client.cc b/chrome/utility/chrome_content_utility_client.cc
index 0d34830..fb64a04 100644
--- a/chrome/utility/chrome_content_utility_client.cc
+++ b/chrome/utility/chrome_content_utility_client.cc
@@ -18,6 +18,7 @@
 #include "chrome/common/profiler/thread_profiler_configuration.h"
 #include "chrome/utility/browser_exposed_utility_interfaces.h"
 #include "chrome/utility/services.h"
+#include "components/metrics/call_stack_profile_builder.h"
 #include "content/public/child/child_thread.h"
 #include "content/public/common/content_switches.h"
 #include "sandbox/policy/mojom/sandbox.mojom.h"
@@ -70,12 +71,12 @@
           switches::kUtilityProcess &&  // An in-process utility thread may run
                                         // in other processes, only set up
                                         // collector in a utility process.
-      ThreadProfilerConfiguration::Get()
-          ->IsProfilerEnabledForCurrentProcess()) {
+      ThreadProfiler::ShouldCollectProfilesForChildProcess()) {
     mojo::PendingRemote<metrics::mojom::CallStackProfileCollector> collector;
     content::ChildThread::Get()->BindHostReceiver(
         collector.InitWithNewPipeAndPassReceiver());
-    ThreadProfiler::SetCollectorForChildProcess(std::move(collector));
+    metrics::CallStackProfileBuilder::SetParentProfileCollectorForChildProcess(
+        std::move(collector));
   }
 }
 
diff --git a/chromecast/base/metrics/grouped_histogram.cc b/chromecast/base/metrics/grouped_histogram.cc
index 174ee45..8f230ae 100644
--- a/chromecast/base/metrics/grouped_histogram.cc
+++ b/chromecast/base/metrics/grouped_histogram.cc
@@ -44,7 +44,7 @@
   const char* name;
   int minimum;
   int maximum;
-  uint32_t bucket_count;
+  size_t bucket_count;
 };
 
 // List of metrics to collect using a GroupedHistogram.
@@ -140,7 +140,7 @@
 void PreregisterHistogram(const char* name,
                           GroupedHistogram::Sample minimum,
                           GroupedHistogram::Sample maximum,
-                          uint32_t bucket_count,
+                          size_t bucket_count,
                           int32_t flags) {
   base::StringPiece name_piece(name);
 
diff --git a/chromecast/browser/metrics/external_metrics.cc b/chromecast/browser/metrics/external_metrics.cc
index 8252d1d..618fd87 100644
--- a/chromecast/browser/metrics/external_metrics.cc
+++ b/chromecast/browser/metrics/external_metrics.cc
@@ -38,7 +38,7 @@
 bool CheckValues(const std::string& name,
                  int minimum,
                  int maximum,
-                 uint32_t bucket_count) {
+                 size_t bucket_count) {
   if (!base::Histogram::InspectConstructionArguments(
           name, &minimum, &maximum, &bucket_count))
     return false;
diff --git a/chromeos/constants/chromeos_features.cc b/chromeos/constants/chromeos_features.cc
index 715cc51..3c5d650 100644
--- a/chromeos/constants/chromeos_features.cc
+++ b/chromeos/constants/chromeos_features.cc
@@ -26,7 +26,7 @@
 
 // Enables dark/light mode feature.
 const base::Feature kDarkLightMode{"DarkLightMode",
-                                   base::FEATURE_ENABLED_BY_DEFAULT};
+                                   base::FEATURE_DISABLED_BY_DEFAULT};
 
 // Disables "Office Editing for Docs, Sheets & Slides" component app so handlers
 // won't be registered, making it possible to install another version for
diff --git a/chromeos/network/client_cert_resolver.cc b/chromeos/network/client_cert_resolver.cc
index 50577a8..f6552ed 100644
--- a/chromeos/network/client_cert_resolver.cc
+++ b/chromeos/network/client_cert_resolver.cc
@@ -15,9 +15,11 @@
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/containers/flat_map.h"
+#include "base/containers/flat_set.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
 #include "base/task/thread_pool.h"
 #include "base/time/clock.h"
 #include "base/values.h"
@@ -25,6 +27,7 @@
 #include "chromeos/components/onc/variable_expander.h"
 #include "chromeos/dbus/shill/shill_service_client.h"
 #include "chromeos/network/certificate_helper.h"
+#include "chromeos/network/client_cert_util.h"
 #include "chromeos/network/managed_network_configuration_handler.h"
 #include "chromeos/network/network_event_log.h"
 #include "chromeos/network/network_state.h"
@@ -42,6 +45,8 @@
 
 namespace {
 
+using ResolvedCert = client_cert::ResolvedCert;
+
 std::string GetNetworkIdWithGuid(const NetworkState* network_state) {
   return NetworkId(network_state) + "[guid='" + network_state->guid() + "']";
 }
@@ -52,50 +57,25 @@
     g_provisioning_id_getter_for_testing =
         ClientCertResolver::ProvisioningProfileIdGetter();
 
-// Describes a resolved client certificate along with the EAP identity field.
-struct MatchingCert {
-  MatchingCert() {}
-
-  MatchingCert(const std::string& pkcs11_id,
-               int key_slot_id,
-               const std::string& configured_identity)
-      : pkcs11_id(pkcs11_id),
-        key_slot_id(key_slot_id),
-        identity(configured_identity) {}
-
-  bool operator==(const MatchingCert& other) const {
-    return pkcs11_id == other.pkcs11_id && key_slot_id == other.key_slot_id &&
-           identity == other.identity;
-  }
-
-  // The id of the matching certificate.
-  std::string pkcs11_id;
-
-  // The id of the slot containing the certificate and the private key.
-  int key_slot_id = -1;
-
-  // The ONC WiFi.EAP.Identity field can contain variables like
-  // ${CERT_SAN_EMAIL} which are expanded by ClientCertResolver.
-  // |identity| stores a copy of this string after the substitution
-  // has been done.
-  std::string identity;
-};
-
 // Describes a network that is configured with |client_cert_config|, which
 // includes the certificate config.
 struct NetworkAndCertConfig {
   NetworkAndCertConfig(const std::string& network_path,
+                       const std::string& userhash,
+                       const std::string& guid,
                        const client_cert::ClientCertConfig& client_cert_config)
-      : service_path(network_path), cert_config(client_cert_config) {}
+      : service_path(network_path),
+        userhash(userhash),
+        guid(guid),
+        cert_config(client_cert_config) {}
 
   std::string service_path;
+  std::string userhash;
+  std::string guid;
+
   client_cert::ClientCertConfig cert_config;
 };
 
-// The certificate resolving status of a known network that needs certificate
-// pattern resolution.
-enum class ResolveStatus { kResolving, kResolved };
-
 // Returns substitutions based on |cert|'s contents to be used in a
 // VariableExpander.
 base::flat_map<std::string, std::string> GetSubstitutionsForCert(
@@ -129,6 +109,18 @@
   return substitutions;
 }
 
+absl::optional<ResolvedCert> GetResolvedCert(CERTCertificate* cert) {
+  int slot_id = -1;
+  std::string pkcs11_id =
+      NetworkCertLoader::GetPkcs11IdAndSlotForCert(cert, &slot_id);
+  if (pkcs11_id.empty()) {
+    LOG(ERROR) << "Can't extract PKCS11 id";
+    return {};
+  }
+  return ResolvedCert::CertMatched(slot_id, pkcs11_id,
+                                   GetSubstitutionsForCert(cert));
+}
+
 // Returns true if |client_cert_config| specifies a pattern or reference, i.e.
 // if client certificate resolution should be attempted.
 bool ShouldResolveCert(
@@ -143,39 +135,26 @@
 
 namespace internal {
 
-// Describes the resolve status for a network, and if resolving already
-// completed, also holds the matched certificate.
-struct MatchingCertAndResolveStatus {
-  // kResolving if client cert resolution is pending, kResolved if client cert
-  // resolution has been completed for the network.
-  ResolveStatus resolve_status = ResolveStatus::kResolving;
-
-  // This is set to the last resolved client certificate or nullopt if no
-  // matching certificate has been found when |resolve_status| is kResolved.
-  // This is also used to determine if re-resolving a network actually changed
-  // any properties.
-  absl::optional<MatchingCert> matching_cert;
-};
-
-// Describes a network |network_path| and the client cert resolution result.
+// Describes a network and the client cert resolution result for that network.
 struct NetworkAndMatchingCert {
   NetworkAndMatchingCert(const NetworkAndCertConfig& network_and_cert_config,
-                         absl::optional<MatchingCert> matching_cert)
+                         ResolvedCert resolved_cert)
       : service_path(network_and_cert_config.service_path),
-        cert_config_type(network_and_cert_config.cert_config.location),
-        matching_cert(matching_cert) {}
+        userhash(network_and_cert_config.userhash),
+        guid(network_and_cert_config.guid),
+        resolved_cert(std::move(resolved_cert)) {}
 
   std::string service_path;
-  client_cert::ConfigType cert_config_type;
+  std::string userhash;
+  std::string guid;
 
-  // The resolved certificate, or |nullopt| if no matching certificate has been
-  // found.
-  absl::optional<MatchingCert> matching_cert;
+  // The resolved certificate, or |ResolvedCert::NothingMatched()| if no
+  // matching certificate has been found.
+  ResolvedCert resolved_cert;
 };
 
 }  // namespace internal
 
-using internal::MatchingCertAndResolveStatus;
 using internal::NetworkAndMatchingCert;
 
 namespace {
@@ -425,45 +404,26 @@
       VLOG(1) << "Couldn't find a matching client cert for network "
               << network_and_cert_config.service_path;
       matches.push_back(
-          NetworkAndMatchingCert(network_and_cert_config, absl::nullopt));
+          NetworkAndMatchingCert(network_and_cert_config,
+                                 client_cert::ResolvedCert::NothingMatched()));
       continue;
     }
 
-    std::string pkcs11_id;
-    int slot_id = -1;
-
-    pkcs11_id = NetworkCertLoader::GetPkcs11IdAndSlotForCert(
-        cert_it->cert.get(), &slot_id);
-    if (pkcs11_id.empty()) {
+    absl::optional<ResolvedCert> resolved_cert =
+        GetResolvedCert(cert_it->cert.get());
+    if (!resolved_cert) {
       LOG(ERROR) << "Couldn't determine PKCS#11 ID.";
       // So far this error is not expected to happen. We can just continue, in
       // the worst case the user can remove the problematic cert.
       continue;
     }
 
-    // Expand placeholders in the identity string that are specific to the
-    // client certificate.
-    VariableExpander variable_expander(
-        GetSubstitutionsForCert(cert_it->cert.get()));
-    std::string identity = network_and_cert_config.cert_config.policy_identity;
-    const bool success = variable_expander.ExpandString(&identity);
-    LOG_IF(ERROR, !success)
-        << "Error during variable expansion in ONC-configured identity";
-
-    matches.push_back(NetworkAndMatchingCert(
-        network_and_cert_config, MatchingCert(pkcs11_id, slot_id, identity)));
+    matches.push_back(NetworkAndMatchingCert(network_and_cert_config,
+                                             std::move(resolved_cert.value())));
   }
   return matches;
 }
 
-void LogError(const std::string& service_path,
-              const std::string& dbus_error_name,
-              const std::string& dbus_error_message) {
-  network_handler::ShillErrorCallbackFunction(
-      "ClientCertResolver.SetProperties failed", service_path,
-      network_handler::ErrorCallback(), dbus_error_name, dbus_error_message);
-}
-
 bool ClientCertificatesLoaded() {
   if (!NetworkCertLoader::Get()->initial_load_finished()) {
     VLOG(1) << "Certificates not loaded yet.";
@@ -592,9 +552,10 @@
     return;
   // Configure only networks that were not configured before.
 
-  // We'll drop networks from |networks_status_|, which are not known anymore.
-  base::flat_map<std::string, MatchingCertAndResolveStatus> old_networks_status;
-  old_networks_status.swap(networks_status_);
+  // We'll drop networks from |known_networks_service_paths_| which are not
+  // known anymore.
+  base::flat_set<std::string> old_known_networks_service_paths;
+  old_known_networks_service_paths.swap(known_networks_service_paths_);
 
   NetworkStateHandler::NetworkStateList networks;
   network_state_handler_->GetNetworkListByType(
@@ -604,12 +565,10 @@
   NetworkStateHandler::NetworkStateList networks_to_check;
   for (const NetworkState* network : networks) {
     const std::string& service_path = network->path();
-    auto old_networks_status_iter = old_networks_status.find(service_path);
-    if (old_networks_status_iter != old_networks_status.end()) {
-      networks_status_[service_path] = old_networks_status_iter->second;
-      continue;
+    known_networks_service_paths_.insert(service_path);
+    if (!old_known_networks_service_paths.contains(service_path)) {
+      networks_to_check.push_back(network);
     }
-    networks_to_check.push_back(network);
   }
 
   if (!networks_to_check.empty()) {
@@ -662,20 +621,11 @@
   NET_LOG(EVENT) << "ClientCertResolver: PolicyAppliedToNetwork: "
                  << GetNetworkIdWithGuid(network);
 
-  // Policy application may have wiped e.g. the 'EAP.Identity' field, so
-  // forget the resolved certificate and make sure to re-apply it.
-  ForgetResolvedCert(network);
-
   NetworkStateHandler::NetworkStateList networks;
   networks.push_back(network);
   ResolveNetworks(networks);
 }
 
-void ClientCertResolver::ForgetResolvedCert(const NetworkState* network) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  networks_status_.erase(network->path());
-}
-
 void ClientCertResolver::ResolveNetworks(
     const NetworkStateHandler::NetworkStateList& networks) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -685,21 +635,20 @@
   // Filter networks with ClientCertPattern, ClientCertRef, or
   // ProvisioningProfileId. As these can only be set by policy, we check there.
   for (const NetworkState* network : networks) {
-    // If the network was not known before, mark it as known but with resolving
-    // pending.
-    if (networks_status_.find(network->path()) == networks_status_.end())
-      networks_status_.insert_or_assign(network->path(),
-                                        MatchingCertAndResolveStatus());
-
     // If this network is not configured, it cannot have a
     // ClientCertPattern/ClientCertRef/ProvisioningProfileId.
     if (network->profile_path().empty())
       continue;
 
+    known_networks_service_paths_.insert(network->path());
+
     ::onc::ONCSource onc_source = ::onc::ONC_SOURCE_NONE;
+    std::string userhash;
     const base::Value* policy =
         managed_network_config_handler_->FindPolicyByGuidAndProfile(
-            network->guid(), network->profile_path(), &onc_source);
+            network->guid(), network->profile_path(),
+            ManagedNetworkConfigurationHandler::PolicyType::kOriginal,
+            &onc_source, &userhash);
 
     if (!policy) {
       VLOG(1) << "The policy for network " << network->path() << " with GUID "
@@ -717,8 +666,8 @@
     if (!ShouldResolveCert(cert_config))
       continue;
 
-    networks_to_resolve.push_back(
-        NetworkAndCertConfig(network->path(), cert_config));
+    networks_to_resolve.push_back(NetworkAndCertConfig(
+        network->path(), userhash, network->guid(), cert_config));
     networks_to_resolve_info.push_back(GetNetworkIdWithGuid(network));
   }
 
@@ -773,60 +722,28 @@
     std::vector<NetworkAndMatchingCert> matches) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   std::vector<std::string> resolved_networks_info;
-  for (const NetworkAndMatchingCert& match : matches) {
+  for (NetworkAndMatchingCert& match : matches) {
     const NetworkState* network_state =
         network_state_handler_->GetNetworkStateFromServicePath(
             match.service_path, /*configured_only=*/true);
     if (!network_state) {
-      resolved_networks_info.push_back(
-          "Skipping " + match.service_path +
-          " because it is not configured anymore.");
+      resolved_networks_info.push_back(match.service_path +
+                                       ":skipped(not configured)");
       continue;
     }
-    MatchingCertAndResolveStatus& network_status =
-        networks_status_[match.service_path];
-    if (network_status.resolve_status == ResolveStatus::kResolved &&
-        network_status.matching_cert == match.matching_cert) {
-      resolved_networks_info.push_back(GetNetworkIdWithGuid(network_state) +
-                                       ":match,no_change");
-      // The same certificate was configured in the last ConfigureCertificates
-      // call, so don't do anything for this network.
-      continue;
-    }
-    network_status.resolve_status = ResolveStatus::kResolved;
-    network_status.matching_cert = match.matching_cert;
-    network_properties_changed_ = true;
 
-    NET_LOG(EVENT) << "Configuring certificate for network: "
-                   << GetNetworkIdWithGuid(network_state);
-
-    base::Value shill_properties{base::Value::Type::DICTIONARY};
-    if (match.matching_cert.has_value()) {
-      const MatchingCert& matching_cert = match.matching_cert.value();
-      client_cert::SetShillProperties(
-          match.cert_config_type, matching_cert.key_slot_id,
-          matching_cert.pkcs11_id, shill_properties.GetDict());
-      resolved_networks_info.push_back(GetNetworkIdWithGuid(network_state) +
-                                       ":match,identity='" +
-                                       matching_cert.identity + "'");
-      if (!matching_cert.identity.empty()) {
-        shill_properties.SetKey(shill::kEapIdentityProperty,
-                                base::Value(matching_cert.identity));
-      }
-    } else {
-      resolved_networks_info.push_back(GetNetworkIdWithGuid(network_state) +
-                                       ":no_match");
-      client_cert::SetEmptyShillProperties(match.cert_config_type,
-                                           shill_properties.GetDict());
-    }
-    ShillServiceClient::Get()->SetProperties(
-        dbus::ObjectPath(match.service_path), shill_properties,
-        base::DoNothing(), base::BindOnce(&LogError, match.service_path));
-    network_state_handler_->RequestUpdateForNetwork(match.service_path);
+    resolved_networks_info.push_back(
+        GetNetworkIdWithGuid(network_state) +
+        (match.resolved_cert.status() == ResolvedCert::Status::kCertMatched
+             ? ":match"
+             : ":no_match"));
+    network_properties_changed_ |=
+        managed_network_config_handler_->SetResolvedClientCertificate(
+            match.userhash, match.guid, std::move(match.resolved_cert));
   }
-
   NET_LOG(EVENT) << "Summary: "
                  << base::JoinString(resolved_networks_info, ", ");
+
   resolve_task_running_ = false;
   if (queued_networks_to_resolve_.empty())
     NotifyResolveRequestCompleted();
diff --git a/chromeos/network/client_cert_resolver.h b/chromeos/network/client_cert_resolver.h
index c8606d59..141850e5 100644
--- a/chromeos/network/client_cert_resolver.h
+++ b/chromeos/network/client_cert_resolver.h
@@ -11,7 +11,7 @@
 
 #include "base/callback_helpers.h"
 #include "base/component_export.h"
-#include "base/containers/flat_map.h"
+#include "base/containers/flat_set.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "base/scoped_observation.h"
@@ -35,7 +35,6 @@
 
 namespace internal {
 struct NetworkAndMatchingCert;
-struct MatchingCertAndResolveStatus;
 }  // namespace internal
 
 // Observes the known networks. If a network is configured with a client
@@ -116,11 +115,6 @@
   // NetworkPolicyObserver overrides
   void PolicyAppliedToNetwork(const std::string& service_path) override;
 
-  // Forget the resolved certificate of |network| - ensures that the next
-  // ResolveNetwork run will reconfigure the certificate (and EAP Identity
-  // field) even if the certificate has not changed.
-  void ForgetResolvedCert(const NetworkState* network);
-
   // Check which networks of |networks| are configured with a client certificate
   // pattern. Search for certificates, on the worker thread, and configure the
   // networks for which a matching cert is found (see ConfigureCertificates).
@@ -145,11 +139,10 @@
 
   base::ObserverList<Observer, true>::Unchecked observers_;
 
-  // Stores the current client certificate resolution status for each network.
-  // The key is the network's service path. If a network is not present, it is
-  // not known yet (or disappeared from the list of known networks again).
-  base::flat_map<std::string, internal::MatchingCertAndResolveStatus>
-      networks_status_;
+  // Tracks which network configurations ClientCertResolver is aware of, to be
+  // able to detect newly created networks for which certificate resolution may
+  // be necessary. The elements in the set are shill service paths.
+  base::flat_set<std::string> known_networks_service_paths_;
 
   // The list of network paths that still have to be resolved.
   std::set<std::string> queued_networks_to_resolve_;
diff --git a/chromeos/network/client_cert_resolver_unittest.cc b/chromeos/network/client_cert_resolver_unittest.cc
index d424d9a..ba0e4fc 100644
--- a/chromeos/network/client_cert_resolver_unittest.cc
+++ b/chromeos/network/client_cert_resolver_unittest.cc
@@ -844,7 +844,6 @@
 
   GetServiceProperty(shill::kEapIdentityProperty, &identity);
   EXPECT_EQ("upn-santest@ad.corp.example.com-suffix", identity);
-  EXPECT_EQ(2, network_properties_changed_count_);
 
   // Verify that after changing the ONC policy to request the subject CommonName
   // field, the correct value is substituted into the shill service entry.
@@ -855,7 +854,6 @@
 
   GetServiceProperty(shill::kEapIdentityProperty, &identity);
   EXPECT_EQ("subject-cn-Client Cert F-suffix", identity);
-  EXPECT_EQ(3, network_properties_changed_count_);
 }
 
 // Test for crbug.com/781276. A notification which results in no networks to be
@@ -894,59 +892,6 @@
   EXPECT_EQ(test_cert_id_, pkcs11_id);
 }
 
-// Cert and Identity are reconfigured after policy has been applied.
-// Regression test for b/209084821 .
-TEST_F(ClientCertResolverTest, ReresolveAfterPolicyApplication) {
-  SetupTestCerts("client_3", true /* import issuer */);
-  SetupWifi();
-  task_environment_.RunUntilIdle();
-
-  SetupNetworkHandlers();
-  ASSERT_NO_FATAL_FAILURE(SetupPolicyMatchingIssuerPEM(
-      ::onc::ONC_SOURCE_USER_POLICY, "${CERT_SAN_UPN}"));
-  task_environment_.RunUntilIdle();
-
-  network_properties_changed_count_ = 0;
-  StartNetworkCertLoader();
-  task_environment_.RunUntilIdle();
-
-  // Verify that cert id and identity have been resolved
-  {
-    EXPECT_EQ(1, network_properties_changed_count_);
-
-    std::string pkcs11_id;
-    GetServiceProperty(shill::kEapCertIdProperty, &pkcs11_id);
-    EXPECT_THAT(pkcs11_id, Not(IsEmpty()));
-
-    std::string identity;
-    GetServiceProperty(shill::kEapIdentityProperty, &identity);
-    EXPECT_EQ(identity, "santest@ad.corp.example.com");
-  }
-
-  // Mangle cert id and identity
-  ASSERT_TRUE(service_test_->SetServiceProperty(
-      kWifiStub, shill::kEapCertIdProperty, base::Value("modified_cert_id")));
-  ASSERT_TRUE(service_test_->SetServiceProperty(
-      kWifiStub, shill::kEapIdentityProperty, base::Value(std::string())));
-
-  // Pretend that network policy was (re)applied. This should trigger
-  // re-configuration of the cert and EAP.Identity.
-  static_cast<NetworkPolicyObserver*>(client_cert_resolver_.get())
-      ->PolicyAppliedToNetwork(kWifiStub);
-  task_environment_.RunUntilIdle();
-  {
-    EXPECT_EQ(2, network_properties_changed_count_);
-
-    std::string pkcs11_id;
-    GetServiceProperty(shill::kEapCertIdProperty, &pkcs11_id);
-    EXPECT_THAT(pkcs11_id, Not(IsEmpty()));
-
-    std::string identity;
-    GetServiceProperty(shill::kEapIdentityProperty, &identity);
-    EXPECT_EQ(identity, "santest@ad.corp.example.com");
-  }
-}
-
 // Tests that a ClientCertRef reference is resolved by |ClientCertResolver|.
 // Uses the |CertificateImporterImpl| to import the client certificate from ONC
 // policy, ensuring that setting the cert's key's nickname (in the import step)
diff --git a/chromeos/network/client_cert_util.cc b/chromeos/network/client_cert_util.cc
index 5b01f73..9de3e113 100644
--- a/chromeos/network/client_cert_util.cc
+++ b/chromeos/network/client_cert_util.cc
@@ -331,16 +331,24 @@
   return pkcs11_id_;
 }
 
-const base::flat_map<std::string, std::string>
+const base::flat_map<std::string, std::string>&
 ResolvedCert::variable_expansions() const {
   DCHECK_EQ(status(), Status::kCertMatched);
   return variable_expansions_;
 }
 
 bool operator==(const ResolvedCert& lhs, const ResolvedCert& rhs) {
-  return lhs.status() == rhs.status() && lhs.slot_id() == rhs.slot_id() &&
-         lhs.pkcs11_id() == rhs.pkcs11_id() &&
-         lhs.variable_expansions() == rhs.variable_expansions();
+  if (lhs.status() != rhs.status())
+    return false;
+
+  if (lhs.status() == ResolvedCert::Status::kCertMatched) {
+    // Compare attributes of the matched certificate.
+    return lhs.slot_id() == rhs.slot_id() &&
+           lhs.pkcs11_id() == rhs.pkcs11_id() &&
+           lhs.variable_expansions() == rhs.variable_expansions();
+  }
+
+  return true;
 }
 
 // Uses a template type to easily implement a const and a non-const version.
diff --git a/chromeos/network/client_cert_util.h b/chromeos/network/client_cert_util.h
index c9ac9c4..57d4b52 100644
--- a/chromeos/network/client_cert_util.h
+++ b/chromeos/network/client_cert_util.h
@@ -105,7 +105,7 @@
   const std::string& pkcs11_id() const;
   // ONC Variable expansions extracted from the resolved certificate.
   // Only callable if `status()` is `Status::kCertMatched`.
-  const base::flat_map<std::string, std::string> variable_expansions() const;
+  const base::flat_map<std::string, std::string>& variable_expansions() const;
 
  private:
   ResolvedCert(Status status,
diff --git a/chromeos/network/managed_network_configuration_handler.h b/chromeos/network/managed_network_configuration_handler.h
index 438c25c..fbd5aeb 100644
--- a/chromeos/network/managed_network_configuration_handler.h
+++ b/chromeos/network/managed_network_configuration_handler.h
@@ -11,6 +11,7 @@
 #include "base/callback.h"
 #include "base/compiler_specific.h"
 #include "base/component_export.h"
+#include "chromeos/network/client_cert_util.h"
 #include "chromeos/network/network_handler.h"
 #include "chromeos/network/network_handler_callbacks.h"
 #include "components/onc/onc_constants.h"
@@ -54,6 +55,15 @@
 // user consumption.
 class COMPONENT_EXPORT(CHROMEOS_NETWORK) ManagedNetworkConfigurationHandler {
  public:
+  // Specifies which policy type a caller is interested in.
+  enum class PolicyType {
+    // Original ONC policy as provided by cloud policy.
+    kOriginal,
+    // ONC policy with runtime values set, i.e. variables can be expanded and a
+    // resolved client certificate set.
+    kWithRuntimeValues,
+  };
+
   ManagedNetworkConfigurationHandler& operator=(
       const ManagedNetworkConfigurationHandler&) = delete;
 
@@ -150,6 +160,13 @@
       const std::string& userhash,
       base::flat_map<std::string, std::string> expansions) = 0;
 
+  // Sets the resolved certificate for the network |guid|.
+  // Returns true if this resulted in an effective change.
+  virtual bool SetResolvedClientCertificate(
+      const std::string& userhash,
+      const std::string& guid,
+      client_cert::ResolvedCert resolved_cert) = 0;
+
   // Returns the user policy for user |userhash| or device policy, which has
   // |guid|. If |userhash| is empty, only looks for a device policy. If such
   // doesn't exist, returns NULL. Sets |onc_source| accordingly.
@@ -169,12 +186,14 @@
       const std::string& userhash) const = 0;
 
   // Returns the policy with |guid| for profile |profile_path|. If such
-  // doesn't exist, returns nullptr. Sets |onc_source| accordingly if it is not
-  // nullptr.
+  // doesn't exist, returns nullptr. Sets |onc_source| and |userhash|
+  // accordingly if it is not nullptr.
   virtual const base::Value* FindPolicyByGuidAndProfile(
       const std::string& guid,
       const std::string& profile_path,
-      ::onc::ONCSource* onc_source) const = 0;
+      PolicyType policy_type,
+      ::onc::ONCSource* out_onc_source,
+      std::string* out_userhash) const = 0;
 
   // Returns true if the network with |guid| is configured by device or user
   // policy for profile |profile_path|.
diff --git a/chromeos/network/managed_network_configuration_handler_impl.cc b/chromeos/network/managed_network_configuration_handler_impl.cc
index 16983be52..48aad8b2 100644
--- a/chromeos/network/managed_network_configuration_handler_impl.cc
+++ b/chromeos/network/managed_network_configuration_handler_impl.cc
@@ -4,6 +4,7 @@
 
 #include "chromeos/network/managed_network_configuration_handler_impl.h"
 
+#include <iterator>
 #include <memory>
 #include <utility>
 #include <vector>
@@ -30,6 +31,7 @@
 #include "chromeos/dbus/shill/shill_profile_client.h"
 #include "chromeos/dbus/shill/shill_service_client.h"
 #include "chromeos/network/cellular_policy_handler.h"
+#include "chromeos/network/client_cert_util.h"
 #include "chromeos/network/device_state.h"
 #include "chromeos/network/network_configuration_handler.h"
 #include "chromeos/network/network_device_handler.h"
@@ -153,6 +155,18 @@
 
 }  // namespace
 
+ManagedNetworkConfigurationHandlerImpl::PolicyApplicationInfo::
+    PolicyApplicationInfo() = default;
+ManagedNetworkConfigurationHandlerImpl::PolicyApplicationInfo::
+    ~PolicyApplicationInfo() = default;
+
+ManagedNetworkConfigurationHandlerImpl::PolicyApplicationInfo::
+    PolicyApplicationInfo(PolicyApplicationInfo&& other) = default;
+
+ManagedNetworkConfigurationHandlerImpl::PolicyApplicationInfo&
+ManagedNetworkConfigurationHandlerImpl::PolicyApplicationInfo::operator=(
+    PolicyApplicationInfo&& other) = default;
+
 void ManagedNetworkConfigurationHandlerImpl::AddObserver(
     NetworkPolicyObserver* observer) {
   observers_.AddObserver(observer);
@@ -508,9 +522,8 @@
     }
   }
 
-  base::flat_set<std::string> modified_policies =
-      policies->ApplyOncNetworkConfigurationList(network_configs_onc);
-  ApplyOrQueuePolicies(userhash, &modified_policies);
+  ApplyOrQueuePolicies(userhash, policies->ApplyOncNetworkConfigurationList(
+                                     network_configs_onc));
 
   for (auto& observer : observers_)
     observer.PoliciesChanged(userhash);
@@ -518,55 +531,99 @@
 
 bool ManagedNetworkConfigurationHandlerImpl::IsAnyPolicyApplicationRunning()
     const {
-  return !policy_applicators_.empty() || !queued_modified_policies_.empty();
+  for (const auto& [_, policy_application_info] :
+       policy_application_info_map_) {
+    if (policy_application_info.IsRunningOrRequired()) {
+      return true;
+    }
+  }
+  return false;
 }
 
-bool ManagedNetworkConfigurationHandlerImpl::ApplyOrQueuePolicies(
+void ManagedNetworkConfigurationHandlerImpl::ApplyOrQueuePolicies(
     const std::string& userhash,
-    base::flat_set<std::string>* modified_policies) {
-  DCHECK(modified_policies);
-
+    base::flat_set<std::string> modified_policies) {
   const NetworkProfile* profile =
       network_profile_handler_->GetProfileForUserhash(userhash);
   if (!profile) {
     VLOG(1) << "The relevant Shill profile isn't initialized yet, postponing "
             << "policy application.";
     // OnProfileAdded will apply all policies for this userhash.
-    return false;
+    return;
   }
 
-  if (base::Contains(policy_applicators_, userhash)) {
-    // A previous policy application is still running. Queue the modified
-    // policies.
-    // Note, even if |modified_policies| is empty, this means that a policy
-    // application will be queued.
-    queued_modified_policies_[userhash].insert(modified_policies->begin(),
-                                               modified_policies->end());
-    VLOG(1) << "Previous PolicyApplicator still running. Postponing policy "
-               "application.";
-    return false;
+  // Note that this will default-construct a PolicyApplicationInfo if none
+  // exists for the shill profile identifier by |userhash| yet.
+  PolicyApplicationInfo& policy_application_info =
+      policy_application_info_map_[userhash];
+  policy_application_info.modified_policy_guids.insert(
+      std::make_move_iterator(modified_policies.begin()),
+      std::make_move_iterator(modified_policies.end()));
+  SchedulePolicyApplication(userhash);
+}
+
+void ManagedNetworkConfigurationHandlerImpl::SchedulePolicyApplication(
+    const std::string& userhash) {
+  PolicyApplicationInfo& policy_application_info =
+      policy_application_info_map_[userhash];
+  policy_application_info.application_required = true;
+  if (policy_application_info.task_scheduled) {
+    return;
   }
+  policy_application_info.task_scheduled = true;
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindOnce(
+          &ManagedNetworkConfigurationHandlerImpl::StartPolicyApplication,
+          weak_ptr_factory_.GetWeakPtr(), userhash));
+}
+
+void ManagedNetworkConfigurationHandlerImpl::StartPolicyApplication(
+    const std::string& userhash) {
+  PolicyApplicationInfo& policy_application_info =
+      policy_application_info_map_[userhash];
+  DCHECK(policy_application_info.task_scheduled);
+  DCHECK(policy_application_info.application_required);
+  policy_application_info.task_scheduled = false;
+  policy_application_info.application_required = false;
 
   const ProfilePolicies* policies = policies_by_user_[userhash].get();
   DCHECK(policies);
 
-  auto policy_applicator = std::make_unique<PolicyApplicator>(
-      *profile, policies->GetGuidToPolicyMap(),
-      policies->GetGlobalNetworkConfig()->Clone(), this,
-      managed_cellular_pref_handler_, modified_policies);
-  auto* policy_applicator_unowned = policy_applicator.get();
-  policy_applicators_[userhash] = std::move(policy_applicator);
-  policy_applicator_unowned->Run();
-  return true;
+  const NetworkProfile* profile =
+      network_profile_handler_->GetProfileForUserhash(userhash);
+  DCHECK(profile);
+
+  base::flat_set<std::string> modified_guids;
+  policy_application_info.modified_policy_guids.swap(modified_guids);
+
+  policy_application_info.running_policy_applicator =
+      std::make_unique<PolicyApplicator>(
+          *profile, policies->GetGuidToPolicyMap(),
+          policies->GetGlobalNetworkConfig()->Clone(), this,
+          managed_cellular_pref_handler_, std::move(modified_guids));
+  policy_application_info.running_policy_applicator->Run();
 }
 
 void ManagedNetworkConfigurationHandlerImpl::SetProfileWideVariableExpansions(
     const std::string& userhash,
     base::flat_map<std::string, std::string> expansions) {
-  base::flat_set<std::string> modified_policy_guids =
-      GetOrCreatePoliciesForUser(userhash)->SetProfileWideExpansions(
-          std::move(expansions));
-  ApplyOrQueuePolicies(userhash, &modified_policy_guids);
+  ApplyOrQueuePolicies(
+      userhash, GetOrCreatePoliciesForUser(userhash)->SetProfileWideExpansions(
+                    std::move(expansions)));
+}
+
+bool ManagedNetworkConfigurationHandlerImpl::SetResolvedClientCertificate(
+    const std::string& userhash,
+    const std::string& guid,
+    client_cert::ResolvedCert resolved_cert) {
+  bool change_had_effect =
+      GetOrCreatePoliciesForUser(userhash)->SetResolvedClientCertificate(
+          guid, std::move(resolved_cert));
+  if (!change_had_effect)
+    return false;
+  ApplyOrQueuePolicies(userhash, {guid});
+  return true;
 }
 
 void ManagedNetworkConfigurationHandlerImpl::set_ui_proxy_config_service(
@@ -586,10 +643,7 @@
     return;
   }
 
-  base::flat_set<std::string> policy_guids = policies->GetAllPolicyGuids();
-  const bool started_policy_application =
-      ApplyOrQueuePolicies(profile.userhash, &policy_guids);
-  DCHECK(started_policy_application);
+  ApplyOrQueuePolicies(profile.userhash, policies->GetAllPolicyGuids());
 }
 
 void ManagedNetworkConfigurationHandlerImpl::OnProfileRemoved(
@@ -690,46 +744,48 @@
     const base::flat_set<std::string>& new_cellular_policy_guids) {
   const std::string& userhash = profile.userhash;
   VLOG(1) << "Policy application for user '" << userhash << "' finished.";
+
+  PolicyApplicationInfo& policy_application_info =
+      policy_application_info_map_[userhash];
+
   base::ThreadTaskRunnerHandle::Get()->DeleteSoon(
-      FROM_HERE, policy_applicators_[userhash].release());
-  policy_applicators_.erase(userhash);
+      FROM_HERE, std::move(policy_application_info.running_policy_applicator));
 
   TriggerCellularPolicyApplication(profile, new_cellular_policy_guids);
 
-  if (base::Contains(queued_modified_policies_, userhash)) {
-    base::flat_set<std::string> modified_policies;
-    queued_modified_policies_[userhash].swap(modified_policies);
-    // Remove |userhash| from the queue.
-    queued_modified_policies_.erase(userhash);
-    ApplyOrQueuePolicies(userhash, &modified_policies);
-  } else {
-    if (userhash.empty())
-      device_policy_applied_ = true;
-    else
-      user_policy_applied_ = true;
-
-    if (features::IsESimPolicyEnabled()) {
-      ESimPolicyLoginMetricsLogger::RecordBlockNonManagedCellularBehavior(
-          AllowOnlyPolicyCellularNetworks());
-      // Call UpdateBlockCellularNetworks when either device policy applied or
-      // user policy applied so that so that unmanaged cellular networks are
-      // blocked correctly if the policy appears in either.
-      network_state_handler_->UpdateBlockedCellularNetworks(
-          AllowOnlyPolicyCellularNetworks());
-    }
-
-    if (features::IsSimLockPolicyEnabled())
-      network_device_handler_->SetAllowCellularSimLock(AllowCellularSimLock());
-
-    if (device_policy_applied_ && user_policy_applied_) {
-      network_state_handler_->UpdateBlockedWifiNetworks(
-          AllowOnlyPolicyWiFiToConnect(),
-          AllowOnlyPolicyWiFiToConnectIfAvailable(), GetBlockedHexSSIDs());
-    }
-
-    for (auto& observer : observers_)
-      observer.PoliciesApplied(userhash);
+  if (policy_application_info.application_required) {
+    // This means that a network policy change happened while policy was being
+    // applied. Schedule another network policy application run.
+    SchedulePolicyApplication(userhash);
+    return;
   }
+
+  if (userhash.empty())
+    device_policy_applied_ = true;
+  else
+    user_policy_applied_ = true;
+
+  if (features::IsESimPolicyEnabled()) {
+    ESimPolicyLoginMetricsLogger::RecordBlockNonManagedCellularBehavior(
+        AllowOnlyPolicyCellularNetworks());
+    // Call UpdateBlockCellularNetworks when either device policy applied or
+    // user policy applied so that so that unmanaged cellular networks are
+    // blocked correctly if the policy appears in either.
+    network_state_handler_->UpdateBlockedCellularNetworks(
+        AllowOnlyPolicyCellularNetworks());
+  }
+
+  if (features::IsSimLockPolicyEnabled())
+    network_device_handler_->SetAllowCellularSimLock(AllowCellularSimLock());
+
+  if (device_policy_applied_ && user_policy_applied_) {
+    network_state_handler_->UpdateBlockedWifiNetworks(
+        AllowOnlyPolicyWiFiToConnect(),
+        AllowOnlyPolicyWiFiToConnectIfAvailable(), GetBlockedHexSSIDs());
+  }
+
+  for (auto& observer : observers_)
+    observer.PoliciesApplied(userhash);
 }
 
 const base::Value* ManagedNetworkConfigurationHandlerImpl::FindPolicyByGUID(
@@ -785,7 +841,9 @@
 ManagedNetworkConfigurationHandlerImpl::FindPolicyByGuidAndProfile(
     const std::string& guid,
     const std::string& profile_path,
-    ::onc::ONCSource* onc_source) const {
+    PolicyType policy_type,
+    ::onc::ONCSource* out_onc_source,
+    std::string* out_userhash) const {
   if (profile_path.empty())
     return nullptr;
 
@@ -801,10 +859,16 @@
   if (!policies)
     return nullptr;
 
-  const base::Value* policy = policies->GetPolicyByGuid(guid);
-  if (policy && onc_source) {
-    *onc_source = (profile->userhash.empty() ? ::onc::ONC_SOURCE_DEVICE_POLICY
-                                             : ::onc::ONC_SOURCE_USER_POLICY);
+  const base::Value* policy = (policy_type == PolicyType::kOriginal)
+                                  ? policies->GetOriginalPolicyByGuid(guid)
+                                  : policies->GetPolicyByGuid(guid);
+  if (policy && out_onc_source) {
+    *out_onc_source =
+        (profile->userhash.empty() ? ::onc::ONC_SOURCE_DEVICE_POLICY
+                                   : ::onc::ONC_SOURCE_USER_POLICY);
+  }
+  if (policy && out_userhash) {
+    *out_userhash = profile->userhash;
   }
   return policy;
 }
diff --git a/chromeos/network/managed_network_configuration_handler_impl.h b/chromeos/network/managed_network_configuration_handler_impl.h
index 00ccd0d1..e476e6a1 100644
--- a/chromeos/network/managed_network_configuration_handler_impl.h
+++ b/chromeos/network/managed_network_configuration_handler_impl.h
@@ -14,6 +14,7 @@
 #include "base/containers/flat_set.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
+#include "chromeos/network/client_cert_util.h"
 #include "chromeos/network/managed_network_configuration_handler.h"
 #include "chromeos/network/network_handler_callbacks.h"
 #include "chromeos/network/network_profile_observer.h"
@@ -94,6 +95,11 @@
       const std::string& userhash,
       base::flat_map<std::string, std::string> expansions) override;
 
+  bool SetResolvedClientCertificate(
+      const std::string& userhash,
+      const std::string& guid,
+      client_cert::ResolvedCert resolved_cert) override;
+
   const base::Value* FindPolicyByGUID(
       const std::string userhash,
       const std::string& guid,
@@ -107,7 +113,9 @@
   const base::Value* FindPolicyByGuidAndProfile(
       const std::string& guid,
       const std::string& profile_path,
-      ::onc::ONCSource* onc_source) const override;
+      PolicyType policy_type,
+      ::onc::ONCSource* onc_source,
+      std::string* userhash) const override;
 
   bool IsNetworkConfiguredByPolicy(
       const std::string& guid,
@@ -165,12 +173,48 @@
   friend class NetworkHandler;
   friend class ProhibitedTechnologiesHandlerTest;
 
+  // This structure holds information about the status of ONC network policy
+  // application for a shill profile.
+  // ManagedNetworkConfigurationHandler maintains a map shill profile ->
+  // PolicyApplicationInfo.
+  struct PolicyApplicationInfo {
+    PolicyApplicationInfo();
+    ~PolicyApplicationInfo();
+
+    // Moveable type
+    PolicyApplicationInfo(const PolicyApplicationInfo& other) = delete;
+    PolicyApplicationInfo& operator=(const PolicyApplicationInfo& other) =
+        delete;
+    PolicyApplicationInfo(PolicyApplicationInfo&& other);
+    PolicyApplicationInfo& operator=(PolicyApplicationInfo&& other);
+
+    bool IsRunningOrRequired() const {
+      return application_required || running_policy_applicator;
+    }
+
+    // Holds the set of ONC NetworkConfiguration GUIDs which have been modified
+    // since network policy has been last applied.
+    base::flat_set<std::string> modified_policy_guids;
+    // If true, network policy application needs to happen for this shill
+    // profile, i.e. there were network policy changes that have not been
+    // applied yet. Note that this can be true even if |modified_policy_guids|
+    // is empty, e.g. if an ONC GlobalNetworkConfiguration parameter (which
+    // affects all networks in this shill profile) has changed, but the settings
+    // of the individual NetworkConfigurations remained the same.
+    bool application_required = false;
+    // If true, a task has already been scheduled to actually apply network
+    // policy for this shill profile.
+    bool task_scheduled = false;
+    // If present, network policy is currently being applied (which is an
+    // asynchronous process). The PolicyApplicator instance is responsible for
+    // applying it.
+    std::unique_ptr<PolicyApplicator> running_policy_applicator;
+  };
+
   using UserToPoliciesMap =
       base::flat_map<std::string, std::unique_ptr<ProfilePolicies>>;
-  using UserToPolicyApplicatorMap =
-      base::flat_map<std::string, std::unique_ptr<PolicyApplicator>>;
-  using UserToModifiedPoliciesMap =
-      base::flat_map<std::string, base::flat_set<std::string>>;
+  using UserToPolicyApplicationInfo =
+      base::flat_map<std::string, PolicyApplicationInfo>;
 
   // The type of properties to send after a Get{Managed}Properties call.
   enum class PropertiesType {
@@ -251,12 +295,13 @@
   void SetManagedActiveProxyValues(const std::string& guid,
                                    base::Value* dictionary);
 
-  // Applies policies for |userhash|. |modified_policies| must be not null and
-  // contain the GUIDs of the network configurations that changed since the last
-  // policy application. Returns true if policy application was started and
-  // false if it was queued or delayed.
-  bool ApplyOrQueuePolicies(const std::string& userhash,
-                            base::flat_set<std::string>* modified_policies);
+  // Applies policies for |userhash|. |modified_policies| contains the GUIDs of
+  // the network configurations that changed since the last policy application.
+  void ApplyOrQueuePolicies(const std::string& userhash,
+                            base::flat_set<std::string> modified_policies);
+
+  void SchedulePolicyApplication(const std::string& userhash);
+  void StartPolicyApplication(const std::string& userhash);
 
   void set_ui_proxy_config_service(
       UIProxyConfigService* ui_proxy_config_service);
@@ -274,15 +319,7 @@
   ProhibitedTechnologiesHandler* prohibited_technologies_handler_ = nullptr;
   UIProxyConfigService* ui_proxy_config_service_ = nullptr;
 
-  // Owns the currently running PolicyApplicators.
-  UserToPolicyApplicatorMap policy_applicators_;
-
-  // Per userhash (or empty string for device policy), contains the GUIDs of the
-  // policies that were modified.
-  // If this map contains a userhash as key, it means that a policy application
-  // for this userhash is pending even if no policies were modified and the
-  // associated set of GUIDs is empty.
-  UserToModifiedPoliciesMap queued_modified_policies_;
+  UserToPolicyApplicationInfo policy_application_info_map_;
 
   base::ObserverList<NetworkPolicyObserver, true>::Unchecked observers_;
 
diff --git a/chromeos/network/mock_managed_network_configuration_handler.h b/chromeos/network/mock_managed_network_configuration_handler.h
index f774278..10637bc0 100644
--- a/chromeos/network/mock_managed_network_configuration_handler.h
+++ b/chromeos/network/mock_managed_network_configuration_handler.h
@@ -9,6 +9,7 @@
 
 #include "base/component_export.h"
 #include "base/values.h"
+#include "chromeos/network/client_cert_util.h"
 #include "chromeos/network/managed_network_configuration_handler.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
@@ -69,6 +70,10 @@
   MOCK_METHOD2(SetProfileWideVariableExpansions,
                void(const std::string& userhash,
                     base::flat_map<std::string, std::string> expansions));
+  MOCK_METHOD3(SetResolvedClientCertificate,
+               bool(const std::string& userhash,
+                    const std::string& guid,
+                    client_cert::ResolvedCert resolved_cert));
   MOCK_CONST_METHOD3(FindPolicyByGUID,
                      const base::Value*(const std::string userhash,
                                         const std::string& guid,
@@ -76,10 +81,12 @@
   MOCK_CONST_METHOD1(HasAnyPolicyNetwork, bool(const std::string& userhash));
   MOCK_CONST_METHOD1(GetGlobalConfigFromPolicy,
                      const base::Value*(const std::string& userhash));
-  MOCK_CONST_METHOD3(FindPolicyByGuidAndProfile,
+  MOCK_CONST_METHOD5(FindPolicyByGuidAndProfile,
                      const base::Value*(const std::string& guid,
                                         const std::string& profile_path,
-                                        ::onc::ONCSource* onc_source));
+                                        PolicyType policy_type,
+                                        ::onc::ONCSource* out_onc_source,
+                                        std::string* out_userhash));
   MOCK_CONST_METHOD2(IsNetworkConfiguredByPolicy,
                      bool(const std::string& guid,
                           const std::string& profile_path));
diff --git a/chromeos/network/network_connection_handler_impl.cc b/chromeos/network/network_connection_handler_impl.cc
index ae4a5bb..4ad59f6d 100644
--- a/chromeos/network/network_connection_handler_impl.cc
+++ b/chromeos/network/network_connection_handler_impl.cc
@@ -673,7 +673,9 @@
   const base::Value* policy = nullptr;
   if (guid && profile) {
     policy = managed_configuration_handler_->FindPolicyByGuidAndProfile(
-        *guid, *profile, &onc_source);
+        *guid, *profile,
+        ManagedNetworkConfigurationHandler::PolicyType::kWithRuntimeValues,
+        &onc_source, /*out_userhash=*/nullptr);
   }
   // Check if network is blocked by policy.
   if (*type == shill::kTypeWifi &&
diff --git a/chromeos/network/policy_applicator.cc b/chromeos/network/policy_applicator.cc
index 4c46399cf..09458fc 100644
--- a/chromeos/network/policy_applicator.cc
+++ b/chromeos/network/policy_applicator.cc
@@ -110,14 +110,13 @@
     base::Value global_network_config,
     ConfigurationHandler* handler,
     ManagedCellularPrefHandler* managed_cellular_pref_handler,
-    base::flat_set<std::string>* modified_policy_guids)
+    base::flat_set<std::string> modified_policy_guids)
     : handler_(handler),
       managed_cellular_pref_handler_(managed_cellular_pref_handler),
       profile_(profile),
       all_policies_(std::move(all_policies)),
-      global_network_config_(std::move(global_network_config)) {
-  remaining_policy_guids_.swap(*modified_policy_guids);
-}
+      global_network_config_(std::move(global_network_config)),
+      remaining_policy_guids_(std::move(modified_policy_guids)) {}
 
 PolicyApplicator::~PolicyApplicator() {
   VLOG(1) << "Destroying PolicyApplicator for " << profile_.userhash;
diff --git a/chromeos/network/policy_applicator.h b/chromeos/network/policy_applicator.h
index 068d3ff..deca0fa 100644
--- a/chromeos/network/policy_applicator.h
+++ b/chromeos/network/policy_applicator.h
@@ -67,7 +67,7 @@
                    base::Value global_network_config,
                    ConfigurationHandler* handler,
                    ManagedCellularPrefHandler* managed_cellular_pref_handler,
-                   base::flat_set<std::string>* modified_policy_guids);
+                   base::flat_set<std::string> modified_policy_guids);
 
   PolicyApplicator(const PolicyApplicator&) = delete;
   PolicyApplicator& operator=(const PolicyApplicator&) = delete;
@@ -147,6 +147,12 @@
   // |handler_|.
   void NotifyConfigurationHandlerAndFinish();
 
+  ConfigurationHandler* const handler_;
+  ManagedCellularPrefHandler* managed_cellular_pref_handler_ = nullptr;
+  NetworkProfile profile_;
+  base::flat_map<std::string, base::Value> all_policies_;
+  base::Value global_network_config_;
+
   base::flat_set<std::string> remaining_policy_guids_;
   base::flat_set<std::string> pending_get_entry_calls_;
 
@@ -154,12 +160,6 @@
   // the caller.
   base::flat_set<std::string> new_cellular_policy_guids_;
 
-  ConfigurationHandler* handler_;
-  ManagedCellularPrefHandler* managed_cellular_pref_handler_ = nullptr;
-  NetworkProfile profile_;
-  base::flat_map<std::string, base::Value> all_policies_;
-  base::Value global_network_config_;
-
   SEQUENCE_CHECKER(sequence_checker_);
 
   base::WeakPtrFactory<PolicyApplicator> weak_ptr_factory_{this};
diff --git a/chromeos/services/libassistant/settings_controller.cc b/chromeos/services/libassistant/settings_controller.cc
index 442b8c1..a383f59 100644
--- a/chromeos/services/libassistant/settings_controller.cc
+++ b/chromeos/services/libassistant/settings_controller.cc
@@ -10,8 +10,10 @@
 #include "base/callback_helpers.h"
 #include "base/sequence_checker.h"
 #include "chromeos/assistant/internal/internal_util.h"
+#include "chromeos/assistant/internal/proto/assistant/display_connection.pb.h"
 #include "chromeos/assistant/internal/proto/shared/proto/settings_ui.pb.h"
 #include "chromeos/assistant/internal/proto/shared/proto/v2/config_settings_interface.pb.h"
+#include "chromeos/assistant/internal/proto/shared/proto/v2/display_interface.pb.h"
 #include "chromeos/services/assistant/public/cpp/features.h"
 #include "chromeos/services/assistant/public/proto/assistant_device_settings_ui.pb.h"
 #include "chromeos/services/assistant/public/proto/settings_ui.pb.h"
@@ -248,6 +250,12 @@
 
 void SettingsController::SetDarkModeEnabled(bool value) {
   dark_mode_enabled_ = value;
+
+  if (chromeos::assistant::features::IsLibAssistantV2Enabled()) {
+    UpdateDarkModeEnabledV2(dark_mode_enabled_);
+    return;
+  }
+
   UpdateInternalOptions(locale_, spoken_feedback_enabled_, dark_mode_enabled_);
 }
 
@@ -299,6 +307,14 @@
   if (!assistant_client_)
     return;
 
+  if (chromeos::assistant::features::IsLibAssistantV2Enabled()) {
+    if (locale.has_value() && spoken_feedback_enabled.has_value()) {
+      assistant_client_->SetInternalOptions(locale.value(),
+                                            spoken_feedback_enabled.value());
+    }
+    return;
+  }
+
   if (locale.has_value() && spoken_feedback_enabled.has_value() &&
       dark_mode_enabled.has_value()) {
     assistant_client_->SetDeviceAttributes(dark_mode_enabled.value());
@@ -330,6 +346,26 @@
   }
 }
 
+void SettingsController::UpdateDarkModeEnabledV2(
+    absl::optional<bool> dark_mode_enabled) {
+  if (!assistant_client_)
+    return;
+
+  if (!dark_mode_enabled.has_value())
+    return;
+
+  ::assistant::display::DisplayRequest display_request;
+  display_request.mutable_set_device_properties_request()
+      ->mutable_theme_properties_to_merge()
+      ->set_mode(dark_mode_enabled.value()
+                     ? ::assistant::api::params::ThemeProperties::DARK_THEME
+                     : ::assistant::api::params::ThemeProperties::LIGHT_THEME);
+
+  ::assistant::api::OnDisplayRequestRequest request;
+  request.set_display_request_bytes(display_request.SerializeAsString());
+  assistant_client_->SendDisplayRequest(request);
+}
+
 void SettingsController::OnAssistantClientStarted(
     AssistantClient* assistant_client) {
   assistant_client_ = assistant_client;
@@ -353,6 +389,7 @@
   if (chromeos::assistant::features::IsLibAssistantV2Enabled()) {
     UpdateLocaleOverride(locale_);
     UpdateListeningEnabled(listening_enabled_);
+    UpdateDarkModeEnabledV2(dark_mode_enabled_);
   }
 }
 
diff --git a/chromeos/services/libassistant/settings_controller.h b/chromeos/services/libassistant/settings_controller.h
index 3c63090..06036ff 100644
--- a/chromeos/services/libassistant/settings_controller.h
+++ b/chromeos/services/libassistant/settings_controller.h
@@ -60,6 +60,7 @@
   void UpdateLocaleOverride(const absl::optional<std::string>& locale);
   void UpdateDeviceSettings(const absl::optional<std::string>& locale,
                             absl::optional<bool> hotword_enabled);
+  void UpdateDarkModeEnabledV2(absl::optional<bool> dark_mode_enabled);
 
   // Instantiated when Libassistant is started and destroyed when Libassistant
   // is stopped.
diff --git a/chromeos/strings/chromeos_strings_am.xtb b/chromeos/strings/chromeos_strings_am.xtb
index 746f531..d18dc7fe 100644
--- a/chromeos/strings/chromeos_strings_am.xtb
+++ b/chromeos/strings/chromeos_strings_am.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">በ <ph name="FIRST_MANAGER" /> እና <ph name="SECOND_MANAGER" /> የሚተዳደር</translation>
 <translation id="1726100011689679555">የስም አገልጋዩች</translation>
 <translation id="1731082422893354635">የብሉቱዝ መዳሰሻ ሰሌዳ</translation>
+<translation id="1745577949879301685">ምስሎችን መጫን አልተቻለም። የአውታረ መረብ ግንኙነትዎን ይፈትሹ ወይም ምስሎቹን እንደገና ለመጫን ይሞክሩ።</translation>
 <translation id="1751249301761991853">የግል</translation>
 <translation id="1753496554272155572">ከልጣፍ ቅድመ-እይታ ይውጡ</translation>
 <translation id="175763766237925754">ጥሩ (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb
index a4a48d5..6dadbc3d 100644
--- a/chromeos/strings/chromeos_strings_ar.xtb
+++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">هذا الجهاز مُدار من خلال <ph name="FIRST_MANAGER" /> و<ph name="SECOND_MANAGER" /></translation>
 <translation id="1726100011689679555">خوادم الأسماء</translation>
 <translation id="1731082422893354635">لوحة لمس تتضمّن بلوتوث</translation>
+<translation id="1745577949879301685">تعذَّر تحميل الصور. يُرجى التحقُّق من الاتصال بالشبكة أو إعادة محاولة تحميل الصور.</translation>
 <translation id="1751249301761991853">إعدادات التخصيص</translation>
 <translation id="1753496554272155572">إغلاق معاينة الخلفية</translation>
 <translation id="175763766237925754">إشارة جيدة (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb
index f3d919c..f11ba40 100644
--- a/chromeos/strings/chromeos_strings_az.xtb
+++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -430,6 +430,7 @@
 <translation id="4915052247106771211">Cihazı zavod ayarlarına sıfırlanacaq (Powerwash).</translation>
 <translation id="4917385247580444890">Güclü</translation>
 <translation id="4917889632206600977">Dayanıb - Kağız yoxdur</translation>
+<translation id="491791267030419270">Rəy yazmaq üzrə məsləhətlər</translation>
 <translation id="4921665434385737356"><ph name="NUM_SECONDS" /> saniyədə <ph name="RATE" /> şarj edilib.</translation>
 <translation id="4930320165497208503">Bağlantını ayarlamaq və ya güncəlləmək üçün <ph name="BEGIN_LINK" />Ayarlara<ph name="END_LINK" /> keçin.</translation>
 <translation id="4932733599132424254">Tarix</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb
index c594e4f..1becea6 100644
--- a/chromeos/strings/chromeos_strings_bs.xtb
+++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -430,6 +430,7 @@
 <translation id="4915052247106771211">Ovim će se uređaj vratiti na fabričke postavke (Powerwash).</translation>
 <translation id="4917385247580444890">Jako</translation>
 <translation id="4917889632206600977">Zaustavljeno – nestalo je papira</translation>
+<translation id="491791267030419270">Savjeti za pisanje povratnih informacija</translation>
 <translation id="4921665434385737356">Napunjeno <ph name="RATE" /> za <ph name="NUM_SECONDS" /> s.</translation>
 <translation id="4930320165497208503">Da postavite ili ažurirate vezu, idite u <ph name="BEGIN_LINK" />Postavke<ph name="END_LINK" />.</translation>
 <translation id="4932733599132424254">Datum</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb
index 9cfd109..7a8b0de 100644
--- a/chromeos/strings/chromeos_strings_en-GB.xtb
+++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -18,6 +18,7 @@
 <translation id="1175697296044146566">This <ph name="DEVICE_TYPE" /> is managed by <ph name="MANAGER" />.</translation>
 <translation id="1175951029573070619">Average (<ph name="SIGNAL_STRENGTH" />)</translation>
 <translation id="1181037720776840403">Remove</translation>
+<translation id="1190378975642195988">Base accelerometer</translation>
 <translation id="1195447618553298278">Unknown error.</translation>
 <translation id="1196959502276349371">Version <ph name="VERSION" /></translation>
 <translation id="1199355487114804640">Play/Pause</translation>
@@ -268,6 +269,7 @@
 <translation id="3484914941826596830">While the firmware is updating, do not unplug this external device or shut down your computer. You can minimise this window. This update may take a few minutes and your external device may not work during this time.</translation>
 <translation id="3486220673238053218">definition</translation>
 <translation id="3488065109653206955">Partially activated</translation>
+<translation id="3492982278147736083">Lid gyroscope</translation>
 <translation id="3517001332549868749">ChromeOS update</translation>
 <translation id="3527036260304016759">Failed – Unknown error</translation>
 <translation id="3532980081107202182">About <ph name="MIN_REMAINING" /> minutes remaining</translation>
@@ -301,6 +303,7 @@
 <translation id="3820172043799983114">Invalid PIN.</translation>
 <translation id="3838338534323494292">New password</translation>
 <translation id="385051799172605136">Back</translation>
+<translation id="3856304145690230735">Base gyroscope</translation>
 <translation id="385832974417157471">Before shutting down, Powerwash your device. If your device has a lid, wait until Powerwash completes before closing the lid. Powerwash may take up to a minute to complete.</translation>
 <translation id="3858860766373142691">Name</translation>
 <translation id="3865414814144988605">Resolution</translation>
@@ -371,6 +374,7 @@
 <translation id="4472575034687746823">Get started</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4483049906298469269">Failed to ping the non-default network gateway</translation>
+<translation id="4500213108254186382">Lid accelerometer</translation>
 <translation id="4503223151711056411">Left arrow</translation>
 <translation id="4511264077854731334">Portal</translation>
 <translation id="4521826082652183069">Subject alternative name match</translation>
@@ -382,6 +386,7 @@
 <translation id="4561801978359312462">SIM unlocked</translation>
 <translation id="4562494484721939086">No service</translation>
 <translation id="4568938274596692027">Installation is complete. Preparing to restart…</translation>
+<translation id="4576943788798178439">Stylus support</translation>
 <translation id="458794348635939462">Failed to resolve all hosts</translation>
 <translation id="4593212453765072419">Proxy authentication required</translation>
 <translation id="4609350030397390689">Keyboard brightness down</translation>
@@ -537,6 +542,7 @@
 <translation id="5866840822086176774">Very strong</translation>
 <translation id="588258955323874662">Full screen</translation>
 <translation id="5895138241574237353">Restart</translation>
+<translation id="5898758006340607522">Power button</translation>
 <translation id="5901630391730855834">Yellow</translation>
 <translation id="5903200662178656908">Device is a keyboard and mouse combo.</translation>
 <translation id="5916084858004523819">Prohibited</translation>
@@ -859,6 +865,7 @@
 <translation id="8919792139048574232">See what's been fixed</translation>
 <translation id="8919837981463578619">Failed – Tray missing</translation>
 <translation id="8923267550422472772">Day of month for reset</translation>
+<translation id="8925613211674558308">Vpd cached</translation>
 <translation id="8928727111548978589">Failed – Out of paper</translation>
 <translation id="8930521118335213258">Peer</translation>
 <translation id="8930622219860340959">Wireless</translation>
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb
index 3598ea9..6d2fc953 100644
--- a/chromeos/strings/chromeos_strings_es.xtb
+++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">Gestionado por <ph name="FIRST_MANAGER" /> y <ph name="SECOND_MANAGER" /></translation>
 <translation id="1726100011689679555">Servidores de nombres</translation>
 <translation id="1731082422893354635">Panel táctil Bluetooth</translation>
+<translation id="1745577949879301685">No se han podido cargar las imágenes. Revisa tu conexión de red o prueba a cargar las imágenes de nuevo.</translation>
 <translation id="1751249301761991853">Personalizar</translation>
 <translation id="1753496554272155572">Salir de la vista previa de fondo de pantalla</translation>
 <translation id="175763766237925754">Buena (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb
index deea76a..7b470e9 100644
--- a/chromeos/strings/chromeos_strings_et.xtb
+++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">Seadet haldab <ph name="FIRST_MANAGER" /> ja <ph name="SECOND_MANAGER" /></translation>
 <translation id="1726100011689679555">Nimeserverid</translation>
 <translation id="1731082422893354635">Bluetooth-puuteplaat</translation>
+<translation id="1745577949879301685">Pilte ei õnnestunud laadida. Kontrollige võrguühendust või proovige pilte uuesti laadida.</translation>
 <translation id="1751249301761991853">Isiklik</translation>
 <translation id="1753496554272155572">Taustapildi eelvaatest väljumine</translation>
 <translation id="175763766237925754">Hea (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb
index 9df1c2b..3e9f382 100644
--- a/chromeos/strings/chromeos_strings_eu.xtb
+++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">Kudeatzaileak: <ph name="FIRST_MANAGER" /> eta <ph name="SECOND_MANAGER" /></translation>
 <translation id="1726100011689679555">Izen-zerbitzariak</translation>
 <translation id="1731082422893354635">Bluetooth bidezko ukipen-panela</translation>
+<translation id="1745577949879301685">Ezin izan dira kargatu irudiak. Egiaztatu sarera konektatuta zaudela edo saiatu irudiak berriro kargatzen.</translation>
 <translation id="1751249301761991853">Pertsonalak</translation>
 <translation id="1753496554272155572">Irten horma-paperaren aurrebistatik</translation>
 <translation id="175763766237925754">Ona (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb
index 73a2ea0..8c762b3 100644
--- a/chromeos/strings/chromeos_strings_fil.xtb
+++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -430,6 +430,7 @@
 <translation id="4915052247106771211">Ire-reset nito ang device sa mga factory setting</translation>
 <translation id="4917385247580444890">Malakas</translation>
 <translation id="4917889632206600977">Huminto - Wala nang papel</translation>
+<translation id="491791267030419270">Mga tip sa pagsusulat ng feedback</translation>
 <translation id="4921665434385737356">Na-charge nang <ph name="RATE" /> sa loob ng <ph name="NUM_SECONDS" /> (na) segundo.</translation>
 <translation id="4930320165497208503">Para mag-set up o mag-update ng koneksyon, pumunta sa <ph name="BEGIN_LINK" />Mga Setting<ph name="END_LINK" />.</translation>
 <translation id="4932733599132424254">Petsa</translation>
diff --git a/chromeos/strings/chromeos_strings_hi.xtb b/chromeos/strings/chromeos_strings_hi.xtb
index 9b2850cf..1ab85f8 100644
--- a/chromeos/strings/chromeos_strings_hi.xtb
+++ b/chromeos/strings/chromeos_strings_hi.xtb
@@ -430,6 +430,7 @@
 <translation id="4915052247106771211">इससे, डिवाइस को फ़ैक्ट्री सेटिंग पर रीसेट कर दिया जाएगा (पावरवॉश).</translation>
 <translation id="4917385247580444890">मज़बूत</translation>
 <translation id="4917889632206600977">बंद हो गया - काग़ज़ खत्म हो गया</translation>
+<translation id="491791267030419270">सुझाव, शिकायत या राय लिखने के बारे में सलाह</translation>
 <translation id="4921665434385737356"><ph name="NUM_SECONDS" /> सेकंड में <ph name="RATE" /> चार्ज हुई.</translation>
 <translation id="4930320165497208503">किसी कनेक्शन को सेट अप या अपडेट करने के लिए, <ph name="BEGIN_LINK" />सेटिंग पर जाएं<ph name="END_LINK" />.</translation>
 <translation id="4932733599132424254">तारीख</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb
index f88b7f82..cbbdb0f 100644
--- a/chromeos/strings/chromeos_strings_hr.xtb
+++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -430,6 +430,7 @@
 <translation id="4915052247106771211">Time će se uređaj vratiti na tvorničke postavke (Powerwash).</translation>
 <translation id="4917385247580444890">Jak</translation>
 <translation id="4917889632206600977">Zaustavljeno – nema papira</translation>
+<translation id="491791267030419270">Savjeti za pisanje povratnih informacija</translation>
 <translation id="4921665434385737356">Napunjeno <ph name="RATE" /> za <ph name="NUM_SECONDS" /> s.</translation>
 <translation id="4930320165497208503">Da biste postavili ili ažurirali vezu, otvorite <ph name="BEGIN_LINK" />postavke<ph name="END_LINK" />.</translation>
 <translation id="4932733599132424254">Datum</translation>
diff --git a/chromeos/strings/chromeos_strings_hu.xtb b/chromeos/strings/chromeos_strings_hu.xtb
index c932529..f844963 100644
--- a/chromeos/strings/chromeos_strings_hu.xtb
+++ b/chromeos/strings/chromeos_strings_hu.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">A következők kezelik: <ph name="FIRST_MANAGER" /> és <ph name="SECOND_MANAGER" /></translation>
 <translation id="1726100011689679555">Névszerverek</translation>
 <translation id="1731082422893354635">Bluetooth-érintőpad</translation>
+<translation id="1745577949879301685">Nem sikerült a képek betöltése. Ellenőrizze a hálózati kapcsolatot, vagy próbálja meg újra betölteni a képeket.</translation>
 <translation id="1751249301761991853">Személyes</translation>
 <translation id="1753496554272155572">Kilépés a háttérkép előnézetéből</translation>
 <translation id="175763766237925754">Jó (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb
index 4296a9d..da28d3e 100644
--- a/chromeos/strings/chromeos_strings_id.xtb
+++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">Dikelola oleh <ph name="FIRST_MANAGER" /> dan <ph name="SECOND_MANAGER" /></translation>
 <translation id="1726100011689679555">Nama server</translation>
 <translation id="1731082422893354635">Touchpad Bluetooth</translation>
+<translation id="1745577949879301685">Tidak dapat memuat foto. Periksa koneksi jaringan Anda atau coba muat foto lagi.</translation>
 <translation id="1751249301761991853">Pribadi</translation>
 <translation id="1753496554272155572">Keluar dari pratinjau wallpaper</translation>
 <translation id="175763766237925754">Baik (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_is.xtb b/chromeos/strings/chromeos_strings_is.xtb
index ba45002..137168e 100644
--- a/chromeos/strings/chromeos_strings_is.xtb
+++ b/chromeos/strings/chromeos_strings_is.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">Í umsjón <ph name="FIRST_MANAGER" /> og <ph name="SECOND_MANAGER" /></translation>
 <translation id="1726100011689679555">Nafnaþjónar</translation>
 <translation id="1731082422893354635">Bluetooth-snertiflötur</translation>
+<translation id="1745577949879301685">Ekki tókst að hlaða myndum. Athugaðu nettenginguna og reyndu að hlaða myndunum aftur.</translation>
 <translation id="1751249301761991853">Persónulegt</translation>
 <translation id="1753496554272155572">Loka forskoðun veggfóðurs</translation>
 <translation id="175763766237925754">Góður (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb
index 45d13e9..3867530 100644
--- a/chromeos/strings/chromeos_strings_it.xtb
+++ b/chromeos/strings/chromeos_strings_it.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">Dispositivo gestito da <ph name="FIRST_MANAGER" /> e <ph name="SECOND_MANAGER" /></translation>
 <translation id="1726100011689679555">Server dei nomi</translation>
 <translation id="1731082422893354635">Touchpad Bluetooth</translation>
+<translation id="1745577949879301685">Impossibile caricare le immagini. Controlla la connessione di rete o riprova a caricare le immagini.</translation>
 <translation id="1751249301761991853">Personali</translation>
 <translation id="1753496554272155572">Esci dall'anteprima dello sfondo</translation>
 <translation id="175763766237925754">Buono (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb
index 4ae59065..43449ab 100644
--- a/chromeos/strings/chromeos_strings_kk.xtb
+++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422"><ph name="FIRST_MANAGER" /> және <ph name="SECOND_MANAGER" /> арқылы басқарылады.</translation>
 <translation id="1726100011689679555">Ат серверлері</translation>
 <translation id="1731082422893354635">Bluetooth сенсорлық тақтасы</translation>
+<translation id="1745577949879301685">Суреттерді жүктеу мүмкін болмады. Желі байланысын тексеріңіз немесе суреттерді қайта жүктеп көріңіз.</translation>
 <translation id="1751249301761991853">Жеке</translation>
 <translation id="1753496554272155572">Тұсқағазды алдын ала қарау режимінен шығу</translation>
 <translation id="175763766237925754">Жақсы (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_km.xtb b/chromeos/strings/chromeos_strings_km.xtb
index 598d776..a4bd11b 100644
--- a/chromeos/strings/chromeos_strings_km.xtb
+++ b/chromeos/strings/chromeos_strings_km.xtb
@@ -430,6 +430,7 @@
 <translation id="4915052247106771211">វា​នឹង​កំណត់​ឧបករណ៍​ឡើងវិញ​ទៅ​ការកំណត់​ដូចចេញពី​រោងចក្រ (Powerwash)។</translation>
 <translation id="4917385247580444890">ខ្លាំង</translation>
 <translation id="4917889632206600977">បានឈប់ - អស់​ក្រដាស</translation>
+<translation id="491791267030419270">គន្លឹះ​ក្នុងការសរសេរ​មតិកែលម្អ</translation>
 <translation id="4921665434385737356">បានសាកថ្ម <ph name="RATE" /> ក្នុងរយៈពេល <ph name="NUM_SECONDS" /> វិនាទី។</translation>
 <translation id="4930320165497208503">ដើម្បីរៀបចំ ឬធ្វើបច្ចុប្បន្នភាពការតភ្ជាប់ សូមចូលទៅកាន់<ph name="BEGIN_LINK" />ការកំណត់<ph name="END_LINK" />។</translation>
 <translation id="4932733599132424254">កាលបរិច្ឆេទ</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb
index 4da6a665..62fe578 100644
--- a/chromeos/strings/chromeos_strings_kn.xtb
+++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -430,6 +430,7 @@
 <translation id="4915052247106771211">ಇದು ಸಾಧನವನ್ನು ಫ್ಯಾಕ್ಟರಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ (ಪವರ್‌ವಾಶ್) ರೀಸೆಟ್ ಮಾಡುತ್ತದೆ.</translation>
 <translation id="4917385247580444890">ಪ್ರಬಲ</translation>
 <translation id="4917889632206600977">ನಿಲ್ಲಿಸಲಾಗಿದೆ - ಪೇಪರ್ ಖಾಲಿಯಾಗಿದೆ</translation>
+<translation id="491791267030419270">ಪ್ರತಿಕ್ರಿಯೆ ಬರೆಯುವ ಕುರಿತು ಸಲಹೆಗಳು</translation>
 <translation id="4921665434385737356"><ph name="NUM_SECONDS" /> ಸೆಕೆಂಡ್‌ಗಳಲ್ಲಿ <ph name="RATE" /> ಶುಲ್ಕವನ್ನು ವಿಧಿಸಲಾಗಿದೆ.</translation>
 <translation id="4930320165497208503">ಕನೆಕ್ಷನ್ ಸೆಟಪ್ ಮಾಡಲು ಅಥವಾ ಅಪ್‌ಡೇಟ್ ಮಾಡಲು, <ph name="BEGIN_LINK" />ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ<ph name="END_LINK" /> ಹೋಗಿ.</translation>
 <translation id="4932733599132424254">ದಿನಾಂಕ</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb
index 2857143..70fe725d 100644
--- a/chromeos/strings/chromeos_strings_ko.xtb
+++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">관리자: <ph name="FIRST_MANAGER" /> 및 <ph name="SECOND_MANAGER" /></translation>
 <translation id="1726100011689679555">네임서버</translation>
 <translation id="1731082422893354635">블루투스 터치패드</translation>
+<translation id="1745577949879301685">이미지를 로드할 수 없습니다. 네트워크 연결을 확인하거나 이미지를 다시 로드해 보세요.</translation>
 <translation id="1751249301761991853">개인</translation>
 <translation id="1753496554272155572">배경화면 미리보기 종료</translation>
 <translation id="175763766237925754">양호(<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_ky.xtb b/chromeos/strings/chromeos_strings_ky.xtb
index c4da5a2..01d2af3 100644
--- a/chromeos/strings/chromeos_strings_ky.xtb
+++ b/chromeos/strings/chromeos_strings_ky.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422"><ph name="FIRST_MANAGER" /> менен <ph name="SECOND_MANAGER" /> башкарат</translation>
 <translation id="1726100011689679555">Ысым серверлери</translation>
 <translation id="1731082422893354635">Bluetooth сенсордук тактасы</translation>
+<translation id="1745577949879301685">Сүрөттөр жүктөлбөй калды. Тармакка туташууну текшериңиз же сүрөттөрдү кайра жүктөп көрүңүз.</translation>
 <translation id="1751249301761991853">Жеке</translation>
 <translation id="1753496554272155572">Тушкагазды алдын ала көрүү режиминен чыгуу</translation>
 <translation id="175763766237925754">Жакшы (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb
index 7edde7b..d97a754 100644
--- a/chromeos/strings/chromeos_strings_lt.xtb
+++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">Tvarko <ph name="FIRST_MANAGER" /> ir <ph name="SECOND_MANAGER" /></translation>
 <translation id="1726100011689679555">Pavadinimų serveriai</translation>
 <translation id="1731082422893354635">„Bluetooth“ jutiklinė dalis</translation>
+<translation id="1745577949879301685">Nepavyko įkelti vaizdų. Patikrinkite tinklo ryšį arba pabandykite dar kartą įkelti vaizdus.</translation>
 <translation id="1751249301761991853">Suasmeninimas</translation>
 <translation id="1753496554272155572">Išeiti iš ekrano fono peržiūros</translation>
 <translation id="175763766237925754">Geras (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_mk.xtb b/chromeos/strings/chromeos_strings_mk.xtb
index c0a4d644..266df94f 100644
--- a/chromeos/strings/chromeos_strings_mk.xtb
+++ b/chromeos/strings/chromeos_strings_mk.xtb
@@ -430,6 +430,7 @@
 <translation id="4915052247106771211">Ова ќе го ресетира уредот на фабрички поставки (Фабричко ресетирање).</translation>
 <translation id="4917385247580444890">Силен</translation>
 <translation id="4917889632206600977">Запрено - нема хартија</translation>
+<translation id="491791267030419270">Совети за пишување повратни информации</translation>
 <translation id="4921665434385737356">Наполнета <ph name="RATE" /> за <ph name="NUM_SECONDS" /> секунди.</translation>
 <translation id="4930320165497208503">За да поставите или ажурирате врска, одете во <ph name="BEGIN_LINK" />Поставки<ph name="END_LINK" />.</translation>
 <translation id="4932733599132424254">Датум</translation>
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb
index dc4227a..a746063 100644
--- a/chromeos/strings/chromeos_strings_mn.xtb
+++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -18,6 +18,7 @@
 <translation id="1175697296044146566">Энэ <ph name="DEVICE_TYPE" />-г <ph name="MANAGER" /> удирддаг.</translation>
 <translation id="1175951029573070619">Дундаж (<ph name="SIGNAL_STRENGTH" />)</translation>
 <translation id="1181037720776840403">Хасах</translation>
+<translation id="1190378975642195988">Суурийн хурдатгал хэмжигч</translation>
 <translation id="1195447618553298278">Үл танигдах алдаа гаргасан байна</translation>
 <translation id="1196959502276349371">Хувилбар <ph name="VERSION" /></translation>
 <translation id="1199355487114804640">Тоглуулах/Түр зогсоох</translation>
@@ -268,6 +269,7 @@
 <translation id="3484914941826596830">Жижиг программыг шинэчилж байх үед энэ гадны төхөөрөмжийг бүү салгаарай. Мөн компьютероо бүү унтраагаарай. Та энэ цонхыг багасгах боломжтой. Энэ шинэчлэлтэд хэдэн минут зарцуулж магадгүй бөгөөд энэ хугацаанд таны гадны төхөөрөмж ажиллахгүй байж магадгүй.</translation>
 <translation id="3486220673238053218">тодорхойлолт</translation>
 <translation id="3488065109653206955">Хагас идэвхжсэн</translation>
+<translation id="3492982278147736083">Тагийн гироскоп</translation>
 <translation id="3517001332549868749">ChromeOS-н шинэчлэлт</translation>
 <translation id="3527036260304016759">Амжилтгүй болсон - Үл мэдэгдэх алдаа</translation>
 <translation id="3532980081107202182"><ph name="MIN_REMAINING" /> орчим минут үлдсэн байна</translation>
@@ -301,6 +303,7 @@
 <translation id="3820172043799983114">ПИН буруу байна.</translation>
 <translation id="3838338534323494292">Шинэ нууц үг</translation>
 <translation id="385051799172605136">Буцах</translation>
+<translation id="3856304145690230735">Суурийн гироскоп</translation>
 <translation id="385832974417157471">Унтраахаасаа өмнө төхөөрөмжөө powerwash хийнэ үү. Хэрэв таны төхөөрөмж тагтай бол тагийг нь хаахаас өмнө powerwash хийж дуустал хүлээнэ үү. Powerwash хийж дуусахад хэдэн минут зарцуулж магадгүй.</translation>
 <translation id="3858860766373142691">Нэр</translation>
 <translation id="3865414814144988605">Нягтрал</translation>
@@ -371,6 +374,7 @@
 <translation id="4472575034687746823">Эхлүүлэх</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4483049906298469269">Сүлжээний өгөгдмөл бус гэйтвэйд пин илгээж чадсангүй</translation>
+<translation id="4500213108254186382">Тагийн хурдатгал хэмжигч</translation>
 <translation id="4503223151711056411">Зүүн сум</translation>
 <translation id="4511264077854731334">Портал</translation>
 <translation id="4521826082652183069">Субъектийн хоёрдогч нэрийн тохирол</translation>
@@ -382,6 +386,7 @@
 <translation id="4561801978359312462">SIM-н түгжээг тайлсан</translation>
 <translation id="4562494484721939086">Үйлчилгээ байхгүй</translation>
 <translation id="4568938274596692027">Суулгаж дууслаа. Дахин эхлүүлэхээр бэлтгэж байна...</translation>
+<translation id="4576943788798178439">Мэдрэгч үзгийн тусламж</translation>
 <translation id="458794348635939462">Бүх хостыг шийдвэрлэж чадсангүй</translation>
 <translation id="4593212453765072419">Проксиг баталгаажуулах шаардлагатай</translation>
 <translation id="4609350030397390689">Гарны гэрэлтүүлгийг багасгах</translation>
@@ -537,6 +542,7 @@
 <translation id="5866840822086176774">Маш хүчтэй</translation>
 <translation id="588258955323874662">Дэлгэц дүүрэн</translation>
 <translation id="5895138241574237353">Дахин асаах</translation>
+<translation id="5898758006340607522">Асаах/Унтраах товч</translation>
 <translation id="5901630391730855834">Шар</translation>
 <translation id="5903200662178656908">Төхөөрөмж нь гар болон хулганын хослол юм.</translation>
 <translation id="5916084858004523819">Хориглосон</translation>
@@ -859,6 +865,7 @@
 <translation id="8919792139048574232">Юуг зассаныг хараарай</translation>
 <translation id="8919837981463578619">Амжилтгүй болсон - Тавиур алга байна</translation>
 <translation id="8923267550422472772">Шинэчлэх сарын өдөр</translation>
+<translation id="8925613211674558308">Vpd-г завсрын санах ойд хадгалсан</translation>
 <translation id="8928727111548978589">Амжилтгүй болсон - Цаас дууссан</translation>
 <translation id="8930521118335213258">Төстэй апп</translation>
 <translation id="8930622219860340959">Утасгүй</translation>
diff --git a/chromeos/strings/chromeos_strings_mr.xtb b/chromeos/strings/chromeos_strings_mr.xtb
index e45fd44..1a86d2c 100644
--- a/chromeos/strings/chromeos_strings_mr.xtb
+++ b/chromeos/strings/chromeos_strings_mr.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422"><ph name="FIRST_MANAGER" /> आणि <ph name="SECOND_MANAGER" /> द्वारे व्यवस्थापित</translation>
 <translation id="1726100011689679555">नाव सर्व्हर</translation>
 <translation id="1731082422893354635">ब्लूटूथ टचपॅड</translation>
+<translation id="1745577949879301685">इमेज लोड करता आल्या नाहीत. तुमचे नेटवर्क कनेक्शन तपासा किंवा इमेज पुन्हा लोड करून पहा.</translation>
 <translation id="1751249301761991853">वैयक्तिक</translation>
 <translation id="1753496554272155572">वॉलपेपर पूर्वावलोकनामधून बाहेर पडा</translation>
 <translation id="175763766237925754">चांगला (<ph name="SIGNAL_STRENGTH" />)</translation>
@@ -429,6 +430,7 @@
 <translation id="4915052247106771211">यामुळे डिव्हाइस फॅक्टरी सेटिंग्जवर रीसेट केले जाईल (Powerwash).</translation>
 <translation id="4917385247580444890">मजबूत</translation>
 <translation id="4917889632206600977">थांबले - कागद संपला आहे</translation>
+<translation id="491791267030419270">फीडबॅक लिहिण्यासाठी टिपा</translation>
 <translation id="4921665434385737356"><ph name="NUM_SECONDS" /> सेकंदांत <ph name="RATE" /> शुल्क आकारले.</translation>
 <translation id="4930320165497208503">कनेक्शन सेट किंवा अपडेट करण्यासाठी, <ph name="BEGIN_LINK" />सेटिंग्ज<ph name="END_LINK" /> वर जा.</translation>
 <translation id="4932733599132424254">तारीख</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb
index 5ae36fe..2063acb 100644
--- a/chromeos/strings/chromeos_strings_pt-BR.xtb
+++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -430,6 +430,7 @@
 <translation id="4915052247106771211">Esta ação redefine o dispositivo para as configurações originais (Powerwash).</translation>
 <translation id="4917385247580444890">Forte</translation>
 <translation id="4917889632206600977">Parado (sem papel)</translation>
+<translation id="491791267030419270">Dicas para escrever um feedback</translation>
 <translation id="4921665434385737356"><ph name="RATE" /> carregados em <ph name="NUM_SECONDS" /> segundos.</translation>
 <translation id="4930320165497208503">Para definir ou atualizar uma conexão, acesse as <ph name="BEGIN_LINK" />Configurações<ph name="END_LINK" />.</translation>
 <translation id="4932733599132424254">Data</translation>
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb
index 9e38b86..167ec42 100644
--- a/chromeos/strings/chromeos_strings_ro.xtb
+++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -430,6 +430,7 @@
 <translation id="4915052247106771211">Astfel, dispozitivul va reveni la setările din fabrică (Powerwash).</translation>
 <translation id="4917385247580444890">Puternic</translation>
 <translation id="4917889632206600977">Oprită – Hârtie epuizată</translation>
+<translation id="491791267030419270">Sfaturi pentru a scrie feedback</translation>
 <translation id="4921665434385737356">S-a încărcat cu <ph name="RATE" /> în <ph name="NUM_SECONDS" /> secunde.</translation>
 <translation id="4930320165497208503">Pentru a configura sau a actualiza o conexiune, accesează <ph name="BEGIN_LINK" />Setările<ph name="END_LINK" />.</translation>
 <translation id="4932733599132424254">Data</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb
index c7c3682..074aeb4 100644
--- a/chromeos/strings/chromeos_strings_ru.xtb
+++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">Под управлением <ph name="FIRST_MANAGER" /> и <ph name="SECOND_MANAGER" /></translation>
 <translation id="1726100011689679555">Серверы имен</translation>
 <translation id="1731082422893354635">Сенсорная панель Bluetooth</translation>
+<translation id="1745577949879301685">Не удалось загрузить изображения. Проверьте подключение к сети и повторите попытку.</translation>
 <translation id="1751249301761991853">Персональные настройки</translation>
 <translation id="1753496554272155572">Выйти из предпросмотра обоев</translation>
 <translation id="175763766237925754">Хороший (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb
index 4931e33..fbedc86 100644
--- a/chromeos/strings/chromeos_strings_sk.xtb
+++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -18,6 +18,7 @@
 <translation id="1175697296044146566">Toto zariadenie <ph name="DEVICE_TYPE" /> spravuje <ph name="MANAGER" />.</translation>
 <translation id="1175951029573070619">Priemerné (<ph name="SIGNAL_STRENGTH" />)</translation>
 <translation id="1181037720776840403">Odstrániť</translation>
+<translation id="1190378975642195988">Akcelerometer v základni</translation>
 <translation id="1195447618553298278">Neznáma chyba.</translation>
 <translation id="1196959502276349371">Verzia <ph name="VERSION" /></translation>
 <translation id="1199355487114804640">Prehratie alebo pozastavenie</translation>
@@ -267,6 +268,7 @@
 <translation id="3484914941826596830">Počas aktualizovania firmvéru neodpájajte toto zariadenie ani nevypínajte počítač. Toto okno môžete minimalizovať. Táto aktualizácia môže trvať niekoľko minút a vaše externé zariadenie nemusí počas nej fungovať.</translation>
 <translation id="3486220673238053218">definícia</translation>
 <translation id="3488065109653206955">Čiastočne aktivované</translation>
+<translation id="3492982278147736083">Gyroskop v kryte</translation>
 <translation id="3517001332549868749">Aktualiz. ChromeOS</translation>
 <translation id="3527036260304016759">Nepodarilo sa – neznáma chyba</translation>
 <translation id="3532980081107202182">Zostávajúci čas je približne <ph name="MIN_REMAINING" /> min.</translation>
@@ -300,6 +302,7 @@
 <translation id="3820172043799983114">Neplatný kód PIN.</translation>
 <translation id="3838338534323494292">Nové heslo</translation>
 <translation id="385051799172605136">Späť</translation>
+<translation id="3856304145690230735">Gyroskop v základni</translation>
 <translation id="385832974417157471">Pred vypnutím vykonajte obnovu zariadenia prostredníctvom funkcie Powerwash. Ak má zariadenie kryt, zatvorte ho až po dokončení obnovy prostredníctvom funkcie Powerwash. Jej dokončenie môže trvať až minútu.</translation>
 <translation id="3858860766373142691">Názov</translation>
 <translation id="3865414814144988605">Rozlíšenie</translation>
@@ -370,6 +373,7 @@
 <translation id="4472575034687746823">Začíname</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4483049906298469269">Nepredvolenú bránu siete sa nepodarilo otestovať</translation>
+<translation id="4500213108254186382">Akcelerometer v kryte</translation>
 <translation id="4503223151711056411">Šípka doľava</translation>
 <translation id="4511264077854731334">Portál</translation>
 <translation id="4521826082652183069">Zhoda alternatívneho názvu subjektu</translation>
@@ -381,6 +385,7 @@
 <translation id="4561801978359312462">SIM karta je odomknutá</translation>
 <translation id="4562494484721939086">Žiadny signál</translation>
 <translation id="4568938274596692027">Inštalácia je hotová. Pripravuje sa reštart...</translation>
+<translation id="4576943788798178439">Podpora dotykového pera</translation>
 <translation id="458794348635939462">Nepodarilo sa vybrať všetkých hostiteľov</translation>
 <translation id="4593212453765072419">Vyžaduje sa overenie servera proxy</translation>
 <translation id="4609350030397390689">Zníženie jasu klávesnice</translation>
@@ -429,6 +434,7 @@
 <translation id="4915052247106771211">Týmto sa obnovia výrobné nastavenia zariadenia (Powerwash).</translation>
 <translation id="4917385247580444890">Silné</translation>
 <translation id="4917889632206600977">Zastavené – minul sa papier</translation>
+<translation id="491791267030419270">Tipy, ako napísať spätnú väzbu</translation>
 <translation id="4921665434385737356">Nabité na <ph name="RATE" /> za <ph name="NUM_SECONDS" /> s.</translation>
 <translation id="4930320165497208503">Ak chcete nastaviť alebo aktualizovať pripojenie, prejdite do <ph name="BEGIN_LINK" />Nastavení<ph name="END_LINK" />.</translation>
 <translation id="4932733599132424254">Dátum</translation>
@@ -535,6 +541,7 @@
 <translation id="5866840822086176774">Veľmi silné</translation>
 <translation id="588258955323874662">Celá obrazovka</translation>
 <translation id="5895138241574237353">Reštartovať</translation>
+<translation id="5898758006340607522">Vypínač</translation>
 <translation id="5901630391730855834">Žltá</translation>
 <translation id="5903200662178656908">Zariadenie je kombináciou klávesnice a myši.</translation>
 <translation id="5916084858004523819">Zakázané</translation>
@@ -857,6 +864,7 @@
 <translation id="8919792139048574232">Pozrite si opravy</translation>
 <translation id="8919837981463578619">Nepodarilo sa – chýba zásobník</translation>
 <translation id="8923267550422472772">Deň mesiaca pre reset</translation>
+<translation id="8925613211674558308">Vpd vo vyrovnávacej pamäti</translation>
 <translation id="8928727111548978589">Nepodarilo sa – minul sa papier</translation>
 <translation id="8930521118335213258">Podobná aplikácia</translation>
 <translation id="8930622219860340959">Bezdrôtové pripojenie</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb
index 048892f..7d99b22 100644
--- a/chromeos/strings/chromeos_strings_sl.xtb
+++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">Napravo upravljata <ph name="FIRST_MANAGER" /> in <ph name="SECOND_MANAGER" />.</translation>
 <translation id="1726100011689679555">Imenski strežniki</translation>
 <translation id="1731082422893354635">Sledilna ploščica Bluetooth</translation>
+<translation id="1745577949879301685">Slik ni bilo mogoče naložiti. Preverite omrežno povezavo ali znova poskusite naložiti slike.</translation>
 <translation id="1751249301761991853">Osebno</translation>
 <translation id="1753496554272155572">Zapiranje predogleda zaslonskega ozadja</translation>
 <translation id="175763766237925754">Dobra (<ph name="SIGNAL_STRENGTH" />)</translation>
@@ -821,7 +822,7 @@
 <translation id="8660881923941176839">funti</translation>
 <translation id="8662671328352114214">Pridružitev omrežju <ph name="TYPE" /></translation>
 <translation id="8671972493856476349">Posodobi na različico <ph name="VERSION_NUMBER" /> in zaženi znova</translation>
-<translation id="8675354002693747642">Ključ v predhodni skupni rabi</translation>
+<translation id="8675354002693747642">Vnaprej deljeni ključ</translation>
 <translation id="8677859815076891398">Ni albumov. Ustvarite album v <ph name="LINK_BEGIN" />Googlu Foto<ph name="LINK_END" />.</translation>
 <translation id="8680431479333800907">Naprava se prenaša k istemu uporabniku.</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Upravljajte to funkcijo s tipkama puščica levo ali desno.</translation>
diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb
index ac78d69..cf09c89d 100644
--- a/chromeos/strings/chromeos_strings_sr-Latn.xtb
+++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">Upravljaju <ph name="FIRST_MANAGER" /> i <ph name="SECOND_MANAGER" /></translation>
 <translation id="1726100011689679555">Serveri imena</translation>
 <translation id="1731082422893354635">Bluetooth tačped</translation>
+<translation id="1745577949879301685">Učitavanje slika nije uspelo. Proverite mrežnu vezu ili probajte da ponovo učitate sliku.</translation>
 <translation id="1751249301761991853">Lično</translation>
 <translation id="1753496554272155572">Izađite iz pregleda pozadine</translation>
 <translation id="175763766237925754">Dobar (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb
index 47a0556..f551e65 100644
--- a/chromeos/strings/chromeos_strings_sr.xtb
+++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">Управљају <ph name="FIRST_MANAGER" /> и <ph name="SECOND_MANAGER" /></translation>
 <translation id="1726100011689679555">Сервери имена</translation>
 <translation id="1731082422893354635">Bluetooth тачпед</translation>
+<translation id="1745577949879301685">Учитавање слика није успело. Проверите мрежну везу или пробајте да поново учитате слику.</translation>
 <translation id="1751249301761991853">Лично</translation>
 <translation id="1753496554272155572">Изађите из прегледа позадине</translation>
 <translation id="175763766237925754">Добар (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb
index c75c5b90..aa6b592 100644
--- a/chromeos/strings/chromeos_strings_sv.xtb
+++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -649,7 +649,7 @@
 <translation id="6905724422583748843">Tillbaka till <ph name="PAGE_NAME" /></translation>
 <translation id="6910312834584889076">Skannerns lucka är öppen. Stäng luckan och försök igen.</translation>
 <translation id="6911383237894364323">Det gick inte att ansluta till medieservrarna</translation>
-<translation id="6943893908656559156">Ta bort identitet (valfritt)</translation>
+<translation id="6943893908656559156">Fjärridentitet (valfritt)</translation>
 <translation id="6957231940976260713">Namn på tjänsten</translation>
 <translation id="6961170852793647506">Sätt dokumentet i skannern för att komma igång</translation>
 <translation id="6965382102122355670">OK</translation>
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb
index 8bd0c3e..97863597 100644
--- a/chromeos/strings/chromeos_strings_te.xtb
+++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422"><ph name="FIRST_MANAGER" />, అలాగే <ph name="SECOND_MANAGER" /> ద్వారా మేనేజ్ చేయబడుతుంది</translation>
 <translation id="1726100011689679555">పేరు సర్వర్‌లు</translation>
 <translation id="1731082422893354635">బ్లూటూత్ టచ్‌ప్యాడ్</translation>
+<translation id="1745577949879301685">ఇమేజ్‌లను లోడ్ చేయడం సాధ్యపడలేదు. మీ నెట్‌వర్క్ కనెక్షన్‌ను చెక్ చేయండి లేదా ఇమేజ్‌లను మళ్లీ లోడ్ చేయడానికి ట్రై చేయండి.</translation>
 <translation id="1751249301761991853">వ్యక్తిగతం</translation>
 <translation id="1753496554272155572">వాల్‌పేపర్ ప్రివ్యూ నుండి నిష్క్రమించండి</translation>
 <translation id="175763766237925754">బాగుంది (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb
index d8711d4..355d6c4 100644
--- a/chromeos/strings/chromeos_strings_th.xtb
+++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -430,6 +430,7 @@
 <translation id="4915052247106771211">ตัวเลือกนี้จะรีเซ็ตอุปกรณ์เป็นการตั้งค่าเริ่มต้น (Powerwash)</translation>
 <translation id="4917385247580444890">แรง</translation>
 <translation id="4917889632206600977">หยุดพิมพ์ - กระดาษหมด</translation>
+<translation id="491791267030419270">เคล็ดลับในการเขียนความคิดเห็น</translation>
 <translation id="4921665434385737356">ชาร์จ <ph name="RATE" /> ใน <ph name="NUM_SECONDS" /> วินาที</translation>
 <translation id="4930320165497208503">ไปที่<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" />เพื่อตั้งค่าหรืออัปเดตการเชื่อมต่อ</translation>
 <translation id="4932733599132424254">วันที่</translation>
diff --git a/chromeos/strings/chromeos_strings_ur.xtb b/chromeos/strings/chromeos_strings_ur.xtb
index 50997942..e80fb2f 100644
--- a/chromeos/strings/chromeos_strings_ur.xtb
+++ b/chromeos/strings/chromeos_strings_ur.xtb
@@ -430,6 +430,7 @@
 <translation id="4915052247106771211">‏اس سے آلہ فیکٹری کی ترتیبات (Powerwash) پر ری سیٹ ہو جائے گا۔</translation>
 <translation id="4917385247580444890">مضبوط</translation>
 <translation id="4917889632206600977">رک گیا - کاغذ ختم ہو گیا</translation>
+<translation id="491791267030419270">تاثرات لکھنے کے متعلق تجاویز</translation>
 <translation id="4921665434385737356"><ph name="NUM_SECONDS" /> سیکنڈ میں <ph name="RATE" /> چارج کیا گیا۔</translation>
 <translation id="4930320165497208503">کنکشن سیٹ اپ کرنے یا اپ ڈیٹ کرنے کیلئے، <ph name="BEGIN_LINK" />ترتیبات<ph name="END_LINK" /> پر جائیں۔</translation>
 <translation id="4932733599132424254">تاریخ</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb
index 7b23152..ef7b2a11 100644
--- a/chromeos/strings/chromeos_strings_zh-CN.xtb
+++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">由 <ph name="FIRST_MANAGER" /> 和 <ph name="SECOND_MANAGER" /> 管理</translation>
 <translation id="1726100011689679555">域名服务器</translation>
 <translation id="1731082422893354635">蓝牙触控板</translation>
+<translation id="1745577949879301685">无法加载这些图片。请检查您的网络连接状况,或尝试重新加载这些图片。</translation>
 <translation id="1751249301761991853">个人</translation>
 <translation id="1753496554272155572">退出壁纸预览</translation>
 <translation id="175763766237925754">良好 (<ph name="SIGNAL_STRENGTH" />)</translation>
diff --git a/chromeos/strings/chromeos_strings_zu.xtb b/chromeos/strings/chromeos_strings_zu.xtb
index 368f9fa..4bd8e2b 100644
--- a/chromeos/strings/chromeos_strings_zu.xtb
+++ b/chromeos/strings/chromeos_strings_zu.xtb
@@ -95,6 +95,7 @@
 <translation id="1717874160321062422">Iphethwe ngu-<ph name="FIRST_MANAGER" /> no-<ph name="SECOND_MANAGER" /></translation>
 <translation id="1726100011689679555">Amagama wamasevisi</translation>
 <translation id="1731082422893354635">Iphedi yokuthinta ye-Bluetooth</translation>
+<translation id="1745577949879301685">Ayikwazanga ukulayisha imifanekiso. Hlola uxhumo lwakho lwenethiwekhi noma uzame ukulayisha futhi imifanekiso.</translation>
 <translation id="1751249301761991853">Okomuntu siqu</translation>
 <translation id="1753496554272155572">Phuma ekubukeni kuqala kwesithombe sangemuva</translation>
 <translation id="175763766237925754">Kuhle (<ph name="SIGNAL_STRENGTH" />)</translation>
@@ -429,6 +430,7 @@
 <translation id="4915052247106771211">Lokhu kuzosetha kabusha idivayisi kumasethingi asekuqaleni (i-Powerwash).</translation>
 <translation id="4917385247580444890">kunamandla</translation>
 <translation id="4917889632206600977">Imile - Iphepha liphelile</translation>
+<translation id="491791267030419270">Amathiphu okubhala impendulo</translation>
 <translation id="4921665434385737356">Ikhokhiswe <ph name="RATE" /> ngamasekhondi angu-<ph name="NUM_SECONDS" />.</translation>
 <translation id="4930320165497208503">Ukuze usethe noma uvuselele uxhumano, iya <ph name="BEGIN_LINK" />Kumasethingi<ph name="END_LINK" />.</translation>
 <translation id="4932733599132424254">Idethi</translation>
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni
index 831bb5e5..837a631 100644
--- a/chromeos/tast_control.gni
+++ b/chromeos/tast_control.gni
@@ -259,8 +259,53 @@
   "health.DiagnosticsRun.dns_resolution",
   "health.DiagnosticsRun.dns_resolver_present",
 
+  # This is effectively the mirror of the crrev.com/c/3691078 in CrOS.
+  # Although the change is made, because CrOS SDK is not yet ready
+  # we're still blocked by the test failures. This is the short term
+  # mitigation. We can remove this when CrOS SDK 14903 gets ready
+  # and started to be used.
+  "crostini.LaunchTerminal.buster_stable",
+  "crostini.Notify.buster_stable",
+  "crostini.PackageInfo.buster_stable",
+  "crostini.NoSharedFolder.buster_stable",
+  "crostini.LaunchBrowser.buster_stable",
+  "crostini.SecureCopyPaste.copy_wayland_buster_stable",
+  "crostini.SecureCopyPaste.copy_x11_buster_stable",
+  "crostini.PackageInstallUninstall.buster_stable",
+  "crostini.Xattrs.buster_stable",
+  "crostini.SSHFSMount.buster_stable",
+  "crostini.SecureCopyPaste.paste_wayland_buster_stable",
+  "crostini.UninstallInvalidApp.buster_stable",
+  "crostini.SecureCopyPaste.paste_x11_buster_stable",
+  "crostini.SharedFontFiles.buster_stable",
+  "crostini.CrashReporter.buster_stable",
+  "crostini.HomeDirectoryCreateFile.buster_stable",
+  "crostini.Basic.buster_stable",
+  "crostini.GPUEnabled.gpu_buster_stable",
+  "crostini.GPUEnabled.gpu_bullseye_stable",
+  "crostini.CrashReporter.bullseye_stable",
+  "crostini.Basic.bullseye_stable",
+  "crostini.HomeDirectoryCreateFile.bullseye_stable",
+  "crostini.LaunchBrowser.bullseye_stable",
+  "crostini.SecureCopyPaste.copy_wayland_bullseye_stable",
+  "crostini.SharedFontFiles.bullseye_stable",
+  "crostini.SecureCopyPaste.paste_x11_bullseye_stable",
+  "crostini.PackageInfo.bullseye_stable",
+  "crostini.Notify.bullseye_stable",
+  "crostini.UninstallInvalidApp.bullseye_stable",
+  "crostini.LaunchTerminal.bullseye_stable",
+  "crostini.NoSharedFolder.bullseye_stable",
+  "crostini.Xattrs.bullseye_stable",
+  "crostini.PackageInstallUninstall.bullseye_stable",
+  "crostini.SecureCopyPaste.paste_wayland_bullseye_stable",
+  "crostini.SSHFSMount.bullseye_stable",
+  "crostini.SecureCopyPaste.copy_x11_bullseye_stable",
+
   # http://b234699971
   "crostini.AppGeditUnshareFolder",
+
+  # b/235279574
+  "wmp.DragAndDropWindow",
 ]
 
 # To create filters to be used on specific builders add them like this:
diff --git a/components/autofill/core/browser/payments/autofill_offer_manager.cc b/components/autofill/core/browser/payments/autofill_offer_manager.cc
index b677767..c94e756 100644
--- a/components/autofill/core/browser/payments/autofill_offer_manager.cc
+++ b/components/autofill/core/browser/payments/autofill_offer_manager.cc
@@ -61,16 +61,13 @@
   }
   // Sort the suggestions such that suggestions with offers are shown at the
   // top.
-  if (base::FeatureList::IsEnabled(
-          features::kAutofillSortSuggestionsBasedOnOfferPresence)) {
-    std::sort(suggestions.begin(), suggestions.end(),
-              [](const Suggestion& a, const Suggestion& b) {
-                if (!a.offer_label.empty() && b.offer_label.empty()) {
-                  return true;
-                }
-                return false;
-              });
-  }
+  std::sort(suggestions.begin(), suggestions.end(),
+            [](const Suggestion& a, const Suggestion& b) {
+              if (!a.offer_label.empty() && b.offer_label.empty()) {
+                return true;
+              }
+              return false;
+            });
 }
 
 bool AutofillOfferManager::IsUrlEligible(const GURL& last_committed_url) {
diff --git a/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc b/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc
index ee42c8f..2edebeb 100644
--- a/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc
@@ -195,31 +195,6 @@
 }
 
 TEST_F(AutofillOfferManagerTest,
-       UpdateSuggestionsWithOffer_SuggestionsNotSortedByOfferPresence_ExpOff) {
-  scoped_feature_list_.Reset();
-  scoped_feature_list_.InitAndDisableFeature(
-      features::kAutofillSortSuggestionsBasedOnOfferPresence);
-  CreditCard cardWithoutOffer = CreateCreditCard(kTestGuid);
-  CreditCard cardWithOffer =
-      CreateCreditCard(kTestGuid2, "4111111111111111", 100);
-  personal_data_manager_.AddAutofillOfferData(
-      CreateCreditCardOfferForCard(cardWithOffer, "5%"));
-
-  std::vector<Suggestion> suggestions = {Suggestion(), Suggestion()};
-  suggestions[0].payload = kTestGuid;
-  suggestions[1].payload = kTestGuid2;
-  autofill_offer_manager_->UpdateSuggestionsWithOffers(GURL(kTestUrlWithParam),
-                                                       suggestions);
-
-  // offer_label was set on suggestions[1] and wasn't sorted because experiment
-  // is turned off.
-  EXPECT_TRUE(suggestions[0].offer_label.empty());
-  EXPECT_TRUE(!suggestions[1].offer_label.empty());
-  EXPECT_EQ(absl::get<std::string>(suggestions[0].payload), kTestGuid);
-  EXPECT_EQ(absl::get<std::string>(suggestions[1].payload), kTestGuid2);
-}
-
-TEST_F(AutofillOfferManagerTest,
        UpdateSuggestionsWithOffer_SuggestionsNotSortedIfAllCardsHaveOffers) {
   CreditCard card1 = CreateCreditCard(kTestGuid, kTestNumber, 100);
   CreditCard card2 = CreateCreditCard(kTestGuid2, "4111111111111111", 101);
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc
index ce8a8fc4..af5c7e22 100644
--- a/components/autofill/core/common/autofill_payments_features.cc
+++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -192,11 +192,6 @@
     "AutofillShowUnmaskedCachedCardInManualFillingView",
     base::FEATURE_DISABLED_BY_DEFAULT};
 
-// When enabled, suggestions with offers will be shown at the top.
-const base::Feature kAutofillSortSuggestionsBasedOnOfferPresence{
-    "AutofillSortSuggestionsBasedOnOfferPresence",
-    base::FEATURE_ENABLED_BY_DEFAULT};
-
 // When enabled, merchant bound virtual cards will be suggested even if we don't
 // detect all of the card number, exp date and CVC fields in the payment form.
 const base::Feature kAutofillSuggestVirtualCardsOnIncompleteForm{
diff --git a/components/autofill/core/common/autofill_payments_features.h b/components/autofill/core/common/autofill_payments_features.h
index 78c37324..fd66d25 100644
--- a/components/autofill/core/common/autofill_payments_features.h
+++ b/components/autofill/core/common/autofill_payments_features.h
@@ -48,7 +48,6 @@
 extern const base::FeatureParam<int>
     kAutofillSaveCardUiExperimentSelectorInNumber;
 extern const base::Feature kAutofillShowUnmaskedCachedCardInManualFillingView;
-extern const base::Feature kAutofillSortSuggestionsBasedOnOfferPresence;
 extern const base::Feature kAutofillSuggestVirtualCardsOnIncompleteForm;
 extern const base::Feature kAutofillUpstream;
 extern const base::Feature kAutofillUpstreamAllowAdditionalEmailDomains;
diff --git a/components/autofill_assistant/browser/actions/action_delegate.h b/components/autofill_assistant/browser/actions/action_delegate.h
index 3aa2f2a..78f9df7 100644
--- a/components/autofill_assistant/browser/actions/action_delegate.h
+++ b/components/autofill_assistant/browser/actions/action_delegate.h
@@ -321,9 +321,6 @@
   // is created on the first call.
   virtual content::WebContents* GetWebContentsForJsExecution() = 0;
 
-  // Get the library to be executed before every JS flow action.
-  virtual const std::string& GetJsFlowLibrary() const = 0;
-
   // Get the ElementStore.
   virtual ElementStore* GetElementStore() const = 0;
 
diff --git a/components/autofill_assistant/browser/actions/js_flow_action.cc b/components/autofill_assistant/browser/actions/js_flow_action.cc
index 9dd7e7c..1892570 100644
--- a/components/autofill_assistant/browser/actions/js_flow_action.cc
+++ b/components/autofill_assistant/browser/actions/js_flow_action.cc
@@ -27,9 +27,8 @@
 JsFlowAction::JsFlowAction(ActionDelegate* delegate, const ActionProto& proto)
     : Action(delegate, proto),
       js_flow_executor_(std::make_unique<JsFlowExecutorImpl>(
-          /* delegate= */ this,
           delegate->GetWebContentsForJsExecution(),
-          delegate->GetJsFlowLibrary())) {
+          this)) {
   DCHECK(proto_.has_js_flow());
 }
 
diff --git a/components/autofill_assistant/browser/actions/mock_action_delegate.h b/components/autofill_assistant/browser/actions/mock_action_delegate.h
index a4a0735..8c67a4c 100644
--- a/components/autofill_assistant/browser/actions/mock_action_delegate.h
+++ b/components/autofill_assistant/browser/actions/mock_action_delegate.h
@@ -136,7 +136,6 @@
                      password_manager::PasswordChangeSuccessTracker*());
   MOCK_CONST_METHOD0(GetWebContents, content::WebContents*());
   MOCK_METHOD0(GetWebContentsForJsExecution, content::WebContents*());
-  MOCK_METHOD(const std::string&, GetJsFlowLibrary, (), (const override));
   MOCK_CONST_METHOD0(GetWebController, WebController*());
   MOCK_CONST_METHOD0(GetEmailAddressForAccessTokenAccount, std::string());
   MOCK_CONST_METHOD0(GetUkmRecorder, ukm::UkmRecorder*());
diff --git a/components/autofill_assistant/browser/client_context.cc b/components/autofill_assistant/browser/client_context.cc
index 35589ce..aa36888f 100644
--- a/components/autofill_assistant/browser/client_context.cc
+++ b/components/autofill_assistant/browser/client_context.cc
@@ -90,11 +90,6 @@
   proto_.mutable_annotate_dom_model_context()->set_model_version(model_version);
 }
 
-void ClientContextImpl::UpdateJsFlowLibraryLoaded(
-    const bool js_flow_library_loaded) {
-  proto_.set_js_flow_library_loaded(js_flow_library_loaded);
-}
-
 ClientContextProto ClientContextImpl::AsProto() const {
   return proto_;
 }
diff --git a/components/autofill_assistant/browser/client_context.h b/components/autofill_assistant/browser/client_context.h
index 64665a0..03664c7 100644
--- a/components/autofill_assistant/browser/client_context.h
+++ b/components/autofill_assistant/browser/client_context.h
@@ -20,8 +20,6 @@
   virtual void Update(const TriggerContext& trigger_context) = 0;
   // Updates the annotate DOM model context.
   virtual void UpdateAnnotateDomModelContext(int64_t model_version) {}
-  // Updates whether the JS flow library is loaded.
-  virtual void UpdateJsFlowLibraryLoaded(bool js_flow_library_loaded){};
   // Returns the proto representation of this client context.
   virtual ClientContextProto AsProto() const = 0;
 };
@@ -30,11 +28,10 @@
 class ClientContextImpl : public ClientContext {
  public:
   // |client| must outlive this instance.
-  explicit ClientContextImpl(const Client* client);
+  ClientContextImpl(const Client* client);
   ~ClientContextImpl() override = default;
   void Update(const TriggerContext& trigger_context) override;
   void UpdateAnnotateDomModelContext(int64_t model_version) override;
-  void UpdateJsFlowLibraryLoaded(bool js_flow_library_loaded) override;
   ClientContextProto AsProto() const override;
 
  private:
diff --git a/components/autofill_assistant/browser/client_context_unittest.cc b/components/autofill_assistant/browser/client_context_unittest.cc
index 413f905..613bc95c 100644
--- a/components/autofill_assistant/browser/client_context_unittest.cc
+++ b/components/autofill_assistant/browser/client_context_unittest.cc
@@ -67,7 +67,6 @@
   EXPECT_THAT(actual_client_context.window_size().height_pixels(), Eq(1920));
   EXPECT_THAT(actual_client_context.screen_orientation(),
               ClientContextProto::PORTRAIT);
-  EXPECT_EQ(actual_client_context.js_flow_library_loaded(), false);
 #if BUILDFLAG(IS_ANDROID)
   EXPECT_THAT(actual_client_context.platform_type(),
               ClientContextProto::PLATFORM_TYPE_ANDROID);
@@ -209,14 +208,5 @@
               Eq(ClientContextProto::SIGNED_IN));
 }
 
-TEST_F(ClientContextTest, UpdateJsFlowLibraryLoaded) {
-  ClientContextImpl client_context(&mock_client_);
-  EXPECT_EQ(client_context.AsProto().js_flow_library_loaded(), false);
-  client_context.UpdateJsFlowLibraryLoaded(true);
-  EXPECT_EQ(client_context.AsProto().js_flow_library_loaded(), true);
-  client_context.UpdateJsFlowLibraryLoaded(false);
-  EXPECT_EQ(client_context.AsProto().js_flow_library_loaded(), false);
-}
-
 }  // namespace
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/controller.cc b/components/autofill_assistant/browser/controller.cc
index 35a08b1c..c3a48082 100644
--- a/components/autofill_assistant/browser/controller.cc
+++ b/components/autofill_assistant/browser/controller.cc
@@ -164,15 +164,6 @@
   return web_contents_for_js_execution_.get();
 }
 
-void Controller::SetJsFlowLibrary(const std::string& js_flow_library) {
-  js_flow_library_ = js_flow_library;
-  GetService()->UpdateJsFlowLibraryLoaded(!js_flow_library_.empty());
-}
-
-const std::string& Controller::GetJsFlowLibrary() const {
-  return js_flow_library_;
-}
-
 std::string Controller::GetEmailAddressForAccessTokenAccount() {
   return client_->GetEmailAddressForAccessTokenAccount();
 }
diff --git a/components/autofill_assistant/browser/controller.h b/components/autofill_assistant/browser/controller.h
index 2f5c4ed..83244f5 100644
--- a/components/autofill_assistant/browser/controller.h
+++ b/components/autofill_assistant/browser/controller.h
@@ -125,8 +125,6 @@
   GetPasswordChangeSuccessTracker() override;
   content::WebContents* GetWebContents() override;
   content::WebContents* GetWebContentsForJsExecution() override;
-  void SetJsFlowLibrary(const std::string& js_flow_library) override;
-  const std::string& GetJsFlowLibrary() const override;
   std::string GetEmailAddressForAccessTokenAccount() override;
   ukm::UkmRecorder* GetUkmRecorder() override;
   void SetTouchableElementArea(const ElementAreaProto& area) override;
@@ -445,7 +443,6 @@
 
   // Lazily instantiated in GetWebContentsForJsExecution()
   std::unique_ptr<content::WebContents> web_contents_for_js_execution_;
-  std::string js_flow_library_;
 
   base::WeakPtrFactory<Controller> weak_ptr_factory_{this};
 };
diff --git a/components/autofill_assistant/browser/controller_unittest.cc b/components/autofill_assistant/browser/controller_unittest.cc
index 12c61ab..69df4d8 100644
--- a/components/autofill_assistant/browser/controller_unittest.cc
+++ b/components/autofill_assistant/browser/controller_unittest.cc
@@ -2396,23 +2396,4 @@
                          TriggerContext::Options()));
 }
 
-TEST_F(ControllerTest, SettingJsFlowLibraryWorks) {
-  const std::string js_flow_library = "const st = 2;";
-  EXPECT_EQ(controller_->GetJsFlowLibrary(), "");
-  controller_->SetJsFlowLibrary(js_flow_library);
-  EXPECT_EQ(controller_->GetJsFlowLibrary(), js_flow_library);
-}
-
-TEST_F(ControllerTest, UpdatesJsFlowLibraryLoaded) {
-  EXPECT_CALL(*mock_service_, UpdateJsFlowLibraryLoaded(true));
-
-  controller_->SetJsFlowLibrary("const st = 2;");
-}
-
-TEST_F(ControllerTest, JsFlowLibraryNotLoadedForEmpty) {
-  EXPECT_CALL(*mock_service_, UpdateJsFlowLibraryLoaded(false));
-
-  controller_->SetJsFlowLibrary("");
-}
-
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/fake_script_executor_delegate.cc b/components/autofill_assistant/browser/fake_script_executor_delegate.cc
index 711d1757..99ccb05 100644
--- a/components/autofill_assistant/browser/fake_script_executor_delegate.cc
+++ b/components/autofill_assistant/browser/fake_script_executor_delegate.cc
@@ -66,15 +66,6 @@
   return web_contents_;
 }
 
-void FakeScriptExecutorDelegate::SetJsFlowLibrary(
-    const std::string& js_flow_library) {
-  js_flow_library_ = js_flow_library;
-}
-
-const std::string& FakeScriptExecutorDelegate::GetJsFlowLibrary() const {
-  return js_flow_library_;
-}
-
 std::string FakeScriptExecutorDelegate::GetEmailAddressForAccessTokenAccount() {
   return std::string();
 }
diff --git a/components/autofill_assistant/browser/fake_script_executor_delegate.h b/components/autofill_assistant/browser/fake_script_executor_delegate.h
index 3cdb79c4..33b770d2 100644
--- a/components/autofill_assistant/browser/fake_script_executor_delegate.h
+++ b/components/autofill_assistant/browser/fake_script_executor_delegate.h
@@ -46,8 +46,6 @@
   GetPasswordChangeSuccessTracker() override;
   content::WebContents* GetWebContents() override;
   content::WebContents* GetWebContentsForJsExecution() override;
-  void SetJsFlowLibrary(const std::string& js_flow_library) override;
-  const std::string& GetJsFlowLibrary() const override;
   std::string GetEmailAddressForAccessTokenAccount() override;
   ukm::UkmRecorder* GetUkmRecorder() override;
   bool EnterState(AutofillAssistantState state) override;
@@ -127,7 +125,6 @@
   raw_ptr<Service> service_ = nullptr;
   raw_ptr<WebController> web_controller_ = nullptr;
   raw_ptr<content::WebContents> web_contents_ = nullptr;
-  std::string js_flow_library_;
   std::unique_ptr<TriggerContext> trigger_context_;
   std::vector<AutofillAssistantState> state_history_;
   std::vector<ElementAreaProto> touchable_element_area_history_;
diff --git a/components/autofill_assistant/browser/js_flow_executor_impl.cc b/components/autofill_assistant/browser/js_flow_executor_impl.cc
index 5b38ab45..43a05433 100644
--- a/components/autofill_assistant/browser/js_flow_executor_impl.cc
+++ b/components/autofill_assistant/browser/js_flow_executor_impl.cc
@@ -119,17 +119,15 @@
 }  // namespace
 
 JsFlowExecutorImpl::JsFlowExecutorImpl(
-    Delegate* delegate,
     content::WebContents* web_contents_for_js_execution,
-    const std::string& js_flow_library)
+    Delegate* delegate)
     : delegate_(delegate),
       devtools_client_(std::make_unique<DevtoolsClient>(
           content::DevToolsAgentHost::GetOrCreateFor(
               web_contents_for_js_execution),
           base::FeatureList::IsEnabled(
               autofill_assistant::features::
-                  kAutofillAssistantFullJsFlowStackTraces))),
-      js_flow_library_(js_flow_library) {}
+                  kAutofillAssistantFullJsFlowStackTraces))) {}
 
 JsFlowExecutorImpl::~JsFlowExecutorImpl() = default;
 
@@ -170,11 +168,11 @@
           .SetFrameId(result->GetFrameTree()->GetFrame()->GetId())
           .Build(),
       kMainFrame,
-      base::BindOnce(&JsFlowExecutorImpl::OnIsolatedWorldCreated,
+      base::BindOnce(&JsFlowExecutorImpl::IsolatedWorldCreated,
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-void JsFlowExecutorImpl::OnIsolatedWorldCreated(
+void JsFlowExecutorImpl::IsolatedWorldCreated(
     const DevtoolsClient::ReplyStatus& reply_status,
     std::unique_ptr<page::CreateIsolatedWorldResult> result) {
   if (!result) {
@@ -186,7 +184,6 @@
   }
 
   isolated_world_context_id_ = result->GetExecutionContextId();
-
   InternalStart();
 }
 
@@ -200,9 +197,9 @@
 
   // Wrap the main js_flow in an async function containing a method to
   // request native actions. This is essentially providing |js_flow| with a
-  // JS API to call native functionality. Also adds the js_flow_library.
-  js_flow_ = std::make_unique<std::string>(base::StrCat(
-      {kLeadingWrapper, js_flow_library_, *js_flow_, kTrailingWrapper}));
+  // JS API to call native functionality.
+  js_flow_ = std::make_unique<std::string>(
+      base::StrCat({kLeadingWrapper, *js_flow_, kTrailingWrapper}));
 
   // Run the wrapped js_flow in the sandbox and serve potential native action
   // requests as they arrive.
diff --git a/components/autofill_assistant/browser/js_flow_executor_impl.h b/components/autofill_assistant/browser/js_flow_executor_impl.h
index d7d96a0..c75b2a5 100644
--- a/components/autofill_assistant/browser/js_flow_executor_impl.h
+++ b/components/autofill_assistant/browser/js_flow_executor_impl.h
@@ -22,9 +22,8 @@
 class JsFlowExecutorImpl : public JsFlowExecutor {
  public:
   // |delegate| must outlive the JsFlowExecutorImpl.
-  JsFlowExecutorImpl(Delegate* delegate,
-                     content::WebContents* web_contents_for_js_execution,
-                     const std::string& js_flow_library);
+  JsFlowExecutorImpl(content::WebContents* web_contents_for_js_execution,
+                     Delegate* delegate);
   ~JsFlowExecutorImpl() override;
   JsFlowExecutorImpl(const JsFlowExecutorImpl&) = delete;
   JsFlowExecutorImpl& operator=(const JsFlowExecutorImpl&) = delete;
@@ -78,13 +77,11 @@
 
  private:
   void InternalStart();
-
   void OnGetFrameTree(const DevtoolsClient::ReplyStatus& reply_status,
                       std::unique_ptr<page::GetFrameTreeResult> result);
-  void OnIsolatedWorldCreated(
+  void IsolatedWorldCreated(
       const DevtoolsClient::ReplyStatus& reply_status,
       std::unique_ptr<page::CreateIsolatedWorldResult> result);
-
   void RefreshNativeActionPromise();
   void OnNativeActionRequested(const DevtoolsClient::ReplyStatus& reply_status,
                                std::unique_ptr<runtime::EvaluateResult> result);
@@ -125,8 +122,6 @@
 
   const raw_ptr<Delegate> delegate_;
   std::unique_ptr<DevtoolsClient> devtools_client_;
-  const std::string& js_flow_library_;
-
   int isolated_world_context_id_ = -1;
 
   // Only set during a flow.
diff --git a/components/autofill_assistant/browser/js_flow_executor_impl_browsertest.cc b/components/autofill_assistant/browser/js_flow_executor_impl_browsertest.cc
index 73f1a8e..3aceb29 100644
--- a/components/autofill_assistant/browser/js_flow_executor_impl_browsertest.cc
+++ b/components/autofill_assistant/browser/js_flow_executor_impl_browsertest.cc
@@ -77,7 +77,7 @@
     BaseBrowserTest::SetUpOnMainThread();
 
     flow_executor_ = std::make_unique<JsFlowExecutorImpl>(
-        &mock_delegate_, shell()->web_contents(), "");
+        shell()->web_contents(), &mock_delegate_);
   }
 
   // Overload, ignore result value, just return the client status.
@@ -416,5 +416,6 @@
             ACTION_APPLIED);
   EXPECT_EQ(*result, base::Value(5));
 }
+
 }  // namespace
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/js_flow_util.cc b/components/autofill_assistant/browser/js_flow_util.cc
index ed8f5a6..4c1a895 100644
--- a/components/autofill_assistant/browser/js_flow_util.cc
+++ b/components/autofill_assistant/browser/js_flow_util.cc
@@ -4,7 +4,6 @@
 
 #include "components/autofill_assistant/browser/js_flow_util.h"
 #include "base/base64.h"
-#include "base/logging.h"
 #include "base/strings/strcat.h"
 #include "components/autofill_assistant/browser/model.pb.h"
 #include "components/autofill_assistant/browser/service.pb.h"
@@ -151,7 +150,6 @@
   }
 
   if (!value.is_dict()) {
-    VLOG(1) << "JS flow did not return a dictionary.";
     return ClientStatusWithSourceLocation(INVALID_ACTION, __FILE__, __LINE__);
   }
 
@@ -159,7 +157,6 @@
   absl::optional<int> flow_status = dict->FindInt(kStatusKey);
   const base::Value* flow_return_value = dict->Find(kResultKey);
   if (!flow_status || !ProcessedActionStatusProto_IsValid(*flow_status)) {
-    VLOG(1) << "JS flow did not return a valid ActionStatus in " << kStatusKey;
     return ClientStatusWithSourceLocation(INVALID_ACTION, __FILE__, __LINE__);
   }
 
diff --git a/components/autofill_assistant/browser/mock_client_context.h b/components/autofill_assistant/browser/mock_client_context.h
index 43debe39..2827a9a 100644
--- a/components/autofill_assistant/browser/mock_client_context.h
+++ b/components/autofill_assistant/browser/mock_client_context.h
@@ -18,19 +18,9 @@
   MockClientContext();
   ~MockClientContext() override;
 
-  MOCK_METHOD(void,
-              Update,
-              (const TriggerContext& trigger_context),
-              (override));
-  MOCK_METHOD(void,
-              UpdateAnnotateDomModelContext,
-              (int64_t model_version),
-              (override));
-  MOCK_METHOD(void,
-              UpdateJsFlowLibraryLoaded,
-              (bool js_flow_library_loaded),
-              (override));
-  MOCK_METHOD(ClientContextProto, AsProto, (), (const override));
+  MOCK_METHOD1(Update, void(const TriggerContext& trigger_context));
+  MOCK_METHOD1(UpdateAnnotateDomModelContext, void(int64_t model_version));
+  MOCK_CONST_METHOD0(AsProto, ClientContextProto());
 };
 
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/mock_script_executor_delegate.h b/components/autofill_assistant/browser/mock_script_executor_delegate.h
index df6de1b..7b872467 100644
--- a/components/autofill_assistant/browser/mock_script_executor_delegate.h
+++ b/components/autofill_assistant/browser/mock_script_executor_delegate.h
@@ -53,12 +53,6 @@
               GetWebContentsForJsExecution,
               (),
               (override));
-  MOCK_METHOD(void,
-              SetJsFlowLibrary,
-              (const std::string& js_flow_library),
-              (override));
-  MOCK_METHOD(const std::string&, GetJsFlowLibrary, (), (const override));
-
   MOCK_METHOD(std::string,
               GetEmailAddressForAccessTokenAccount,
               (),
diff --git a/components/autofill_assistant/browser/protocol_utils.cc b/components/autofill_assistant/browser/protocol_utils.cc
index 30fc7f0..b3c147e6 100644
--- a/components/autofill_assistant/browser/protocol_utils.cc
+++ b/components/autofill_assistant/browser/protocol_utils.cc
@@ -208,7 +208,6 @@
   ScriptActionRequestProto request_proto;
   request_proto.set_global_payload(global_payload);
   request_proto.set_script_payload(script_payload);
-
   NextScriptActionsRequestProto* next_request =
       request_proto.mutable_next_request();
   for (const auto& processed_action : processed_actions) {
@@ -769,8 +768,7 @@
                                  std::string* return_script_payload,
                                  std::vector<std::unique_ptr<Action>>* actions,
                                  std::vector<std::unique_ptr<Script>>* scripts,
-                                 bool* should_update_scripts,
-                                 std::string* js_flow_library) {
+                                 bool* should_update_scripts) {
   DCHECK(actions);
   DCHECK(scripts);
 
@@ -789,9 +787,6 @@
   if (return_script_payload) {
     *return_script_payload = response_proto.script_payload();
   }
-  if (js_flow_library) {
-    *js_flow_library = std::move(*response_proto.mutable_js_flow_library());
-  }
 
   for (const auto& action : response_proto.actions()) {
     std::unique_ptr<Action> client_action = CreateAction(delegate, action);
diff --git a/components/autofill_assistant/browser/protocol_utils.h b/components/autofill_assistant/browser/protocol_utils.h
index 52e872e..ab906e3 100644
--- a/components/autofill_assistant/browser/protocol_utils.h
+++ b/components/autofill_assistant/browser/protocol_utils.h
@@ -116,8 +116,7 @@
                            std::string* return_script_payload,
                            std::vector<std::unique_ptr<Action>>* actions,
                            std::vector<std::unique_ptr<Script>>* scripts,
-                           bool* should_update_scripts,
-                           std::string* js_flow_library);
+                           bool* should_update_scripts);
 
   // Parses a single serialized ActionProto. Returns nullptr in the case of
   // parsing errors.
diff --git a/components/autofill_assistant/browser/protocol_utils_unittest.cc b/components/autofill_assistant/browser/protocol_utils_unittest.cc
index a4a30ff..4438fd4 100644
--- a/components/autofill_assistant/browser/protocol_utils_unittest.cc
+++ b/components/autofill_assistant/browser/protocol_utils_unittest.cc
@@ -230,12 +230,11 @@
   bool unused;
   std::vector<std::unique_ptr<Action>> unused_actions;
   std::vector<std::unique_ptr<Script>> unused_scripts;
-  std::string unused_js_flow_library;
   EXPECT_FALSE(ProtocolUtils::ParseActions(
       /* delegate= */ nullptr, /* response= */ "invalid", /* run_id= */ nullptr,
-      /* return_global_payload= */ nullptr,
-      /* return_script_payload= */ nullptr, &unused_actions, &unused_scripts,
-      /* should_update_scripts= */ &unused, &unused_js_flow_library));
+      /* global_payload= */ nullptr,
+      /* script_payload= */ nullptr, &unused_actions, &unused_scripts,
+      /* should_update_scripts= */ &unused));
 }
 
 TEST_F(ProtocolUtilsTest, ParseActionParseError) {
@@ -259,11 +258,10 @@
   bool should_update_scripts = true;
   std::vector<std::unique_ptr<Action>> actions;
   std::vector<std::unique_ptr<Script>> scripts;
-  std::string unused_js_flow_library;
 
   EXPECT_TRUE(ProtocolUtils::ParseActions(
       nullptr, proto_str, &run_id, &global_payload, &script_payload, &actions,
-      &scripts, &should_update_scripts, &unused_js_flow_library));
+      &scripts, &should_update_scripts));
   EXPECT_EQ(1u, run_id);
   EXPECT_EQ("global_payload", global_payload);
   EXPECT_EQ("script_payload", script_payload);
@@ -290,12 +288,11 @@
   bool should_update_scripts = false;
   std::vector<std::unique_ptr<Script>> scripts;
   std::vector<std::unique_ptr<Action>> unused_actions;
-  std::string unused_js_flow_library;
 
   EXPECT_TRUE(ProtocolUtils::ParseActions(
       nullptr, proto_str, /* run_id= */ nullptr, /* global_payload= */ nullptr,
       /* script_payload */ nullptr, &unused_actions, &scripts,
-      &should_update_scripts, &unused_js_flow_library));
+      &should_update_scripts));
   EXPECT_TRUE(should_update_scripts);
   EXPECT_TRUE(scripts.empty());
 }
@@ -316,13 +313,11 @@
   bool should_update_scripts = false;
   std::vector<std::unique_ptr<Script>> scripts;
   std::vector<std::unique_ptr<Action>> unused_actions;
-  std::string unused_js_flow_library;
 
   EXPECT_TRUE(ProtocolUtils::ParseActions(
-      nullptr, proto_str, /* run_id= */ nullptr,
-      /* return_global_payload= */ nullptr,
-      /* return_script_payload= */ nullptr, &unused_actions, &scripts,
-      &should_update_scripts, &unused_js_flow_library));
+      nullptr, proto_str, /* run_id= */ nullptr, /* global_payload= */ nullptr,
+      /* script_payload= */ nullptr, &unused_actions, &scripts,
+      &should_update_scripts));
   EXPECT_TRUE(should_update_scripts);
   EXPECT_THAT(scripts, SizeIs(1));
   EXPECT_THAT("a", Eq(scripts[0]->handle.path));
diff --git a/components/autofill_assistant/browser/script_executor.cc b/components/autofill_assistant/browser/script_executor.cc
index 19ceffd..47d6561 100644
--- a/components/autofill_assistant/browser/script_executor.cc
+++ b/components/autofill_assistant/browser/script_executor.cc
@@ -633,10 +633,6 @@
   return delegate_->GetWebContentsForJsExecution();
 }
 
-const std::string& ScriptExecutor::GetJsFlowLibrary() const {
-  return delegate_->GetJsFlowLibrary();
-}
-
 ElementStore* ScriptExecutor::GetElementStore() const {
   return element_store_.get();
 }
@@ -837,7 +833,6 @@
       roundtrip_duration.InMilliseconds());
   bool success = http_status == net::HTTP_OK &&
                  ProcessNextActionResponse(response, response_info);
-
   if (should_stop_script_) {
     // The last action forced the script to stop. Sending the result of the
     // action is considered best effort in this situation. Report a successful
@@ -879,19 +874,14 @@
   actions_.clear();
 
   bool should_update_scripts = false;
-  std::string js_flow_library;
   std::vector<std::unique_ptr<Script>> scripts;
   bool parse_result = ProtocolUtils::ParseActions(
       this, response, &run_id_, &last_global_payload_, &last_script_payload_,
-      &actions_, &scripts, &should_update_scripts, &js_flow_library);
+      &actions_, &scripts, &should_update_scripts);
   if (!parse_result) {
     return false;
   }
 
-  if (!js_flow_library.empty()) {
-    delegate_->SetJsFlowLibrary(js_flow_library);
-  }
-
   roundtrip_network_stats_ =
       ProtocolUtils::ComputeNetworkStats(response, response_info, actions_);
   ReportPayloadsToListener();
diff --git a/components/autofill_assistant/browser/script_executor.h b/components/autofill_assistant/browser/script_executor.h
index a0996f2ba..2b3a58d 100644
--- a/components/autofill_assistant/browser/script_executor.h
+++ b/components/autofill_assistant/browser/script_executor.h
@@ -211,7 +211,6 @@
   GetPasswordChangeSuccessTracker() const override;
   content::WebContents* GetWebContents() const override;
   content::WebContents* GetWebContentsForJsExecution() override;
-  const std::string& GetJsFlowLibrary() const override;
   ElementStore* GetElementStore() const override;
   WebController* GetWebController() const override;
   std::string GetEmailAddressForAccessTokenAccount() const override;
diff --git a/components/autofill_assistant/browser/script_executor_browsertest.cc b/components/autofill_assistant/browser/script_executor_browsertest.cc
index c4c7b64..c9ed1cf 100644
--- a/components/autofill_assistant/browser/script_executor_browsertest.cc
+++ b/components/autofill_assistant/browser/script_executor_browsertest.cc
@@ -31,8 +31,6 @@
 
 using ::base::test::RunOnceCallback;
 using ::testing::_;
-using ::testing::AllOf;
-using ::testing::DoAll;
 using ::testing::ElementsAre;
 using ::testing::Eq;
 using ::testing::Field;
@@ -45,7 +43,6 @@
 using ::testing::SizeIs;
 using ::testing::StrictMock;
 using ::testing::WithArg;
-using ::testing::WithArgs;
 
 class ScriptExecutorBrowserTest : public BaseBrowserTest {
  public:
@@ -69,10 +66,11 @@
                                      actions_response.SerializeAsString(),
                                      ServiceRequestSender::ResponseInfo{}));
 
-    ON_CALL(mock_service_, GetNextActions)
-        .WillByDefault(RunOnceCallback<6>(
-            net::HTTP_OK, ActionsResponseProto().SerializeAsString(),
-            ServiceRequestSender::ResponseInfo{}));
+    EXPECT_CALL(mock_service_,
+                GetNextActions(_, _, _, processed_actions_matcher_, _, _, _))
+        .WillOnce(RunOnceCallback<6>(net::HTTP_OK,
+                                     ActionsResponseProto().SerializeAsString(),
+                                     ServiceRequestSender::ResponseInfo{}));
 
     base::RunLoop run_loop;
 
@@ -91,21 +89,11 @@
 
   void RunJsFlow(const std::string& js_flow,
                  const ProcessedActionStatusProto& result) {
+    processed_actions_matcher_ =
+        ElementsAre(Property(&ProcessedActionProto::status, result));
     EXPECT_CALL(executor_callback_,
                 Run(Field(&ScriptExecutor::Result::success, true)));
 
-    EXPECT_CALL(mock_service_, GetNextActions)
-        .WillOnce(DoAll(
-            WithArgs<3>([&result](const std::vector<ProcessedActionProto>&
-                                      processed_actions) {
-              EXPECT_THAT(
-                  processed_actions,
-                  ElementsAre(Property(&ProcessedActionProto::status, result)));
-            }),
-            RunOnceCallback<6>(net::HTTP_OK,
-                               ActionsResponseProto().SerializeAsString(),
-                               ServiceRequestSender::ResponseInfo{})));
-
     ActionsResponseProto actions_response;
     actions_response.add_actions()->mutable_js_flow()->set_js_flow(js_flow);
     Run(actions_response);
@@ -124,6 +112,8 @@
 
   StrictMock<base::MockCallback<ScriptExecutor::RunScriptCallback>>
       executor_callback_;
+  Matcher<const std::vector<ProcessedActionProto>&> processed_actions_matcher_ =
+      _;
 };
 
 std::string CreateRunNativeActionCall(
@@ -263,160 +253,6 @@
   Run(actions_response);
 }
 
-IN_PROC_BROWSER_TEST_F(ScriptExecutorBrowserTest, JsLibraryIsUsed) {
-  ActionsResponseProto actions_response;
-  actions_response.set_js_flow_library("const status = 2;");
-  actions_response.add_actions()->mutable_js_flow()->set_js_flow(
-      "return {status};");
-
-  EXPECT_CALL(mock_service_,
-              GetNextActions(_, _, _,
-                             ElementsAre(Property(&ProcessedActionProto::status,
-                                                  ACTION_APPLIED)),
-                             _, _, _))
-      .WillOnce(RunOnceCallback<6>(net::HTTP_OK,
-                                   ActionsResponseProto().SerializeAsString(),
-                                   ServiceRequestSender::ResponseInfo{}));
-
-  EXPECT_CALL(executor_callback_,
-              Run(Field(&ScriptExecutor::Result::success, true)));
-
-  Run(actions_response);
-}
-
-IN_PROC_BROWSER_TEST_F(ScriptExecutorBrowserTest, JsLibraryIsReused) {
-  ActionsResponseProto actions_response;
-  actions_response.set_js_flow_library("const status = 2;");
-  actions_response.add_actions()->mutable_js_flow()->set_js_flow(
-      "return {status};");
-  actions_response.add_actions()->mutable_js_flow()->set_js_flow(
-      "return {status};");
-
-  EXPECT_CALL(
-      mock_service_,
-      GetNextActions(
-          _, _, _,
-          ElementsAre(Property(&ProcessedActionProto::status, ACTION_APPLIED),
-                      Property(&ProcessedActionProto::status, ACTION_APPLIED)),
-          _, _, _))
-      .WillOnce(RunOnceCallback<6>(net::HTTP_OK,
-                                   ActionsResponseProto().SerializeAsString(),
-                                   ServiceRequestSender::ResponseInfo{}));
-
-  EXPECT_CALL(executor_callback_,
-              Run(Field(&ScriptExecutor::Result::success, true)));
-
-  Run(actions_response);
-}
-
-IN_PROC_BROWSER_TEST_F(ScriptExecutorBrowserTest, JsLibraryIsUsedAccrossCalls) {
-  ActionsResponseProto actions_response_1;
-  actions_response_1.set_js_flow_library("const st = 2;");
-  actions_response_1.add_actions()->mutable_js_flow()->set_js_flow(
-      "return {status: st};");
-
-  ActionsResponseProto actions_response_2;
-  actions_response_2.add_actions()->mutable_js_flow()->set_js_flow(
-      "return {status: st};");
-
-  EXPECT_CALL(mock_service_,
-              GetNextActions(_, _, _,
-                             ElementsAre(Property(&ProcessedActionProto::status,
-                                                  ACTION_APPLIED)),
-                             _, _, _))
-      .WillOnce(RunOnceCallback<6>(net::HTTP_OK,
-                                   actions_response_2.SerializeAsString(),
-                                   ServiceRequestSender::ResponseInfo{}))
-      .WillOnce(RunOnceCallback<6>(net::HTTP_OK,
-                                   ActionsResponseProto().SerializeAsString(),
-                                   ServiceRequestSender::ResponseInfo{}));
-
-  EXPECT_CALL(executor_callback_,
-              Run(Field(&ScriptExecutor::Result::success, true)));
-
-  Run(actions_response_1);
-}
-
-IN_PROC_BROWSER_TEST_F(ScriptExecutorBrowserTest, JsFlowErrorInJsLibraryFlow) {
-  ActionsResponseProto actions_response_1;
-  actions_response_1.set_js_flow_library("throw new Error();");
-  actions_response_1.add_actions()->mutable_js_flow()->set_js_flow(
-      "return {status: 2};");
-
-  EXPECT_CALL(mock_service_, GetNextActions)
-      .WillOnce(DoAll(
-          WithArgs<3>(
-              [](const std::vector<ProcessedActionProto>& processed_actions) {
-                ASSERT_THAT(processed_actions, SizeIs(1));
-
-                const auto& processed_action = processed_actions[0];
-                EXPECT_THAT(processed_action,
-                            Property(&ProcessedActionProto::status,
-                                     UNEXPECTED_JS_ERROR));
-
-                const auto& unexpected_error_info =
-                    processed_action.status_details().unexpected_error_info();
-                EXPECT_THAT(
-                    unexpected_error_info,
-                    Property(
-                        &UnexpectedErrorInfoProto::js_exception_line_numbers,
-                        ElementsAre(0)));
-                EXPECT_THAT(
-                    unexpected_error_info,
-                    Property(
-                        &UnexpectedErrorInfoProto::js_exception_column_numbers,
-                        ElementsAre(6)));
-              }),
-          RunOnceCallback<6>(net::HTTP_OK,
-                             ActionsResponseProto().SerializeAsString(),
-                             ServiceRequestSender::ResponseInfo{})));
-
-  EXPECT_CALL(executor_callback_,
-              Run(Field(&ScriptExecutor::Result::success, true)));
-
-  Run(actions_response_1);
-}
-
-IN_PROC_BROWSER_TEST_F(ScriptExecutorBrowserTest, JsFlowErrorInJsFlow) {
-  ActionsResponseProto actions_response_1;
-  actions_response_1.set_js_flow_library("const st = 2;\n");
-  actions_response_1.add_actions()->mutable_js_flow()->set_js_flow(
-      "throw new Error();");
-
-  EXPECT_CALL(mock_service_, GetNextActions)
-      .WillOnce(DoAll(
-          WithArgs<3>(
-              [](const std::vector<ProcessedActionProto>& processed_actions) {
-                ASSERT_THAT(processed_actions, SizeIs(1));
-
-                const auto& processed_action = processed_actions[0];
-                EXPECT_THAT(processed_action,
-                            Property(&ProcessedActionProto::status,
-                                     UNEXPECTED_JS_ERROR));
-
-                const auto& unexpected_error_info =
-                    processed_action.status_details().unexpected_error_info();
-                EXPECT_THAT(
-                    unexpected_error_info,
-                    Property(
-                        &UnexpectedErrorInfoProto::js_exception_line_numbers,
-                        ElementsAre(1)));
-                EXPECT_THAT(
-                    unexpected_error_info,
-                    Property(
-                        &UnexpectedErrorInfoProto::js_exception_column_numbers,
-                        ElementsAre(6)));
-              }),
-          RunOnceCallback<6>(net::HTTP_OK,
-                             ActionsResponseProto().SerializeAsString(),
-                             ServiceRequestSender::ResponseInfo{})));
-
-  EXPECT_CALL(executor_callback_,
-              Run(Field(&ScriptExecutor::Result::success, true)));
-
-  Run(actions_response_1);
-}
-
 IN_PROC_BROWSER_TEST_F(ScriptExecutorBrowserTest, WaitForDomSucceeds) {
   WaitForDomProto wait_for_dom;
   wait_for_dom.mutable_wait_condition()
diff --git a/components/autofill_assistant/browser/script_executor_delegate.h b/components/autofill_assistant/browser/script_executor_delegate.h
index c2b2911..42d5e5a 100644
--- a/components/autofill_assistant/browser/script_executor_delegate.h
+++ b/components/autofill_assistant/browser/script_executor_delegate.h
@@ -63,13 +63,10 @@
   virtual password_manager::PasswordChangeSuccessTracker*
   GetPasswordChangeSuccessTracker() = 0;
   virtual content::WebContents* GetWebContents() = 0;
+
   // Get dummy web contents that can be used for JS execution. The web contents
   // is created on the first call.
   virtual content::WebContents* GetWebContentsForJsExecution() = 0;
-
-  virtual void SetJsFlowLibrary(const std::string& js_flow_library) = 0;
-  virtual const std::string& GetJsFlowLibrary() const = 0;
-
   virtual std::string GetEmailAddressForAccessTokenAccount() = 0;
   virtual ukm::UkmRecorder* GetUkmRecorder() = 0;
 
@@ -159,7 +156,7 @@
   virtual bool MustUseBackendData() const = 0;
 
  protected:
-  virtual ~ScriptExecutorDelegate() = default;
+  virtual ~ScriptExecutorDelegate() {}
 };
 }  // namespace autofill_assistant
 
diff --git a/components/autofill_assistant/browser/script_executor_unittest.cc b/components/autofill_assistant/browser/script_executor_unittest.cc
index 8b4a25b..469b2dc 100644
--- a/components/autofill_assistant/browser/script_executor_unittest.cc
+++ b/components/autofill_assistant/browser/script_executor_unittest.cc
@@ -2392,26 +2392,5 @@
                           AutofillAssistantState::RUNNING));
 }
 
-TEST_F(ScriptExecutorTest, JsFlowLibraryUpdated) {
-  ActionsResponseProto actions_response;
-  actions_response.set_js_flow_library("const status = 2;");
-  actions_response.add_actions()->mutable_tell()->set_message("message");
-
-  EXPECT_CALL(mock_service_, GetActions)
-      .WillOnce(RunOnceCallback<5>(net::HTTP_OK,
-                                   actions_response.SerializeAsString(),
-                                   ServiceRequestSender::ResponseInfo{}));
-  EXPECT_CALL(mock_service_, GetNextActions)
-      .WillOnce(RunOnceCallback<6>(net::HTTP_OK,
-                                   ActionsResponseProto().SerializeAsString(),
-                                   ServiceRequestSender::ResponseInfo{}));
-
-  EXPECT_CALL(executor_callback_,
-              Run(Field(&ScriptExecutor::Result::success, true)));
-
-  executor_->Run(&user_data_, executor_callback_.Get());
-  EXPECT_EQ(delegate_.GetJsFlowLibrary(), actions_response.js_flow_library());
-}
-
 }  // namespace
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/service/mock_service.h b/components/autofill_assistant/browser/service/mock_service.h
index 02d06509..abc4cd2 100644
--- a/components/autofill_assistant/browser/service/mock_service.h
+++ b/components/autofill_assistant/browser/service/mock_service.h
@@ -63,10 +63,6 @@
               UpdateAnnotateDomModelContext,
               (int64_t model_version),
               (override));
-  MOCK_METHOD(void,
-              UpdateJsFlowLibraryLoaded,
-              (bool js_flow_library_loaded),
-              (override));
 };
 
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/service/service.h b/components/autofill_assistant/browser/service/service.h
index c879077e0..c0154c0d 100644
--- a/components/autofill_assistant/browser/service/service.h
+++ b/components/autofill_assistant/browser/service/service.h
@@ -62,8 +62,6 @@
 
   virtual void UpdateAnnotateDomModelContext(int64_t model_version) {}
 
-  virtual void UpdateJsFlowLibraryLoaded(bool js_flow_library_loaded){};
-
  protected:
   Service() = default;
 };
diff --git a/components/autofill_assistant/browser/service/service_impl.cc b/components/autofill_assistant/browser/service/service_impl.cc
index 00f11d6f..d713e03 100644
--- a/components/autofill_assistant/browser/service/service_impl.cc
+++ b/components/autofill_assistant/browser/service/service_impl.cc
@@ -214,8 +214,4 @@
   client_context_->UpdateAnnotateDomModelContext(model_version);
 }
 
-void ServiceImpl::UpdateJsFlowLibraryLoaded(const bool js_flow_library_loaded) {
-  client_context_->UpdateJsFlowLibraryLoaded(js_flow_library_loaded);
-}
-
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/service/service_impl.h b/components/autofill_assistant/browser/service/service_impl.h
index aaadc0b6..e16ee262 100644
--- a/components/autofill_assistant/browser/service/service_impl.h
+++ b/components/autofill_assistant/browser/service/service_impl.h
@@ -96,8 +96,6 @@
 
   void UpdateAnnotateDomModelContext(int64_t model_version) override;
 
-  void UpdateJsFlowLibraryLoaded(bool js_flow_library_loaded) override;
-
  private:
   void SendUserDataRequest(
       uint64_t run_id,
diff --git a/components/autofill_assistant/browser/service/service_impl_unittest.cc b/components/autofill_assistant/browser/service/service_impl_unittest.cc
index 860db4a..f2504a6e 100644
--- a/components/autofill_assistant/browser/service/service_impl_unittest.cc
+++ b/components/autofill_assistant/browser/service/service_impl_unittest.cc
@@ -259,10 +259,5 @@
   service_->UpdateAnnotateDomModelContext(123456);
 }
 
-TEST_F(ServiceImplTest, UpdateJsFlowLibraryLoaded) {
-  EXPECT_CALL(*mock_client_context_, UpdateJsFlowLibraryLoaded(true));
-  service_->UpdateJsFlowLibraryLoaded(true);
-}
-
 }  // namespace
 }  // namespace autofill_assistant
diff --git a/components/bookmarks/browser/model_loader.cc b/components/bookmarks/browser/model_loader.cc
index 263c902..eb8a749 100644
--- a/components/bookmarks/browser/model_loader.cc
+++ b/components/bookmarks/browser/model_loader.cc
@@ -19,6 +19,7 @@
 #include "components/bookmarks/browser/titled_url_index.h"
 #include "components/bookmarks/browser/url_index.h"
 #include "components/bookmarks/common/bookmark_metrics.h"
+#include "components/bookmarks/common/url_load_stats.h"
 
 namespace bookmarks {
 
@@ -81,53 +82,8 @@
 
   details->CreateUrlIndex();
 
-  UrlIndex::Stats stats = details->url_index()->ComputeStats();
-
-  DCHECK_LE(stats.duplicate_url_bookmark_count, stats.total_url_bookmark_count);
-  DCHECK_LE(stats.duplicate_url_and_title_bookmark_count,
-            stats.duplicate_url_bookmark_count);
-  DCHECK_LE(stats.duplicate_url_and_title_and_parent_bookmark_count,
-            stats.duplicate_url_and_title_bookmark_count);
-
-  // TODO(crbug.com/1321690): Consolidate metrics calls into a file.
-  base::UmaHistogramCounts100000(
-      "Bookmarks.Count.OnProfileLoad",
-      base::saturated_cast<int>(stats.total_url_bookmark_count));
-
-  if (stats.duplicate_url_bookmark_count != 0) {
-    base::UmaHistogramCounts100000(
-        "Bookmarks.Count.OnProfileLoad.DuplicateUrl2",
-        base::saturated_cast<int>(stats.duplicate_url_bookmark_count));
-  }
-
-  if (stats.duplicate_url_and_title_bookmark_count != 0) {
-    base::UmaHistogramCounts100000(
-        "Bookmarks.Count.OnProfileLoad.DuplicateUrlAndTitle",
-        base::saturated_cast<int>(
-            stats.duplicate_url_and_title_bookmark_count));
-  }
-
-  if (stats.duplicate_url_and_title_and_parent_bookmark_count != 0) {
-    base::UmaHistogramCounts100000(
-        "Bookmarks.Count.OnProfileLoad.DuplicateUrlAndTitleAndParent",
-        base::saturated_cast<int>(
-            stats.duplicate_url_and_title_and_parent_bookmark_count));
-  }
-
-  // Log derived metrics for convenience.
-  base::UmaHistogramCounts100000(
-      "Bookmarks.Count.OnProfileLoad.UniqueUrl",
-      base::saturated_cast<int>(stats.total_url_bookmark_count -
-                                stats.duplicate_url_bookmark_count));
-  base::UmaHistogramCounts100000(
-      "Bookmarks.Count.OnProfileLoad.UniqueUrlAndTitle",
-      base::saturated_cast<int>(stats.total_url_bookmark_count -
-                                stats.duplicate_url_and_title_bookmark_count));
-  base::UmaHistogramCounts100000(
-      "Bookmarks.Count.OnProfileLoad.UniqueUrlAndTitleAndParent",
-      base::saturated_cast<int>(
-          stats.total_url_bookmark_count -
-          stats.duplicate_url_and_title_and_parent_bookmark_count));
+  UrlLoadStats stats = details->url_index()->ComputeStats();
+  metrics::RecordUrlLoadStatsOnProfileLoad(stats);
 
   int64_t file_size_bytes;
   if (bookmark_file_exists && base::GetFileSize(path, &file_size_bytes)) {
diff --git a/components/bookmarks/browser/url_index.cc b/components/bookmarks/browser/url_index.cc
index 10b11c7d..033f5a5e3 100644
--- a/components/bookmarks/browser/url_index.cc
+++ b/components/bookmarks/browser/url_index.cc
@@ -9,6 +9,7 @@
 #include "base/containers/adapters.h"
 #include "base/guid.h"
 #include "components/bookmarks/browser/url_and_title.h"
+#include "components/bookmarks/common/url_load_stats.h"
 
 namespace bookmarks {
 
@@ -23,7 +24,7 @@
 // calling site.
 void AddStatsForBookmarksWithSameUrl(
     std::vector<const BookmarkNode*>* bookmarks_with_same_url,
-    UrlIndex::Stats* stats) {
+    UrlLoadStats* stats) {
   if (bookmarks_with_same_url->size() <= 1)
     return;
 
@@ -126,9 +127,9 @@
   return !nodes_ordered_by_url_set_.empty();
 }
 
-UrlIndex::Stats UrlIndex::ComputeStats() const {
+UrlLoadStats UrlIndex::ComputeStats() const {
   base::AutoLock url_lock(url_lock_);
-  UrlIndex::Stats stats;
+  UrlLoadStats stats;
   stats.total_url_bookmark_count = nodes_ordered_by_url_set_.size();
 
   if (stats.total_url_bookmark_count <= 1)
diff --git a/components/bookmarks/browser/url_index.h b/components/bookmarks/browser/url_index.h
index 5f1c0dc..e318770 100644
--- a/components/bookmarks/browser/url_index.h
+++ b/components/bookmarks/browser/url_index.h
@@ -19,6 +19,7 @@
 
 class BookmarkNode;
 
+struct UrlLoadStats;
 struct UrlAndTitle;
 
 // UrlIndex maintains the bookmark nodes of type url. The nodes are ordered by
@@ -67,24 +68,8 @@
   // Returns true if there is at least one bookmark.
   bool HasBookmarks() const;
 
-  // Returns some stats about number of URL bookmarks stored, for UMA purposes.
-  struct Stats {
-    // Number of bookmark in the index excluding folders.
-    size_t total_url_bookmark_count = 0;
-    // Number of bookmarks (excluding folders) with a URL that is used by at
-    // least one other bookmark, excluding one bookmark per unique URL (i.e. all
-    // except one are considered duplicates).
-    size_t duplicate_url_bookmark_count = 0;
-    // Number of bookmarks (excluding folders) with the pair <URL, title> that
-    // is used by at least one other bookmark, excluding one bookmark per unique
-    // URL (i.e. all except one are considered duplicates).
-    size_t duplicate_url_and_title_bookmark_count = 0;
-    // Number of bookmarks (excluding folders) with the triple <URL, title,
-    // parent> that is used by at least one other bookmark, excluding one
-    // bookmark per unique URL (i.e. all except one are considered duplicates).
-    size_t duplicate_url_and_title_and_parent_bookmark_count = 0;
-  };
-  Stats ComputeStats() const;
+  // Compute stats from the load.
+  UrlLoadStats ComputeStats() const;
 
   // HistoryBookmarkModel:
   bool IsBookmarked(const GURL& url) override;
diff --git a/components/bookmarks/common/BUILD.gn b/components/bookmarks/common/BUILD.gn
index 192cf94..2f414f9 100644
--- a/components/bookmarks/common/BUILD.gn
+++ b/components/bookmarks/common/BUILD.gn
@@ -10,6 +10,7 @@
     "bookmark_metrics.h",
     "bookmark_pref_names.cc",
     "bookmark_pref_names.h",
+    "url_load_stats.h",
   ]
 
   deps = [ "//base" ]
diff --git a/components/bookmarks/common/bookmark_metrics.cc b/components/bookmarks/common/bookmark_metrics.cc
index 267089c..40f6ef0 100644
--- a/components/bookmarks/common/bookmark_metrics.cc
+++ b/components/bookmarks/common/bookmark_metrics.cc
@@ -5,6 +5,7 @@
 #include "components/bookmarks/common/bookmark_metrics.h"
 
 #include "base/metrics/histogram_functions.h"
+#include "components/bookmarks/common/url_load_stats.h"
 
 namespace {
 const int kBytesPerKB = 1024;
@@ -26,4 +27,51 @@
                              total_size_kb);
 }
 
+void RecordUrlLoadStatsOnProfileLoad(const UrlLoadStats& stats) {
+  DCHECK_LE(stats.duplicate_url_bookmark_count, stats.total_url_bookmark_count);
+  DCHECK_LE(stats.duplicate_url_and_title_bookmark_count,
+            stats.duplicate_url_bookmark_count);
+  DCHECK_LE(stats.duplicate_url_and_title_and_parent_bookmark_count,
+            stats.duplicate_url_and_title_bookmark_count);
+
+  base::UmaHistogramCounts100000(
+      "Bookmarks.Count.OnProfileLoad",
+      base::saturated_cast<int>(stats.total_url_bookmark_count));
+
+  if (stats.duplicate_url_bookmark_count != 0) {
+    base::UmaHistogramCounts100000(
+        "Bookmarks.Count.OnProfileLoad.DuplicateUrl2",
+        base::saturated_cast<int>(stats.duplicate_url_bookmark_count));
+  }
+
+  if (stats.duplicate_url_and_title_bookmark_count != 0) {
+    base::UmaHistogramCounts100000(
+        "Bookmarks.Count.OnProfileLoad.DuplicateUrlAndTitle",
+        base::saturated_cast<int>(
+            stats.duplicate_url_and_title_bookmark_count));
+  }
+
+  if (stats.duplicate_url_and_title_and_parent_bookmark_count != 0) {
+    base::UmaHistogramCounts100000(
+        "Bookmarks.Count.OnProfileLoad.DuplicateUrlAndTitleAndParent",
+        base::saturated_cast<int>(
+            stats.duplicate_url_and_title_and_parent_bookmark_count));
+  }
+
+  // Log derived metrics for convenience.
+  base::UmaHistogramCounts100000(
+      "Bookmarks.Count.OnProfileLoad.UniqueUrl",
+      base::saturated_cast<int>(stats.total_url_bookmark_count -
+                                stats.duplicate_url_bookmark_count));
+  base::UmaHistogramCounts100000(
+      "Bookmarks.Count.OnProfileLoad.UniqueUrlAndTitle",
+      base::saturated_cast<int>(stats.total_url_bookmark_count -
+                                stats.duplicate_url_and_title_bookmark_count));
+  base::UmaHistogramCounts100000(
+      "Bookmarks.Count.OnProfileLoad.UniqueUrlAndTitleAndParent",
+      base::saturated_cast<int>(
+          stats.total_url_bookmark_count -
+          stats.duplicate_url_and_title_and_parent_bookmark_count));
+}
+
 }  // namespace bookmarks::metrics
\ No newline at end of file
diff --git a/components/bookmarks/common/bookmark_metrics.h b/components/bookmarks/common/bookmark_metrics.h
index 500051c..bd2f05b 100644
--- a/components/bookmarks/common/bookmark_metrics.h
+++ b/components/bookmarks/common/bookmark_metrics.h
@@ -7,7 +7,11 @@
 
 #include "base/time/time.h"
 
-namespace bookmarks::metrics {
+namespace bookmarks {
+
+struct UrlLoadStats;
+
+namespace metrics {
 
 // Records the time since the last save with a 1 hour max. The first save will
 // record the time since startup.
@@ -20,6 +24,11 @@
 // Records size of the bookmark file at startup.
 void RecordFileSizeAtStartup(int64_t total_bytes);
 
-}  // namespace bookmarks::metrics
+// Records the metrics derived from `stats`. Recording happens on profile load.
+void RecordUrlLoadStatsOnProfileLoad(const UrlLoadStats& stats);
+
+}  // namespace metrics
+
+}  // namespace bookmarks
 
 #endif  // COMPONENTS_BOOKMARKS_COMMON_BOOKMARK_METRICS_H_
\ No newline at end of file
diff --git a/components/bookmarks/common/url_load_stats.h b/components/bookmarks/common/url_load_stats.h
new file mode 100644
index 0000000..a3964cd
--- /dev/null
+++ b/components/bookmarks/common/url_load_stats.h
@@ -0,0 +1,30 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_BOOKMARKS_COMMON_URL_LOAD_STATS_H_
+#define COMPONENTS_BOOKMARKS_COMMON_URL_LOAD_STATS_H_
+
+namespace bookmarks {
+
+// Returns some stats about number of URL bookmarks stored, for UMA purposes.
+struct UrlLoadStats {
+  // Number of bookmark in the index excluding folders.
+  size_t total_url_bookmark_count = 0;
+  // Number of bookmarks (excluding folders) with a URL that is used by at
+  // least one other bookmark, excluding one bookmark per unique URL (i.e. all
+  // except one are considered duplicates).
+  size_t duplicate_url_bookmark_count = 0;
+  // Number of bookmarks (excluding folders) with the pair <URL, title> that
+  // is used by at least one other bookmark, excluding one bookmark per unique
+  // URL (i.e. all except one are considered duplicates).
+  size_t duplicate_url_and_title_bookmark_count = 0;
+  // Number of bookmarks (excluding folders) with the triple <URL, title,
+  // parent> that is used by at least one other bookmark, excluding one
+  // bookmark per unique URL (i.e. all except one are considered duplicates).
+  size_t duplicate_url_and_title_and_parent_bookmark_count = 0;
+};
+
+}  // namespace bookmarks
+
+#endif  // COMPONENTS_BOOKMARKS_COMMON_URL_LOAD_STATS_H_
\ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings.grd b/components/browser_ui/strings/android/browser_ui_strings.grd
index 5534a54e..54aaef5 100644
--- a/components/browser_ui/strings/android/browser_ui_strings.grd
+++ b/components/browser_ui/strings/android/browser_ui_strings.grd
@@ -460,6 +460,9 @@
       <message name="IDS_PAGE_INFO_ABOUT_THIS_SITE_TITLE" desc="The title label of the 'About this site' subpage in Page Info bubble.">
         From the web
       </message>
+      <message name="IDS_PAGE_INFO_ABOUT_THIS_PAGE_TITLE" desc="The title of the 'About this page' row in the Page Info bubble.">
+        About this page
+      </message>
       <message name="IDS_PAGE_INFO_ABOUT_THIS_SITE_SUBPAGE_FROM_LABEL" desc="The label containing the source of the description in the 'About this site' subpage in Page Info bubble.">
         From <ph name="SOURCE_NAME">%1$s<ex>Wikipedia</ex></ph>
       </message>
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_ABOUT_THIS_PAGE_TITLE.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_ABOUT_THIS_PAGE_TITLE.png.sha1
new file mode 100644
index 0000000..cf0d5cd
--- /dev/null
+++ b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_ABOUT_THIS_PAGE_TITLE.png.sha1
@@ -0,0 +1 @@
+615c239640a2d400f684595cfdfe5716b11e8417
\ No newline at end of file
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index 30de5698..be54334 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "10.5",
-  "log_list_timestamp": "2022-06-07T12:58:08Z",
+  "version": "10.6",
+  "log_list_timestamp": "2022-06-08T12:56:00Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
index 2bd333c..6cac1897 100644
--- a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
+++ b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
@@ -1257,7 +1257,7 @@
             callback.RunAndGetResult().request_status);
 
   // Wait for model to unload and reattach surface. New content is loaded.
-  task_environment_.FastForwardBy(base::Seconds(5));
+  WaitForModelToAutoUnload();
   surface.Attach(stream_.get());
   WaitForIdleTaskQueue();
   ASSERT_EQ("loading -> 3 slices", surface.DescribeUpdates());
@@ -2435,7 +2435,7 @@
 
   for_you_surface.Detach();
 
-  task_environment_.FastForwardBy(base::Seconds(2));
+  WaitForModelToAutoUnload();
   WaitForIdleTaskQueue();
 
   EXPECT_TRUE(stream_->GetModel(kWebFeedStream));
@@ -3146,6 +3146,122 @@
                                       .info_card_tracking_state(1)));
 }
 
+TEST_F(FeedApiTest, InvalidateFeedCache_CauseRefreshOnNextLoad) {
+  // Load the ForYou feed with initial content from the network.
+  response_translator_.InjectResponse(MakeTypicalInitialModelState());
+  TestForYouSurface surface(stream_.get());
+  WaitForIdleTaskQueue();
+  EXPECT_TRUE(response_translator_.InjectedResponseConsumed());
+  ASSERT_EQ("loading -> [user@foo] 2 slices", surface.DescribeUpdates());
+
+  // Invalidate cached content and reattach the surface, waiting for the model
+  // to unload. It should refresh from the network with refreshed content.
+  response_translator_.InjectResponse(MakeTypicalRefreshModelState());
+  stream_->InvalidateContentCacheFor(StreamKind::kForYou);
+  surface.Detach();
+  WaitForModelToAutoUnload();
+  surface.Attach(stream_.get());
+  WaitForIdleTaskQueue();
+  EXPECT_TRUE(response_translator_.InjectedResponseConsumed());
+  ASSERT_EQ("loading -> 3 slices", surface.DescribeUpdates());
+}
+
+TEST_F(FeedApiTest, InvalidateFeedCache_DoesNotForceRefreshFeedWhileInUse) {
+  // Load the ForYou feed with initial content from the network.
+  response_translator_.InjectResponse(MakeTypicalInitialModelState());
+  TestForYouSurface surface(stream_.get());
+  WaitForIdleTaskQueue();
+  EXPECT_TRUE(response_translator_.InjectedResponseConsumed());
+  ASSERT_EQ("loading -> [user@foo] 2 slices", surface.DescribeUpdates());
+
+  // Invalidate the ForYou feed and verify nothing changes right away.
+  response_translator_.InjectResponse(MakeTypicalRefreshModelState());
+  stream_->InvalidateContentCacheFor(StreamKind::kForYou);
+  WaitForIdleTaskQueue();
+  ASSERT_EQ("", surface.DescribeUpdates());
+  EXPECT_FALSE(response_translator_.InjectedResponseConsumed());
+}
+
+TEST_F(FeedApiTest, InvalidateFeedCache_UnknownDoesNotForceRefreshAnyFeeds) {
+  // Enable WebFeed and WebFeedOnboarding flags to force WebFeed to fetch
+  // without subscriptions.
+  base::test::ScopedFeatureList features;
+  std::vector<base::Feature> enabled_features = {kWebFeed, kWebFeedOnboarding},
+                             disabled_features = {};
+  features.InitWithFeatures(enabled_features, disabled_features);
+  {
+    // Load both feeds and allow them to fetch network contents.
+    response_translator_.InjectResponse(MakeTypicalInitialModelState());
+    response_translator_.InjectResponse(MakeTypicalInitialModelState());
+    TestForYouSurface for_you_surface(stream_.get());
+    TestWebFeedSurface web_feed_surface(stream_.get());
+    WaitForIdleTaskQueue();
+    ASSERT_EQ("loading -> [user@foo] 2 slices",
+              for_you_surface.DescribeUpdates());
+    ASSERT_EQ("loading -> [user@foo] 2 slices",
+              web_feed_surface.DescribeUpdates());
+    EXPECT_TRUE(response_translator_.InjectedResponseConsumed());
+  }
+
+  // Both surfaces have been destroyed, so wait for the model to unload.
+  WaitForModelToAutoUnload();
+
+  // Invalidate with an unknown feed and recreate both surfaces. None should
+  // refresh from network.
+  response_translator_.InjectResponse(MakeTypicalRefreshModelState());
+  stream_->InvalidateContentCacheFor(StreamKind::kUnknown);
+  {
+    TestForYouSurface for_you_surface(stream_.get());
+    TestWebFeedSurface web_feed_surface(stream_.get());
+    WaitForIdleTaskQueue();
+    ASSERT_EQ("loading -> [user@foo] 2 slices",
+              for_you_surface.DescribeUpdates());
+    ASSERT_EQ("loading -> [user@foo] 2 slices",
+              web_feed_surface.DescribeUpdates());
+  }
+  EXPECT_FALSE(response_translator_.InjectedResponseConsumed());
+}
+
+TEST_F(FeedApiTest, InvalidateFeedCache_DoesNotRefreshOtherFeed) {
+  // Enable WebFeed and WebFeedOnboarding flags to force WebFeed to fetch
+  // without subscriptions.
+  base::test::ScopedFeatureList features;
+  std::vector<base::Feature> enabled_features = {kWebFeed, kWebFeedOnboarding},
+                             disabled_features = {};
+  features.InitWithFeatures(enabled_features, disabled_features);
+  {
+    // Load both feeds and allow them to fetch network contents.
+    response_translator_.InjectResponse(MakeTypicalInitialModelState());
+    response_translator_.InjectResponse(MakeTypicalInitialModelState());
+    TestForYouSurface for_you_surface(stream_.get());
+    TestWebFeedSurface web_feed_surface(stream_.get());
+    WaitForIdleTaskQueue();
+    ASSERT_EQ("loading -> [user@foo] 2 slices",
+              for_you_surface.DescribeUpdates());
+    ASSERT_EQ("loading -> [user@foo] 2 slices",
+              web_feed_surface.DescribeUpdates());
+    EXPECT_TRUE(response_translator_.InjectedResponseConsumed());
+  }
+
+  // Both surfaces have been destroyed, so wait for the model to unload.
+  WaitForModelToAutoUnload();
+
+  // Invalidate only the WebFeed feed and recreate both surfaces. Only the
+  // WebFeed should refresh from network.
+  response_translator_.InjectResponse(MakeTypicalRefreshModelState());
+  stream_->InvalidateContentCacheFor(StreamKind::kFollowing);
+  {
+    TestForYouSurface for_you_surface(stream_.get());
+    TestWebFeedSurface web_feed_surface(stream_.get());
+    WaitForIdleTaskQueue();
+    ASSERT_EQ("loading -> [user@foo] 2 slices",
+              for_you_surface.DescribeUpdates());
+    ASSERT_EQ("loading -> [user@foo] 3 slices",
+              web_feed_surface.DescribeUpdates());
+  }
+  EXPECT_TRUE(response_translator_.InjectedResponseConsumed());
+}
+
 // Keep instantiations at the bottom.
 INSTANTIATE_TEST_SUITE_P(FeedApiTest,
                          FeedStreamTestForAllStreamTypes,
diff --git a/components/feed/core/v2/api_test/feed_api_test.cc b/components/feed/core/v2/api_test/feed_api_test.cc
index 835e2ca5..5a2261f9 100644
--- a/components/feed/core/v2/api_test/feed_api_test.cc
+++ b/components/feed/core/v2/api_test/feed_api_test.cc
@@ -960,6 +960,11 @@
       }));
 }
 
+void FeedApiTest::WaitForModelToAutoUnload() {
+  task_environment_.FastForwardBy(GetFeedConfig().model_unload_timeout +
+                                  base::Seconds(1));
+}
+
 void FeedApiTest::UnloadModel(const StreamType& stream_type) {
   WaitForIdleTaskQueue();
   stream_->UnloadModel(stream_type);
diff --git a/components/feed/core/v2/api_test/feed_api_test.h b/components/feed/core/v2/api_test/feed_api_test.h
index 1159d38a..0ef006e 100644
--- a/components/feed/core/v2/api_test/feed_api_test.h
+++ b/components/feed/core/v2/api_test/feed_api_test.h
@@ -476,6 +476,9 @@
   std::unique_ptr<StreamModel> CreateStreamModel();
   bool IsTaskQueueIdle() const;
   void WaitForIdleTaskQueue();
+  // Fast forwards the task environment enough for the in-memory model to
+  // auto-unload, which will only take place if there are no attached surfaces.
+  void WaitForModelToAutoUnload();
   void UnloadModel(const StreamType& stream_type);
   void FollowWebFeed(const WebFeedPageInformation page_info);
 
diff --git a/components/feed/core/v2/feed_stream.cc b/components/feed/core/v2/feed_stream.cc
index dced816..bdd39b0 100644
--- a/components/feed/core/v2/feed_stream.cc
+++ b/components/feed/core/v2/feed_stream.cc
@@ -669,6 +669,15 @@
                    url) != recent_feed_navigations_.end();
 }
 
+void FeedStream::InvalidateContentCacheFor(StreamKind stream_kind) {
+  if (StreamKind::kForYou == stream_kind) {
+    SetStreamStale(kForYouStream, true);
+  }
+  if (StreamKind::kFollowing == stream_kind) {
+    SetStreamStale(kWebFeedStream, true);
+  }
+}
+
 DebugStreamData FeedStream::GetDebugStreamData() {
   return ::feed::prefs::GetDebugStreamData(*profile_prefs_);
 }
diff --git a/components/feed/core/v2/feed_stream.h b/components/feed/core/v2/feed_stream.h
index e936811..b416ff54 100644
--- a/components/feed/core/v2/feed_stream.h
+++ b/components/feed/core/v2/feed_stream.h
@@ -144,6 +144,7 @@
   void ProcessViewAction(base::StringPiece data,
                          const LoggingParameters& logging_parameters) override;
   bool WasUrlRecentlyNavigatedFromFeed(const GURL& url) override;
+  void InvalidateContentCacheFor(StreamKind stream_kind) override;
   DebugStreamData GetDebugStreamData() override;
   void ForceRefreshForDebugging(const StreamType& stream_type) override;
   std::string DumpStateForDebugging() override;
diff --git a/components/feed/core/v2/public/feed_api.h b/components/feed/core/v2/public/feed_api.h
index fd7440c6..d5d27e7 100644
--- a/components/feed/core/v2/public/feed_api.h
+++ b/components/feed/core/v2/public/feed_api.h
@@ -149,6 +149,11 @@
   // navigated to by the user.
   virtual bool WasUrlRecentlyNavigatedFromFeed(const GURL& url) = 0;
 
+  // Requests that the cache of the feed identified by |stream_kind| be
+  // invalidated so that its contents are re-fetched the next time that feed is
+  // shown/loaded.
+  virtual void InvalidateContentCacheFor(StreamKind stream_kind) = 0;
+
   // User interaction reporting. Unless otherwise documented, these have no
   // side-effects other than reporting metrics.
 
diff --git a/components/feed/core/v2/public/test/stub_feed_api.h b/components/feed/core/v2/public/test/stub_feed_api.h
index 6f3018a..24111adf7 100644
--- a/components/feed/core/v2/public/test/stub_feed_api.h
+++ b/components/feed/core/v2/public/test/stub_feed_api.h
@@ -71,6 +71,7 @@
                          const LoggingParameters& logging_parameters) override {
   }
   bool WasUrlRecentlyNavigatedFromFeed(const GURL& url) override;
+  void InvalidateContentCacheFor(StreamKind stream_kind) override {}
   void ReportSliceViewed(SurfaceId surface_id,
                          const StreamType& stream_type,
                          const std::string& slice_id) override {}
diff --git a/components/flags_ui/feature_entry.cc b/components/flags_ui/feature_entry.cc
index 882dc41b..e48ea7c 100644
--- a/components/flags_ui/feature_entry.cc
+++ b/components/flags_ui/feature_entry.cc
@@ -42,6 +42,10 @@
     case FeatureEntry::ENABLE_DISABLE_VALUE:
     case FeatureEntry::FEATURE_VALUE:
     case FeatureEntry::FEATURE_WITH_PARAMS_VALUE:
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+    case FeatureEntry::PLATFORM_FEATURE_NAME_VALUE:
+    case FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE:
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
       // Check that the pattern matches what's produced by NameForOption().
       int index = -1;
       return name.size() > internal_name_length + 1 &&
@@ -55,11 +59,17 @@
   switch (type) {
     case ENABLE_DISABLE_VALUE:
     case FEATURE_VALUE:
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+    case PLATFORM_FEATURE_NAME_VALUE:
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
       return 3;
     case MULTI_VALUE:
       return choices.size();
     case FEATURE_WITH_PARAMS_VALUE:
-      return 3 + feature.feature_variations.size();
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+    case PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE:
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+      return 3 + GetVariations().size();
     default:
       return 0;
   }
@@ -69,7 +79,12 @@
   DCHECK(type == FeatureEntry::MULTI_VALUE ||
          type == FeatureEntry::ENABLE_DISABLE_VALUE ||
          type == FeatureEntry::FEATURE_VALUE ||
-         type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE);
+         type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+         || type == FeatureEntry::PLATFORM_FEATURE_NAME_VALUE ||
+         type == FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+  );
   DCHECK_LT(index, NumOptions());
   return std::string(internal_name) + testing::kMultiSeparator +
          base::NumberToString(index);
@@ -83,18 +98,31 @@
   DCHECK(type == FeatureEntry::MULTI_VALUE ||
          type == FeatureEntry::ENABLE_DISABLE_VALUE ||
          type == FeatureEntry::FEATURE_VALUE ||
-         type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE);
+         type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+         || type == FeatureEntry::PLATFORM_FEATURE_NAME_VALUE ||
+         type == FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+  );
   DCHECK_LT(index, NumOptions());
   const char* description = nullptr;
   if (type == FeatureEntry::ENABLE_DISABLE_VALUE ||
-      type == FeatureEntry::FEATURE_VALUE) {
+      type == FeatureEntry::FEATURE_VALUE
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+      || type == FeatureEntry::PLATFORM_FEATURE_NAME_VALUE
+#endif
+  ) {
     const char* const kEnableDisableDescriptions[] = {
         kGenericExperimentChoiceDefault,
         kGenericExperimentChoiceEnabled,
         kGenericExperimentChoiceDisabled,
     };
     description = kEnableDisableDescriptions[index];
-  } else if (type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE) {
+  } else if (type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+             || type == FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE
+#endif
+  ) {
     if (index == 0) {
       description = kGenericExperimentChoiceDefault;
     } else if (index == 1) {
@@ -102,9 +130,9 @@
     } else if (index < NumOptions() - 1) {
       // First two options do not have variations params.
       int variation_index = index - 2;
-      return base::ASCIIToUTF16(base::StrCat(
-          {kGenericExperimentChoiceEnabled, " ",
-           feature.feature_variations[variation_index].description_text}));
+      return base::ASCIIToUTF16(
+          base::StrCat({kGenericExperimentChoiceEnabled, " ",
+                        GetVariations()[variation_index].description_text}));
     } else {
       DCHECK_EQ(NumOptions() - 1, index);
       description = kGenericExperimentChoiceDisabled;
@@ -124,7 +152,12 @@
 
 FeatureEntry::FeatureState FeatureEntry::StateForOption(int index) const {
   DCHECK(type == FeatureEntry::FEATURE_VALUE ||
-         type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE);
+         type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+         || type == FeatureEntry::PLATFORM_FEATURE_NAME_VALUE ||
+         type == FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE
+#endif
+  );
   DCHECK_LT(index, NumOptions());
 
   if (index == 0)
@@ -137,16 +170,27 @@
 const FeatureEntry::FeatureVariation* FeatureEntry::VariationForOption(
     int index) const {
   DCHECK(type == FeatureEntry::FEATURE_VALUE ||
-         type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE);
+         type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+         || type == FeatureEntry::PLATFORM_FEATURE_NAME_VALUE ||
+         type == FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE
+#endif
+  );
   DCHECK_LT(index, NumOptions());
 
-  if (type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE && index > 1 &&
-      index < NumOptions() - 1) {
-    // We have no variations for FEATURE_VALUE type. Option at |index|
-    // corresponds to variation at |index| - 2 as the list starts with "Default"
-    // and "Enabled" (with default parameters).
-    return &feature.feature_variations[index - 2];
+  if ((type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+       || type == FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE
+#endif
+       ) &&
+      index > 1 && index < NumOptions() - 1) {
+    // We have no variations for FEATURE_VALUE type or
+    // PLATFORM_FEATURE_NAME_VALUE type. Option at |index| corresponds to
+    // variation at |index| - 2 as the list starts with "Default" and "Enabled"
+    // (with default parameters).
+    return &GetVariations()[index - 2];
   }
+
   return nullptr;
 }
 
@@ -208,11 +252,47 @@
         return false;
       }
       return true;
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+    case FeatureEntry::PLATFORM_FEATURE_NAME_VALUE:
+      if (!platform_feature_name.name) {
+        LOG(ERROR) << "no feature name is set";
+        return false;
+      }
+      return true;
+    case FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE:
+      if (!platform_feature_name.name) {
+        LOG(ERROR) << "no feature name is set";
+        return false;
+      }
+      if (platform_feature_name.feature_variations.size() == 0) {
+        LOG(ERROR) << "feature_variations is empty";
+        return false;
+      }
+      if (!platform_feature_name.feature_trial_name) {
+        LOG(ERROR) << "feature_trial_name is null";
+        return false;
+      }
+      return true;
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
   }
   NOTREACHED();
   return false;
 }
 
+const base::span<const FeatureEntry::FeatureVariation>
+FeatureEntry::GetVariations() const {
+  if (type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE) {
+    return feature.feature_variations;
+  }
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  if (type == FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE) {
+    return platform_feature_name.feature_variations;
+  }
+#endif
+  NOTREACHED();
+  return base::span<const FeatureEntry::FeatureVariation>();
+}
+
 namespace testing {
 
 const char kMultiSeparator[] = {kMultiSeparatorChar, '\0'};
diff --git a/components/flags_ui/feature_entry.h b/components/flags_ui/feature_entry.h
index f61a438b..855e9ec 100644
--- a/components/flags_ui/feature_entry.h
+++ b/components/flags_ui/feature_entry.h
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "base/containers/span.h"
+#include "build/chromeos_buildflags.h"
 
 namespace base {
 struct Feature;
@@ -80,6 +81,32 @@
     // of url::Origins. (Lists will not be reordered.) Default state is
     // disabled like SINGLE_VALUE.
     ORIGIN_LIST_VALUE,
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+    // The below two types are for *platform* features -- that is, those defined
+    // and queried via platform2/featured/feature_library.h. Such features
+    // should be defined outside of the browser (e.g., in platform2 or
+    // platform) using a compile-time-constant default value and name.
+    // See feature_library.h for more documentation.
+
+    // Corresponds to a feature *name*, starting with "CrOSLateBoot", for a
+    // platform feature.
+    //
+    // Broadly similar to FEATURE_VALUE, but we cannot define |base::Feature|s
+    // starting with CrOSLateBoot in the browser directly -- they must instead
+    // be defined and queried outside of the browser, using
+    // platform2/featured/feature_library.h.
+    PLATFORM_FEATURE_NAME_VALUE,
+
+    // Corresponds to a feature *name*, starting with "CrOSLateBoot", for a
+    // platform feature, along with its parameters.
+    //
+    // Broadly similar to FEATURE_WITH_PARAMS_VALUE, but we cannot define
+    // |base::Feature|s starting with CrOSLateBoot in the browser directly --
+    // they must instead be defined and queried outside of the browser, using
+    // platform2/featured/feature_library.h.
+    PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE,
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
   };
 
   // Describes state of a feature.
@@ -181,6 +208,25 @@
       const char* feature_trial_name;
     } feature;
 
+    struct {
+      // For PLATFORM_FEATURE_NAME_TYPE or
+      // PLATFORM_FEATURE_WITH_PARAMS_VALUE_TYPE, the name of the feature this
+      // entry corresponds to. The same feature must not be used in multiple
+      // FeatureEntries.
+      const char* name;
+
+      // This describes the options if type is
+      // PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE.
+      // The first variation is the default "Enabled" variation, its
+      // description_id is disregarded.
+      base::span<const FeatureVariation> feature_variations;
+
+      // The name of the FieldTrial in which the selected variation parameters
+      // should be registered. This is used if type is
+      // PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE.
+      const char* feature_trial_name;
+    } platform_feature_name;
+
     // This describes the options if type is MULTI_VALUE.
     base::span<const Choice> choices;
   };
@@ -218,6 +264,10 @@
   // Returns true if the entry is considered as valid.
   // See the implenetation for the details of what is valid.
   bool IsValid() const;
+
+  // Returns the variation list. Type must be either
+  // FEATURE_WITH_PARAMS_VALUE or PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE.
+  const base::span<const FeatureVariation> GetVariations() const;
 };
 
 namespace testing {
diff --git a/components/flags_ui/feature_entry_macros.h b/components/flags_ui/feature_entry_macros.h
index accb85c..6a0e37e 100644
--- a/components/flags_ui/feature_entry_macros.h
+++ b/components/flags_ui/feature_entry_macros.h
@@ -4,7 +4,7 @@
 
 #ifndef COMPONENTS_FLAGS_UI_FEATURE_ENTRY_MACROS_H_
 #define COMPONENTS_FLAGS_UI_FEATURE_ENTRY_MACROS_H_
-
+#include "build/chromeos_buildflags.h"
 
 // Macros to simplify specifying the type of FeatureEntry. Please refer to
 // the comments on FeatureEntry::Type in feature_entry.h, which explain the
@@ -44,4 +44,16 @@
     .feature = { &feature_entry, feature_variations, feature_trial }      \
   }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#define PLATFORM_FEATURE_NAME_TYPE(name)                 \
+  flags_ui::FeatureEntry::PLATFORM_FEATURE_NAME_VALUE, { \
+    .platform_feature_name = { name, {}, nullptr }       \
+  }
+#define PLATFORM_FEATURE_WITH_PARAMS_VALUE_TYPE(name, feature_variations, \
+                                                feature_trial)            \
+  flags_ui::FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE, {      \
+    .platform_feature_name = { name, feature_variations, feature_trial }  \
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
 #endif  // COMPONENTS_FLAGS_UI_FEATURE_ENTRY_MACROS_H_
diff --git a/components/flags_ui/flags_state.cc b/components/flags_ui/flags_state.cc
index c3666aaf..f8b4990 100644
--- a/components/flags_ui/flags_state.cc
+++ b/components/flags_ui/flags_state.cc
@@ -12,6 +12,7 @@
 #include "base/containers/contains.h"
 #include "base/containers/span.h"
 #include "base/feature_list.h"
+#include "base/feature_list_buildflags.h"
 #include "base/logging.h"
 #include "base/metrics/field_trial.h"
 #include "base/stl_util.h"
@@ -21,7 +22,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "components/flags_ui/feature_entry.h"
 #include "components/flags_ui/flags_storage.h"
 #include "components/flags_ui/flags_ui_switches.h"
@@ -79,6 +79,10 @@
     case FeatureEntry::ENABLE_DISABLE_VALUE:
     case FeatureEntry::FEATURE_VALUE:
     case FeatureEntry::FEATURE_WITH_PARAMS_VALUE:
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+    case FeatureEntry::PLATFORM_FEATURE_NAME_VALUE:
+    case FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE:
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
       for (int i = 0; i < entry.NumOptions(); ++i) {
         if (enabled_entries.count(entry.NameForOption(i)) > 0)
           return false;
@@ -95,7 +99,12 @@
   DCHECK(entry.type == FeatureEntry::MULTI_VALUE ||
          entry.type == FeatureEntry::ENABLE_DISABLE_VALUE ||
          entry.type == FeatureEntry::FEATURE_VALUE ||
-         entry.type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE);
+         entry.type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+         || entry.type == FeatureEntry::PLATFORM_FEATURE_NAME_VALUE ||
+         entry.type == FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+  );
   base::Value result(base::Value::Type::LIST);
   for (int i = 0; i < entry.NumOptions(); ++i) {
     base::Value value(base::Value::Type::DICTIONARY);
@@ -499,14 +508,29 @@
 
   // First collect all the data for each trial.
   for (const FeatureEntry& entry : feature_entries) {
-    if (entry.type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE) {
+    if (entry.type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+        || entry.type == FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+    ) {
       for (int j = 0; j < entry.NumOptions(); ++j) {
         if (entry.StateForOption(j) == FeatureEntry::FeatureState::ENABLED &&
             enabled_entries.count(entry.NameForOption(j))) {
-          std::string trial_name = entry.feature.feature_trial_name;
-          // The user has chosen to enable the feature by this option.
-          enabled_features_by_trial_name[trial_name].insert(
-              entry.feature.feature->name);
+          std::string trial_name;
+          if (entry.type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE) {
+            trial_name = entry.feature.feature_trial_name;
+            // The user has chosen to enable the feature by this option.
+            enabled_features_by_trial_name[trial_name].insert(
+                entry.feature.feature->name);
+          }
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+          else {
+            trial_name = entry.platform_feature_name.feature_trial_name;
+            // The user has chosen to enable the feature by this option.
+            enabled_features_by_trial_name[trial_name].insert(
+                entry.platform_feature_name.name);
+          }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
           const FeatureEntry::FeatureVariation* variation =
               entry.VariationForOption(j);
@@ -602,6 +626,10 @@
       case FeatureEntry::ENABLE_DISABLE_VALUE:
       case FeatureEntry::FEATURE_VALUE:
       case FeatureEntry::FEATURE_WITH_PARAMS_VALUE:
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+      case FeatureEntry::PLATFORM_FEATURE_NAME_VALUE:
+      case FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE:
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
         data.SetKey("options", CreateOptionsData(entry, enabled_entries));
         break;
     }
@@ -612,7 +640,18 @@
         (entry.supported_platforms & kOsCrOSOwnerOnly) != 0) {
       supported = true;
     }
-#endif
+
+#if BUILDFLAG(ENABLE_BANNED_BASE_FEATURE_PREFIX)
+    if ((entry.type == FeatureEntry::PLATFORM_FEATURE_NAME_VALUE ||
+         entry.type == FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE) &&
+        !base::StartsWith(entry.platform_feature_name.name,
+                          BUILDFLAG(BANNED_BASE_FEATURE_PREFIX))) {
+      LOG(ERROR) << "mising required prefix for "
+                 << entry.platform_feature_name.name;
+      supported = false;
+    }
+#endif  // BUILDFLAG(ENABLED_BANNED_BASE_FEATURE_PREFIX)
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
     if (supported)
       supported_entries.push_back(std::move(data));
@@ -850,6 +889,10 @@
 
       case FeatureEntry::FEATURE_VALUE:
       case FeatureEntry::FEATURE_WITH_PARAMS_VALUE:
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+      case FeatureEntry::PLATFORM_FEATURE_NAME_VALUE:
+      case FeatureEntry::PLATFORM_FEATURE_NAME_WITH_PARAMS_VALUE:
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
         for (int j = 0; j < entry.NumOptions(); ++j) {
           FeatureEntry::FeatureState state = entry.StateForOption(j);
           if (state == FeatureEntry::FeatureState::DEFAULT) {
@@ -858,7 +901,16 @@
           } else {
             const FeatureEntry::FeatureVariation* variation =
                 entry.VariationForOption(j);
-            std::string feature_name(entry.feature.feature->name);
+            std::string feature_name;
+            if (entry.type == FeatureEntry::FEATURE_VALUE ||
+                entry.type == FeatureEntry::FEATURE_WITH_PARAMS_VALUE) {
+              feature_name = entry.feature.feature->name;
+            }
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+            else {
+              feature_name = entry.platform_feature_name.name;
+            }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
             std::vector<std::string> params_value;
 
             std::string variation_id;
diff --git a/components/keyed_service/core/dependency_manager.cc b/components/keyed_service/core/dependency_manager.cc
index 553c937..d8409ef 100644
--- a/components/keyed_service/core/dependency_manager.cc
+++ b/components/keyed_service/core/dependency_manager.cc
@@ -193,3 +193,7 @@
   base::WriteFile(dot_file, contents.c_str(), contents.size());
 }
 #endif  // NDEBUG
+
+DependencyGraph& DependencyManager::GetDependencyGraphForTesting() {
+  return dependency_graph_;
+}
\ No newline at end of file
diff --git a/components/keyed_service/core/dependency_manager.h b/components/keyed_service/core/dependency_manager.h
index b2712da..bee06bcd2 100644
--- a/components/keyed_service/core/dependency_manager.h
+++ b/components/keyed_service/core/dependency_manager.h
@@ -42,6 +42,9 @@
       DependencyManager* dependency_manager2,
       void* context2);
 
+  // Returns the dependency graph for Keyed Services Factory testing purposes.
+  DependencyGraph& GetDependencyGraphForTesting();
+
  protected:
   DependencyManager();
   virtual ~DependencyManager();
diff --git a/components/keyed_service/core/keyed_service_base_factory.h b/components/keyed_service/core/keyed_service_base_factory.h
index a8fa2e3a..b0d544d 100644
--- a/components/keyed_service/core/keyed_service_base_factory.h
+++ b/components/keyed_service/core/keyed_service_base_factory.h
@@ -48,6 +48,9 @@
   // factories with different type of context, or dependencies are safe to have.
   Type type() { return type_; }
 
+  // Returns whether the service is created for the given context.
+  virtual bool IsServiceCreated(void* context) const = 0;
+
  protected:
   KeyedServiceBaseFactory(const char* service_name,
                           DependencyManager* manager,
diff --git a/components/keyed_service/core/keyed_service_factory.cc b/components/keyed_service/core/keyed_service_factory.cc
index c7e1664a..f19ee6c 100644
--- a/components/keyed_service/core/keyed_service_factory.cc
+++ b/components/keyed_service/core/keyed_service_factory.cc
@@ -122,3 +122,7 @@
 bool KeyedServiceFactory::HasTestingFactory(void* context) {
   return base::Contains(testing_factories_, context);
 }
+
+bool KeyedServiceFactory::IsServiceCreated(void* context) const {
+  return base::Contains(mapping_, context);
+}
\ No newline at end of file
diff --git a/components/keyed_service/core/keyed_service_factory.h b/components/keyed_service/core/keyed_service_factory.h
index e0e4be7..c6d5d84e 100644
--- a/components/keyed_service/core/keyed_service_factory.h
+++ b/components/keyed_service/core/keyed_service_factory.h
@@ -80,6 +80,7 @@
 
   void SetEmptyTestingFactory(void* context) override;
   bool HasTestingFactory(void* context) override;
+  bool IsServiceCreated(void* context) const override;
 
  private:
   friend class DependencyManager;
diff --git a/components/keyed_service/core/refcounted_keyed_service_factory.cc b/components/keyed_service/core/refcounted_keyed_service_factory.cc
index b01fd6f..20b2109 100644
--- a/components/keyed_service/core/refcounted_keyed_service_factory.cc
+++ b/components/keyed_service/core/refcounted_keyed_service_factory.cc
@@ -124,3 +124,7 @@
 void RefcountedKeyedServiceFactory::CreateServiceNow(void* context) {
   GetServiceForContext(context, true);
 }
+
+bool RefcountedKeyedServiceFactory::IsServiceCreated(void* context) const {
+  return base::Contains(mapping_, context);
+}
\ No newline at end of file
diff --git a/components/keyed_service/core/refcounted_keyed_service_factory.h b/components/keyed_service/core/refcounted_keyed_service_factory.h
index 347df0b22..1f70cfcc 100644
--- a/components/keyed_service/core/refcounted_keyed_service_factory.h
+++ b/components/keyed_service/core/refcounted_keyed_service_factory.h
@@ -87,6 +87,7 @@
   void SetEmptyTestingFactory(void* context) override;
   bool HasTestingFactory(void* context) override;
   void CreateServiceNow(void* context) override;
+  bool IsServiceCreated(void* context) const override;
 
  private:
   // The mapping between a context and its refcounted service.
diff --git a/components/omnibox/browser/BUILD.gn b/components/omnibox/browser/BUILD.gn
index b2c4b149..db43825 100644
--- a/components/omnibox/browser/BUILD.gn
+++ b/components/omnibox/browser/BUILD.gn
@@ -258,7 +258,6 @@
     "//components/keyed_service/core",
     "//components/metrics",
     "//components/navigation_metrics",
-    "//components/ntp_tiles",
     "//components/open_from_clipboard",
     "//components/pref_registry",
     "//components/prefs",
diff --git a/components/omnibox/browser/DEPS b/components/omnibox/browser/DEPS
index 18dc0e29..1e55da03 100644
--- a/components/omnibox/browser/DEPS
+++ b/components/omnibox/browser/DEPS
@@ -18,7 +18,6 @@
   "+components/keyed_service/core",
   "+components/metrics",
   "+components/navigation_metrics",
-  "+components/ntp_tiles",
   "+components/open_from_clipboard",
   "+components/pref_registry",
   "+components/prefs",
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc
index a21a36f..fba4727 100644
--- a/components/omnibox/browser/autocomplete_controller.cc
+++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -301,8 +301,10 @@
   }
   if (provider_types & AutocompleteProvider::TYPE_BUILTIN)
     providers_.push_back(new BuiltinProvider(provider_client_.get()));
-  if (provider_types & AutocompleteProvider::TYPE_HISTORY_QUICK)
-    providers_.push_back(new HistoryQuickProvider(provider_client_.get()));
+  if (provider_types & AutocompleteProvider::TYPE_HISTORY_QUICK) {
+    history_quick_provider_ = new HistoryQuickProvider(provider_client_.get());
+    providers_.push_back(history_quick_provider_.get());
+  }
   if (provider_types & AutocompleteProvider::TYPE_KEYWORD) {
     keyword_provider_ = new KeywordProvider(provider_client_.get(), this);
     providers_.push_back(keyword_provider_.get());
@@ -452,11 +454,12 @@
   expire_timer_.Stop();
   stop_timer_.Stop();
 
-  // Start the new query.
+  // Start the new query. Starter Pack engines in keyword mode only run a subset
+  // of the providers, so call `GetProvidersToRun()` to determine the subset or
+  // if we run all providers.
   in_start_ = true;
   base::TimeTicks start_time = base::TimeTicks::Now();
-  Providers providers_to_run = GetProvidersToRun();
-  for (const auto& provider : providers_to_run) {
+  for (const auto& provider : GetProvidersToRun()) {
     base::TimeTicks provider_start_time = base::TimeTicks::Now();
     provider->Start(input_, minimal_changes);
     if (!input.want_asynchronous_matches())
@@ -534,7 +537,10 @@
     return;
   }
 
-  for (auto provider : providers_) {
+  // Starter Pack engines in keyword mode only run a subset of the providers, so
+  // call `GetProvidersToRun()` to determine the subset or if we run all
+  // providers (the Default case).
+  for (auto provider : GetProvidersToRun()) {
     provider->StartPrefetch(input);
   }
 }
@@ -1161,13 +1167,25 @@
     const TemplateURL* keyword_turl =
         KeywordProvider::GetSubstitutingTemplateURLForInput(
             template_url_service_, &keyword_input);
-    if (keyword_turl &&
-        keyword_turl->starter_pack_id() ==
-            TemplateURLStarterPackData::StarterPackID::kBookmarks) {
-      Providers provider_subset;
+    Providers provider_subset;
+    if (keyword_turl && keyword_turl->starter_pack_id() > 0) {
+      // Search provider and keyword provider are still run because we would
+      // lose the suggestion the keyword chip is attached to otherwise. Search
+      // provider suggestions are curbed for starter pack scopes in
+      // `SearchProvider::ShouldCurbDefaultSuggestions()`.
       provider_subset.push_back(search_provider_.get());
       provider_subset.push_back(keyword_provider_.get());
-      provider_subset.push_back(bookmark_provider_.get());
+
+      switch (keyword_turl->starter_pack_id()) {
+        case TemplateURLStarterPackData::kBookmarks:
+          provider_subset.push_back(bookmark_provider_.get());
+          break;
+        case TemplateURLStarterPackData::kHistory:
+          provider_subset.push_back(history_quick_provider_.get());
+          provider_subset.push_back(history_url_provider_.get());
+          break;
+      }
+
       return provider_subset;
     }
   }
diff --git a/components/omnibox/browser/autocomplete_controller.h b/components/omnibox/browser/autocomplete_controller.h
index 076dea7..18bbee7 100644
--- a/components/omnibox/browser/autocomplete_controller.h
+++ b/components/omnibox/browser/autocomplete_controller.h
@@ -30,6 +30,7 @@
 class ClipboardProvider;
 class DocumentProvider;
 class HistoryURLProvider;
+class HistoryQuickProvider;
 class KeywordProvider;
 class SearchProvider;
 class TemplateURLService;
@@ -332,6 +333,8 @@
 
   raw_ptr<BookmarkProvider> bookmark_provider_;
 
+  raw_ptr<HistoryQuickProvider> history_quick_provider_;
+
   raw_ptr<DocumentProvider> document_provider_;
 
   raw_ptr<HistoryURLProvider> history_url_provider_;
diff --git a/components/omnibox/browser/autocomplete_provider_client.cc b/components/omnibox/browser/autocomplete_provider_client.cc
index 3dd7e9b..88735667 100644
--- a/components/omnibox/browser/autocomplete_provider_client.cc
+++ b/components/omnibox/browser/autocomplete_provider_client.cc
@@ -9,11 +9,6 @@
   return nullptr;
 }
 
-ntp_tiles::MostVisitedSites*
-AutocompleteProviderClient::GetNtpMostVisitedSites() {
-  return nullptr;
-}
-
 bool AutocompleteProviderClient::AllowDeletingBrowserHistory() const {
   return true;
 }
diff --git a/components/omnibox/browser/autocomplete_provider_client.h b/components/omnibox/browser/autocomplete_provider_client.h
index 4b1cc1f..f2b95f1 100644
--- a/components/omnibox/browser/autocomplete_provider_client.h
+++ b/components/omnibox/browser/autocomplete_provider_client.h
@@ -60,10 +60,6 @@
 class TileService;
 }
 
-namespace ntp_tiles {
-class MostVisitedSites;
-}
-
 class TemplateURLService;
 
 class AutocompleteProviderClient : public OmniboxAction::Client {
@@ -79,7 +75,6 @@
   virtual history::HistoryService* GetHistoryService() = 0;
   virtual history_clusters::HistoryClustersService* GetHistoryClustersService();
   virtual scoped_refptr<history::TopSites> GetTopSites() = 0;
-  virtual ntp_tiles::MostVisitedSites* GetNtpMostVisitedSites();
   virtual bookmarks::BookmarkModel* GetBookmarkModel() = 0;
   virtual history::URLDatabase* GetInMemoryDatabase() = 0;
   virtual InMemoryURLIndex* GetInMemoryURLIndex() = 0;
diff --git a/components/omnibox/browser/fake_autocomplete_provider_client.cc b/components/omnibox/browser/fake_autocomplete_provider_client.cc
index 245091a..c0a351a7 100644
--- a/components/omnibox/browser/fake_autocomplete_provider_client.cc
+++ b/components/omnibox/browser/fake_autocomplete_provider_client.cc
@@ -85,8 +85,3 @@
 scoped_refptr<history::TopSites> FakeAutocompleteProviderClient::GetTopSites() {
   return top_sites_;
 }
-
-ntp_tiles::MostVisitedSites*
-FakeAutocompleteProviderClient::GetNtpMostVisitedSites() {
-  return ntp_most_visited_sites_;
-}
diff --git a/components/omnibox/browser/fake_autocomplete_provider_client.h b/components/omnibox/browser/fake_autocomplete_provider_client.h
index 4cf93b7..63b3f72 100644
--- a/components/omnibox/browser/fake_autocomplete_provider_client.h
+++ b/components/omnibox/browser/fake_autocomplete_provider_client.h
@@ -61,7 +61,6 @@
   query_tiles::TileService* GetQueryTileService() const override;
   const TabMatcher& GetTabMatcher() const override;
   scoped_refptr<history::TopSites> GetTopSites() override;
-  ntp_tiles::MostVisitedSites* GetNtpMostVisitedSites() override;
 
   // Test-only setters
   void set_bookmark_model(std::unique_ptr<bookmarks::BookmarkModel> model) {
@@ -80,10 +79,6 @@
     top_sites_ = std::move(top_sites);
   }
 
-  void set_ntp_most_visited_sites(ntp_tiles::MostVisitedSites* ntp_mv_sites) {
-    ntp_most_visited_sites_ = ntp_mv_sites;
-  }
-
   void set_shortcuts_backend(scoped_refptr<ShortcutsBackend> backend) {
     shortcuts_backend_ = std::move(backend);
   }
@@ -100,7 +95,6 @@
   std::unique_ptr<query_tiles::TileService> tile_service_;
   FakeTabMatcher fake_tab_matcher_;
   scoped_refptr<history::TopSites> top_sites_{};
-  raw_ptr<ntp_tiles::MostVisitedSites> ntp_most_visited_sites_{};
 };
 
 #endif  // COMPONENTS_OMNIBOX_BROWSER_FAKE_AUTOCOMPLETE_PROVIDER_CLIENT_H_
diff --git a/components/omnibox/browser/history_quick_provider.cc b/components/omnibox/browser/history_quick_provider.cc
index 8587002..ab80a4c 100644
--- a/components/omnibox/browser/history_quick_provider.cc
+++ b/components/omnibox/browser/history_quick_provider.cc
@@ -27,6 +27,7 @@
 #include "components/omnibox/browser/autocomplete_result.h"
 #include "components/omnibox/browser/history_url_provider.h"
 #include "components/omnibox/browser/in_memory_url_index.h"
+#include "components/omnibox/browser/keyword_provider.h"
 #include "components/omnibox/browser/omnibox_field_trial.h"
 #include "components/omnibox/browser/url_prefix.h"
 #include "components/prefs/pref_service.h"
@@ -55,7 +56,10 @@
   if ((input.type() == metrics::OmniboxInputType::EMPTY))
     return;
 
-  autocomplete_input_ = input;
+  // Remove the keyword from input if we're in keyword mode for a starter pack
+  // engine.
+  autocomplete_input_ = KeywordProvider::AdjustInputForStarterPackEngines(
+      input, client()->GetTemplateURLService());
 
   // TODO(pkasting): We should just block here until this loads.  Any time
   // someone unloads the history backend, we'll get inconsistent inline
diff --git a/components/omnibox/browser/history_quick_provider_unittest.cc b/components/omnibox/browser/history_quick_provider_unittest.cc
index 8a75f32..e0814cf 100644
--- a/components/omnibox/browser/history_quick_provider_unittest.cc
+++ b/components/omnibox/browser/history_quick_provider_unittest.cc
@@ -17,6 +17,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/test/bookmark_test_helpers.h"
@@ -33,9 +34,11 @@
 #include "components/omnibox/browser/history_test_util.h"
 #include "components/omnibox/browser/history_url_provider.h"
 #include "components/omnibox/browser/in_memory_url_index_test_util.h"
+#include "components/omnibox/common/omnibox_features.h"
 #include "components/prefs/pref_service.h"
 #include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/search_terms_data.h"
+#include "components/search_engines/template_url_starter_pack_data.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using base::ASCIIToUTF16;
@@ -204,6 +207,8 @@
   client_->set_in_memory_url_index(std::make_unique<InMemoryURLIndex>(
       client_->GetBookmarkModel(), client_->GetHistoryService(), nullptr,
       history_dir_.GetPath(), SchemeSet()));
+  client_->set_template_url_service(
+      std::make_unique<TemplateURLService>(nullptr, 0));
   client_->GetInMemoryURLIndex()->Init();
   ASSERT_TRUE(client_->GetHistoryService());
 
@@ -909,6 +914,53 @@
   EXPECT_TRUE(ac_match.allowed_to_be_default_match);
 }
 
+TEST_F(HistoryQuickProviderTest, KeywordModeExtractUserInput) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(omnibox::kSiteSearchStarterPack);
+
+  // Populate template URL with starter pack entries
+  std::vector<std::unique_ptr<TemplateURLData>> turls =
+      TemplateURLStarterPackData::GetStarterPackEngines();
+  for (auto& turl : turls) {
+    client().GetTemplateURLService()->Add(
+        std::make_unique<TemplateURL>(std::move(*turl)));
+  }
+  // Test result for user text "google", we should get back a result for google.
+  AutocompleteInput input(u"google", metrics::OmniboxEventProto::OTHER,
+                          TestSchemeClassifier());
+  provider().Start(input, false);
+  if (!provider().done())
+    base::RunLoop().Run();
+
+  ACMatches matches = provider().matches();
+  ASSERT_GT(matches.size(), 0u);
+  EXPECT_EQ(GURL("http://www.google.com/"), matches[0].destination_url);
+
+  // Test result for "@history google" while NOT in keyword mode,
+  // we should not get a result for google since the we're
+  // searching for the whole input text including "@history".
+  AutocompleteInput input2(u"@history google",
+                           metrics::OmniboxEventProto::OTHER,
+                           TestSchemeClassifier());
+  provider().Start(input2, false);
+  if (!provider().done())
+    base::RunLoop().Run();
+
+  matches = provider().matches();
+  ASSERT_EQ(matches.size(), 0u);
+
+  // Turn on keyword mode, test result again, we should get back the result for
+  // google.com since we're searching only for the user text after the keyword.
+  input2.set_prefer_keyword(true);
+  provider().Start(input2, false);
+  if (!provider().done())
+    base::RunLoop().Run();
+
+  matches = provider().matches();
+  ASSERT_GT(matches.size(), 0u);
+  EXPECT_EQ(GURL("http://www.google.com/"), matches[0].destination_url);
+}
+
 // HQPOrderingTest -------------------------------------------------------------
 
 class HQPOrderingTest : public HistoryQuickProviderTest {
diff --git a/components/omnibox/browser/history_url_provider.cc b/components/omnibox/browser/history_url_provider.cc
index 4d8f70b3..8180f05 100644
--- a/components/omnibox/browser/history_url_provider.cc
+++ b/components/omnibox/browser/history_url_provider.cc
@@ -34,6 +34,7 @@
 #include "components/omnibox/browser/autocomplete_result.h"
 #include "components/omnibox/browser/history_provider.h"
 #include "components/omnibox/browser/in_memory_url_index_types.h"
+#include "components/omnibox/browser/keyword_provider.h"
 #include "components/omnibox/browser/omnibox_field_trial.h"
 #include "components/omnibox/browser/url_prefix.h"
 #include "components/omnibox/browser/verbatim_match.h"
@@ -434,33 +435,40 @@
       (input.type() == metrics::OmniboxInputType::EMPTY))
     return;
 
+  // Remove the keyword from input if we're in keyword mode for a starter pack
+  // engine.
+  AutocompleteInput autocomplete_input =
+      KeywordProvider::AdjustInputForStarterPackEngines(
+          input, client()->GetTemplateURLService());
+
   // Do some fixup on the user input before matching against it, so we provide
   // good results for local file paths, input with spaces, etc.
-  const FixupReturn fixup_return(FixupUserInput(input));
+  const FixupReturn fixup_return(FixupUserInput(autocomplete_input));
   if (!fixup_return.first)
     return;
   url::Parsed parts;
   url_formatter::SegmentURL(fixup_return.second, &parts);
-  AutocompleteInput fixed_up_input(input);
+  AutocompleteInput fixed_up_input(autocomplete_input);
   fixed_up_input.UpdateText(fixup_return.second, std::u16string::npos, parts);
 
   // Create a match for what the user typed.
-  const bool trim_http = !AutocompleteInput::HasHTTPScheme(input.text());
+  const bool trim_http =
+      !AutocompleteInput::HasHTTPScheme(autocomplete_input.text());
   AutocompleteMatch what_you_typed_match(
       VerbatimMatchForInput(this, client(), fixed_up_input,
                             fixed_up_input.canonicalized_url(), trim_http));
 
   // If the input fix-up above added characters, show them as an
   // autocompletion, unless directed not to.
-  if (!input.prevent_inline_autocomplete() &&
-      fixed_up_input.text().size() > input.text().size() &&
-      base::StartsWith(fixed_up_input.text(), input.text(),
+  if (!autocomplete_input.prevent_inline_autocomplete() &&
+      fixed_up_input.text().size() > autocomplete_input.text().size() &&
+      base::StartsWith(fixed_up_input.text(), autocomplete_input.text(),
                        base::CompareCase::SENSITIVE)) {
     what_you_typed_match.fill_into_edit = fixed_up_input.text();
     what_you_typed_match.inline_autocompletion =
-        fixed_up_input.text().substr(input.text().size());
+        fixed_up_input.text().substr(autocomplete_input.text().size());
     what_you_typed_match.contents_class.push_back(
-        {input.text().length(), ACMatchClassification::URL});
+        {autocomplete_input.text().length(), ACMatchClassification::URL});
   }
 
   what_you_typed_match.relevance = CalculateRelevance(WHAT_YOU_TYPED, 0);
@@ -492,7 +500,7 @@
   // onto the |params_| member for later deletion below if we need to run pass
   // 2.
   std::unique_ptr<HistoryURLProviderParams> params(new HistoryURLProviderParams(
-      fixed_up_input, input, trim_http, what_you_typed_match,
+      fixed_up_input, autocomplete_input, trim_http, what_you_typed_match,
       default_search_provider, search_terms_data,
       client()->AllowDeletingBrowserHistory()));
 
@@ -516,7 +524,7 @@
 
   // Pass 2: Ask the history service to call us back on the history thread,
   // where we can read the full on-disk DB.
-  if (search_url_database_ && input.want_asynchronous_matches()) {
+  if (search_url_database_ && autocomplete_input.want_asynchronous_matches()) {
     done_ = false;
     params_ = params.release();  // This object will be destroyed in
                                  // QueryComplete() once we're done with it.
diff --git a/components/omnibox/browser/history_url_provider_unittest.cc b/components/omnibox/browser/history_url_provider_unittest.cc
index fa008a1..a1aab3b 100644
--- a/components/omnibox/browser/history_url_provider_unittest.cc
+++ b/components/omnibox/browser/history_url_provider_unittest.cc
@@ -15,6 +15,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -29,11 +30,13 @@
 #include "components/omnibox/browser/fake_autocomplete_provider_client.h"
 #include "components/omnibox/browser/history_quick_provider.h"
 #include "components/omnibox/browser/verbatim_match.h"
+#include "components/omnibox/common/omnibox_features.h"
 #include "components/prefs/pref_service.h"
 #include "components/search_engines/default_search_manager.h"
 #include "components/search_engines/omnibox_focus_type.h"
 #include "components/search_engines/template_url.h"
 #include "components/search_engines/template_url_service.h"
+#include "components/search_engines/template_url_starter_pack_data.h"
 #include "components/url_formatter/url_fixer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
@@ -175,6 +178,9 @@
     {"https://www.zebra.com/zebras", "zebra2", 7, 7, 80},
     {"https://www.zebra.com/zebra s", "zebra3", 7, 7, 80},
     {"https://www.zebra.com/zebra  s", "zebra4", 7, 7, 80},
+
+    // URL with "history" in it, to test the @history starter pack scope.
+    {"https://history.com/", "History.com", 1, 1, 80},
 };
 
 }  // namespace
@@ -284,6 +290,8 @@
       client_->GetBookmarkModel(), client_->GetHistoryService(), nullptr,
       history_dir_.GetPath(), SchemeSet()));
   client_->GetInMemoryURLIndex()->Init();
+  client_->set_template_url_service(
+      std::make_unique<TemplateURLService>(nullptr, 0));
   if (!client_->GetHistoryService())
     return false;
   autocomplete_ = base::MakeRefCounted<HistoryURLProvider>(client_.get(), this);
@@ -1401,3 +1409,63 @@
   AutocompleteMatch match = autocomplete_->HistoryMatchToACMatch(*params, 0, 0);
   EXPECT_EQ(u"facebook.com", match.contents);
 }
+
+// Make sure that user input is trimmed correctly for starter pack keyword mode.
+// In this mode, suggestions should be provided for only the user input after
+// the keyword, i.e. "@history google" should only match "google".
+TEST_F(HistoryURLProviderTest, KeywordModeExtractUserInput) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(omnibox::kSiteSearchStarterPack);
+
+  // Populate template URL with starter pack entries
+  std::vector<std::unique_ptr<TemplateURLData>> turls =
+      TemplateURLStarterPackData::GetStarterPackEngines();
+  for (auto& turl : turls) {
+    client_->GetTemplateURLService()->Add(
+        std::make_unique<TemplateURL>(std::move(*turl)));
+  }
+  // Test result for user text "google", we should get back a result for google.
+  AutocompleteInput input(u"google", metrics::OmniboxEventProto::OTHER,
+                          TestSchemeClassifier());
+  autocomplete_->Start(input, false);
+  if (!autocomplete_->done())
+    base::RunLoop().Run();
+
+  matches_ = autocomplete_->matches();
+  ASSERT_GT(matches_.size(), 0u);
+  EXPECT_EQ(GURL("http://www.google.com/"), matches_[0].destination_url);
+
+  // Test result for "@history" and "@history google" while NOT in keyword mode,
+  // we should get a result for history.com and not for google since the we're
+  // searching for the whole input text including "@history".
+  AutocompleteInput input2(u"@history", metrics::OmniboxEventProto::OTHER,
+                           TestSchemeClassifier());
+  autocomplete_->Start(input2, false);
+  if (!autocomplete_->done())
+    base::RunLoop().Run();
+
+  matches_ = autocomplete_->matches();
+  ASSERT_GT(matches_.size(), 0u);
+  EXPECT_EQ(GURL("https://history.com/"), matches_[0].destination_url);
+
+  AutocompleteInput input3(u"@history google",
+                           metrics::OmniboxEventProto::OTHER,
+                           TestSchemeClassifier());
+  autocomplete_->Start(input3, false);
+  if (!autocomplete_->done())
+    base::RunLoop().Run();
+
+  matches_ = autocomplete_->matches();
+  ASSERT_EQ(matches_.size(), 0u);
+
+  // Turn on keyword mode, test result again, we should get back the result for
+  // google.com since we're searching only for the user text after the keyword.
+  input3.set_prefer_keyword(true);
+  autocomplete_->Start(input3, false);
+  if (!autocomplete_->done())
+    base::RunLoop().Run();
+
+  matches_ = autocomplete_->matches();
+  ASSERT_GT(matches_.size(), 0u);
+  EXPECT_EQ(GURL("http://www.google.com/"), matches_[0].destination_url);
+}
diff --git a/components/omnibox/browser/keyword_provider.cc b/components/omnibox/browser/keyword_provider.cc
index 62233f6..1630e09 100644
--- a/components/omnibox/browser/keyword_provider.cc
+++ b/components/omnibox/browser/keyword_provider.cc
@@ -178,6 +178,27 @@
   return nullptr;
 }
 
+// static
+AutocompleteInput KeywordProvider::AdjustInputForStarterPackEngines(
+    const AutocompleteInput& input,
+    TemplateURLService* model) {
+  DCHECK(model);
+
+  // If we're in a starter pack scope, we want to run the provider with only
+  // the user text AFTER the keyword.  i.e. if the input is "@history text",
+  // set the autocomplete input to just "text".
+  AutocompleteInput keyword_input = input;
+  const TemplateURL* keyword_provider =
+      KeywordProvider::GetSubstitutingTemplateURLForInput(model,
+                                                          &keyword_input);
+  if (OmniboxFieldTrial::IsSiteSearchStarterPackEnabled() &&
+      input.prefer_keyword() && keyword_provider &&
+      keyword_provider->starter_pack_id() > 0) {
+    return keyword_input;
+  }
+  return input;
+}
+
 std::u16string KeywordProvider::GetKeywordForText(
     const std::u16string& text) const {
   TemplateURLService* url_service = GetTemplateURLService();
diff --git a/components/omnibox/browser/keyword_provider.h b/components/omnibox/browser/keyword_provider.h
index 9fc1799..7c299dc3 100644
--- a/components/omnibox/browser/keyword_provider.h
+++ b/components/omnibox/browser/keyword_provider.h
@@ -84,6 +84,13 @@
       TemplateURLService* model,
       AutocompleteInput* input);
 
+  // Returns an AutocompleteInput with the keyword stripped if we're in keyword
+  // mode for a starter pack engine. i.e. for "@History text", input is adjusted
+  // to just be "text".  Otherwise, input is untouched and returned as is.
+  static AutocompleteInput AdjustInputForStarterPackEngines(
+      const AutocompleteInput& input,
+      TemplateURLService* model);
+
   // If |text| corresponds (in the sense of
   // TemplateURLModel::CleanUserInputKeyword()) to an enabled, substituting
   // keyword, returns that keyword; returns the empty string otherwise.
diff --git a/components/omnibox/browser/most_visited_sites_provider.cc b/components/omnibox/browser/most_visited_sites_provider.cc
index 99ce4e2..538ad77 100644
--- a/components/omnibox/browser/most_visited_sites_provider.cc
+++ b/components/omnibox/browser/most_visited_sites_provider.cc
@@ -11,7 +11,6 @@
 #include "base/feature_list.h"
 #include "base/strings/escape.h"
 #include "components/history/core/browser/top_sites.h"
-#include "components/ntp_tiles/most_visited_sites.h"
 #include "components/omnibox/browser/autocomplete_input.h"
 #include "components/omnibox/browser/autocomplete_match.h"
 #include "components/omnibox/browser/autocomplete_match_classification.h"
@@ -27,10 +26,6 @@
 // Suggest tiles should be positioned below the Query Tiles object.
 constexpr const int kMostVisitedTilesRelevance = 1500;
 
-// Use the same max number of tiles as MostVisitedListCoordinator to offer the
-// same content.
-constexpr const int kMaxTileCount = 12;
-
 // Constructs an AutocompleteMatch from supplied details.
 AutocompleteMatch BuildMatch(AutocompleteProvider* provider,
                              AutocompleteProviderClient* client,
@@ -68,16 +63,7 @@
   if (container.empty())
     return false;
 
-  // We force to build TILE_NAVSUGGEST when the TileContainer type is
-  // ntp_tiles::NTPTilesVector. This is because:
-  // 1) NTPTiles are always presented as a TILE_NAVSUGGEST entry;
-  // 2) NTPTiles are only served in the START_SURFACE_HOMEPAGE and
-  //    START_SURFACE_NEW_TAB context, making these controlled by the same finch
-  //    feature flag as start surface itself.
-  bool using_ntp_tiles =
-      std::is_same<TileContainer, ntp_tiles::NTPTilesVector>::value;
-  if (using_ntp_tiles ||
-      base::FeatureList::IsEnabled(omnibox::kMostVisitedTiles)) {
+  if (base::FeatureList::IsEnabled(omnibox::kMostVisitedTiles)) {
     AutocompleteMatch match = BuildMatch(
         provider, client, std::u16string(), GURL::EmptyGURL(),
         kMostVisitedTilesRelevance, AutocompleteMatchType::TILE_NAVSUGGEST);
@@ -115,18 +101,6 @@
   if (!AllowMostVisitedSitesSuggestions(input))
     return;
 
-  if (input.current_page_classification() ==
-          metrics::OmniboxEventProto::START_SURFACE_HOMEPAGE ||
-      input.current_page_classification() ==
-          metrics::OmniboxEventProto::START_SURFACE_NEW_TAB) {
-    StartFetchNTPTiles();
-    return;
-  }
-
-  StartFetchTopSites();
-}
-
-void MostVisitedSitesProvider::StartFetchTopSites() {
   scoped_refptr<history::TopSites> top_sites = client_->GetTopSites();
   if (!top_sites)
     return;
@@ -136,19 +110,8 @@
                           request_weak_ptr_factory_.GetWeakPtr()));
 }
 
-void MostVisitedSitesProvider::StartFetchNTPTiles() {
-  if (!most_visited_sites_)
-    most_visited_sites_ = client_->GetNtpMostVisitedSites();
-
-  // |most_visited_sites| will notify the provider when the fetch is complete.
-  most_visited_sites_->AddMostVisitedURLsObserver(this, kMaxTileCount);
-}
-
 void MostVisitedSitesProvider::Stop(bool clear_cached_results,
                                     bool due_to_user_inactivity) {
-  if (most_visited_sites_)
-    most_visited_sites_->RemoveMostVisitedURLsObserver(this);
-
   request_weak_ptr_factory_.InvalidateWeakPtrs();
   if (clear_cached_results)
     matches_.clear();
@@ -213,32 +176,11 @@
   return true;
 }
 
-void MostVisitedSitesProvider::OnURLsAvailable(
-    const std::map<ntp_tiles::SectionType, ntp_tiles::NTPTilesVector>&
-        sections) {
-  // If the |matches_| has been build, don't build it again.
-  if (!matches_.empty())
-    return;
-
-  if (BuildTileSuggest(this, client_,
-                       sections.at(ntp_tiles::SectionType::PERSONALIZED),
-                       matches_)) {
-    NotifyListeners(true);
-  }
-}
-
-void MostVisitedSitesProvider::OnIconMadeAvailable(const GURL& site_url) {}
-
 void MostVisitedSitesProvider::BlockURL(const GURL& site_url) {
   scoped_refptr<history::TopSites> top_sites = client_->GetTopSites();
   if (top_sites) {
     top_sites->AddBlockedUrl(site_url);
   }
-
-  if (most_visited_sites_) {
-    most_visited_sites_->DeleteCustomLink(site_url);
-    most_visited_sites_->AddOrRemoveBlockedUrl(site_url, /* add_url=*/true);
-  }
 }
 
 void MostVisitedSitesProvider::DeleteMatch(const AutocompleteMatch& match) {
diff --git a/components/omnibox/browser/most_visited_sites_provider.h b/components/omnibox/browser/most_visited_sites_provider.h
index 846cb48..707fad3 100644
--- a/components/omnibox/browser/most_visited_sites_provider.h
+++ b/components/omnibox/browser/most_visited_sites_provider.h
@@ -5,14 +5,10 @@
 #ifndef COMPONENTS_OMNIBOX_BROWSER_MOST_VISITED_SITES_PROVIDER_H_
 #define COMPONENTS_OMNIBOX_BROWSER_MOST_VISITED_SITES_PROVIDER_H_
 
-#include <memory>
-#include <string>
-
 #include "base/compiler_specific.h"
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "components/ntp_tiles/most_visited_sites.h"
 #include "components/omnibox/browser/autocomplete_input.h"
 #include "components/omnibox/browser/autocomplete_provider.h"
 #include "components/omnibox/browser/autocomplete_provider_client.h"
@@ -22,8 +18,7 @@
 // Autocomplete provider serving Most Visited Sites in zero-prefix context.
 // Serves most frequently visited URLs in a form of either individual- or
 // aggregate suggestions.
-class MostVisitedSitesProvider : public AutocompleteProvider,
-                                 ntp_tiles::MostVisitedSites::Observer {
+class MostVisitedSitesProvider : public AutocompleteProvider {
  public:
   MostVisitedSitesProvider(AutocompleteProviderClient* client,
                            AutocompleteProviderListener* listener);
@@ -40,12 +35,6 @@
 
   ~MostVisitedSitesProvider() override;
 
-  // Starts a new fetch of the top sites.
-  void StartFetchTopSites();
-
-  // Start a new fetch of the NTP tiles.
-  void StartFetchNTPTiles();
-
   // When the TopSites service serves the most visited URLs, this function
   // converts those urls to AutocompleteMatches and adds them to |matches_|.
   void OnMostVisitedUrlsAvailable(const history::MostVisitedURLList& urls);
@@ -55,15 +44,8 @@
   // met.
   bool AllowMostVisitedSitesSuggestions(const AutocompleteInput& input) const;
 
-  // MostVisitedSites::Observer.
-  void OnURLsAvailable(
-      const std::map<ntp_tiles::SectionType, ntp_tiles::NTPTilesVector>&
-          sections) override;
-  void OnIconMadeAvailable(const GURL& site_url) override;
   void BlockURL(const GURL& site_url);
 
-  raw_ptr<ntp_tiles::MostVisitedSites> most_visited_sites_{};
-
   const raw_ptr<AutocompleteProviderClient> client_;
   // Note: used to cancel requests - not a general purpose WeakPtr factory.
   base::WeakPtrFactory<MostVisitedSitesProvider> request_weak_ptr_factory_{
diff --git a/components/omnibox/browser/most_visited_sites_provider_unittest.cc b/components/omnibox/browser/most_visited_sites_provider_unittest.cc
index 4737ca5f..875c662 100644
--- a/components/omnibox/browser/most_visited_sites_provider_unittest.cc
+++ b/components/omnibox/browser/most_visited_sites_provider_unittest.cc
@@ -13,8 +13,6 @@
 #include "base/test/task_environment.h"
 #include "build/build_config.h"
 #include "components/history/core/browser/top_sites.h"
-#include "components/ntp_tiles/icon_cacher.h"
-#include "components/ntp_tiles/most_visited_sites.h"
 #include "components/omnibox/browser/autocomplete_controller.h"
 #include "components/omnibox/browser/autocomplete_provider_listener.h"
 #include "components/omnibox/browser/fake_autocomplete_provider_client.h"
@@ -22,7 +20,6 @@
 #include "components/omnibox/browser/test_scheme_classifier.h"
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/search_engines/omnibox_focus_type.h"
-#include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
@@ -138,11 +135,8 @@
 
   std::unique_ptr<base::test::SingleThreadTaskEnvironment> task_environment_;
   scoped_refptr<FakeTopSites> top_sites_;
-  scoped_refptr<FakeTopSites> top_sites_for_start_surface_;
   scoped_refptr<MostVisitedSitesProvider> provider_;
   base::test::ScopedFeatureList features_;
-  sync_preferences::TestingPrefServiceSyncable pref_service_;
-  std::unique_ptr<ntp_tiles::MostVisitedSites> ntp_top_sites_;
   std::unique_ptr<AutocompleteController> controller_;
 };
 
@@ -218,17 +212,10 @@
 void MostVisitedSitesProviderTest::SetUp() {
   task_environment_ =
       std::make_unique<base::test::SingleThreadTaskEnvironment>();
-  ntp_tiles::MostVisitedSites::RegisterProfilePrefs(pref_service_.registry());
   top_sites_ = new FakeTopSites();
-  top_sites_for_start_surface_ = new FakeTopSites();
 
-  // Note: std::make_unique<> fails here because it is unable to deduce argument
-  // types.
-  ntp_top_sites_.reset(new ntp_tiles::MostVisitedSites(
-      &pref_service_, top_sites_for_start_surface_, {}, {}, {}, {}, true));
   auto client = std::make_unique<FakeAutocompleteProviderClient>();
   client->set_top_sites(top_sites_);
-  client->set_ntp_most_visited_sites(ntp_top_sites_.get());
 
   // For tests requiring direct interaction with the Provider.
   provider_ = new MostVisitedSitesProvider(client.get(), this);
@@ -247,8 +234,6 @@
   }};
 
   top_sites_->urls().assign(test_data.begin(), test_data.end());
-  top_sites_for_start_surface_->urls().assign(test_data.rbegin(),
-                                              test_data.rend());
 }
 
 void MostVisitedSitesProviderTest::OnProviderUpdate(bool updated_matches) {}
@@ -312,47 +297,6 @@
   EXPECT_EQ(0u, NumMostVisitedMatches());
 }
 
-TEST_F(MostVisitedSitesProviderWithMatchesTest,
-       TestStartSurfaceSourcingTilesFromItsSource) {
-  controller_->Start(BuildAutocompleteInput(
-      {}, NTP_URL, metrics::OmniboxEventProto::START_SURFACE_HOMEPAGE,
-      OmniboxFocusType::ON_FOCUS));
-  EXPECT_EQ(0u, NumMostVisitedMatches());
-  // Start surface should not be waiting for old top_sites.
-  EXPECT_FALSE(top_sites_->EmitURLs());
-  EXPECT_EQ(0u, NumMostVisitedMatches());
-  // Start surface should use its dedicated source instead.
-  EXPECT_TRUE(top_sites_for_start_surface_->EmitURLs());
-  CheckMatchesEquivalentTo(top_sites_for_start_surface_->urls(),
-                           /* expect_tiles=*/true);
-}
-
-TEST_F(MostVisitedSitesProviderTest,
-       TestDeleteMostVisitedElementForStartSurface) {
-  // Make a copy (intentional - we'll modify this later)
-  auto urls = top_sites_for_start_surface_->urls();
-  controller_->Start(BuildAutocompleteInput(
-      {}, NTP_URL, metrics::OmniboxEventProto::START_SURFACE_HOMEPAGE,
-      OmniboxFocusType::ON_FOCUS));
-
-  EXPECT_TRUE(top_sites_for_start_surface_->EmitURLs());
-  CheckMatchesEquivalentTo(urls, /* expect_tiles=*/true);
-
-  // Delete tile #3
-  auto* match = GetMatch(AutocompleteMatchType::TILE_NAVSUGGEST, 0);
-  ASSERT_NE(nullptr, match) << "No TILE_NAVSUGGEST Match found";
-  controller_->DeleteMatchElement(*match, 2);
-
-  // Observe that the URL is now blocked and removed from suggestion.
-  auto deleted_url = urls[2].url;
-  urls.erase(urls.begin() + 2);
-  CheckMatchesEquivalentTo(urls, /* expect_tiles=*/true);
-  // Note: when Start Surface is being used, we want to make sure we delete
-  // tiles from all sources.
-  EXPECT_TRUE(top_sites_->IsBlocked(deleted_url));
-  EXPECT_TRUE(top_sites_for_start_surface_->IsBlocked(deleted_url));
-}
-
 class ParameterizedMostVisitedSitesProviderTest
     : public MostVisitedSitesProviderTest,
       public ::testing::WithParamInterface<bool> {
@@ -408,9 +352,6 @@
 TEST_P(ParameterizedMostVisitedSitesProviderTest, TestCreateMostVisitedMatch) {
   controller_->Start(BuildAutocompleteInputForWebOnFocus());
   EXPECT_EQ(0u, NumMostVisitedMatches());
-  // Confirm that the StartSurface source is rejected.
-  EXPECT_FALSE(top_sites_for_start_surface_->EmitURLs());
-  EXPECT_EQ(0u, NumMostVisitedMatches());
   // Accept only direct TopSites data.
   EXPECT_TRUE(top_sites_->EmitURLs());
   CheckMatchesEquivalentTo(top_sites_->urls(), GetParam());
@@ -422,9 +363,6 @@
   top_sites_->urls().clear();
   controller_->Start(BuildAutocompleteInputForWebOnFocus());
   EXPECT_EQ(0u, NumMostVisitedMatches());
-  // Confirm that the StartSurface source is rejected.
-  EXPECT_FALSE(top_sites_for_start_surface_->EmitURLs());
-  EXPECT_EQ(0u, NumMostVisitedMatches());
   // Accept only direct TopSites data, confirm no matches are built.
   EXPECT_TRUE(top_sites_->EmitURLs());
   EXPECT_EQ(0u, NumMostVisitedMatches());
@@ -435,9 +373,6 @@
   // Make a copy (intentional - we'll modify this later)
   auto urls = top_sites_->urls();
   controller_->Start(BuildAutocompleteInputForWebOnFocus());
-  // Confirm that the StartSurface source is rejected.
-  EXPECT_FALSE(top_sites_for_start_surface_->EmitURLs());
-  EXPECT_EQ(0u, NumMostVisitedMatches());
   // Accept only direct TopSites data.
   EXPECT_TRUE(top_sites_->EmitURLs());
   CheckMatchesEquivalentTo(urls, GetParam());
diff --git a/components/omnibox/browser/search_provider.cc b/components/omnibox/browser/search_provider.cc
index 1b13a47..34a70d83 100644
--- a/components/omnibox/browser/search_provider.cc
+++ b/components/omnibox/browser/search_provider.cc
@@ -1421,8 +1421,7 @@
     const TemplateURL* turl = providers_.GetKeywordProviderURL();
     DCHECK(turl);
     if (OmniboxFieldTrial::IsSiteSearchStarterPackEnabled() &&
-        (turl->starter_pack_id() ==
-         TemplateURLStarterPackData::StarterPackID::kBookmarks)) {
+        (turl->starter_pack_id() > 0)) {
       return true;
     }
     return InExplicitExperimentalKeywordMode(input_,
diff --git a/components/page_info_strings.grdp b/components/page_info_strings.grdp
index 7274c28..0feea7d 100644
--- a/components/page_info_strings.grdp
+++ b/components/page_info_strings.grdp
@@ -692,7 +692,7 @@
   <message name="IDS_PAGE_INFO_ABOUT_THIS_SITE_HEADER" desc="The header label of the 'About this site' subpage in Page Info bubble.">
     From the web
   </message>
-    <message name="IDS_PAGE_INFO_ABOUT_THIS_PAGE_TITLE" desc="The title of the 'About this page' row in the Page Info bubble.">
+  <message name="IDS_PAGE_INFO_ABOUT_THIS_PAGE_TITLE" desc="The title of the 'About this page' row in the Page Info bubble.">
     About this page
   </message>
   <message name="IDS_PAGE_INFO_ABOUT_THIS_SITE_TOOLTIP" desc="The tooltip of the button that opens 'About this site' subpage in Page Info bubble.">
diff --git a/components/password_manager/core/browser/login_database.cc b/components/password_manager/core/browser/login_database.cc
index 08dca5a5..9256701 100644
--- a/components/password_manager/core/browser/login_database.cc
+++ b/components/password_manager/core/browser/login_database.cc
@@ -2038,10 +2038,8 @@
     const std::vector<PasswordNote>& notes) {
   if (!base::FeatureList::IsEnabled(features::kPasswordNotes))
     return;
-  if (notes.empty() || notes[0].value.empty()) {
-    password_notes_table_.RemovePasswordNotes(primary_key);
-    return;
-  }
+
+  password_notes_table_.RemovePasswordNotes(primary_key);
   for (const PasswordNote& note : notes)
     password_notes_table_.InsertOrReplace(primary_key, note);
 }
diff --git a/components/password_manager/core/browser/login_database_unittest.cc b/components/password_manager/core/browser/login_database_unittest.cc
index 13526375..cf4100e 100644
--- a/components/password_manager/core/browser/login_database_unittest.cc
+++ b/components/password_manager/core/browser/login_database_unittest.cc
@@ -2378,38 +2378,6 @@
             note);
 }
 
-TEST_F(LoginDatabaseTest, AddLoginWithEmptyNoteDeletesTheNote) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kPasswordNotes);
-
-  PasswordForm form = GenerateExamplePasswordForm();
-  form.notes = {PasswordNote(std::u16string(), base::Time::Now())};
-
-  std::ignore = db().AddLogin(form);
-
-  EXPECT_TRUE(
-      db().password_notes_table().GetPasswordNotes(FormPrimaryKey(1)).empty());
-}
-
-TEST_F(LoginDatabaseTest, UpdateLoginWithEmptyNoteDeletesExistingNote) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kPasswordNotes);
-
-  PasswordForm form = GenerateExamplePasswordForm();
-  PasswordNote note = PasswordNote(u"example note", base::Time::Now());
-  form.notes = {note};
-
-  std::ignore = db().AddLogin(form);
-  EXPECT_EQ(db().password_notes_table().GetPasswordNotes(FormPrimaryKey(1))[0],
-            note);
-
-  form.notes = {PasswordNote(u"", base::Time::Now())};
-  std::ignore = db().UpdateLogin(form);
-
-  EXPECT_TRUE(
-      db().password_notes_table().GetPasswordNotes(FormPrimaryKey(1)).empty());
-}
-
 TEST_F(LoginDatabaseTest, RemoveLoginRemovesNoteAttachedToTheLogin) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndEnableFeature(features::kPasswordNotes);
diff --git a/components/password_manager/core/browser/password_form.cc b/components/password_manager/core/browser/password_form.cc
index 9ec2389..bb8fbd6 100644
--- a/components/password_manager/core/browser/password_form.cc
+++ b/components/password_manager/core/browser/password_form.cc
@@ -247,6 +247,10 @@
          lhs.hide_by_default == rhs.hide_by_default;
 }
 
+bool operator!=(const PasswordNote& lhs, const PasswordNote& rhs) {
+  return !(lhs == rhs);
+}
+
 PasswordForm::PasswordForm() = default;
 
 PasswordForm::PasswordForm(const PasswordForm& other) = default;
diff --git a/components/password_manager/core/browser/password_form.h b/components/password_manager/core/browser/password_form.h
index f158edc..b907812 100644
--- a/components/password_manager/core/browser/password_form.h
+++ b/components/password_manager/core/browser/password_form.h
@@ -89,6 +89,7 @@
 };
 
 bool operator==(const PasswordNote& lhs, const PasswordNote& rhs);
+bool operator!=(const PasswordNote& lhs, const PasswordNote& rhs);
 
 // The PasswordForm struct encapsulates information about a login form,
 // which can be an HTML form or a dialog with username/password text fields.
diff --git a/components/password_manager/core/browser/ui/credential_ui_entry.cc b/components/password_manager/core/browser/ui/credential_ui_entry.cc
index c047f15..209c2c3 100644
--- a/components/password_manager/core/browser/ui/credential_ui_entry.cc
+++ b/components/password_manager/core/browser/ui/credential_ui_entry.cc
@@ -17,9 +17,16 @@
       password(form.password_value),
       federation_origin(form.federation_origin),
       password_issues(form.password_issues),
-      notes(form.notes),
       blocked_by_user(form.blocked_by_user),
       key_(CredentialKey(CreateSortKey(form, IgnoreStore(true)))) {
+  // Only one-note with an empty `unique_display_name` is supported in the
+  // settings UI.
+  for (const PasswordNote& n : form.notes) {
+    if (n.unique_display_name.empty()) {
+      note = n;
+      break;
+    }
+  }
   if (form.IsUsingAccountStore())
     stored_in.insert(PasswordForm::Store::kAccountStore);
   if (form.IsUsingProfileStore())
diff --git a/components/password_manager/core/browser/ui/credential_ui_entry.h b/components/password_manager/core/browser/ui/credential_ui_entry.h
index b55f322..f73f04d 100644
--- a/components/password_manager/core/browser/ui/credential_ui_entry.h
+++ b/components/password_manager/core/browser/ui/credential_ui_entry.h
@@ -70,8 +70,11 @@
   // to its metadata (e.g. time it was discovered, whether alerts are muted).
   base::flat_map<InsecureType, InsecurityMetadata> password_issues;
 
-  // Attached notes to the credential.
-  std::vector<PasswordNote> notes;
+  // Attached note to the credential. This is a single entry since settings UI
+  // currently supports manipulation of one note only with an empty
+  // `unique_display_name`. The storage layer however supports multiple-notes
+  // for forward compatibility.
+  PasswordNote note;
 
   // Tracks if the user opted to never remember passwords for this website.
   bool blocked_by_user;
diff --git a/components/password_manager/core/browser/ui/saved_passwords_presenter.cc b/components/password_manager/core/browser/ui/saved_passwords_presenter.cc
index 24bae7d..a3366f8 100644
--- a/components/password_manager/core/browser/ui/saved_passwords_presenter.cc
+++ b/components/password_manager/core/browser/ui/saved_passwords_presenter.cc
@@ -53,7 +53,9 @@
   form.signon_realm = credential.signon_realm;
   form.username_value = credential.username;
   form.password_value = credential.password;
-  form.notes = credential.notes;
+  if (!credential.note.value.empty()) {
+    form.notes = {credential.note};
+  }
   DCHECK(!credential.stored_in.empty());
   form.in_store = *credential.stored_in.begin();
   return form;
@@ -200,15 +202,17 @@
   if (forms_to_change.empty())
     return false;
 
-  std::u16string new_note =
-      credential.notes.empty() ? u"" : credential.notes[0].value;
+  const auto& old_note_itr =
+      base::ranges::find_if(forms_to_change[0].notes, &std::u16string::empty,
+                            &PasswordNote::unique_display_name);
 
   // TODO(crbug.com/1184691): Merge into a single method.
   if (credential.username != forms_to_change[0].username_value ||
       credential.password != forms_to_change[0].password_value ||
-      credential.notes != forms_to_change[0].notes) {
+      (old_note_itr != forms_to_change[0].notes.end() &&
+       credential.note != *old_note_itr)) {
     return EditSavedPasswords(forms_to_change, credential.username,
-                              credential.password, new_note);
+                              credential.password, credential.note.value);
   } else if (credential.password_issues != forms_to_change[0].password_issues) {
     for (auto& old_form : forms_to_change) {
       old_form.password_issues = credential.password_issues;
@@ -228,9 +232,14 @@
     return false;
   IsUsernameChanged username_changed(new_username != forms[0].username_value);
   IsPasswordChanged password_changed(new_password != forms[0].password_value);
+
+  const auto& old_note_itr =
+      base::ranges::find_if(forms[0].notes, &std::u16string::empty,
+                            &PasswordNote::unique_display_name);
+  bool old_note_exists = old_note_itr != forms[0].notes.end();
   IsPasswordNoteChanged note_changed = IsPasswordNoteChanged(
-      (forms[0].notes.empty() && !new_note.empty()) ||
-      (!forms[0].notes.empty() && forms[0].notes[0].value != new_note));
+      (old_note_exists && old_note_itr->value != new_note) ||
+      (!old_note_exists && !new_note.empty()));
 
   if (new_password.empty())
     return false;
@@ -254,15 +263,18 @@
       }
 
       if (note_changed) {
-        // if the old note is empty, the note is just created.
-        if (old_form.notes.empty()) {
+        // if the old note doesn't exist, the note is just created.
+        const auto& note_itr =
+            base::ranges::find_if(new_form.notes, &std::u16string::empty,
+                                  &PasswordNote::unique_display_name);
+        if (note_itr == new_form.notes.end()) {
           new_form.notes.emplace_back(new_note,
                                       /*date_created=*/base::Time::Now());
         } else {
-          if (old_form.notes[0].value.empty()) {
-            new_form.notes[0].date_created = base::Time::Now();
+          if (note_itr->value.empty()) {
+            note_itr->date_created = base::Time::Now();
           }
-          new_form.notes[0].value = new_note;
+          note_itr->value = new_note;
         }
       }
 
diff --git a/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc b/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc
index fb4043e..084b55e3 100644
--- a/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc
+++ b/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc
@@ -386,6 +386,9 @@
 TEST_F(SavedPasswordsPresenterTest, EditOnlyNoteFirstTime) {
   PasswordForm form =
       CreateTestPasswordForm(PasswordForm::Store::kProfileStore);
+  form.notes.emplace_back(u"display name", u"note with non-empty display name",
+                          /*date_created=*/base::Time::Now(),
+                          /*hide_by_default=*/true);
 
   store().AddLogin(form);
   RunUntilIdle();
@@ -397,9 +400,11 @@
       forms, form.username_value, form.password_value, kNewNoteValue));
   RunUntilIdle();
 
+  // The note with the non-empty display name should be untouched. Another note
+  // with an empty display name should be added.
   PasswordForm expected_updated_form = form;
-  expected_updated_form.notes = {
-      PasswordNote(kNewNoteValue, base::Time::Now())};
+  expected_updated_form.notes.emplace_back(kNewNoteValue,
+                                           /*date_created=*/base::Time::Now());
   EXPECT_THAT(
       store().stored_passwords(),
       ElementsAre(Pair(form.signon_realm, ElementsAre(expected_updated_form))));
@@ -475,6 +480,31 @@
       ElementsAre(Pair(form.signon_realm, ElementsAre(expected_updated_form))));
 }
 
+TEST_F(SavedPasswordsPresenterTest,
+       GetSavedCredentialsReturnNotesWithEmptyDisplayName) {
+  // Create form with two notes, first is with a non-empty display name, and the
+  // second with an empty one.
+  PasswordNote kNoteWithEmptyDisplayName =
+      PasswordNote(u"note with empty display name",
+                   /*date_created=*/base::Time::Now());
+  PasswordForm form =
+      CreateTestPasswordForm(PasswordForm::Store::kProfileStore);
+  form.notes.emplace_back(u"display name", u"note with non-empty display name",
+                          /*date_created=*/base::Time::Now(),
+                          /*hide_by_default=*/true);
+  form.notes.push_back(kNoteWithEmptyDisplayName);
+
+  store().AddLogin(form);
+  RunUntilIdle();
+
+  // The expect credential UI entry should contain only the note with that empty
+  // display name.
+  std::vector<CredentialUIEntry> saved_credentials =
+      presenter().GetSavedCredentials();
+  ASSERT_EQ(1U, saved_credentials.size());
+  EXPECT_EQ(kNoteWithEmptyDisplayName, saved_credentials[0].note);
+}
+
 TEST_F(SavedPasswordsPresenterTest, EditUsernameAndPassword) {
   PasswordForm form =
       CreateTestPasswordForm(PasswordForm::Store::kProfileStore);
diff --git a/components/permissions/bluetooth_delegate_impl.cc b/components/permissions/bluetooth_delegate_impl.cc
index 29cfaae..76612dd 100644
--- a/components/permissions/bluetooth_delegate_impl.cc
+++ b/components/permissions/bluetooth_delegate_impl.cc
@@ -46,6 +46,14 @@
                                                 std::move(callback));
 }
 
+void BluetoothDelegateImpl::ShowDevicePairConfirmPrompt(
+    RenderFrameHost* frame,
+    const std::u16string& device_identifier,
+    PairConfirmCallback callback) {
+  client_->ShowBluetoothDevicePairConfirmDialog(frame, device_identifier,
+                                                std::move(callback));
+}
+
 WebBluetoothDeviceId BluetoothDelegateImpl::GetWebBluetoothDeviceId(
     RenderFrameHost* frame,
     const std::string& device_address) {
diff --git a/components/permissions/bluetooth_delegate_impl.h b/components/permissions/bluetooth_delegate_impl.h
index 71a81c6..fda295c5 100644
--- a/components/permissions/bluetooth_delegate_impl.h
+++ b/components/permissions/bluetooth_delegate_impl.h
@@ -74,6 +74,16 @@
         content::RenderFrameHost* frame,
         const std::u16string& device_identifier,
         content::BluetoothDelegate::CredentialsCallback callback) = 0;
+
+    // Prompt the user to consent pairing device.
+    //
+    // The |device_identifier| is a localized string (device name, address,
+    // etc.) displayed to the user for identification purposes. When the
+    // prompt is complete |callback| is called with the result.
+    virtual void ShowBluetoothDevicePairConfirmDialog(
+        content::RenderFrameHost* frame,
+        const std::u16string& device_identifier,
+        content::BluetoothDelegate::PairConfirmCallback callback) = 0;
   };
 
   explicit BluetoothDelegateImpl(std::unique_ptr<Client> client);
@@ -93,6 +103,9 @@
   void ShowDeviceCredentialsPrompt(content::RenderFrameHost* frame,
                                    const std::u16string& device_identifier,
                                    CredentialsCallback callback) override;
+  void ShowDevicePairConfirmPrompt(content::RenderFrameHost* frame,
+                                   const std::u16string& device_identifier,
+                                   PairConfirmCallback callback) override;
   blink::WebBluetoothDeviceId GetWebBluetoothDeviceId(
       content::RenderFrameHost* frame,
       const std::string& device_address) override;
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 598e6b2..722832a 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -29584,7 +29584,7 @@
       'owners': ['mattm@chromium.org'],
       'type': 'main',
       'schema': { 'type': 'boolean' },
-      'future_on': ['chrome.win', 'chrome.mac', 'chrome.linux'],
+      'supported_on': ['chrome.win:104-', 'chrome.mac:104-', 'chrome.linux:104-'],
       'features': {
         'dynamic_refresh': True,
         'per_profile': True,
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 8d1c7ae..89319c9 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -1859,6 +1859,7 @@
 
       Si no se le asigna ningún valor, se aplicará la política <ph name="ASK_GEOLOCATION_POLICY_NAME" />, pero los usuarios podrán cambiar esta opción.</translation>
 <translation id="2922511125678964398">Permitir que la autenticación de portales cautivos ignore la configuración de proxy</translation>
+<translation id="2926813071464307947">Inhabilitar el entorno aislado del contenedor de aplicaciones del renderizador</translation>
 <translation id="2931888116345994552">Si se habilita o no se establece, se habilitarán las actualizaciones de todos los componentes de <ph name="PRODUCT_NAME" />.
 
       Si se inhabilita, se desactivarán las actualizaciones de los componentes. Sin embargo, algunos componentes quedan exentos de esta política: las actualizaciones de los componentes que no contengan código ejecutable o que sean esenciales para proteger la seguridad del navegador no se inhabilitarán.
@@ -2304,6 +2305,11 @@
           Si se asigna una cadena que no esté vacía a esta política, esa cadena se utilizará como nombre del destino de <ph name="PRODUCT_NAME" />. De lo contrario, el nombre del destino será el nombre del dispositivo. Si esta política no se establece, el nombre del destino será el nombre del dispositivo y su propietario (o un usuario del dominio que gestiona el dispositivo) podrá cambiarlo. El nombre tiene un límite de 24 caracteres.</translation>
 <translation id="3329063005964041553">Bloquear la API File Handling en estas aplicaciones web</translation>
 <translation id="3329401415394648069">Permitir el uso de la API U2F Security Key.</translation>
+<translation id="3329976499753286262">Si se habilita esta política o no se establece, la configuración del contenedor de aplicaciones del renderizador se habilitará en las plataformas compatibles.
+
+      Si se inhabilita esta política, se reducirán la seguridad y la estabilidad de <ph name="PRODUCT_NAME" />, ya que se debilitará el entorno aislado que utilizan los procesos del renderizador. Inhabilita la política solo si hay problemas de compatibilidad con un software de terceros que deba ejecutarse en los procesos del renderizador.
+
+      Nota: Consulta más información sobre las políticas de mitigación de procesos en la página https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies.</translation>
 <translation id="3339271789059866414">Configura la disponibilidad del servicio de proxy del sistema y las credenciales de proxy para los servicios del sistema.
       Si no se establece esta política, el servicio de proxy del sistema no estará disponible.</translation>
 <translation id="3348799281602260763">Si se habilita la política, las conexiones de punto a punto WebRTC podrán cambiar a versiones
@@ -4224,6 +4230,7 @@
 <translation id="5625771176514429288">Se permitirá ejecutar aplicaciones de Chrome en estas plataformas.</translation>
 <translation id="5630352020869108293">Restaurar la última sesión</translation>
 <translation id="5633871703004128675">Habilitar la función de accesibilidad de resaltado del símbolo de intercalación de texto</translation>
+<translation id="5634032995857968056">Habilitar el entorno aislado del contenedor de aplicaciones del renderizador</translation>
 <translation id="5639454129004500060">Si se establece esta política, contendrá información para descargar un archivo de plantilla de escritorio.  Este archivo contiene una plantilla de escritorio que se proporcionará al usuario actual.
       Si no se establece esta política, no se incluirá ninguna plantilla de escritorio preconfigurada en la lista de plantillas de escritorio.  Si la política <ph name="DESK_TEMPLATES_ENABLED_POLICY_NAME" />
       no tiene asignado el valor true, no tendrá efecto.</translation>
@@ -7176,6 +7183,7 @@
 <translation id="8763716376920670835">WebSQL está habilitado de forma predeterminada desde la versión M101, pero puede inhabilitarse mediante una marca de Chrome.
           Si se asigna el valor false a esta política o no se le asigna ningún valor, WebSQL se podrá inhabilitar.
           Si se le asigna el valor true, WebSQL no se podrá inhabilitar.</translation>
+<translation id="8766910236040529804">Habilitar el contenedor de aplicaciones del renderizador</translation>
 <translation id="8767743923206070405">Si se habilita esta política, se mostrará el botón de página principal en la barra de herramientas de <ph name="PRODUCT_NAME" />. Si se inhabilita esta política, no se mostrará el botón de página principal.
 
       Si se le asigna un valor a esta política, los usuarios no podrán cambiarlo en <ph name="PRODUCT_NAME" />. Si no se le asigna ningún valor, los usuarios podrán decidir si quieren que se muestre el botón de página principal.</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index ddf27b7..11fb90d 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -1858,6 +1858,7 @@
 
       Jika kebijakan tidak disetel, kebijakan<ph name="ASK_GEOLOCATION_POLICY_NAME" /> akan berlaku, tetapi pengguna dapat mengubah setelan ini.</translation>
 <translation id="2922511125678964398">Izinkan autentikasi captive portal mengabaikan setelan proxy</translation>
+<translation id="2926813071464307947">Nonaktifkan sandbox Penampung Aplikasi Perender</translation>
 <translation id="2931888116345994552">Mengaktifkan update komponen untuk semua komponen di <ph name="PRODUCT_NAME" /> jika tidak disetel atau disetel ke aktif.
 
       Jika disetel ke nonaktif, update komponen akan dinonaktifkan. Namun, beberapa komponen akan dikecualikan dari kebijakan ini: update komponen apa pun yang tidak berisi kode yang dapat dieksekusi dan yang penting bagi keamanan browser, tidak akan dinonaktifkan.
@@ -2303,6 +2304,11 @@
           Jika kebijakan ini disetel ke string yang tidak kosong, string tersebut akan digunakan sebagai nama tujuan <ph name="PRODUCT_NAME" />. Jika tidak, nama tujuan akan menjadi nama perangkat. Jika kebijakan ini tidak disetel, nama tujuan akan menjadi nama perangkat, dan pemilik perangkat (atau pengguna dari domain yang mengelola perangkat) akan diizinkan untuk mengubahnya. Karakter nama dibatasi hingga 24 karakter.</translation>
 <translation id="3329063005964041553">Memblokir File Handling API di aplikasi web ini</translation>
 <translation id="3329401415394648069">Izinkan penggunaan U2F Security Key API.</translation>
+<translation id="3329976499753286262">Jika kebijakan disetel ke Aktif atau tidak disetel, konfigurasi Penampung Aplikasi Perender akan diaktifkan di platform yang didukung.
+
+      Menyetel kebijakan ke Nonaktif akan merugikan keamanan dan stabilitas <ph name="PRODUCT_NAME" /> karena akan melemahkan sandbox yang digunakan proses perender. Nonaktifkan kebijakan hanya jika terdapat masalah kompatibilitas dengan software pihak ketiga yang harus berjalan dalam proses perender.
+
+      Catatan: Baca selengkapnya tentang Kebijakan mitigasi proses ( https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies ).</translation>
 <translation id="3339271789059866414">Mengonfigurasi ketersediaan layanan System-proxy dan kredensial proxy untuk layanan sistem.
       Jika kebijakan tidak ditetapkan, layanan System-proxy tidak akan tersedia.</translation>
 <translation id="3348799281602260763">Jika diaktifkan, koneksi pembanding WebRTC dapat mendowngrade ke versi
@@ -4224,6 +4230,7 @@
 <translation id="5625771176514429288">Aplikasi Chrome akan diizinkan berjalan di platform berikut.</translation>
 <translation id="5630352020869108293">Mengembalikan sesi terakhir</translation>
 <translation id="5633871703004128675">Mengaktifkan fitur aksesibilitas sorotan tanda sisipan</translation>
+<translation id="5634032995857968056">Aktifkan sandbox Penampung Aplikasi Perender</translation>
 <translation id="5639454129004500060">Jika disetel, kebijakan ini akan berisi informasi untuk mendownload file template desktop.  File tersebut berisi template desktop yang akan disediakan untuk pengguna saat ini.
       Jika tidak disetel, template desktop yang dikonfigurasi sebelumnya tidak disertakan dalam daftar template desktop.  Jika kebijakan <ph name="DESK_TEMPLATES_ENABLED_POLICY_NAME" />
       tidak disetel ke benar (true), kebijakan ini tidak akan berpengaruh.</translation>
@@ -7162,6 +7169,7 @@
 <translation id="8763716376920670835">WebSQL aktif secara default mulai M101, tetapi dapat dinonaktifkan melalui tanda Chrome.
           Jika kebijakan ini disetel ke salah (false) atau tidak disetel, WebSQL dapat dinonaktifkan.
           Jika kebijakan ini disetel ke benar (true), WebSQL tidak dapat dinonaktifkan.</translation>
+<translation id="8766910236040529804">Mengaktifkan Penampung Aplikasi Perender</translation>
 <translation id="8767743923206070405">Jika kebijakan disetel ke Aktif, tombol Beranda akan ditampilkan di toolbar <ph name="PRODUCT_NAME" />. Jika kebijakan disetel ke Nonaktif, tombol Beranda tidak akan muncul.
 
       Jika Anda menyetel kebijakan, pengguna tidak dapat mengubahnya di <ph name="PRODUCT_NAME" />. Jika tidak disetel, pengguna dapat memilih untuk menampilkan tombol Beranda atau tidak.</translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index ba3138a..566ee63b 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -1731,6 +1731,7 @@
 
       このポリシーを未設定のままにした場合、<ph name="ASK_GEOLOCATION_POLICY_NAME" /> ポリシーは適用されますが、ユーザーはこの設定を変更できます。</translation>
 <translation id="2922511125678964398">キャプティブ ポータル認証でプロキシ設定を無視できるようにする</translation>
+<translation id="2926813071464307947">レンダラアプリ コンテナのサンドボックスを無効にする</translation>
 <translation id="2931888116345994552">このポリシーを未設定のままか有効に設定した場合、<ph name="PRODUCT_NAME" /> のすべてのコンポーネントでコンポーネントの更新が有効になります。
 
       このポリシーを無効に設定した場合、コンポーネントの更新は無効になります。ただし、一部のコンポーネント(実行可能コードを含まず、ブラウザのセキュリティ上重要なコンポーネント)はこのポリシーの適用外で、これらのコンポーネントの更新は無効にはなりません。
@@ -2160,6 +2161,11 @@
           このポリシーが空でない文字列に設定されている場合は、その文字列が <ph name="PRODUCT_NAME" /> のレシーバー名として使用されます。それ以外の場合、レシーバー名にはデバイス名が設定されます。このポリシーが未設定の場合、レシーバー名にはデバイス名が設定され、デバイスの所有者(またはデバイスを管理するドメインのユーザー)はその名前を変更できます。なお、名前は 24 文字以内で指定する必要があります。</translation>
 <translation id="3329063005964041553">File Handling API の使用をブロックするウェブアプリを指定する</translation>
 <translation id="3329401415394648069">U2F Security Key API の使用を許可</translation>
+<translation id="3329976499753286262">このポリシーを有効に設定するか未設定のままにすると、対応プラットフォームでレンダラアプリ コンテナの設定が有効になります。
+
+      このポリシーを無効に設定した場合は、レンダラ プロセスで使用されるサンドボックスの保護が弱まるため、<ph name="PRODUCT_NAME" /> のセキュリティと安定性が低下します。このポリシーは、レンダラ プロセス内で実行する必要のあるサードパーティ ソフトウェアとの間で互換性の問題が発生する場合にのみ無効にしてください。
+
+      注: 詳しくはプロセス対応ポリシー(https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies)をご覧ください。</translation>
 <translation id="3339271789059866414">システム プロキシ サービスを利用できるようにするかどうかとシステム サービスのプロキシ認証情報を設定します。
       このポリシーが設定されていない場合、システム プロキシ サービスは利用できません。</translation>
 <translation id="3348799281602260763">有効にすると、WebRTC ピア接続が TLS/DTLS プロトコルのサポートが終了したバージョン(DTLS 1.0、TLS 1.0、TLS 1.1)にダウングレードされる可能性があります。
@@ -3964,6 +3970,7 @@
 <translation id="5625771176514429288">指定プラットフォームで Chrome アプリを実行できる。</translation>
 <translation id="5630352020869108293">最後のセッションを復元する</translation>
 <translation id="5633871703004128675">「テキストカーソルによるハイライト表示」のユーザー補助機能を有効にする</translation>
+<translation id="5634032995857968056">レンダラアプリ コンテナのサンドボックスを有効にする</translation>
 <translation id="5639454129004500060">設定した場合、このポリシーによって、デスク テンプレート ファイルをダウンロードするための情報が含められます。このファイルには、現在のユーザーにプロビジョニングするデスク テンプレートが含まれます。
       未設定の場合、デスク テンプレートのリストに事前設定のデスク テンプレートは含められません。<ph name="DESK_TEMPLATES_ENABLED_POLICY_NAME" /> ポリシーが true に設定されていない場合、このポリシーは無視されます。</translation>
 <translation id="5641279111657132737">このポリシーはサポートが終了しています。代わりに <ph name="AUTH_SERVER_ALLOWLIST_POLICY_NAME" /> ポリシーを使用してください。
@@ -6739,6 +6746,7 @@
 <translation id="8763716376920670835">WebSQL は、M101 ではデフォルトで有効になっていますが、Chrome フラグで無効にできます。
           このポリシーを False に設定するか未設定のままにした場合、WebSQL を無効にできます。
           このポリシーを True に設定した場合、WebSQL を無効にすることはできません。</translation>
+<translation id="8766910236040529804">レンダラアプリ コンテナを有効にする</translation>
 <translation id="8767743923206070405">このポリシーを有効にすると、<ph name="PRODUCT_NAME" /> のツールバーにホームボタンが表示されます。無効にすると、ホームボタンは表示されません。
 
       このポリシーが設定されている場合、ユーザーは <ph name="PRODUCT_NAME" /> でこの設定を変更できません。未設定の場合、ホームボタンを表示するかどうかはユーザーが選択します。</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index 8df1dcb..1126ca3 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -1856,6 +1856,7 @@
 
       정책을 설정하지 않으면 <ph name="ASK_GEOLOCATION_POLICY_NAME" /> 정책이 적용되지만 사용자가 이 설정을 변경할 수 있습니다.</translation>
 <translation id="2922511125678964398">종속 포털 인증에서 프록시 설정을 무시하도록 허용</translation>
+<translation id="2926813071464307947">렌더러 앱 컨테이너 샌드박스 사용 안함</translation>
 <translation id="2931888116345994552">설정하지 않거나 사용 설정하면 <ph name="PRODUCT_NAME" />의 모든 구성요소에 구성요소 업데이트를 사용합니다.
 
       사용 안함으로 설정하면 구성요소 업데이트가 사용 중지됩니다. 하지만 일부 구성요소는 이 정책에서 제외됩니다. 예를 들어 실행 코드가 포함되지 않은 구성요소와 브라우저 보안에 중요한 구성요소 업데이트는 사용 중지되지 않습니다.
@@ -2297,6 +2298,11 @@
           이 정책을 비어 있지 않은 문자열로 설정하면 해당 문자열이 <ph name="PRODUCT_NAME" /> 전송 대상의 이름으로 사용됩니다. 반면에 비어 있는 문자열로 설정하면 기기 이름이 전송 대상의 이름으로 사용됩니다. 이 정책을 설정하지 않으면 기기 이름이 전송 대상의 이름으로 사용되며, 기기 소유자(또는 기기를 관리하는 도메인의 사용자)가 이 이름을 변경할 수 있습니다. 이름의 길이는 영문 24자로 제한됩니다.</translation>
 <translation id="3329063005964041553">웹 앱에서 File Handling API 차단</translation>
 <translation id="3329401415394648069">U2F Security Key API 사용 허용</translation>
+<translation id="3329976499753286262">정책을 사용으로 설정하거나 설정하지 않으면 지원되는 플랫폼에서 렌더러 앱 컨테이너 구성이 사용 설정됩니다.
+
+      정책을 사용 안함으로 설정하면 <ph name="PRODUCT_NAME" />의 보안 및 안정성에 부정적인 영향을 미치게 됩니다. 렌더러 프로세스에서 사용하는 샌드박스가 취약해지기 때문입니다. 렌더러 프로세스 내에서 실행되어야 하는 서드 파티 소프트웨어에 호환성 문제가 발생하는 경우에만 정책을 사용 중지하세요.
+
+      참고: 프로세스 완화 정책(https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies)에 관해 자세히 알아보세요.</translation>
 <translation id="3339271789059866414">시스템 프록시 서비스 이용 가능 여부 및 시스템 서비스에 대한 프록시 사용자 인증 정보를 구성합니다.
       정책이 설정되지 않은 경우 시스템 프록시 서비스를 사용할 수 없습니다.</translation>
 <translation id="3348799281602260763">사용 설정하면 WebRTC 동종 연결이 지원 중단된 버전의
@@ -4218,6 +4224,7 @@
 <translation id="5625771176514429288">Chrome 앱이 이러한 플랫폼에서 실행됩니다.</translation>
 <translation id="5630352020869108293">마지막 세션 복원</translation>
 <translation id="5633871703004128675">캐럿 강조표시 접근성 기능 사용</translation>
+<translation id="5634032995857968056">렌더러 앱 컨테이너 샌드박스 사용</translation>
 <translation id="5639454129004500060">설정된 경우 정책에 데스크 템플릿 파일을 다운로드하기 위한 정보가 포함됩니다.  파일에 현재 사용자에게 프로비저닝할 데스크 템플릿이 포함됩니다.
       설정되지 않은 경우 사전 구성된 데스크 템플릿이 데스크 템플릿 목록에 포함되지 않습니다.  <ph name="DESK_TEMPLATES_ENABLED_POLICY_NAME" />
       정책이 참으로 설정되지 않은 경우 정책은 적용되지 않습니다.</translation>
@@ -7150,6 +7157,7 @@
 <translation id="8763716376920670835">M101에서 WebSQL이 기본으로 사용 설정되어 있으나 Chrome 플래그에 의해 사용 중지될 수 있습니다.
           이 정책을 False로 설정하거나 설정하지 않으면 WebSQL이 사용 중지될 수 있습니다.
           정책을 True로 설정하면 WebSQL이 사용 중지되지 않습니다.</translation>
+<translation id="8766910236040529804">렌더러 앱 컨테이너 사용</translation>
 <translation id="8767743923206070405">정책을 사용으로 설정하면 <ph name="PRODUCT_NAME" /> 툴바에 홈 버튼이 표시됩니다. 사용 안함으로 설정하면 홈 버튼이 표시되지 않습니다.
 
       정책을 설정하면 <ph name="PRODUCT_NAME" />에서 사용자가 변경할 수 없습니다. 설정하지 않으면 사용자가 홈 버튼 표시 여부를 선택할 수 있습니다.</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index d73da40b..2baf5aec 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -1816,6 +1816,7 @@
 
       Als je het beleid niet instelt, is het beleid <ph name="ASK_GEOLOCATION_POLICY_NAME" /> van toepassing maar kunnen gebruikers deze instelling wijzigen.</translation>
 <translation id="2922511125678964398">Toestaan dat captive portal-verificatie proxyinstellingen negeert</translation>
+<translation id="2926813071464307947">De sandbox voor de app-container van het weergaveprogramma uitzetten</translation>
 <translation id="2931888116345994552">Hiermee zet je componentupdates voor alle componenten in <ph name="PRODUCT_NAME" /> aan als het beleid wordt toegepast of niet is ingesteld.
 
       Als je het beleid niet toepast, staan updates voor componenten uit. Bepaalde componenten zijn wel uitgesloten van dit beleid. Updates voor componenten worden niet uitgezet als deze geen uitvoerbare code bevatten en essentieel zijn voor de beveiliging van de browser.
@@ -2256,6 +2257,11 @@
           Als dit beleid is ingesteld op een niet-lege tekenreeks, wordt die tekenreeks gebruikt als de naam van de <ph name="PRODUCT_NAME" />-bestemming. Anders wordt de apparaatnaam gebruikt voor de bestemmingsnaam. Als dit beleid niet is ingesteld, is de naam van de bestemming de apparaatnaam en kan de eigenaar van het apparaat (of een gebruiker in het domein dat het apparaat beheert) deze naam wijzigen. De naam mag maximaal 24 tekens lang zijn.</translation>
 <translation id="3329063005964041553">De File Handling API blokkeren voor deze web-apps</translation>
 <translation id="3329401415394648069">Het gebruik van de U2F-beveiligingssleutel-API toestaan.</translation>
+<translation id="3329976499753286262">Als je het beleid toepast of niet instelt, wordt de configuratie van de app-container van het weergaveprogramma aangezet op ondersteunde platforms.
+
+      Als je dit beleid niet toepast, heeft dit een nadelige invloed op de beveiliging en stabiliteit van <ph name="PRODUCT_NAME" />, omdat daardoor de sandbox waarvan de processen van het weergaveprogramma gebruikmaken, minder wordt. Pas het beleid alleen niet toe als er compatibiliteitsproblemen zijn met software van derden die in de processen van het weergaveprogramma moeten worden uitgevoerd.
+
+      Opmerking: Lees meer informatie over het beleid voor procesbeperking (https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies).</translation>
 <translation id="3339271789059866414">Configureert de beschikbaarheid van de systeemproxyservice en de proxygegevens voor systeemservices.
       Als het beleid niet is ingesteld, is de systeemproxyservice niet beschikbaar.</translation>
 <translation id="3348799281602260763">Als het beleid is toegepast, kunnen WebRTC-peerverbindingen worden gedowngraded naar verouderde versies van de TLS/DTLS-protocollen (DTLS 1.0, TLS 1.0 en TLS 1.1).
@@ -4155,6 +4161,7 @@
 <translation id="5625771176514429288">Chrome-apps kunnen op deze platforms worden uitgevoerd.</translation>
 <translation id="5630352020869108293">De laatste sessie herstellen</translation>
 <translation id="5633871703004128675">Toegankelijkheidsfunctie voor markering van het caret-teken aanzetten</translation>
+<translation id="5634032995857968056">De sandbox voor de app-container van het weergaveprogramma aanzetten</translation>
 <translation id="5639454129004500060">Als dit beleid wordt ingesteld, bevat het informatie om een bureautemplate-bestand te downloaden.  Het bestand bevat een bureautemplate dat aan de huidige gebruiker kan worden geleverd.
       Als het niet wordt ingesteld, bevat de lijst met bureautemplates geen vooraf ingestelde bureautemplate.  Als het beleid <ph name="DESK_TEMPLATES_ENABLED_POLICY_NAME" /> niet op True wordt ingesteld, heeft dit beleid geen effect.</translation>
 <translation id="5641279111657132737">Dit beleid is beëindigd. Gebruik in plaats daarvan het beleid <ph name="AUTH_SERVER_ALLOWLIST_POLICY_NAME" />.
@@ -7046,6 +7053,7 @@
 <translation id="8763716376920670835">WebSQL staat standaard aan vanaf M101, maar kan worden uitgezet via Chrome-flag.
           Als dit beleid is ingesteld op False of niet is ingesteld, kan WebSQL worden uitgezet.
           Als dit beleid is ingesteld op True, kan WebSQL niet worden uitgezet.</translation>
+<translation id="8766910236040529804">App-container van weergaveprogramma aanzetten</translation>
 <translation id="8767743923206070405">Als je het beleid toepast, wordt de Homepage-knop in de werkbalk van <ph name="PRODUCT_NAME" /> getoond. Als je het beleid niet toepast, wordt de Homepage-knop niet getoond.
 
       Als je het beleid instelt, kunnen gebruikers dit niet wijzigen in <ph name="PRODUCT_NAME" />. Als je het beleid niet instelt, kunnen gebruikers bepalen of ze de Homepage-knop wel of niet willen tonen.</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index a3fb441..0031d7d 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -1845,6 +1845,7 @@
 
       Если правило не настроено, действует правило <ph name="ASK_GEOLOCATION_POLICY_NAME" />, но пользователи могут его изменить.</translation>
 <translation id="2922511125678964398">Разрешить игнорирование настроек прокси-сервера при аутентификации через страницы входа</translation>
+<translation id="2926813071464307947">Отключить тестовую среду контейнера приложения для визуализации</translation>
 <translation id="2931888116345994552">Включает обновление всех компонентов для <ph name="PRODUCT_NAME" />, если правило не настроено или включено.
 
       Если правило отключено, компоненты обновляться не будут. Исключение составляют компоненты, которые не содержат исполняемый код и отвечают за безопасность браузера.
@@ -2287,6 +2288,11 @@
           Значение, указанное в правиле, служит названием ресивера <ph name="PRODUCT_NAME" />. Если оно не задано или правило не настроено, название ресивера соответствует названию устройства. Менять его может владелец (или пользователь домена, в котором управляют устройством). Максимальная длина названия – 24 символа.</translation>
 <translation id="3329063005964041553">Запретить использование File Handling API для этих веб-приложений</translation>
 <translation id="3329401415394648069">Разрешить использовать U2F Security Key API</translation>
+<translation id="3329976499753286262">Если правило включено или не настроено, конфигурация контейнера приложения для визуализации будет задействована на поддерживаемых платформах.
+
+      Отключение этого правила окажет негативный эффект на безопасность и стабильность <ph name="PRODUCT_NAME" />, так как ослабит защиту тестовой среды, которую используют средства визуализации. Правило можно отключить, только если возникают проблемы совместимости со сторонним ПО, которое применяется в процессах средства визуализации.
+
+      Примечание. Подробную информацию можно найти здесь: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies.</translation>
 <translation id="3339271789059866414">Настраивает доступность системного прокси-сервиса и учетные данные прокси-сервера для системных сервисов.
       Если правило не задано, системный прокси-сервис недоступен.</translation>
 <translation id="3348799281602260763">Если правило включено, для одноранговых соединений WebRTC можно использовать
@@ -4198,6 +4204,7 @@
 <translation id="5625771176514429288">Запуск приложений Chrome разрешен на этих платформах</translation>
 <translation id="5630352020869108293">Восстановить последний сеанс</translation>
 <translation id="5633871703004128675">Включить подсветку текстового курсора (специальная возможность)</translation>
+<translation id="5634032995857968056">Включить тестовую среду контейнера приложения для визуализации</translation>
 <translation id="5639454129004500060">Если правило настроено, в нем содержатся данные о том, как скачать файл шаблона для рабочего стола  с предварительно настроенными параметрами для текущего пользователя.
       Если правило не настроено, в списке шаблонов рабочего стола не будет предварительно настроенного варианта.  Если правило <ph name="DESK_TEMPLATES_ENABLED_POLICY_NAME" />
       отключено, это правило работать не будет.</translation>
@@ -7138,6 +7145,7 @@
 <translation id="8763716376920670835">WebSQL включен по умолчанию начиная с версии M101, но его можно отключить с помощью экспериментального параметра.
           Если правило не настроено или для него задано значение False, WebSQL можно отключить.
           Если установлено значение True, WebSQL отключить нельзя.</translation>
+<translation id="8766910236040529804">Включить контейнер приложения для визуализации</translation>
 <translation id="8767743923206070405">Если правило включено, кнопка главного экрана будет располагаться на панели инструментов <ph name="PRODUCT_NAME" />. В противном случае она будет не видна.
 
       Если правило задано, не удастся изменить эту настройку в <ph name="PRODUCT_NAME" />. В противном случае пользователи смогут добавить или скрыть кнопку главного экрана.</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index cb3b2408..28785e7 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -1817,6 +1817,7 @@
 
       การไม่ตั้งค่านโยบายนี้หมายความว่านโยบาย <ph name="ASK_GEOLOCATION_POLICY_NAME" /> จะมีผล แต่ผู้ใช้เปลี่ยนการตั้งค่านี้ได้</translation>
 <translation id="2922511125678964398">อนุญาตให้การตรวจสอบสิทธิ์แคพทีฟพอร์ทัลละเว้นการตั้งค่าพร็อกซี</translation>
+<translation id="2926813071464307947">ปิดใช้แซนด์บ็อกซ์ของคอนเทนเนอร์แอปตัวแสดงผล</translation>
 <translation id="2931888116345994552">เปิดใช้งานการอัปเดตคอมโพเนนต์สำหรับทุกคอมโพเนนต์ใน <ph name="PRODUCT_NAME" /> เมื่อไม่มีการตั้งค่าหรือตั้งค่าเป็นเปิดใช้งาน
 
       หากตั้งค่าเป็นปิดใช้งาน การอัปเดตสำหรับคอมโพเนนต์จะปิดใช้งาน อย่างไรก็ตาม จะมีบางคอมโพเนนต์ที่ได้รับการยกเว้นจากนโยบายนี้ กล่าวคือระบบจะไม่ปิดใช้การอัปเดตคอมโพเนนต์ที่ไม่มีโค้ดปฏิบัติการและมีความสำคัญต่อการรักษาความปลอดภัยของเบราว์เซอร์
@@ -2257,6 +2258,11 @@
           หากตั้งค่านโยบายนี้เป็นสตริงที่ไม่ว่างเปล่า ระบบจะใช้สตริงนั้นเป็นชื่อปลายทางของ <ph name="PRODUCT_NAME" /> มิเช่นนั้นชื่อปลายทางจะเป็นชื่ออุปกรณ์ หากไม่ตั้งค่านโยบายนี้ ชื่อปลายทางจะเป็นชื่ออุปกรณ์ และเจ้าของอุปกรณ์ (หรือผู้ใช้จากโดเมนที่จัดการอุปกรณ์) จะได้รับอนุญาตให้เปลี่ยนชื่อ ชื่อต้องมีความยาวไม่เกิน 24 อักขระ</translation>
 <translation id="3329063005964041553">บล็อกการใช้ File Handling API ในเว็บแอปเหล่านี้</translation>
 <translation id="3329401415394648069">อนุญาตให้ใช้ U2F Security Key API</translation>
+<translation id="3329976499753286262">การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่าหมายความว่าจะเปิดใช้การกำหนดค่าคอนเทนเนอร์ของแอปตัวแสดงผลในแพลตฟอร์มที่รองรับ
+
+      การตั้งค่านโยบายเป็น "ปิดใช้" จะมีผลกระทบที่เป็นอันตรายต่อความปลอดภัยและความเสถียรของ <ph name="PRODUCT_NAME" /> เนื่องจากจะลดประสิทธิภาพของแซนด์บ็อกซ์ที่กระบวนการแสดงผลใช้ ปิดนโยบายนี้เฉพาะในกรณีที่มีปัญหาด้านความเข้ากันได้กับซอฟต์แวร์ของบุคคลที่สามซึ่งต้องเรียกใช้ภายในกระบวนการแสดงผล
+
+      หมายเหตุ: อ่านเพิ่มเติมเกี่ยวกับนโยบายการลดการประมวลผล (https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md#Process-mitigation-policies)</translation>
 <translation id="3339271789059866414">กำหนดค่าความพร้อมใช้งานของบริการพร็อกซีของระบบและข้อมูลเข้าสู่ระบบของพร็อกซีสำหรับบริการของระบบ
       หากไม่ได้ตั้งค่านโยบาย บริการพร็อกซีของระบบจะใช้งานไม่ได้</translation>
 <translation id="3348799281602260763">หากเปิดใช้ การเชื่อมต่อแบบเพียร์ WebRTC จะดาวน์เกรดเป็นโปรโตคอล TLS/DTLS เวอร์ชันที่ล้าสมัย (DTLS 1.0, TLS 1.0 และ TLS 1.1) ได้
@@ -4151,6 +4157,7 @@
 <translation id="5625771176514429288">แอป Chrome จะได้รับอนุญาตให้ทำงานในแพลตฟอร์มเหล่านี้</translation>
 <translation id="5630352020869108293">คืนค่าเซสชันล่าสุด</translation>
 <translation id="5633871703004128675">เปิดใช้ฟีเจอร์การช่วยเหลือพิเศษสำหรับการไฮไลต์เคอร์เซอร์ข้อความ</translation>
+<translation id="5634032995857968056">เปิดใช้แซนด์บ็อกซ์ของคอนเทนเนอร์แอปตัวแสดงผล</translation>
 <translation id="5639454129004500060">หากตั้งค่า นโยบายนี้จะมีข้อมูลให้ดาวน์โหลดไฟล์เทมเพลตเดสก์  โดยไฟล์ดังกล่าวมีเทมเพลตเดสก์ที่จะจัดสรรให้กับผู้ใช้คนปัจจุบัน
       หากไม่ได้ตั้งค่า ระบบจะไม่รวมเทมเพลตเดสก์ที่กำหนดค่าไว้ล่วงหน้าในรายการเทมเพลตเดสก์  หากไม่ได้ตั้งค่านโยบาย <ph name="DESK_TEMPLATES_ENABLED_POLICY_NAME" /> เป็น "จริง" นโยบายนี้จะไม่มีผล</translation>
 <translation id="5641279111657132737">นโยบายนี้เลิกใช้งานไปแล้ว โปรดใช้นโยบาย "<ph name="AUTH_SERVER_ALLOWLIST_POLICY_NAME" />" แทน
@@ -7044,6 +7051,7 @@
 <translation id="8763716376920670835">WebSQL จะเปิดโดยค่าเริ่มต้นตั้งแต่ M101 แต่ก็สามารถปิดใช้ผ่านธงของ Chrome ได้
           หากตั้งค่านโยบายนี้เป็น "เท็จ" หรือไม่ได้ตั้งค่าไว้ ระบบจะปิดใช้ WebSQL ได้
           หากตั้งค่านโยบายนี้เป็น "จริง" ระบบจะปิดใช้ WebSQL ไม่ได้</translation>
+<translation id="8766910236040529804">เปิดใช้คอนเทนเนอร์ของแอปตัวแสดงผล</translation>
 <translation id="8767743923206070405">การตั้งค่านโยบายเป็น "เปิดใช้" จะแสดงปุ่มหน้าแรกในแถบเครื่องมือของ <ph name="PRODUCT_NAME" /> การตั้งค่านโยบายเป็น "ปิดใช้" จะทำให้ปุ่มหน้าแรกไม่ปรากฏขึ้นมา
 
       หากคุณตั้งค่านโยบายไว้ ผู้ใช้จะเปลี่ยนการตั้งค่าดังกล่าวใน <ph name="PRODUCT_NAME" /> ไม่ได้ หากไม่ได้ตั้งค่า ผู้ใช้จะเลือกว่าจะแสดงปุ่มหน้าแรกหรือไม่</translation>
diff --git a/components/safe_browsing/content/browser/client_side_phishing_model.cc b/components/safe_browsing/content/browser/client_side_phishing_model.cc
index a0291e0..3a2e1b8 100644
--- a/components/safe_browsing/content/browser/client_side_phishing_model.cc
+++ b/components/safe_browsing/content/browser/client_side_phishing_model.cc
@@ -232,6 +232,13 @@
   return mapped_region_.mapping.memory();
 }
 
+void ClientSidePhishingModel::NotifyCallbacksOfUpdateForTesting() {
+  // base::Unretained is safe because this is a singleton.
+  content::GetUIThreadTaskRunner({})->PostTask(
+      FROM_HERE, base::BindOnce(&ClientSidePhishingModel::NotifyCallbacksOnUI,
+                                base::Unretained(this)));
+}
+
 void ClientSidePhishingModel::MaybeOverrideModel() {
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           kOverrideCsdModelFlag)) {
diff --git a/components/safe_browsing/content/browser/client_side_phishing_model.h b/components/safe_browsing/content/browser/client_side_phishing_model.h
index 1955008..747a05f 100644
--- a/components/safe_browsing/content/browser/client_side_phishing_model.h
+++ b/components/safe_browsing/content/browser/client_side_phishing_model.h
@@ -68,6 +68,8 @@
   void ClearMappedRegionForTesting();
   // Get flatbuffer memory address.
   void* GetFlatBufferMemoryAddressForTesting();
+  // Notifies all the callbacks of a change in model.
+  void NotifyCallbacksOfUpdateForTesting();
 
   // Called to check the command line and maybe override the current model.
   void MaybeOverrideModel();
diff --git a/components/safe_browsing/content/common/safe_browsing.mojom b/components/safe_browsing/content/common/safe_browsing.mojom
index 44ed3ef2..9b95cbf 100644
--- a/components/safe_browsing/content/common/safe_browsing.mojom
+++ b/components/safe_browsing/content/common/safe_browsing.mojom
@@ -152,4 +152,16 @@
   // to classify the appearance of pages.
   SetPhishingFlatBufferModel(mojo_base.mojom.ReadOnlySharedMemoryRegion region,
                              mojo_base.mojom.ReadOnlyFile? tflite_model);
+
+  // This is used in tests to ensure that the model has been set before sending
+  // IPCs to start classification.
+  SetTestObserver(pending_remote<PhishingModelSetterTestObserver>? observer) =>
+    ();
+};
+
+// This is used in tests to ensure that the model has been set before sending
+// IPCs to start classification.
+interface PhishingModelSetterTestObserver {
+  // Called whenever the phishing model has changed.
+  PhishingModelUpdated();
 };
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.cc b/components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.cc
index 8889337..5f1521f 100644
--- a/components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.cc
+++ b/components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.cc
@@ -39,6 +39,10 @@
       return;
   }
   ScorerStorage::GetInstance()->SetScorer(std::move(scorer));
+
+  if (observer_for_testing_.is_bound()) {
+    observer_for_testing_->PhishingModelUpdated();
+  }
 }
 
 void PhishingModelSetterImpl::SetPhishingFlatBufferModel(
@@ -53,6 +57,19 @@
       return;
   }
   ScorerStorage::GetInstance()->SetScorer(std::move(scorer));
+
+  if (observer_for_testing_.is_bound()) {
+    observer_for_testing_->PhishingModelUpdated();
+  }
+}
+
+void PhishingModelSetterImpl::SetTestObserver(
+    mojo::PendingRemote<mojom::PhishingModelSetterTestObserver> observer,
+    SetTestObserverCallback callback) {
+  if (observer_for_testing_.is_bound())
+    observer_for_testing_.reset();
+  observer_for_testing_.Bind(std::move(observer));
+  std::move(callback).Run();
 }
 
 void PhishingModelSetterImpl::OnRendererAssociatedRequest(
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.h b/components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.h
index 332f2615..99edf2aa 100644
--- a/components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.h
+++ b/components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.h
@@ -8,6 +8,7 @@
 #include "components/safe_browsing/content/common/safe_browsing.mojom.h"
 #include "content/public/renderer/render_thread_observer.h"
 #include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 
 namespace safe_browsing {
 
@@ -34,10 +35,15 @@
   void SetPhishingFlatBufferModel(
       base::ReadOnlySharedMemoryRegion flatbuffer_region,
       base::File tflite_visual_model) override;
+  void SetTestObserver(
+      mojo::PendingRemote<mojom::PhishingModelSetterTestObserver> observer,
+      SetTestObserverCallback callback) override;
 
   void OnRendererAssociatedRequest(
       mojo::PendingAssociatedReceiver<mojom::PhishingModelSetter> receiver);
 
+  mojo::Remote<mojom::PhishingModelSetterTestObserver> observer_for_testing_;
+
   mojo::AssociatedReceiver<mojom::PhishingModelSetter> receiver_{this};
 };
 }  // namespace safe_browsing
diff --git a/components/signin/public/base/signin_metrics.h b/components/signin/public/base/signin_metrics.h
index c26a830..6bc0a85 100644
--- a/components/signin/public/base/signin_metrics.h
+++ b/components/signin/public/base/signin_metrics.h
@@ -72,6 +72,9 @@
   // effective on their browser if they Sync with their managed account. The
   // user has the option to sign out to avoid user policies.
   USER_CLICKED_SIGNOUT_FROM_USER_POLICY_NOTIFICATION_DIALOG = 19,
+  // The email address of the primary account on the device was updated,
+  // triggering an automatic signout followed by signin.
+  ACCOUNT_EMAIL_UPDATED = 20,
   // Keep this as the last enum.
   NUM_PROFILE_SIGNOUT_METRICS,
 };
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb
index 117a1ca2..6038568 100644
--- a/components/strings/components_strings_az.xtb
+++ b/components/strings/components_strings_az.xtb
@@ -27,6 +27,7 @@
 <translation id="1043382569739532657">Qrantlar, təqaüdlər və maliyyə yardımı</translation>
 <translation id="1048785276086539861">Annotasiyaları redaktə etdiyiniz zaman bu sənəd bir səhifəlik görünüşə qayıdacaq</translation>
 <translation id="1050038467049342496">Digər tətbiqləri bağlayın</translation>
+<translation id="1053959602163383901"><ph name="PROVIDER_ORIGIN" /> istifadə edən saytlarda doğrulayıcı cihaz ilə doğrulamağı seçmisiniz. Bu provayder ödəniş metodunuz haqqında məlumat saxlamış ola bilər, onu <ph name="LINK_TEXT" /> ünvanında tapa bilərsiniz.</translation>
 <translation id="1055184225775184556">Əlavəni geri qaytarın</translation>
 <translation id="1056663316309890343">Foto proqramları</translation>
 <translation id="1056898198331236512">Xəbərdarlıq</translation>
@@ -426,6 +427,7 @@
 <translation id="2053111141626950936"><ph name="LANGUAGE" /> dilindəki səhifələr tərcümə edilməyəcək.</translation>
 <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Bu kontrol aktiv olduqda və status "aktiv" olduğu zaman Chrome axtarış fəaliyyətinizin ən çox bənzədiyi çox iştirakçısı olan qrupu, yaxud "kohortu" müəyyən edir. Reklamçılar qrup üçün reklamlar seçə bilər və axtarış fəaliyyətiniz cihazınızda məxfi saxlanılır. Qrupunuz hər gün yenilənir.}=1{Bu kontrol aktiv olduqda və status "aktiv" olduğu zaman Chrome axtarış fəaliyyətinizin ən çox bənzədiyi çox iştirakçısı olan qrupu, yaxud "kohortu" müəyyən edir. Reklamçılar qrup üçün reklamlar seçə bilər və axtarış fəaliyyətiniz cihazınızda məxfi saxlanılır. Qrupunuz hər gün yenilənir.}other{Bu kontrol aktiv olduqda və status "aktiv" olduğu zaman Chrome axtarış fəaliyyətinizin ən çox bənzədiyi çox iştirakçısı olan qrupu, yaxud "kohortu" müəyyən edir. Reklamçılar qrup üçün reklamlar seçə bilər və axtarış fəaliyyətiniz cihazınızda məxfi saxlanılır. Qrupunuz {NUM_DAYS} gündən bir yenilənir.}}</translation>
 <translation id="2064691555167957331">{COUNT,plural, =1{1 təklif}other{# təklif}}</translation>
+<translation id="2066915425250589881">silinməsini tələb edin</translation>
 <translation id="2068528718802935086">Körpələr və yenicə ayaq açmış uşaqlar</translation>
 <translation id="2071156619270205202">Bu kart virtual kart nömrəsi üçün uyğun deyil.</translation>
 <translation id="2071692954027939183">Bildirişlərə adətən icazə vermədiyinizə görə onlar avtomatik olaraq bloklanıb</translation>
@@ -582,6 +584,7 @@
 <translation id="2512101340618156538">İcazə verilməyib (defolt)</translation>
 <translation id="2512413427717747692">"Chrome'u defolt brauzer kimi ayarlayın" düyməsi, Enter düyməsinə basaraq iOS ayarlarında Chrome'u sistemin defolt brauzeri kimi ayarlayın</translation>
 <translation id="2515629240566999685">Ərazinizdəki siqnal yoxlanılır</translation>
+<translation id="2515761554693942801"><ph name="PROVIDER_ORIGIN" /> istifadə edən saytlarda Touch ID ilə doğrulamağı seçmisiniz. Bu provayder ödəniş metodunuz haqqında məlumat saxlamış ola bilər, onu <ph name="LINK_TEXT" /> ünvanında tapa bilərsiniz.</translation>
 <translation id="2521385132275182522">Aşağı sağdan ştapel vurun</translation>
 <translation id="2521736961081452453">Forma yaradın</translation>
 <translation id="2523886232349826891">Yalnız bu cihaz yadda saxlanıldı</translation>
@@ -1496,6 +1499,7 @@
 <translation id="5051305769747448211">Canlı komediya</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{Yaxınlıqda Paylaşım ilə bu faylı göndərmək üçün cihazınızda (<ph name="DISK_SPACE_SIZE" />) yer boşaldın}other{Yaxınlıqda Paylaşım ilə bu faylları göndərmək üçün cihazınızda (<ph name="DISK_SPACE_SIZE" />) yer boşaldın}}</translation>
 <translation id="5056549851600133418">Sizin üçün məqalələr</translation>
+<translation id="5060483733937416656"><ph name="PROVIDER_ORIGIN" /> istifadə edən saytlarda Windows Hello ilə doğrulamağı seçmisiniz. Bu provayder ödəniş metodunuz haqqında məlumat saxlamış ola bilər, onu <ph name="LINK_TEXT" /> ünvanında tapa bilərsiniz.</translation>
 <translation id="5061227663725596739"><ph name="LOOKALIKE_DOMAIN" /> nəzərdə tuturdunuz?</translation>
 <translation id="5066056036849835175">Çap tarixçəsi</translation>
 <translation id="5068234115460527047">Hedge fondlar</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb
index 6ab0eca..197791e 100644
--- a/components/strings/components_strings_bs.xtb
+++ b/components/strings/components_strings_bs.xtb
@@ -27,6 +27,7 @@
 <translation id="1043382569739532657">Grantovi, stipendije i finansijska pomoć</translation>
 <translation id="1048785276086539861">Kada uredite bilješke, ovaj dokument će se vratiti na prikaz na jednoj stranici</translation>
 <translation id="1050038467049342496">Zatvorite druge aplikacije</translation>
+<translation id="1053959602163383901">Odabrali ste potvrdu pomoću uređaja za autentifikaciju na web-lokacijama koje koriste <ph name="PROVIDER_ORIGIN" />. Taj je davatelj usluga možda pohranio podatke o vašem načinu plaćanja za koje možete <ph name="LINK_TEXT" />.</translation>
 <translation id="1055184225775184556">&amp;Poništi dodavanje</translation>
 <translation id="1056663316309890343">Softver za fotografije</translation>
 <translation id="1056898198331236512">Upozorenje</translation>
@@ -426,6 +427,7 @@
 <translation id="2053111141626950936">Stranice čiji jezik je <ph name="LANGUAGE" />, neće se prevoditi.</translation>
 <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Kada je ova kontrola uključena i status aktivan, Chrome određuje kojoj je velikoj grupi ljudi, ili "kohorti", vaša nedavna aktivnost pregledanja najsličnija. Oglašivači mogu odabrati oglase za tu grupu, a vaša aktivnost pregledanja ostaje privatna na vašem uređaju. Vaša grupa se ažurira svaki dan.}=1{Kada je ova kontrola uključena i status aktivan, Chrome određuje kojoj je velikoj grupi ljudi, ili "kohorti", vaša nedavna aktivnost pregledanja najsličnija. Oglašivači mogu odabrati oglase za tu grupu, a vaša aktivnost pregledanja ostaje privatna na vašem uređaju. Vaša grupa se ažurira svaki dan.}one{Kada je ova kontrola uključena i status aktivan, Chrome određuje kojoj je velikoj grupi ljudi, ili "kohorti", vaša nedavna aktivnost pregledanja najsličnija. Oglašivači mogu odabrati oglase za tu grupu, a vaša aktivnost pregledanja ostaje privatna na vašem uređaju. Vaša grupa se ažurira svakih {NUM_DAYS} dan.}few{Kada je ova kontrola uključena i status aktivan, Chrome određuje kojoj je velikoj grupi ljudi, ili "kohorti", vaša nedavna aktivnost pregledanja najsličnija. Oglašivači mogu odabrati oglase za tu grupu, a vaša aktivnost pregledanja ostaje privatna na vašem uređaju. Vaša grupa se ažurira svaka {NUM_DAYS} dana.}other{Kada je ova kontrola uključena i status aktivan, Chrome određuje kojoj je velikoj grupi ljudi, ili "kohorti", vaša nedavna aktivnost pregledanja najsličnija. Oglašivači mogu odabrati oglase za tu grupu, a vaša aktivnost pregledanja ostaje privatna na vašem uređaju. Vaša grupa se ažurira svakih {NUM_DAYS} dana.}}</translation>
 <translation id="2064691555167957331">{COUNT,plural, =1{Jedan prijedlog}one{# prijedlog}few{# prijedloga}other{# prijedloga}}</translation>
+<translation id="2066915425250589881">zatražiti da se izbrišu</translation>
 <translation id="2068528718802935086">Bebe i mala djeca</translation>
 <translation id="2071156619270205202">Ova kartica ne ispunjava uslove za broj virtuelne kartice.</translation>
 <translation id="2071692954027939183">Obavještenja su automatski blokirana jer ih obično ne dozvoljavate</translation>
@@ -582,6 +584,7 @@
 <translation id="2512101340618156538">Nije dozvoljeno (zadano)</translation>
 <translation id="2512413427717747692">Dugme za postavljanje Chromea kao zadanog preglednika, pritisnite Enter da postavite Chrome kao zadani preglednik sistema u postavkama iOS-a</translation>
 <translation id="2515629240566999685">Provjeriti signal u svojoj oblasti</translation>
+<translation id="2515761554693942801">Odabrali ste potvrdu pomoću Touch ID-ja na web-lokacijama koje koriste <ph name="PROVIDER_ORIGIN" />. Taj je davatelj usluga možda pohranio podatke o vašem načinu plaćanja za koje možete <ph name="LINK_TEXT" />.</translation>
 <translation id="2521385132275182522">Spajanje u donjem desnom uglu</translation>
 <translation id="2521736961081452453">Kreiraj obrazac</translation>
 <translation id="2523886232349826891">Sačuvano isključivo na ovom uređaju</translation>
@@ -1501,6 +1504,7 @@
 <translation id="5051305769747448211">Komedija uživo</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{Da pošaljete ovaj fajl pomoću Dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}one{Da pošaljete ove fajlove pomoću Dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}few{Da pošaljete ove fajlove pomoću Dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}other{Da pošaljete ove fajlove pomoću Dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}}</translation>
 <translation id="5056549851600133418">Članci za vas</translation>
+<translation id="5060483733937416656">Odabrali ste potvrdu putem značajke Windows Hello na web-lokacijama koje koriste <ph name="PROVIDER_ORIGIN" />. Taj je davatelj usluga možda pohranio podatke o vašem načinu plaćanja za koje možete <ph name="LINK_TEXT" />.</translation>
 <translation id="5061227663725596739">Jeste li mislili <ph name="LOOKALIKE_DOMAIN" />?</translation>
 <translation id="5066056036849835175">Historija štampanja</translation>
 <translation id="5068234115460527047">Hedž fondovi</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 32225e3..79b4393 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -27,6 +27,7 @@
 <translation id="1043382569739532657">Mga grant, scholarship, at tulong Pampinansyal</translation>
 <translation id="1048785276086539861">Kapag nag-edit ka ng mga anotasyon, babalik ang dokumentong ito sa isang page na view</translation>
 <translation id="1050038467049342496">Isara ang iba pang app</translation>
+<translation id="1053959602163383901">Puwede mong piliing mag-verify gamit ang isang authenticator device sa mga website na gumagamit ng <ph name="PROVIDER_ORIGIN" />. Ang provider na ito ay posibleng nag-store ng impormasyon tungkol sa iyong paraan ng pagbabayad, na puwede mong <ph name="LINK_TEXT" />.</translation>
 <translation id="1055184225775184556">&amp;I-undo ang Pagdagdag</translation>
 <translation id="1056663316309890343">Software sa larawan</translation>
 <translation id="1056898198331236512">Babala</translation>
@@ -426,6 +427,7 @@
 <translation id="2053111141626950936">Hindi ita-translate ang mga page na nasa <ph name="LANGUAGE" />.</translation>
 <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Kapag naka-on ang kontrol na ito at aktibo ang status, tinutukoy ng Chrome kung aling malaking grupo ng mga tao, o "cohort," ang pinakakatulad ng iyong kamakailang aktibidad sa pag-browse. Makakapili ang mga advertiser ng mga ad para sa grupo at pinapanatiling pribado sa iyong device ang aktibidad mo sa pag-browse. Ina-update ang iyong grupo araw-araw.}=1{Kapag naka-on ang kontrol na ito at aktibo ang status, tinutukoy ng Chrome kung aling malaking grupo ng mga tao, o "cohort," ang pinakakatulad ng iyong kamakailang aktibidad sa pag-browse. Makakapili ang mga advertiser ng mga ad para sa grupo at pinapanatiling pribado sa iyong device ang aktibidad mo sa pag-browse. Ina-update ang iyong grupo araw-araw.}one{Kapag naka-on ang kontrol na ito at aktibo ang status, tinutukoy ng Chrome kung aling malaking grupo ng mga tao, o "cohort," ang pinakakatulad ng iyong kamakailang aktibidad sa pag-browse. Makakapili ang mga advertiser ng mga ad para sa grupo at pinapanatiling pribado sa iyong device ang aktibidad mo sa pag-browse. Ina-update ang iyong grupo kada {NUM_DAYS} araw.}other{Kapag naka-on ang kontrol na ito at aktibo ang status, tinutukoy ng Chrome kung aling malaking grupo ng mga tao, o "cohort," ang pinakakatulad ng iyong kamakailang aktibidad sa pag-browse. Makakapili ang mga advertiser ng mga ad para sa grupo at pinapanatiling pribado sa iyong device ang aktibidad mo sa pag-browse. Ina-update ang iyong grupo kada {NUM_DAYS} na araw.}}</translation>
 <translation id="2064691555167957331">{COUNT,plural, =1{1 suhestyon}one{# suhestyon}other{# na suhestyon}}</translation>
+<translation id="2066915425250589881">hilinging i-delete</translation>
 <translation id="2068528718802935086">Mga sanggol at toddler</translation>
 <translation id="2071156619270205202">Hindi kwalipikado ang card na ito para sa virtual card number.</translation>
 <translation id="2071692954027939183">Awtomatikong na-block ang mga notification dahil karaniwang hindi mo pinapayagan ang mga ito</translation>
@@ -582,6 +584,7 @@
 <translation id="2512101340618156538">Hindi pinapayagan (default)</translation>
 <translation id="2512413427717747692">Itakda ang Chrome bilang default na button ng browser, pindutin ang Enter para itakda ang Chrome bilang default na browser ng system sa mga setting ng iOS</translation>
 <translation id="2515629240566999685">Suriin ang signal sa iyong lugar</translation>
+<translation id="2515761554693942801">Puwede mong piliing mag-verify gamit ang Touch ID sa mga website na gumagamit ng <ph name="PROVIDER_ORIGIN" />. Ang provider na ito ay posibleng nag-store ng impormasyon tungkol sa iyong paraan ng pagbabayad, na puwede mong <ph name="LINK_TEXT" />.</translation>
 <translation id="2521385132275182522">Staple bottom right</translation>
 <translation id="2521736961081452453">Gumawa ng form</translation>
 <translation id="2523886232349826891">Ise-save sa device lang na ito</translation>
@@ -1501,6 +1504,7 @@
 <translation id="5051305769747448211">Live na komedya</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{Para ipadala ang file na ito gamit ang Nearby Share, magbakante ng espasyo (<ph name="DISK_SPACE_SIZE" />) sa iyong device}one{Para ipadala ang mga file na ito gamit ang Nearby Share, magbakante ng espasyo (<ph name="DISK_SPACE_SIZE" />) sa iyong device}other{Para ipadala ang mga file na ito gamit ang Nearby Share, magbakante ng espasyo (<ph name="DISK_SPACE_SIZE" />) sa iyong device}}</translation>
 <translation id="5056549851600133418">Mga artikulo para sa iyo</translation>
+<translation id="5060483733937416656">Pinili mong mag-verify gamit ang Windows Hello sa mga website na gumagamit ng <ph name="PROVIDER_ORIGIN" />. Ang provider na ito ay posibleng nag-store ng impormasyon tungkol sa iyong paraan ng pagbabayad, na puwede mong <ph name="LINK_TEXT" />.</translation>
 <translation id="5061227663725596739">Ang ibig mo bang sabihin ay <ph name="LOOKALIKE_DOMAIN" />?</translation>
 <translation id="5066056036849835175">History ng pag-print</translation>
 <translation id="5068234115460527047">Mga hedge fund</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index 4b4f82e..ea8a404 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -27,6 +27,7 @@
 <translation id="1043382569739532657">अनुदान, स्कॉलरशिप, और वित्तीय सहायता</translation>
 <translation id="1048785276086539861">जब आप वीडियो के ऊपर टेक्स्ट, लिंक वगैरह में बदलाव करते हैं, तो दस्तावेज़, सिंगल पेज व्यू पर वापस चला जाएगा</translation>
 <translation id="1050038467049342496">दूूूूसरे ऐप्लिकेशन बंद करें</translation>
+<translation id="1053959602163383901">आपने <ph name="PROVIDER_ORIGIN" /> इस्तेमाल करने वाली वेबसाइटों पर, पुष्टि करने वाले एक डिवाइस की मदद से पुष्टि करने का विकल्प चुना है. हो सकता है कि सेवा उपलब्ध कराने वाली इस कंपनी ने आपके पैसे चुकाने के तरीके से जुड़ी जानकारी सेव की हो, जिसे <ph name="LINK_TEXT" /> किया जा सकता है.</translation>
 <translation id="1055184225775184556">&amp;जोड़ना वापस लाएं</translation>
 <translation id="1056663316309890343">फ़ोटो से जुड़ा सॉफ़्टवेयर</translation>
 <translation id="1056898198331236512">चेतावनी</translation>
@@ -427,6 +428,7 @@
 <translation id="2053111141626950936"><ph name="LANGUAGE" /> भाषा के पेजों का अनुवाद नहीं किया जाएगा.</translation>
 <translation id="2053373601901562871">{NUM_DAYS,plural, =0{यह कंट्रोल चालू होने और स्टेटस ऐक्टिव होने पर, Chrome यह देखता है कि आपकी हाल की ब्राउज़िंग गतिविधि, किस बड़े ग्रुप या "समानता रखने वाले लोगों" से काफ़ी हद तक मिलती है. विज्ञापन देने वाले, ग्रुप के लिए विज्ञापनों को चुन सकते हैं. साथ ही, आपकी ब्राउज़िंग गतिविधि आपके डिवाइस पर गोपनीय रखी जाती है. आपका ग्रुप हर दिन अपडेट किया जाता है.}=1{यह कंट्रोल चालू होने और स्टेटस ऐक्टिव होने पर, Chrome यह देखता है कि आपकी हाल की ब्राउज़िंग गतिविधि, किस बड़े ग्रुप या "समानता रखने वाले लोगों" से काफ़ी हद तक मिलती है. विज्ञापन देने वाले, ग्रुप के लिए विज्ञापनों को चुन सकते हैं. साथ ही, आपकी ब्राउज़िंग गतिविधि आपके डिवाइस पर गोपनीय रखी जाती है. आपका ग्रुप हर दिन अपडेट किया जाता है.}one{यह कंट्रोल चालू होने और स्टेटस ऐक्टिव होने पर, Chrome यह देखता है कि आपकी हाल की ब्राउज़िंग गतिविधि, किस बड़े ग्रुप या "समानता रखने वाले लोगों" से काफ़ी हद तक मिलती है. विज्ञापन देने वाले, ग्रुप के लिए विज्ञापनों को चुन सकते हैं. साथ ही, आपकी ब्राउज़िंग गतिविधि आपके डिवाइस पर गोपनीय रखी जाती है. आपका ग्रुप हर {NUM_DAYS} दिन में अपडेट किया जाता है.}other{यह कंट्रोल चालू होने और स्टेटस ऐक्टिव होने पर, Chrome यह देखता है कि आपकी हाल की ब्राउज़िंग गतिविधि, किस बड़े ग्रुप या "समानता रखने वाले लोगों" से काफ़ी हद तक मिलती है. विज्ञापन देने वाले, ग्रुप के लिए विज्ञापनों को चुन सकते हैं. साथ ही, आपकी ब्राउज़िंग गतिविधि आपके डिवाइस पर गोपनीय रखी जाती है. आपका ग्रुप हर {NUM_DAYS} दिन में अपडेट किया जाता है.}}</translation>
 <translation id="2064691555167957331">{COUNT,plural, =1{1 सुझाव}one{# सुझाव}other{# सुझाव}}</translation>
+<translation id="2066915425250589881">मिटाने का अनुरोध</translation>
 <translation id="2068528718802935086">शिशु और छोटे बच्चे</translation>
 <translation id="2071156619270205202">इस कार्ड को वर्चुअल कार्ड के तौर पर इस्तेमाल नहीं किया जा सकता.</translation>
 <translation id="2071692954027939183">सूचनाओं को अपने-आप ब्लॉक कर दिया गया, क्योंकि आम तौर पर आप उन्हें अनुमति नहीं देते हैं</translation>
@@ -583,6 +585,7 @@
 <translation id="2512101340618156538">अनुमति नहीं है (डिफ़ॉल्ट रूप से)</translation>
 <translation id="2512413427717747692">'Chrome को डिफ़ॉल्ट ब्राउज़र के रूप में सेट करें' बटन, Chrome को सिस्टम के डिफ़ॉल्ट ब्राउज़र के रूप में सेट करने के लिए Enter दबाएं</translation>
 <translation id="2515629240566999685">अपने इलाके में सिग्नल की जाँच करें</translation>
+<translation id="2515761554693942801">आपने <ph name="PROVIDER_ORIGIN" /> का इस्तेमाल करने वाली वेबसाइटों पर, Touch ID की मदद से पुष्टि करने का विकल्प चुना है. हो सकता है कि सेवा उपलब्ध कराने वाली इस कंपनी ने आपके पैसे चुकाने के तरीके से जुड़ी जानकारी सेव की हो, जिसे <ph name="LINK_TEXT" /> किया जा सकता है.</translation>
 <translation id="2521385132275182522">नीचे दाईं ओर स्टेपल</translation>
 <translation id="2521736961081452453">फ़ॉर्म बनाएं</translation>
 <translation id="2523886232349826891">सिर्फ़ इस डिवाइस पर सेव किया गया</translation>
@@ -1501,6 +1504,7 @@
 <translation id="5051305769747448211">लाइव कॉमेडी</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{आस-पास शेयर करने की सुविधा का इस्तेमाल करके इस फ़ाइल को भेजने के लिए, अपने डिवाइस में (<ph name="DISK_SPACE_SIZE" />) जगह खाली करें}one{आस-पास शेयर करने की सुविधा का इस्तेमाल करके इस फ़ाइल को भेजने के लिए, अपने डिवाइस में (<ph name="DISK_SPACE_SIZE" />) जगह खाली करें}other{आस-पास शेयर करने की सुविधा का इस्तेमाल करके इन फ़ाइलों को भेजने के लिए, अपने डिवाइस में (<ph name="DISK_SPACE_SIZE" />) जगह खाली करें}}</translation>
 <translation id="5056549851600133418">आपके लिए लेख</translation>
+<translation id="5060483733937416656">आपने <ph name="PROVIDER_ORIGIN" /> इस्तेमाल करने वाली वेबसाइटों पर, Windows Hello की मदद से पुष्टि करने का विकल्प चुना है. हो सकता है कि सेवा उपलब्ध कराने वाली इस कंपनी ने आपके पैसे चुकाने के तरीके से जुड़ी जानकारी सेव की हो, जिसे <ph name="LINK_TEXT" /> किया जा सकता है.</translation>
 <translation id="5061227663725596739">क्या आपका मतलब <ph name="LOOKALIKE_DOMAIN" /> से है?</translation>
 <translation id="5066056036849835175">प्रिंट करने का इतिहास</translation>
 <translation id="5068234115460527047">हेज फ़ंड</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb
index 4e29128..afe2f20a5 100644
--- a/components/strings/components_strings_hr.xtb
+++ b/components/strings/components_strings_hr.xtb
@@ -27,6 +27,7 @@
 <translation id="1043382569739532657">Stipendije i financijska potpora</translation>
 <translation id="1048785276086539861">Kad uredite napomene, dokument će se vratiti na prikaz pojedinačne stranice</translation>
 <translation id="1050038467049342496">Zatvorite ostale aplikacije</translation>
+<translation id="1053959602163383901">Odabrali ste potvrdu pomoću uređaja za autentifikaciju na web-lokacijama koje koriste <ph name="PROVIDER_ORIGIN" />. Taj je davatelj usluga možda pohranio podatke o vašem načinu plaćanja za koje možete <ph name="LINK_TEXT" />.</translation>
 <translation id="1055184225775184556">&amp;Poništi dodavanje</translation>
 <translation id="1056663316309890343">Softver za upravljanje fotografijama</translation>
 <translation id="1056898198331236512">Upozorenje</translation>
@@ -426,6 +427,7 @@
 <translation id="2053111141626950936">Neće se prevoditi <ph name="LANGUAGE" />.</translation>
 <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Kada je ta kontrola uključena i status je aktivan, Chrome određuje kojoj je velikoj grupi ljudi, odnosno skupini, vaša nedavna aktivnost pregledavanja najsličnija. Oglašivači mogu odabrati oglase za tu grupu, a vaša aktivnost pregledavanja ostaje privatna na vašem uređaju. Vaša se grupa ažurira svaki dan.}=1{Kada je ta kontrola uključena i status je aktivan, Chrome određuje kojoj je velikoj grupi ljudi, odnosno skupini, vaša nedavna aktivnost pregledavanja najsličnija. Oglašivači mogu odabrati oglase za tu grupu, a vaša aktivnost pregledavanja ostaje privatna na vašem uređaju. Vaša se grupa ažurira svaki dan.}one{Kada je ta kontrola uključena i status je aktivan, Chrome određuje kojoj je velikoj grupi ljudi, odnosno skupini, vaša nedavna aktivnost pregledavanja najsličnija. Oglašivači mogu odabrati oglase za tu grupu, a vaša aktivnost pregledavanja ostaje privatna na vašem uređaju. Vaša se grupa ažurira svaki {NUM_DAYS} dan.}few{Kada je ta kontrola uključena i status je aktivan, Chrome određuje kojoj je velikoj grupi ljudi, odnosno skupini, vaša nedavna aktivnost pregledavanja najsličnija. Oglašivači mogu odabrati oglase za tu grupu, a vaša aktivnost pregledavanja ostaje privatna na vašem uređaju. Vaša se grupa ažurira svaka {NUM_DAYS} dana.}other{Kada je ta kontrola uključena i status je aktivan, Chrome određuje kojoj je velikoj grupi ljudi, odnosno skupini, vaša nedavna aktivnost pregledavanja najsličnija. Oglašivači mogu odabrati oglase za tu grupu, a vaša aktivnost pregledavanja ostaje privatna na vašem uređaju. Vaša se grupa ažurira svakih {NUM_DAYS} dana.}}</translation>
 <translation id="2064691555167957331">{COUNT,plural, =1{1 prijedlog}one{# prijedlog}few{# prijedloga}other{# prijedloga}}</translation>
+<translation id="2066915425250589881">zatražiti da se izbrišu</translation>
 <translation id="2068528718802935086">Novorođenčad i mala djeca</translation>
 <translation id="2071156619270205202">Ova kartica ne ispunjava kriterije za broj virtualne kartice.</translation>
 <translation id="2071692954027939183">Obavijesti su automatski blokirane jer ih obično ne dopuštate</translation>
@@ -582,6 +584,7 @@
 <translation id="2512101340618156538">Nije dopušteno (zadano)</translation>
 <translation id="2512413427717747692">Gumb za postavljanje Chromea kao zadanog preglednika, pritisnite Enter da biste u postavkama iOS-a Chrome postavili kao zadani preglednik sustava</translation>
 <translation id="2515629240566999685">provjerite jačinu signala na svom području</translation>
+<translation id="2515761554693942801">Odabrali ste potvrdu pomoću Touch ID-ja na web-lokacijama koje koriste <ph name="PROVIDER_ORIGIN" />. Taj je davatelj usluga možda pohranio podatke o vašem načinu plaćanja za koje možete <ph name="LINK_TEXT" />.</translation>
 <translation id="2521385132275182522">Spajanje pri dnu desno</translation>
 <translation id="2521736961081452453">Izradite obrazac</translation>
 <translation id="2523886232349826891">Sprema se samo na ovom uređaju</translation>
@@ -1501,6 +1504,7 @@
 <translation id="5051305769747448211">Komedija uživo</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{Da biste poslali tu datoteku pomoću dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}one{Da biste poslali te datoteke pomoću dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}few{Da biste poslali te datoteke pomoću dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}other{Da biste poslali te datoteke pomoću dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}}</translation>
 <translation id="5056549851600133418">Preporučeni članci</translation>
+<translation id="5060483733937416656">Odabrali ste potvrdu putem značajke Windows Hello na web-lokacijama koje koriste <ph name="PROVIDER_ORIGIN" />. Taj je davatelj usluga možda pohranio podatke o vašem načinu plaćanja za koje možete <ph name="LINK_TEXT" />.</translation>
 <translation id="5061227663725596739">Jeste li mislili <ph name="LOOKALIKE_DOMAIN" />?</translation>
 <translation id="5066056036849835175">Povijest ispisa</translation>
 <translation id="5068234115460527047">Hedge fondovi</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb
index 73befd4..b1a3b9d 100644
--- a/components/strings/components_strings_km.xtb
+++ b/components/strings/components_strings_km.xtb
@@ -27,6 +27,7 @@
 <translation id="1043382569739532657">ជំនួយផ្នែក​ហិរញ្ញវត្ថុ ជំនួយ​ឥតសំណង និង​អាហារូបករណ៍</translation>
 <translation id="1048785276086539861">នៅពេល​អ្នក​កែចំណារ ឯកសារនេះ​នឹងត្រឡប់ទៅ​ការមើល​ទំព័រ​ទោលវិញ</translation>
 <translation id="1050038467049342496">បិទ​កម្មវិធី​ផ្សេងទៀត</translation>
+<translation id="1053959602163383901">អ្នក​បាន​ជ្រើសរើស​ផ្ទៀងផ្ទាត់​ដោយប្រើ​ឧបករណ៍​ដែល​បាន​ភ្ជាប់​នឹង​កម្មវិធី​ផ្ទៀងផ្ទាត់​នៅលើ​គេហទំព័រ​ដែល​ប្រើប្រាស់ <ph name="PROVIDER_ORIGIN" />។ ក្រុមហ៊ុន​ផ្ដល់​សេវា​នេះ​ប្រហែលជា​បានរក្សាទុក​ព័ត៌មាន​អំពី​វិធីបង់ប្រាក់​របស់អ្នក ដែល​អ្នក​អាច​<ph name="LINK_TEXT" />។</translation>
 <translation id="1055184225775184556">បកក្រោយការបន្ថែម</translation>
 <translation id="1056663316309890343">កម្មវិធី​រូបថត</translation>
 <translation id="1056898198331236512">ការព្រមាន</translation>
@@ -428,6 +429,7 @@
 <translation id="2053111141626950936">ទំព័រជា <ph name="LANGUAGE" /> នឹងមិនត្រូវ​បានបកប្រែទេ។</translation>
 <translation id="2053373601901562871">{NUM_DAYS,plural, =0{នៅពេលបើកការគ្រប់គ្រងនេះ ហើយស្ថានភាពកំពុងសកម្ម នោះ Chrome កំណត់ថាតើក្រុមមនុស្សមួយក្រុមធំ ឬ "ក្រុមមនុស្សដូចគ្នា" ណា ដែលសកម្មភាព​រុករក​តាមអ៊ីនធឺណិតថ្មីៗរបស់អ្នកស្រដៀងបំផុត។ អ្នកផ្សាយ​ពាណិជ្ជកម្ម​អាចជ្រើសរើស​ការផ្សាយពាណិជ្ជកម្ម​សម្រាប់ក្រុម​នោះ ហើយសកម្មភាព​រុករក​តាមអ៊ីនធឺណិតរបស់អ្នកត្រូវបានរក្សាជាលក្ខណៈឯកជននៅលើឧបករណ៍របស់អ្នក។ ក្រុមរបស់អ្នកត្រូវបានធ្វើបច្ចុប្បន្នភាពរៀងរាល់ថ្ងៃ។}=1{នៅពេលបើកការគ្រប់គ្រងនេះ ហើយស្ថានភាពកំពុងសកម្ម នោះ Chrome កំណត់ថាតើក្រុមមនុស្សមួយក្រុមធំ ឬ "ក្រុមមនុស្សដូចគ្នា" ណា ដែលសកម្មភាព​រុករក​តាមអ៊ីនធឺណិតថ្មីៗរបស់អ្នកស្រដៀងបំផុត។ អ្នកផ្សាយ​ពាណិជ្ជកម្ម​អាចជ្រើសរើស​ការផ្សាយពាណិជ្ជកម្ម​សម្រាប់ក្រុម​នោះ ហើយសកម្មភាព​រុករក​តាមអ៊ីនធឺណិតរបស់អ្នកត្រូវបានរក្សាជាលក្ខណៈឯកជននៅលើឧបករណ៍របស់អ្នក។ ក្រុមរបស់អ្នកត្រូវបានធ្វើបច្ចុប្បន្នភាពរៀងរាល់ថ្ងៃ។}other{នៅពេលបើកការគ្រប់គ្រងនេះ ហើយស្ថានភាពកំពុងសកម្ម នោះ Chrome កំណត់ថាតើក្រុមមនុស្សមួយក្រុមធំ ឬ "ក្រុមមនុស្សដូចគ្នា" ណា ដែលសកម្មភាព​រុករក​តាមអ៊ីនធឺណិតថ្មីៗរបស់អ្នកស្រដៀងបំផុត។ អ្នកផ្សាយ​ពាណិជ្ជកម្ម​អាចជ្រើសរើស​ការផ្សាយពាណិជ្ជកម្ម​សម្រាប់ក្រុម​នោះ ហើយសកម្មភាព​រុករក​តាមអ៊ីនធឺណិតរបស់អ្នកត្រូវបានរក្សាជាលក្ខណៈឯកជននៅលើឧបករណ៍របស់អ្នក។ ក្រុមរបស់អ្នកត្រូវបានធ្វើបច្ចុប្បន្នភាពរៀងរាល់ {NUM_DAYS} ថ្ងៃ។}}</translation>
 <translation id="2064691555167957331">{COUNT,plural, =1{ការផ្តល់យោបល់ 1}other{ការផ្តល់យោបល់ #}}</translation>
+<translation id="2066915425250589881">ស្នើសុំ​ឱ្យលុប</translation>
 <translation id="2068528718802935086">ទារក និង​ក្មេងតូច​ទើបចេះដើរ</translation>
 <translation id="2071156619270205202">កាតនេះ​មិនមានសិទ្ធិ​សម្រាប់លេខកាត​និម្មិតទេ។</translation>
 <translation id="2071692954027939183">ការជូនដំណឹងត្រូវបានទប់ស្កាត់ដោយស្វ័យប្រវត្តិ ដោយសារជាធម្មតា អ្នកមិនអនុញ្ញាតការជូនដំណឹងទេ</translation>
@@ -585,6 +587,7 @@
 <translation id="2512101340618156538">មិនអនុញ្ញាត (លំនាំដើម)</translation>
 <translation id="2512413427717747692">កំណត់ Chrome ជាប៊ូតុងកម្មវិធីរុករកតាមអ៊ីនធឺណិតលំនាំដើម ចុច "Enter" ដើម្បីកំណត់ Chrome ជាកម្មវិធីរុករកតាមអ៊ីនធឺណិតលំនាំដើមរបស់ប្រព័ន្ធនៅក្នុងការកំណត់ iOS</translation>
 <translation id="2515629240566999685">ពិនិត្យសេវានៅក្នុងតំបន់របស់អ្នក</translation>
+<translation id="2515761554693942801">អ្នក​បាន​ជ្រើសរើស​ផ្ទៀងផ្ទាត់​ដោយប្រើ Touch ID នៅលើ​គេហទំព័រ​ដែល​ប្រើប្រាស់ <ph name="PROVIDER_ORIGIN" />។ ក្រុមហ៊ុន​ផ្ដល់​សេវា​នេះ​ប្រហែលជា​បានរក្សាទុក​ព័ត៌មាន​អំពី​វិធីបង់ប្រាក់​របស់អ្នក ដែល​អ្នក​អាច​<ph name="LINK_TEXT" />។</translation>
 <translation id="2521385132275182522">កិប​ខាងក្រោម​ផ្នែកខាង​ស្ដាំ</translation>
 <translation id="2521736961081452453">បង្កើត​ទម្រង់បែបបទ</translation>
 <translation id="2523886232349826891">បានរក្សាទុក​នៅលើតែឧបករណ៍នេះ​ប៉ុណ្ណោះ</translation>
@@ -1505,6 +1508,7 @@
 <translation id="5051305769747448211">រឿងកំប្លែង​បន្តផ្ទាល់</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{ដើម្បីផ្ញើឯកសារនេះដោយប្រើការ​ចែករំលែកនៅ​ជិត សូមបង្កើនទំហំផ្ទុក (<ph name="DISK_SPACE_SIZE" />) នៅលើឧបករណ៍របស់អ្នក}other{ដើម្បីផ្ញើឯកសារទាំងនេះដោយប្រើការ​ចែករំលែកនៅ​ជិត សូមបង្កើនទំហំផ្ទុក (<ph name="DISK_SPACE_SIZE" />) នៅលើឧបករណ៍របស់អ្នក}}</translation>
 <translation id="5056549851600133418">អត្ថបទសម្រាប់អ្នក</translation>
+<translation id="5060483733937416656">អ្នក​បាន​ជ្រើសរើស​ផ្ទៀងផ្ទាត់​ដោយប្រើ Windows Hello នៅលើ​គេហទំព័រ​ដែល​ប្រើប្រាស់ <ph name="PROVIDER_ORIGIN" />។ ក្រុមហ៊ុន​ផ្ដល់​សេវា​នេះ​ប្រហែលជា​បានរក្សាទុក​ព័ត៌មាន​អំពី​វិធីបង់ប្រាក់​របស់អ្នក ដែល​អ្នក​អាច​<ph name="LINK_TEXT" />។</translation>
 <translation id="5061227663725596739">តើ​អ្នក​ចង់​មានន័យ​ថា <ph name="LOOKALIKE_DOMAIN" />?</translation>
 <translation id="5066056036849835175">ប្រវត្តិ​បោះពុម្ព</translation>
 <translation id="5068234115460527047">មូលនិធិ​ការពារហានិភ័យ</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb
index 2a51474..4f255cc 100644
--- a/components/strings/components_strings_kn.xtb
+++ b/components/strings/components_strings_kn.xtb
@@ -27,6 +27,7 @@
 <translation id="1043382569739532657">ಅನುದಾನಗಳು, ವಿದ್ಯಾರ್ಥಿ ವೇತನಗಳು ಮತ್ತು ಧನ ಸಹಾಯ</translation>
 <translation id="1048785276086539861">ನೀವು ಟಿಪ್ಪಣಿಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಿದಾಗ, ಈ ಡಾಕ್ಯುಮೆಂಟ್ ಒಂದೇ ಪುಟದ ವೀಕ್ಷಣೆಗೆ ಹಿಂತಿರುಗುತ್ತದೆ</translation>
 <translation id="1050038467049342496">ಇತರ ಅಪ್ಲಿಕೇಶನ್‍ಗಳನ್ನು ಮುಚ್ಚಿ</translation>
+<translation id="1053959602163383901">ನೀವು <ph name="PROVIDER_ORIGIN" /> ಬಳಸುವ ವೆಬ್‌ಸೈಟ್‌ಗಳಲ್ಲಿ ದೃಢೀಕರಣ ಸಾಧನವೊಂದರ ಮೂಲಕ ದೃಢೀಕರಿಸುವ ಆಯ್ಕೆಯನ್ನು ಮಾಡಿದ್ದೀರಿ. ಈ ಪೂರೈಕೆದಾರರು ನಿಮ್ಮ ಪಾವತಿ ವಿಧಾನದ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ಸಂಗ್ರಹಿಸಿಟ್ಟಿರಬಹುದು, ನೀವು ಅದನ್ನು <ph name="LINK_TEXT" />.</translation>
 <translation id="1055184225775184556">&amp;ಸೇರಿಸುವುದನ್ನು ರದ್ದುಗೊಳಿಸಿ</translation>
 <translation id="1056663316309890343">ಫೋಟೋ ಸಾಫ್ಟ್‌ವೇರ್</translation>
 <translation id="1056898198331236512">ಎಚ್ಚರಿಕೆ</translation>
@@ -424,6 +425,7 @@
 <translation id="2053111141626950936"><ph name="LANGUAGE" />ಭಾಷೆಯಲ್ಲಿರುವ ಪುಟಗಳು ಅನುವಾದಕ್ಕೊಳಪಡುವುದಿಲ್ಲ.</translation>
 <translation id="2053373601901562871">{NUM_DAYS,plural, =0{ಈ ನಿಯಂತ್ರಣವು ಆನ್ ಆಗಿದ್ದು ಹಾಗೂ ಸ್ಥಿತಿಯು ಸಕ್ರಿಯವಾಗಿದ್ದಾಗ, ಯಾವ ಜನರ ದೊಡ್ಡ ಗುಂಪು ಅಥವಾ ಜನರ ತಂಡಕ್ಕೆ ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಹೋಲುತ್ತದೆ ಎಂದು Chrome ನಿರ್ಧರಿಸುತ್ತದೆ. ಜಾಹೀರಾತುದಾರರು ಗುಂಪಿಗಾಗಿ ಜಾಹೀರಾತುಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಬಹುದು ಹಾಗೂ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಖಾಸಗಿಯಾಗಿ ಇರಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಗುಂಪನ್ನು ಪ್ರತಿದಿನ ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತದೆ.}=1{ಈ ನಿಯಂತ್ರಣವು ಆನ್ ಆಗಿದ್ದು ಹಾಗೂ ಸ್ಥಿತಿಯು ಸಕ್ರಿಯವಾಗಿದ್ದಾಗ, ಯಾವ ಜನರ ದೊಡ್ಡ ಗುಂಪು ಅಥವಾ ಜನರ ತಂಡಕ್ಕೆ ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಹೋಲುತ್ತದೆ ಎಂದು Chrome ನಿರ್ಧರಿಸುತ್ತದೆ. ಜಾಹೀರಾತುದಾರರು ಗುಂಪಿಗಾಗಿ ಜಾಹೀರಾತುಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಬಹುದು ಹಾಗೂ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಖಾಸಗಿಯಾಗಿ ಇರಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಗುಂಪನ್ನು ಪ್ರತಿದಿನ ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತದೆ.}one{ಈ ನಿಯಂತ್ರಣವು ಆನ್ ಆಗಿದ್ದು ಹಾಗೂ ಸ್ಥಿತಿಯು ಸಕ್ರಿಯವಾಗಿದ್ದಾಗ, ಯಾವ ಜನರ ದೊಡ್ಡ ಗುಂಪು ಅಥವಾ ಜನರ ತಂಡಕ್ಕೆ ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಹೋಲುತ್ತದೆ ಎಂದು Chrome ನಿರ್ಧರಿಸುತ್ತದೆ. ಜಾಹೀರಾತುದಾರರು ಗುಂಪಿಗಾಗಿ ಜಾಹೀರಾತುಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಬಹುದು ಹಾಗೂ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಖಾಸಗಿಯಾಗಿ ಇರಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಗುಂಪನ್ನು ಪ್ರತಿ {NUM_DAYS} ದಿನಗಳಿಗೆ ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತದೆ.}other{ಈ ನಿಯಂತ್ರಣವು ಆನ್ ಆಗಿದ್ದು ಹಾಗೂ ಸ್ಥಿತಿಯು ಸಕ್ರಿಯವಾಗಿದ್ದಾಗ, ಯಾವ ಜನರ ದೊಡ್ಡ ಗುಂಪು ಅಥವಾ ಜನರ ತಂಡಕ್ಕೆ ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಹೋಲುತ್ತದೆ ಎಂದು Chrome ನಿರ್ಧರಿಸುತ್ತದೆ. ಜಾಹೀರಾತುದಾರರು ಗುಂಪಿಗಾಗಿ ಜಾಹೀರಾತುಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಬಹುದು ಹಾಗೂ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಖಾಸಗಿಯಾಗಿ ಇರಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಗುಂಪನ್ನು ಪ್ರತಿ {NUM_DAYS} ದಿನಗಳಿಗೆ ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತದೆ.}}</translation>
 <translation id="2064691555167957331">{COUNT,plural, =1{1 ಸಲಹೆ}one{# ಸಲಹೆಗಳು}other{# ಸಲಹೆಗಳು}}</translation>
+<translation id="2066915425250589881">ಅಳಿಸುವಂತೆ ವಿನಂತಿಸಿಕೊಳ್ಳಬಹುದು</translation>
 <translation id="2068528718802935086">ಶಿಶುಗಳು ಮತ್ತು ತೊಡರುಗಾಲಿಡುವ ಮಕ್ಕಳು</translation>
 <translation id="2071156619270205202">ಈ ಕಾರ್ಡ್, ವರ್ಚುವಲ್ ಕಾರ್ಡ್ ಸಂಖ್ಯೆಗೆ ಅರ್ಹವಾಗಿಲ್ಲ.</translation>
 <translation id="2071692954027939183">ಅಧಿಸೂಚನೆಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ ಏಕೆಂದರೆ ನೀವು ಸಾಮಾನ್ಯವಾಗಿ ಅವುಗಳನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ</translation>
@@ -580,6 +582,7 @@
 <translation id="2512101340618156538">ಅನುಮತಿ ಇಲ್ಲ (ಡೀಫಾಲ್ಟ್)</translation>
 <translation id="2512413427717747692">Chrome ಅನ್ನು ಡೀಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಬಟನ್ ಆಗಿ ಹೊಂದಿಸಿ ಮತ್ತು iOS ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ Chrome ಅನ್ನು ಸಿಸ್ಟಂನ ಡೀಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಆಗಿ ಹೊಂದಿಸಲು Enter ಒತ್ತಿರಿ</translation>
 <translation id="2515629240566999685">ನಿಮ್ಮ ಪ್ರದೇಶದಲ್ಲಿನ ಸಿಗ್ನಲ್ ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ</translation>
+<translation id="2515761554693942801">ನೀವು <ph name="PROVIDER_ORIGIN" /> ಬಳಸುವ ವೆಬ್‌ಸೈಟ್‌ಗಳಲ್ಲಿ ಸ್ಪರ್ಶ ID ಯ ಮೂಲಕ ದೃಢೀಕರಿಸುವ ಆಯ್ಕೆಯನ್ನು ಮಾಡಿದ್ದೀರಿ. ಈ ಪೂರೈಕೆದಾರರು ನಿಮ್ಮ ಪಾವತಿ ವಿಧಾನದ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ಸಂಗ್ರಹಿಸಿಟ್ಟಿರಬಹುದು, ನೀವು ಅದನ್ನು <ph name="LINK_TEXT" />.</translation>
 <translation id="2521385132275182522">ಕೆಳಗಿನ ಬಲಭಾಗದಲ್ಲಿ ಸ್ಟೇಪಲ್ ಹಾಕಿ</translation>
 <translation id="2521736961081452453">ಫಾರ್ಮ್ ಆನ್ನು ರಚಿಸಿ</translation>
 <translation id="2523886232349826891">ಈ ಸಾಧನದಲ್ಲಿ ಮಾತ್ರ ಉಳಿಸಲಾಗಿದೆ</translation>
@@ -1491,6 +1494,7 @@
 <translation id="5051305769747448211">ಲೈವ್ ಕಾಮಿಡಿ</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{Nearby ಶೇರ್ ಬಳಸಿಕೊಂಡು ಈ ಫೈಲ್ ಅನ್ನು ಕಳುಹಿಸಲು, ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸ್ಥಳಾವಕಾಶವನ್ನು (<ph name="DISK_SPACE_SIZE" />) ಮುಕ್ತಗೊಳಿಸಿ}one{Nearby ಶೇರ್ ಬಳಸಿಕೊಂಡು ಈ ಫೈಲ್‌ಗಳನ್ನು ಕಳುಹಿಸಲು, ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸ್ಥಳಾವಕಾಶವನ್ನು (<ph name="DISK_SPACE_SIZE" />) ಮುಕ್ತಗೊಳಿಸಿ}other{Nearby ಶೇರ್ ಬಳಸಿಕೊಂಡು ಈ ಫೈಲ್‌ಗಳನ್ನು ಕಳುಹಿಸಲು, ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸ್ಥಳಾವಕಾಶವನ್ನು (<ph name="DISK_SPACE_SIZE" />) ಮುಕ್ತಗೊಳಿಸಿ}}</translation>
 <translation id="5056549851600133418">ನಿಮಗಾಗಿ ಲೇಖನಗಳು</translation>
+<translation id="5060483733937416656">ನೀವು <ph name="PROVIDER_ORIGIN" /> ಬಳಸುವ ವೆಬ್‌ಸೈಟ್‌ಗಳಲ್ಲಿ Windows Hello ಮೂಲಕ ದೃಢೀಕರಿಸುವ ಆಯ್ಕೆಯನ್ನು ಮಾಡಿದ್ದೀರಿ. ಈ ಪೂರೈಕೆದಾರರು ನಿಮ್ಮ ಪಾವತಿ ವಿಧಾನದ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ಸಂಗ್ರಹಿಸಿಟ್ಟಿರಬಹುದು, ನೀವು ಅದನ್ನು <ph name="LINK_TEXT" />.</translation>
 <translation id="5061227663725596739">ನೀವು ಹುಡುಕುತ್ತಿರುವುದು <ph name="LOOKALIKE_DOMAIN" /> ತಾನೇ?</translation>
 <translation id="5066056036849835175">ಪ್ರಿಂಟಿಂಗ್ ಇತಿಹಾಸ</translation>
 <translation id="5068234115460527047">ಹೆಡ್ಜ್ ಫಂಡ್‌ಗಳು</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb
index 34a4d67c..66e57f3 100644
--- a/components/strings/components_strings_mk.xtb
+++ b/components/strings/components_strings_mk.xtb
@@ -27,6 +27,7 @@
 <translation id="1043382569739532657">Грантови, стипендии и финансиска помош</translation>
 <translation id="1048785276086539861">Кога ќе ги изменувате прибелешките, документов ќе се врати на приказ на една страница</translation>
 <translation id="1050038467049342496">Затворете ги другите апликации</translation>
+<translation id="1053959602163383901">Избравте да потврдите со уред за автентикација на веб-страници кои користат <ph name="PROVIDER_ORIGIN" />. Давателов на услуги можеби ги зачувал податоците за вашиот начин на плаќање и можете <ph name="LINK_TEXT" />.</translation>
 <translation id="1055184225775184556">&amp;Врати додавање</translation>
 <translation id="1056663316309890343">Софтвер за фотографии</translation>
 <translation id="1056898198331236512">Предупредување</translation>
@@ -426,6 +427,7 @@
 <translation id="2053111141626950936">Страниците на <ph name="LANGUAGE" /> нема да се преведуваат.</translation>
 <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Кога оваа контрола е вклучена и статусот е активен, Chrome одредува со која голема група на луѓе или „кохортата“ е најслична вашата неодамнешна активност од прелистувањето. Огласувачите може да избираат реклами за групата, а вашата активност од прелистувањето останува приватна на вашиот уред. Групата се ажурира секој ден.}=1{Кога оваа контрола е вклучена и статусот е активен, Chrome одредува со која голема група на луѓе или „кохортата“ е најслична вашата неодамнешна активност од прелистувањето. Огласувачите може да избираат реклами за групата, а вашата активност од прелистувањето останува приватна на вашиот уред. Групата се ажурира секој ден.}one{Кога оваа контрола е вклучена и статусот е активен, Chrome одредува со која голема група на луѓе или „кохортата“ е најслична вашата неодамнешна активност од прелистувањето. Огласувачите може да избираат реклами за групата, а вашата активност од прелистувањето останува приватна на вашиот уред. Групата се ажурира секој {NUM_DAYS} ден.}other{Кога оваа контрола е вклучена и статусот е активен, Chrome одредува со која голема група на луѓе или „кохортата“ е најслична вашата неодамнешна активност од прелистувањето. Огласувачите може да избираат реклами за групата, а вашата активност од прелистувањето останува приватна на вашиот уред. Групата се ажурира секои {NUM_DAYS} дена.}}</translation>
 <translation id="2064691555167957331">{COUNT,plural, =1{1 предлог}one{# предлог}other{# предлози}}</translation>
+<translation id="2066915425250589881">да побарате да се избришат</translation>
 <translation id="2068528718802935086">Бебиња и мали деца</translation>
 <translation id="2071156619270205202">Картичкава не е подобна за број на виртуелна картичка.</translation>
 <translation id="2071692954027939183">Известувањата беа блокирани автоматски бидејќи обично не ги дозволувате</translation>
@@ -582,6 +584,7 @@
 <translation id="2512101340618156538">Не е дозволено (стандардно)</translation>
 <translation id="2512413427717747692">Копче за поставување на Chrome како стандарден прелистувач, притиснете Enter за да го поставите Chrome како стандарден прелистувач на системот во поставките за iOS</translation>
 <translation id="2515629240566999685">Да го проверите сигналот во вашата област</translation>
+<translation id="2515761554693942801">Избравте да потврдите со Touch ID на веб-страници кои користат <ph name="PROVIDER_ORIGIN" />. Давателов на услуги можеби ги зачувал податоците за вашиот начин на плаќање и можете <ph name="LINK_TEXT" />.</translation>
 <translation id="2521385132275182522">Спојување долу десно</translation>
 <translation id="2521736961081452453">Создај формулар</translation>
 <translation id="2523886232349826891">Зачувано само на овој уред</translation>
@@ -1501,6 +1504,7 @@
 <translation id="5051305769747448211">Комедија во живо</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{За да ја испратите датотекава преку „Споделување во близина“, ослободете простор (<ph name="DISK_SPACE_SIZE" />) на уредот}one{За да ги испратите датотекиве преку „Споделување во близина“, ослободете простор (<ph name="DISK_SPACE_SIZE" />) на уредот}other{За да ги испратите датотекиве преку „Споделување во близина“, ослободете простор (<ph name="DISK_SPACE_SIZE" />) на уредот}}</translation>
 <translation id="5056549851600133418">Статии за вас</translation>
+<translation id="5060483733937416656">Избравте да потврдите со Windows Hello на веб-страници кои користат <ph name="PROVIDER_ORIGIN" />. Давателов на услуги можеби ги зачувал податоците за вашиот начин на плаќање и можете <ph name="LINK_TEXT" />.</translation>
 <translation id="5061227663725596739">Дали мислевте на <ph name="LOOKALIKE_DOMAIN" />?</translation>
 <translation id="5066056036849835175">Историја на печатење</translation>
 <translation id="5068234115460527047">Хеџ фондови</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb
index bde6e48..d811f3de 100644
--- a/components/strings/components_strings_mr.xtb
+++ b/components/strings/components_strings_mr.xtb
@@ -27,6 +27,7 @@
 <translation id="1043382569739532657">अनुदाने, शिष्यवृत्ती आणि वित्तसाह्य</translation>
 <translation id="1048785276086539861">तुम्ही भाष्ये संपादित करता तेव्हा हा दस्तऐवज एकल पेजव्ह्यूवर परत येईल</translation>
 <translation id="1050038467049342496">अन्य ॲप्स बंद करा</translation>
+<translation id="1053959602163383901">तुम्ही <ph name="PROVIDER_ORIGIN" /> वापरणाऱ्या वेबसाइटवर ऑथेंटिकेटर डिव्हाइससह पडताळणी करण्याचे निवडले आहे. या पुरवठादाराने तुमच्या पेमेंट पद्धतीविषयी माहिती स्टोअर केलेली असू शकते, जी तुम्ही <ph name="LINK_TEXT" /> करू शकता.</translation>
 <translation id="1055184225775184556">&amp;जोडा पूर्ववत करा</translation>
 <translation id="1056663316309890343">फोटोशी संबंधित सॉफ्टवेअर</translation>
 <translation id="1056898198331236512">चेतावणी</translation>
@@ -426,6 +427,7 @@
 <translation id="2053111141626950936"><ph name="LANGUAGE" />मधील पेज भाषांतरीत केले जाणार नाहीत.</translation>
 <translation id="2053373601901562871">{NUM_DAYS,plural, =0{When this control is on and the status is active, Chrome determines which large group of people, or "cohort," your recent browsing activity is most similar to. Advertisers can select ads for the group and your browsing activity is kept private on your device. Your group is updated every day.}=1{हे नियंत्रण सुरू असते आणि त्याचे स्टेटस अ‍ॅक्टिव्ह असते तेव्हा, तुमची अलीकडील ब्राउझिंग अ‍ॅक्टिव्हिटी ही लोकांच्या कोणत्या मोठ्या गटासारखी किंवा "समूह" यासारखी आहे हे Chrome निश्चित करते. जाहिरातदार हे गटासाठी जाहिराती निवडू शकतात आणि तुमची ब्राउझिंग अ‍ॅक्टिव्हिटी तुमच्या डिव्हाइसवर खाजगी ठेवली जाते. तुमचा गट दररोज अपडेट केला जातो.}other{हे नियंत्रण सुरू असते आणि त्याचे स्टेटस अ‍ॅक्टिव्ह असते तेव्हा, तुमची अलीकडील ब्राउझिंग अ‍ॅक्टिव्हिटी ही लोकांच्या कोणत्या मोठ्या गटासारखी किंवा "समूह" यासारखी आहे हे Chrome निश्चित करते. जाहिरातदार हे गटासाठी जाहिराती निवडू शकतात आणि तुमची ब्राउझिंग अ‍ॅक्टिव्हिटी तुमच्या डिव्हाइसवर खाजगी ठेवली जाते. तुमचा गट दर {NUM_DAYS} दिवसांनी अपडेट केला जातो.}}</translation>
 <translation id="2064691555167957331">{COUNT,plural, =1{1 सूचना}other{# सूचना}}</translation>
+<translation id="2066915425250589881">हटवण्याची विनंती</translation>
 <translation id="2068528718802935086">बाळ आणि रांगती मुले</translation>
 <translation id="2071156619270205202">हे कार्ड व्हर्च्युअल कार्ड नंबरसाठी पात्र नाही.</translation>
 <translation id="2071692954027939183">सूचना आपोआप ब्लॉक केल्या होत्या कारण तुम्ही सहसा त्यांना अनुमती देत नाही</translation>
@@ -582,6 +584,7 @@
 <translation id="2512101340618156538">अनुमती नाही (डीफॉल्ट)</translation>
 <translation id="2512413427717747692">Chrome ला डीफॉल्ट ब्राउझर बटण म्हणून सेट करा, iOS सेटिंग्जमध्ये Chrome ला सिस्टीमचा डीफॉल्ट ब्राउझर म्हणून सेट करण्यासाठी एंटर दाबा</translation>
 <translation id="2515629240566999685">आपल्या क्षेत्रातील सिग्नल तपासणे</translation>
+<translation id="2515761554693942801">तुम्ही <ph name="PROVIDER_ORIGIN" /> वापरणाऱ्या वेबसाइटवर टच आयडी वापरून पडताळणी करण्याचे निवडले आहे. या पुरवठादाराने तुमच्या पेमेंट पद्धतीविषयी माहिती स्टोअर केलेली असू शकते, जी तुम्ही <ph name="LINK_TEXT" /> करू शकता.</translation>
 <translation id="2521385132275182522">स्टेपल बॉटम राइट</translation>
 <translation id="2521736961081452453">फॉर्म तयार करा</translation>
 <translation id="2523886232349826891">फक्त या डिव्हाइसवर सेव्ह केले जाईल</translation>
@@ -1500,6 +1503,7 @@
 <translation id="5051305769747448211">लाइव्ह विनोदी कार्यक्रम</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{Nearby सह शेअरिंग वापरून ही फाइल पाठवण्यासाठी, तुमच्या डिव्हाइसवरील (<ph name="DISK_SPACE_SIZE" />) जागा मोकळी करा}other{Nearby सह शेअरिंग वापरून या फाइल पाठवण्यासाठी, तुमच्या डिव्हाइसवरील (<ph name="DISK_SPACE_SIZE" />) जागा मोकळी करा}}</translation>
 <translation id="5056549851600133418">तुमच्यासाठी लेख</translation>
+<translation id="5060483733937416656">तुम्ही <ph name="PROVIDER_ORIGIN" /> वापरणाऱ्या वेबसाइटवर Windows Hello वापरून पडताळणी करण्याचे निवडले आहे. या पुरवठादाराने तुमच्या पेमेंट पद्धतीविषयी माहिती स्टोअर केलेली असू शकते, जी तुम्ही <ph name="LINK_TEXT" /> करू शकता.</translation>
 <translation id="5061227663725596739">तुम्हाला <ph name="LOOKALIKE_DOMAIN" />असे म्हणायचे होते का?</translation>
 <translation id="5066056036849835175">प्रिंटिंग इतिहास</translation>
 <translation id="5068234115460527047">हेज फंड</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb
index da8fbc7..83461b6 100644
--- a/components/strings/components_strings_pt-BR.xtb
+++ b/components/strings/components_strings_pt-BR.xtb
@@ -27,6 +27,7 @@
 <translation id="1043382569739532657">Bolsas de estudo, subsídios e ajuda financeira</translation>
 <translation id="1048785276086539861">Quando você editar as anotações, este documento voltará à visualização de uma página</translation>
 <translation id="1050038467049342496">Fechar outros apps</translation>
+<translation id="1053959602163383901">Você escolheu fazer a verificação com um dispositivo autenticador em sites que usam o provedor <ph name="PROVIDER_ORIGIN" />. Esse provedor pode ter armazenado informações sobre sua forma de pagamento, mas você pode <ph name="LINK_TEXT" />.</translation>
 <translation id="1055184225775184556">&amp;Desfazer adicionar</translation>
 <translation id="1056663316309890343">Software para fotografia</translation>
 <translation id="1056898198331236512">Aviso</translation>
@@ -422,6 +423,7 @@
 <translation id="2053111141626950936">Páginas em <ph name="LANGUAGE" /> não serão traduzidas.</translation>
 <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Quando este controle estiver ligado e o status estiver ativo, o Chrome determinará com qual grupo grande de pessoas, ou "coorte", sua atividade de navegação se parece mais. Os anunciantes podem selecionar anúncios para o grupo e sua atividade de navegação será armazenada no dispositivo de forma particular. Seu grupo é atualizado todos os dias.}=1{Quando este controle estiver ligado e o status estiver ativo, o Chrome determinará com qual grupo grande de pessoas, ou "coorte", sua atividade de navegação se parece mais. Os anunciantes podem selecionar anúncios para o grupo e sua atividade de navegação será armazenada no dispositivo de forma particular. Seu grupo é atualizado todos os dias.}one{Quando este controle estiver ligado e o status estiver ativo, o Chrome determinará com qual grupo grande de pessoas, ou "coorte", sua atividade de navegação se parece mais. Os anunciantes podem selecionar anúncios para o grupo e sua atividade de navegação será armazenada no dispositivo de forma particular. Seu grupo é atualizado a cada {NUM_DAYS} dia.}other{Quando este controle estiver ligado e o status estiver ativo, o Chrome determinará com qual grupo grande de pessoas, ou "coorte", sua atividade de navegação se parece mais. Os anunciantes podem selecionar anúncios para o grupo e sua atividade de navegação será armazenada no dispositivo de forma particular. Seu grupo é atualizado a cada {NUM_DAYS} dias.}}</translation>
 <translation id="2064691555167957331">{COUNT,plural, =1{1 sugestão}one{# sugestão}other{# sugestões}}</translation>
+<translation id="2066915425250589881">pedir para que elas sejam excluídas</translation>
 <translation id="2068528718802935086">Bebês e crianças</translation>
 <translation id="2071156619270205202">Esse não é um número de cartão virtual.</translation>
 <translation id="2071692954027939183">As notificações foram bloqueadas automaticamente porque você não costuma permiti-las</translation>
@@ -578,6 +580,7 @@
 <translation id="2512101340618156538">Sem permissão (padrão)</translation>
 <translation id="2512413427717747692">Botão Definir o Chrome como navegador padrão: pressione Enter para definir o Chrome como o navegador padrão do sistema nas configurações do iOS</translation>
 <translation id="2515629240566999685">Verificar o sinal na sua área</translation>
+<translation id="2515761554693942801">Você escolheu fazer a verificação com o Touch ID em sites que usam o provedor <ph name="PROVIDER_ORIGIN" />. Esse provedor pode ter armazenado informações sobre sua forma de pagamento, mas você pode <ph name="LINK_TEXT" />.</translation>
 <translation id="2521385132275182522">Grampo na parte inferior direita</translation>
 <translation id="2521736961081452453">Criar formulário</translation>
 <translation id="2523886232349826891">Salvo apenas neste dispositivo</translation>
@@ -1492,6 +1495,7 @@
 <translation id="5051305769747448211">Shows de comédia ao vivo</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{Para enviar este arquivo usando o Compartilhar por proximidade, libere espaço (<ph name="DISK_SPACE_SIZE" />) no seu dispositivo}one{Para enviar este arquivo usando o Compartilhar por proximidade, libere espaço (<ph name="DISK_SPACE_SIZE" />) no seu dispositivo}other{Para enviar estes arquivos usando o Compartilhar por proximidade, libere espaço (<ph name="DISK_SPACE_SIZE" />) no seu dispositivo}}</translation>
 <translation id="5056549851600133418">Artigos para você</translation>
+<translation id="5060483733937416656">Você escolheu fazer a verificação com o Windows Hello em sites que usam o provedor <ph name="PROVIDER_ORIGIN" />. Esse provedor pode ter armazenado informações sobre sua forma de pagamento, mas você pode <ph name="LINK_TEXT" />.</translation>
 <translation id="5061227663725596739">Você quis dizer "<ph name="LOOKALIKE_DOMAIN" />"?</translation>
 <translation id="5066056036849835175">Histórico de impressão</translation>
 <translation id="5068234115460527047">Fundos de cobertura</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index cc160f5..e20864d 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -27,6 +27,7 @@
 <translation id="1043382569739532657">Burse și ajutoare financiare</translation>
 <translation id="1048785276086539861">Când editezi adnotări, acest document va reveni la afișarea cu o pagină</translation>
 <translation id="1050038467049342496">închide celelalte aplicații;</translation>
+<translation id="1053959602163383901">Ai ales să confirmi folosind un dispozitiv de autentificare pe site-urile care folosesc <ph name="PROVIDER_ORIGIN" />. Este posibil ca acest furnizor să fi stocat informații despre metoda de plată, pe care le poți <ph name="LINK_TEXT" />.</translation>
 <translation id="1055184225775184556">&amp;Anulați adăugarea</translation>
 <translation id="1056663316309890343">Software foto</translation>
 <translation id="1056898198331236512">Avertisment</translation>
@@ -426,6 +427,7 @@
 <translation id="2053111141626950936">Paginile în <ph name="LANGUAGE" /> nu vor fi traduse.</translation>
 <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Când opțiunea este activată și starea este Activă, Chrome stabilește un grup mare de utilizatori cu care se aseamănă cel mai mult activitatea ta de navigare recentă. Advertiserii pot selecta anunțuri pentru grup și activitatea ta de navigare este păstrată privată pe dispozitivul tău. Grupul este actualizat în fiecare zi.}=1{Când opțiunea este activată și starea este Activă, Chrome stabilește un grup mare de utilizatori cu care se aseamănă cel mai mult activitatea ta de navigare recentă. Advertiserii pot selecta anunțuri pentru grup și activitatea ta de navigare este păstrată privată pe dispozitivul tău. Grupul este actualizat în fiecare zi.}few{Când opțiunea este activată și starea este Activă, Chrome stabilește un grup mare de utilizatori cu care se aseamănă cel mai mult activitatea ta de navigare recentă. Advertiserii pot selecta anunțuri pentru grup și activitatea ta de navigare este păstrată privată pe dispozitivul tău. Grupul este actualizat o dată la {NUM_DAYS} zile.}other{Când opțiunea este activată și starea este Activă, Chrome stabilește un grup mare de utilizatori cu care se aseamănă cel mai mult activitatea ta de navigare recentă. Advertiserii pot selecta anunțuri pentru grup și activitatea ta de navigare este păstrată privată pe dispozitivul tău. Grupul este actualizat o dată la {NUM_DAYS} de zile.}}</translation>
 <translation id="2064691555167957331">{COUNT,plural, =1{1 sugestie}few{# sugestii}other{# de sugestii}}</translation>
+<translation id="2066915425250589881">solicitare de ștergere</translation>
 <translation id="2068528718802935086">Bebeluși și copii</translation>
 <translation id="2071156619270205202">Cardul nu este eligibil pentru un număr de card virtual.</translation>
 <translation id="2071692954027939183">Notificările au fost blocate automat deoarece nu le permiți de obicei</translation>
@@ -582,6 +584,7 @@
 <translation id="2512101340618156538">Nepermise (prestabilit)</translation>
 <translation id="2512413427717747692">Butonul Setează Chrome ca browser prestabilit, apasă pe Enter ca să setezi Chrome ca browser prestabilit pentru sistem în setările iOS</translation>
 <translation id="2515629240566999685">să verifici semnalul din zona ta.</translation>
+<translation id="2515761554693942801">Ai ales să confirmi cu Touch ID pe site-urile care folosesc <ph name="PROVIDER_ORIGIN" />. Este posibil ca acest furnizor să fi stocat informații despre metoda de plată, pe care le poți <ph name="LINK_TEXT" />.</translation>
 <translation id="2521385132275182522">Capsare în dreapta jos</translation>
 <translation id="2521736961081452453">Creează un formular</translation>
 <translation id="2523886232349826891">Salvat numai pe acest dispozitiv</translation>
@@ -1501,6 +1504,7 @@
 <translation id="5051305769747448211">Comedie în direct</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{Pentru a trimite fișierul prin Trimitere în apropiere, eliberează spațiu (<ph name="DISK_SPACE_SIZE" />) pe dispozitiv}few{Pentru a trimite fișierele prin Trimitere în apropiere, eliberează spațiu (<ph name="DISK_SPACE_SIZE" />) pe dispozitiv}other{Pentru a trimite fișierele prin Trimitere în apropiere, eliberează spațiu (<ph name="DISK_SPACE_SIZE" />) pe dispozitiv}}</translation>
 <translation id="5056549851600133418">Articole pentru tine</translation>
+<translation id="5060483733937416656">Ai ales să confirmi cu Windows Hello pe site-urile care folosesc <ph name="PROVIDER_ORIGIN" />. Este posibil ca acest furnizor să fi stocat informații despre metoda de plată, pe care le poți <ph name="LINK_TEXT" />.</translation>
 <translation id="5061227663725596739">Ai vrut să scrii <ph name="LOOKALIKE_DOMAIN" />?</translation>
 <translation id="5066056036849835175">Istoricul de printare</translation>
 <translation id="5068234115460527047">Fonduri speculative</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb
index 52842ec..bbb623c 100644
--- a/components/strings/components_strings_sk.xtb
+++ b/components/strings/components_strings_sk.xtb
@@ -27,6 +27,7 @@
 <translation id="1043382569739532657">Príspevky, štipendiá a finančná pomoc</translation>
 <translation id="1048785276086539861">Keď upravíte poznámky, tento dokument sa vráti na zobrazenie jednej stránky</translation>
 <translation id="1050038467049342496">Zavrite ostatné aplikácie</translation>
+<translation id="1053959602163383901">Na weboch využívajúcich poskytovateľa <ph name="PROVIDER_ORIGIN" /> ste vybrali overenie zariadením s overovateľom. Tento poskytovateľ mohol ukladať informácie o vašom spôsobe platby, o ktorých odstránenie môžete <ph name="LINK_TEXT" />.</translation>
 <translation id="1055184225775184556">&amp;Vrátiť späť pridanie</translation>
 <translation id="1056663316309890343">Softvér na spracovanie fotiek</translation>
 <translation id="1056898198331236512">Upozornenie</translation>
@@ -422,6 +423,7 @@
 <translation id="2053111141626950936">Stránky v jazyku <ph name="LANGUAGE" /> nebudú prekladané.</translation>
 <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Keď je tento ovládací prvok zapnutý a stav je aktívny, Chrome stanoví, ktorej veľkej skupine ľudí („kohorte“) je vaša nedávna aktivita prehliadania najviac podobná. Inzerenti môžu pre túto skupinu vybrať reklamy a vaša aktivita prehliadania zostane uchovaná v súkromí vo vašom zariadení. Skupina sa aktualizuje každý deň.}=1{Keď je tento ovládací prvok zapnutý a stav je aktívny, Chrome stanoví, ktorej veľkej skupine ľudí („kohorte“) je vaša nedávna aktivita prehliadania najviac podobná. Inzerenti môžu pre túto skupinu vybrať reklamy a vaša aktivita prehliadania zostane uchovaná v súkromí vo vašom zariadení. Skupina sa aktualizuje každý deň.}few{Keď je tento ovládací prvok zapnutý a stav je aktívny, Chrome stanoví, ktorej veľkej skupine ľudí („kohorte“) je vaša nedávna aktivita prehliadania najviac podobná. Inzerenti môžu pre túto skupinu vybrať reklamy a vaša aktivita prehliadania zostane uchovaná v súkromí vo vašom zariadení. Skupina sa aktualizuje každé {NUM_DAYS} dni.}many{Keď je tento ovládací prvok zapnutý a stav je aktívny, Chrome stanoví, ktorej veľkej skupine ľudí („kohorte“) je vaša nedávna aktivita prehliadania najviac podobná. Inzerenti môžu pre túto skupinu vybrať reklamy a vaša aktivita prehliadania zostane uchovaná v súkromí vo vašom zariadení. Skupina sa aktualizuje každého {NUM_DAYS} dňa.}other{Keď je tento ovládací prvok zapnutý a stav je aktívny, Chrome stanoví, ktorej veľkej skupine ľudí („kohorte“) je vaša nedávna aktivita prehliadania najviac podobná. Inzerenti môžu pre túto skupinu vybrať reklamy a vaša aktivita prehliadania zostane uchovaná v súkromí vo vašom zariadení. Skupina sa aktualizuje každých {NUM_DAYS} dní.}}</translation>
 <translation id="2064691555167957331">{COUNT,plural, =1{1 návrh}few{# návrhy}many{# návrhu}other{# návrhov}}</translation>
+<translation id="2066915425250589881">požiadať</translation>
 <translation id="2068528718802935086">Bábätká a batoľatá</translation>
 <translation id="2071156619270205202">Táto karta nespĺňa podmienky na pridelenie čísla virtuálnej karty.</translation>
 <translation id="2071692954027939183">Upozornenia boli automaticky blokované, pretože ich zvyčajne nepovoľujete</translation>
@@ -578,6 +580,7 @@
 <translation id="2512101340618156538">Nepovolené (predvolené)</translation>
 <translation id="2512413427717747692">Tlačidlo nastavenia Chromu ako predvoleného prehliadača, stlačením klávesa Enter nastavíte Chrome ako predvolený prehliadač systému v nastaveniach iOS</translation>
 <translation id="2515629240566999685">Skontrolovať signál vo vašej oblasti</translation>
+<translation id="2515761554693942801">Na weboch využívajúcich poskytovateľa <ph name="PROVIDER_ORIGIN" /> ste vybrali overenie pomocou funkcie Touch ID. Tento poskytovateľ mohol ukladať informácie o vašom spôsobe platby, o ktorých odstránenie môžete <ph name="LINK_TEXT" />.</translation>
 <translation id="2521385132275182522">Zošiť spinkou vpravo dolu</translation>
 <translation id="2521736961081452453">Vytvoriť formulár</translation>
 <translation id="2523886232349826891">Uložené iba na tomto zariadení</translation>
@@ -1488,6 +1491,7 @@
 <translation id="5051305769747448211">Živé komédie</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{Ak chcete tento súbor poslať pomocou Zdieľania nablízku, uvoľnite vo svojom zariadení priestor (<ph name="DISK_SPACE_SIZE" />)}few{Ak chcete tieto súbory poslať pomocou Zdieľania nablízku, uvoľnite vo svojom zariadení priestor (<ph name="DISK_SPACE_SIZE" />)}many{To send these files using Nearby Share, free up space (<ph name="DISK_SPACE_SIZE" />) on your device}other{Ak chcete tieto súbory poslať pomocou Zdieľania nablízku, uvoľnite vo svojom zariadení priestor (<ph name="DISK_SPACE_SIZE" />)}}</translation>
 <translation id="5056549851600133418">Články pre vás</translation>
+<translation id="5060483733937416656">Na weboch využívajúcich poskytovateľa <ph name="PROVIDER_ORIGIN" /> ste vybrali overenie pomocou funkcie Windows Hello. Tento poskytovateľ mohol ukladať informácie o vašom spôsobe platby, o ktorých odstránenie môžete <ph name="LINK_TEXT" />.</translation>
 <translation id="5061227663725596739">Mysleli ste <ph name="LOOKALIKE_DOMAIN" />?</translation>
 <translation id="5066056036849835175">História tlače</translation>
 <translation id="5068234115460527047">Hedžové fondy</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index 84135e3..2eed3da 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -27,6 +27,7 @@
 <translation id="1043382569739532657">ทุนการศึกษาและการช่วยเหลือทางการเงิน</translation>
 <translation id="1048785276086539861">เมื่อคุณแก้ไขคำอธิบายประกอบ เอกสารนี้จะกลับไปเป็นมุมมองแบบหน้าเดียว</translation>
 <translation id="1050038467049342496">ปิดแอปอื่นๆ</translation>
+<translation id="1053959602163383901">คุณเลือกยืนยันด้วยอุปกรณ์ Authenticator ในเว็บไซต์ที่ใช้ <ph name="PROVIDER_ORIGIN" /> ผู้ให้บริการนี้อาจจัดเก็บข้อมูลเกี่ยวกับวิธีการชำระเงินของคุณไว้แล้ว โดยคุณ<ph name="LINK_TEXT" />ได้</translation>
 <translation id="1055184225775184556">&amp;เลิกทำการเพิ่ม</translation>
 <translation id="1056663316309890343">ซอฟต์แวร์เกี่ยวกับรูปถ่าย</translation>
 <translation id="1056898198331236512">คำเตือน</translation>
@@ -422,6 +423,7 @@
 <translation id="2053111141626950936">ระบบจะไม่แปลหน้าเว็บภาษา<ph name="LANGUAGE" /></translation>
 <translation id="2053373601901562871">{NUM_DAYS,plural, =0{เมื่อเปิดการควบคุมนี้ไว้และสถานะเป็น "ใช้งานอยู่" Chrome จะระบุว่ากิจกรรมการท่องเว็บล่าสุดของคุณคล้ายกับกลุ่มคนจำนวนมากหรือ "กลุ่มประชากรตามรุ่น" กลุ่มใดมากที่สุด ผู้ลงโฆษณาจะเลือกโฆษณาสำหรับกลุ่มดังกล่าวได้ และกิจกรรมการท่องเว็บจะเก็บไว้เป็นส่วนตัวในอุปกรณ์ของคุณ กลุ่มจะอัปเดตทุกวัน}=1{เมื่อเปิดการควบคุมนี้ไว้และสถานะเป็น "ใช้งานอยู่" Chrome จะระบุว่ากิจกรรมการท่องเว็บล่าสุดของคุณคล้ายกับกลุ่มคนจำนวนมากหรือ "กลุ่มประชากรตามรุ่น" กลุ่มใดมากที่สุด ผู้ลงโฆษณาจะเลือกโฆษณาสำหรับกลุ่มดังกล่าวได้ และกิจกรรมการท่องเว็บจะเก็บไว้เป็นส่วนตัวในอุปกรณ์ของคุณ กลุ่มจะอัปเดตทุกวัน}other{เมื่อเปิดการควบคุมนี้ไว้และสถานะเป็น "ใช้งานอยู่" Chrome จะระบุว่ากิจกรรมการท่องเว็บล่าสุดของคุณคล้ายกับกลุ่มคนจำนวนมากหรือ "กลุ่มประชากรตามรุ่น" กลุ่มใดมากที่สุด ผู้ลงโฆษณาจะเลือกโฆษณาสำหรับกลุ่มดังกล่าวได้ และกิจกรรมการท่องเว็บจะเก็บไว้เป็นส่วนตัวในอุปกรณ์ของคุณ กลุ่มจะอัปเดตทุก {NUM_DAYS} วัน}}</translation>
 <translation id="2064691555167957331">{COUNT,plural, =1{1 คำแนะนำ}other{# คำแนะนำ}}</translation>
+<translation id="2066915425250589881">ส่งคำขอให้ลบ</translation>
 <translation id="2068528718802935086">ทารกและเด็กเล็ก</translation>
 <translation id="2071156619270205202">บัตรนี้ไม่มีสิทธิ์ใช้หมายเลขบัตรเสมือน</translation>
 <translation id="2071692954027939183">การแจ้งเตือนถูกบล็อกโดยอัตโนมัติเนื่องจากคุณมักไม่อนุญาตให้แสดง</translation>
@@ -578,6 +580,7 @@
 <translation id="2512101340618156538">ไม่อนุญาต (ค่าเริ่มต้น)</translation>
 <translation id="2512413427717747692">ปุ่มตั้ง Chrome เป็นเบราว์เซอร์เริ่มต้น กด Enter เพื่อตั้ง Chrome เป็นเบราว์เซอร์เริ่มต้นของระบบในการตั้งค่า iOS</translation>
 <translation id="2515629240566999685">ตรวจสอบสัญญาณในพื้นที่ของคุณ</translation>
+<translation id="2515761554693942801">คุณเลือกยืนยันด้วย Touch ID ในเว็บไซต์ที่ใช้ <ph name="PROVIDER_ORIGIN" /> ผู้ให้บริการนี้อาจจัดเก็บข้อมูลเกี่ยวกับวิธีการชำระเงินของคุณไว้แล้ว โดยคุณ<ph name="LINK_TEXT" />ได้</translation>
 <translation id="2521385132275182522">เย็บด้วยลวดเย็บกระดาษด้านขวาล่าง</translation>
 <translation id="2521736961081452453">สร้างแบบฟอร์ม</translation>
 <translation id="2523886232349826891">บันทึกไว้เฉพาะในอุปกรณ์นี้</translation>
@@ -1491,6 +1494,7 @@
 <translation id="5051305769747448211">การแสดงตลกแบบสด</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{หากต้องการส่งไฟล์นี้โดยใช้การแชร์ใกล้เคียง ให้เพิ่มพื้นที่ว่าง (<ph name="DISK_SPACE_SIZE" />) ในอุปกรณ์}other{หากต้องการส่งไฟล์เหล่านี้โดยใช้การแชร์ใกล้เคียง ให้เพิ่มพื้นที่ว่าง (<ph name="DISK_SPACE_SIZE" />) ในอุปกรณ์}}</translation>
 <translation id="5056549851600133418">บทความสำหรับคุณ</translation>
+<translation id="5060483733937416656">คุณเลือกยืนยันด้วย Windows Hello ในเว็บไซต์ที่ใช้ <ph name="PROVIDER_ORIGIN" /> ผู้ให้บริการนี้อาจจัดเก็บข้อมูลเกี่ยวกับวิธีการชำระเงินของคุณไว้แล้ว โดยคุณ<ph name="LINK_TEXT" />ได้</translation>
 <translation id="5061227663725596739">หรือคุณหมายถึง <ph name="LOOKALIKE_DOMAIN" /></translation>
 <translation id="5066056036849835175">ประวัติการพิมพ์</translation>
 <translation id="5068234115460527047">กองทุนบริหารความเสี่ยง</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb
index dacdaf2..60125a4 100644
--- a/components/strings/components_strings_ur.xtb
+++ b/components/strings/components_strings_ur.xtb
@@ -28,6 +28,7 @@
 <translation id="1043382569739532657">گرانٹس، اسکالرشپس اور مالی مدد</translation>
 <translation id="1048785276086539861">آپ کے تشریحات میں ترمیم کرنے پر، یہ دستاویز واحد صفحے کے منظر پر واپس آ جائے گا</translation>
 <translation id="1050038467049342496">دیگر ایپس بند کریں</translation>
+<translation id="1053959602163383901">آپ نے <ph name="PROVIDER_ORIGIN" /> استعمال کرنے والی ویب سائٹس پر ایک مستند آلہ سے تصدیق کرنے کا انتخاب کیا۔ ممکن ہے کہ اس فراہم کنندہ کے پاس آپ کی ادائیگی کے طریقہ کے بارے میں معلومات اسٹور کردہ ہے جن کو <ph name="LINK_TEXT" />آپ کر سکتے ہیں۔</translation>
 <translation id="1055184225775184556">شامل کریں کو &amp;کالعدم کریں</translation>
 <translation id="1056663316309890343">تصویر کا سافٹ ویئر</translation>
 <translation id="1056898198331236512">وارننگ</translation>
@@ -427,6 +428,7 @@
 <translation id="2053111141626950936"><ph name="LANGUAGE" /> کے صفحات کا ترجمہ نہیں کیا جائے گا۔</translation>
 <translation id="2053373601901562871">{NUM_DAYS,plural, =0{‏اس کنٹرول کے آن ہونے اور اسٹیٹس کے فعال ہونے پر، Chrome اس بات کا تعین کرتا ہے کہ لوگوں کے کون سے بڑے گروپ یا "مشترک خصوصیات کے حامل لوگوں کے گروپ" سے آپ کی حالیہ براؤزنگ کی سرگرمی سب سے زیادہ ملتی جلتی ہے۔ مشتہرین گروپ کے لیے اشتہارات کا انتخاب کر سکتے ہیں اور آپ کی براؤزنگ کی سرگرمی کو آپ کے آلے پر نجی رکھا جاتا ہے۔ آپ کا گروپ ہر روز اپ ڈیٹ کیا جاتا ہے۔}=1{‏اس کنٹرول کے آن ہونے اور اسٹیٹس کے فعال ہونے پر، Chrome اس بات کا تعین کرتا ہے کہ لوگوں کے کون سے بڑے گروپ یا "مشترک خصوصیات کے حامل لوگوں کے گروپ" سے آپ کی حالیہ براؤزنگ کی سرگرمی سب سے زیادہ ملتی جلتی ہے۔ مشتہرین گروپ کے لیے اشتہارات کا انتخاب کر سکتے ہیں اور آپ کی براؤزنگ کی سرگرمی کو آپ کے آلے پر نجی رکھا جاتا ہے۔ آپ کا گروپ ہر روز اپ ڈیٹ کیا جاتا ہے۔}other{‏اس کنٹرول کے آن ہونے اور اسٹیٹس کے فعال ہونے پر، Chrome اس بات کا تعین کرتا ہے کہ لوگوں کے کون سے بڑے گروپ یا "مشترک خصوصیات کے حامل لوگوں کے گروپ" سے آپ کی حالیہ براؤزنگ کی سرگرمی سب سے زیادہ ملتی جلتی ہے۔ مشتہرین گروپ کے لیے اشتہارات کا انتخاب کر سکتے ہیں اور آپ کی براؤزنگ کی سرگرمی کو آپ کے آلے پر نجی رکھا جاتا ہے۔ آپ کا گروپ ہر {NUM_DAYS} دن میں اپ ڈیٹ کیا جاتا ہے۔}}</translation>
 <translation id="2064691555167957331">{COUNT,plural, =1{1 تجویز}other{# تجاویز}}</translation>
+<translation id="2066915425250589881">حذف کرنے کی درخواست</translation>
 <translation id="2068528718802935086">بچے اور نونہال</translation>
 <translation id="2071156619270205202">یہ کارڈ ورچوئل کارڈ نمبر کیلئے اہل نہیں ہے۔</translation>
 <translation id="2071692954027939183">اطلاعات کو خودکار طور پر مسدود کر دیا گیا کیونکہ آپ عموماً انہیں اجازت نہیں دیتے ہیں</translation>
@@ -583,6 +585,7 @@
 <translation id="2512101340618156538">اجازت نہیں ہے (ڈیفالٹ)</translation>
 <translation id="2512413427717747692">‏Chrome کو بطور ڈیفالٹ براؤزر بٹن سیٹ کریں، iOS ترتیبات میں Chrome کو سسٹم کے ڈیفالٹ براؤزر کے بطور سیٹ کرنے کے لیے Enter دبائیں</translation>
 <translation id="2515629240566999685">آپ کے علاقہ میں سگنل چیک کیا جا رہا ہے</translation>
+<translation id="2515761554693942801">‏آپ نے <ph name="PROVIDER_ORIGIN" /> استعمال کرنے والی ویب سائٹس پر Touch ID سے تصدیق کرنے کا انتخاب کیا۔ ممکن ہے کہ اس فراہم کنندہ کے پاس آپ کی ادائیگی کے طریقہ کے بارے میں معلومات اسٹور کردہ ہے جن کو <ph name="LINK_TEXT" />آپ کر سکتے ہیں۔</translation>
 <translation id="2521385132275182522">نیچے بائیں طرف سٹیپل</translation>
 <translation id="2521736961081452453">فارم تخلیق کریں</translation>
 <translation id="2523886232349826891">صرف اس آلہ پر محفوظ ہے</translation>
@@ -1503,6 +1506,7 @@
 <translation id="5051305769747448211">لائیو کامیڈی</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{اس فائل کو قریبی آلات کے ساتھ اشتراک کا استعمال کرتے ہوئے بھیجنے کے لیے اپنے آلے پر <ph name="DISK_SPACE_SIZE" /> جگہ خالی کریں}other{ان فائلز کو قریبی آلات کے ساتھ اشتراک کا استعمال کرتے ہوئے بھیجنے کے لیے اپنے آلے پر <ph name="DISK_SPACE_SIZE" /> جگہ خالی کریں}}</translation>
 <translation id="5056549851600133418">آپ کیلئے مضامین</translation>
+<translation id="5060483733937416656">‏آپ نے <ph name="PROVIDER_ORIGIN" /> کا استعمال کرنے والی ویب سائٹس پر Windows Hello سے تصدیق کرنے کا انتخاب کیا ہے۔ ممکن ہے کہ اس فراہم کنندہ کے پاس آپ کی ادائیگی کے طریقہ کے بارے میں معلومات اسٹور کردہ ہے جن کو <ph name="LINK_TEXT" />آپ کر سکتے ہیں۔</translation>
 <translation id="5061227663725596739">کیا آپ کا مطلب <ph name="LOOKALIKE_DOMAIN" /> ہے؟</translation>
 <translation id="5066056036849835175">پرنٹنگ کی سرگزشت</translation>
 <translation id="5068234115460527047">باڑ کے فنڈز</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb
index 58579e0..b7c1389d 100644
--- a/components/strings/components_strings_zu.xtb
+++ b/components/strings/components_strings_zu.xtb
@@ -27,6 +27,7 @@
 <translation id="1043382569739532657">Amagranti, imifundaze nosizo lwezezimali</translation>
 <translation id="1048785276086539861">Lapho uhlela izichasiselo, le dokhumenti izobuyela ekuhloleni ikhasi kuqala okukodwa</translation>
 <translation id="1050038467049342496">Vala ezinye izinhlelo zokusebenza</translation>
+<translation id="1053959602163383901">Ukhethe ukuqinisekisa ngedivayisi efakazela ubuqiniso kumawebhusayithi asebenzisa i-<ph name="PROVIDER_ORIGIN" />. Lo mhlinzeki kungenzeka ukuthi ulondoloze ulwazi olumayelana nendlela yakho yokukhokha, ongakwazi uku-<ph name="LINK_TEXT" />.</translation>
 <translation id="1055184225775184556">&amp;Hlehlisa ukungeza</translation>
 <translation id="1056663316309890343">Isofthiwe yesithombe</translation>
 <translation id="1056898198331236512">Isexwayiso</translation>
@@ -426,6 +427,7 @@
 <translation id="2053111141626950936">Amakhasi angesi-<ph name="LANGUAGE" /> ngeke aze ahunyushwe.</translation>
 <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Uma lokhu kulawula kuvuliwe futhi nesimo sisebenza, i-Chrome inquma ukuthi yiliphi iqembu elikhulu labantu, noma "iqoqo," umsebenzi wakho wokuphequlula wakamuva ofana kakhulu nalo. Abakhangisi bangakhetha izikhangiso zeqembu futhi umsebenzi wakho wokuphequlula ugcinwa uyimfihlo kudivayisi yakho. Iqembu lakho libuyekezwa nsuku zonke.}=1{Uma lokhu kulawula kuvuliwe futhi nesimo sisebenza, i-Chrome inquma ukuthi yiliphi iqembu elikhulu labantu, noma "iqoqo," umsebenzi wakho wokuphequlula wakamuva ofana kakhulu nalo. Abakhangisi bangakhetha izikhangiso zeqembu futhi umsebenzi wakho wokuphequlula ugcinwa uyimfihlo kudivayisi yakho. Iqembu lakho libuyekezwa nsuku zonke.}one{Uma lokhu kulawula kuvuliwe futhi nesimo sisebenza, i-Chrome inquma ukuthi yiliphi iqembu elikhulu labantu, noma "iqoqo," umsebenzi wakho wokuphequlula wakamuva ofana kakhulu nalo. Abakhangisi bangakhetha izikhangiso zeqembu futhi umsebenzi wakho wokuphequlula ugcinwa uyimfihlo kudivayisi yakho. Iqembu lakho libuyekezwa njalo ezinsukwini ezingu-{NUM_DAYS}.}other{Uma lokhu kulawula kuvuliwe futhi nesimo sisebenza, i-Chrome inquma ukuthi yiliphi iqembu elikhulu labantu, noma "iqoqo," umsebenzi wakho wokuphequlula wakamuva ofana kakhulu nalo. Abakhangisi bangakhetha izikhangiso zeqembu futhi umsebenzi wakho wokuphequlula ugcinwa uyimfihlo kudivayisi yakho. Iqembu lakho libuyekezwa njalo ezinsukwini ezingu-{NUM_DAYS}.}}</translation>
 <translation id="2064691555167957331">{COUNT,plural, =1{1 isiphakamiso}one{# iziphakamiso}other{# iziphakamiso}}</translation>
+<translation id="2066915425250589881">isicelo sokusulwa</translation>
 <translation id="2068528718802935086">Izingane nabantwana</translation>
 <translation id="2071156619270205202">Leli khadi alifanelekeli inombolo yekhadi le-virtual</translation>
 <translation id="2071692954027939183">Izaziso zivinjelwe ngokuzenzakalela ngoba ngokuvamile awuzivumeli</translation>
@@ -582,6 +584,7 @@
 <translation id="2512101340618156538">Akuvumelekile (okuzenzekelayo)</translation>
 <translation id="2512413427717747692">Setha i-Chrome njengenkinobho yebhrawuza ezenzakalelayo, cindezela okuthi Enter ukuze usethe i-Chrome njengebhrawuza ezenzakalelayo yesistimu kumasethingi e-iOS</translation>
 <translation id="2515629240566999685">Ukuhlola isignali endaweni yakho</translation>
+<translation id="2515761554693942801">Ukhethe ukuqinisekisa nge-Touch ID kumawebhusayithi asebenzisa i-<ph name="PROVIDER_ORIGIN" />. Lo mhlinzeki kungenzeka ukuthi ulondoloze ulwazi olumayelana nendlela yakho yokukhokha, ongakwazi uku-<ph name="LINK_TEXT" />.</translation>
 <translation id="2521385132275182522">Namathisela phansi kwesokudla</translation>
 <translation id="2521736961081452453">Dala ifomu</translation>
 <translation id="2523886232349826891">Kulondolozwe kule divayisi kuphela</translation>
@@ -1498,6 +1501,7 @@
 <translation id="5051305769747448211">Ihlaya elibukhoma</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{Ukuze uthumele leli fayela usebenzisa i-Nearby Share, khulula isikhala (<ph name="DISK_SPACE_SIZE" />) kudivayisi yakho}one{Ukuze uthumele lamafayela usebenzisa i-Nearby Share, khulula isikhala (<ph name="DISK_SPACE_SIZE" />) kudivayisi yakho}other{Ukuze uthumele lamafayela usebenzisa i-Nearby Share, khulula isikhala (<ph name="DISK_SPACE_SIZE" />) kudivayisi yakho}}</translation>
 <translation id="5056549851600133418">Ama-athikili akho</translation>
+<translation id="5060483733937416656">Ukhethe ukuqinisekisa nge-Windows Hello kumawebhusayithi asebenzisa i-<ph name="PROVIDER_ORIGIN" />. Lo mhlinzeki kungenzeka ukuthi ulondoloze ulwazi olumayelana nendlela yakho yokukhokha, ongakwazi uku-<ph name="LINK_TEXT" />.</translation>
 <translation id="5061227663725596739">Ingabe ubukade usho i-<ph name="LOOKALIKE_DOMAIN" />?</translation>
 <translation id="5066056036849835175">Umlando wokuphrinta</translation>
 <translation id="5068234115460527047">Izimali ezivikela ukulahlekelwa</translation>
diff --git a/components/url_param_filter/core/url_param_classifications_loader.cc b/components/url_param_filter/core/url_param_classifications_loader.cc
index 4f833214..0f6fbb7 100644
--- a/components/url_param_filter/core/url_param_classifications_loader.cc
+++ b/components/url_param_filter/core/url_param_classifications_loader.cc
@@ -11,6 +11,7 @@
 #include "base/metrics/field_trial_params.h"
 #include "base/no_destructor.h"
 #include "base/sequence_checker.h"
+#include "base/strings/string_util.h"
 #include "components/url_param_filter/core/features.h"
 #include "components/url_param_filter/core/url_param_filter_classification.pb.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
@@ -40,7 +41,7 @@
     // Any non-matching experimental params have been discarded previously.
     // We retain whether the classification was experimental, however, to write
     // a separate metric when those classifications are used.
-    map[classification.site()][use_case][param.name()] =
+    map[classification.site()][use_case][base::ToLowerASCII(param.name())] =
         !classification.experiment_tags().empty() &&
                 !HasExperimentTag(classification, DEFAULT_TAG)
             ? ClassificationExperimentStatus::EXPERIMENTAL
diff --git a/components/url_param_filter/core/url_param_classifications_loader_unittest.cc b/components/url_param_filter/core/url_param_classifications_loader_unittest.cc
index 2c7adeb..81aef38b 100644
--- a/components/url_param_filter/core/url_param_classifications_loader_unittest.cc
+++ b/components/url_param_filter/core/url_param_classifications_loader_unittest.cc
@@ -185,6 +185,35 @@
 }
 
 TEST_F(UrlParamClassificationsLoaderTest,
+       ReadClassifications_NormalizeToLowercase) {
+  FilterClassifications classifications =
+      MakeClassificationsProtoFromMap({{"source1.xyz", {"UPPERCASE"}}},
+                                      {{"destination2.xyz", {"mixedCase123"}}});
+
+  SetComponentFileContents(classifications.SerializeAsString());
+  loader()->ReadClassifications(test_file_contents());
+
+  EXPECT_THAT(
+      loader()->GetSourceClassifications(),
+      UnorderedElementsAre(
+          Pair("source1.xyz",
+               UnorderedElementsAre(Pair(
+                   FilterClassification::USE_CASE_UNKNOWN,
+                   UnorderedElementsAre(Pair(
+                       "uppercase",
+                       ClassificationExperimentStatus::NON_EXPERIMENTAL)))))));
+  EXPECT_THAT(
+      loader()->GetDestinationClassifications(),
+      UnorderedElementsAre(
+          Pair("destination2.xyz",
+               UnorderedElementsAre(Pair(
+                   FilterClassification::USE_CASE_UNKNOWN,
+                   UnorderedElementsAre(Pair(
+                       "mixedcase123",
+                       ClassificationExperimentStatus::NON_EXPERIMENTAL)))))));
+}
+
+TEST_F(UrlParamClassificationsLoaderTest,
        GetClassifications_ComponentOnlyWithExperiment) {
   const std::string experiment_identifier = "mattwashere";
   base::test::ScopedFeatureList scoped_feature_list;
@@ -329,6 +358,28 @@
 }
 
 TEST_F(UrlParamClassificationsLoaderTest,
+       GetSourceClassifications_FeatureOnly_NormalizeToLowercase) {
+  // Provide classifications using the feature flag.
+  std::map<std::string, std::vector<std::string>> dest_params;
+  SetFeatureParams(
+      {{"classifications",
+        CreateBase64EncodedFilterParamClassificationForTesting(
+            {{kSourceSite, {"UPPERCASE", "mixedCase123"}}}, dest_params)}});
+
+  EXPECT_THAT(
+      loader()->GetSourceClassifications(),
+      UnorderedElementsAre(Pair(
+          Eq(kSourceSite),
+          UnorderedElementsAre(Pair(
+              FilterClassification::USE_CASE_UNKNOWN,
+              UnorderedElementsAre(
+                  Pair("uppercase",
+                       ClassificationExperimentStatus::NON_EXPERIMENTAL),
+                  Pair("mixedcase123",
+                       ClassificationExperimentStatus::NON_EXPERIMENTAL)))))));
+}
+
+TEST_F(UrlParamClassificationsLoaderTest,
        GetSourceClassifications_ComponentThenFeature) {
   // Create proto with both Source + Destination Classifications
   FilterClassifications classifications = MakeClassificationsProtoFromMap(
@@ -353,9 +404,9 @@
           UnorderedElementsAre(Pair(
               FilterClassification::USE_CASE_UNKNOWN,
               UnorderedElementsAre(
-                  Pair("plzblockA",
+                  Pair("plzblocka",
                        ClassificationExperimentStatus::NON_EXPERIMENTAL),
-                  Pair("plzblockB",
+                  Pair("plzblockb",
                        ClassificationExperimentStatus::NON_EXPERIMENTAL)))))));
 }
 
@@ -384,9 +435,9 @@
           UnorderedElementsAre(Pair(
               FilterClassification::USE_CASE_UNKNOWN,
               UnorderedElementsAre(
-                  Pair("plzblockA",
+                  Pair("plzblocka",
                        ClassificationExperimentStatus::NON_EXPERIMENTAL),
-                  Pair("plzblockB",
+                  Pair("plzblockb",
                        ClassificationExperimentStatus::NON_EXPERIMENTAL)))))));
 }
 
@@ -626,9 +677,9 @@
           UnorderedElementsAre(Pair(
               FilterClassification::USE_CASE_UNKNOWN,
               UnorderedElementsAre(
-                  Pair("plzblockA",
+                  Pair("plzblocka",
                        ClassificationExperimentStatus::NON_EXPERIMENTAL),
-                  Pair("plzblockB",
+                  Pair("plzblockb",
                        ClassificationExperimentStatus::NON_EXPERIMENTAL)))))));
 }
 
@@ -657,9 +708,9 @@
           UnorderedElementsAre(Pair(
               FilterClassification::USE_CASE_UNKNOWN,
               UnorderedElementsAre(
-                  Pair("plzblockA",
+                  Pair("plzblocka",
                        ClassificationExperimentStatus::NON_EXPERIMENTAL),
-                  Pair("plzblockB",
+                  Pair("plzblockb",
                        ClassificationExperimentStatus::NON_EXPERIMENTAL)))))));
 }
 
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 47eb313..0dee896 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -1876,10 +1876,10 @@
     "service_worker/service_worker_updated_script_loader.h",
     "service_worker/service_worker_version.cc",
     "service_worker/service_worker_version.h",
+    "shared_storage/shared_storage_budget_charger.cc",
+    "shared_storage/shared_storage_budget_charger.h",
     "shared_storage/shared_storage_document_service_impl.cc",
     "shared_storage/shared_storage_document_service_impl.h",
-    "shared_storage/shared_storage_originated_document_data.cc",
-    "shared_storage/shared_storage_originated_document_data.h",
     "shared_storage/shared_storage_render_thread_worklet_driver.cc",
     "shared_storage/shared_storage_render_thread_worklet_driver.h",
     "shared_storage/shared_storage_url_loader_factory_proxy.cc",
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl_browsertest.cc b/content/browser/bluetooth/web_bluetooth_service_impl_browsertest.cc
index a4c56ce..d658b843 100644
--- a/content/browser/bluetooth/web_bluetooth_service_impl_browsertest.cc
+++ b/content/browser/bluetooth/web_bluetooth_service_impl_browsertest.cc
@@ -169,6 +169,11 @@
                                    CredentialsCallback callback) override {
     NOTREACHED();
   }
+  void ShowDevicePairConfirmPrompt(RenderFrameHost* frame,
+                                   const std::u16string& device_identifier,
+                                   PairConfirmCallback callback) override {
+    NOTREACHED();
+  }
   blink::WebBluetoothDeviceId GetWebBluetoothDeviceId(
       RenderFrameHost* frame,
       const std::string& device_address) override {
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc b/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc
index 30771e6..c32487f 100644
--- a/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc
+++ b/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc
@@ -296,6 +296,11 @@
                                    CredentialsCallback callback) override {
     std::move(callback).Run(DeviceCredentialsPromptResult::kCancelled, u"");
   }
+  void ShowDevicePairConfirmPrompt(content::RenderFrameHost* frame,
+                                   const std::u16string& device_identifier,
+                                   PairConfirmCallback callback) override {
+    std::move(callback).Run(DevicePairConfirmPromptResult::kCancelled);
+  }
   blink::WebBluetoothDeviceId GetWebBluetoothDeviceId(
       RenderFrameHost* frame,
       const std::string& device_address) override {
diff --git a/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.cc b/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.cc
index 03f62e7..cfcd857 100644
--- a/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.cc
+++ b/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.cc
@@ -246,6 +246,8 @@
   SetShowPlayPauseButton(show_play_pause_button);
   Show();
 
+  // TODO(crbug.com/1331248): Rather than set this synchronously, we should call
+  // back with the bounds once the window provides them.
   *window_size = GetSize();
   return result;
 }
diff --git a/content/browser/renderer_host/frame_tree_browsertest.cc b/content/browser/renderer_host/frame_tree_browsertest.cc
index 9e16add..c4e1d217 100644
--- a/content/browser/renderer_host/frame_tree_browsertest.cc
+++ b/content/browser/renderer_host/frame_tree_browsertest.cc
@@ -16,7 +16,6 @@
 #include "content/browser/renderer_host/navigation_request.h"
 #include "content/browser/renderer_host/render_frame_host_impl.h"
 #include "content/browser/renderer_host/render_view_host_impl.h"
-#include "content/browser/shared_storage/shared_storage_originated_document_data.h"
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_handle.h"
@@ -1152,20 +1151,10 @@
     observer.Wait();
   }
 
-  SharedStorageOriginatedDocumentData*
-      shared_storage_originated_document_data1 =
-          SharedStorageOriginatedDocumentData::GetForCurrentDocument(
-              fenced_frame_root_node1->current_frame_host());
-  SharedStorageOriginatedDocumentData*
-      shared_storage_originated_document_data2 =
-          SharedStorageOriginatedDocumentData::GetForCurrentDocument(
-              fenced_frame_root_node2->current_frame_host());
+  EXPECT_TRUE(fenced_frame_root_node1->FindSharedStorageBudgetMetadata());
 
-  DCHECK_NE(shared_storage_originated_document_data1,
-            shared_storage_originated_document_data2);
-
-  DCHECK_EQ(&shared_storage_originated_document_data1->budget_metadata(),
-            &shared_storage_originated_document_data2->budget_metadata());
+  EXPECT_EQ(fenced_frame_root_node1->FindSharedStorageBudgetMetadata(),
+            fenced_frame_root_node2->FindSharedStorageBudgetMetadata());
 }
 
 // Test the scenario where the FF navigation is deferred and then resumed, and
@@ -1221,10 +1210,9 @@
 
   EXPECT_TRUE(url_mapping.HasObserverForTesting(urn_uuid, request));
 
-  SharedStorageOriginatedDocumentData* shared_storage_originated_document_data =
-      SharedStorageOriginatedDocumentData::GetForCurrentDocument(
-          fenced_frame_root_node->current_frame_host());
-  EXPECT_FALSE(shared_storage_originated_document_data);
+  auto* budget_metadata =
+      fenced_frame_root_node->FindSharedStorageBudgetMetadata();
+  EXPECT_FALSE(budget_metadata);
 
   // Trigger the mapping to resume the deferred navigation.
   SimulateSharedStorageURNMappingComplete(
@@ -1240,15 +1228,11 @@
       mapped_url,
       fenced_frame_root_node->current_frame_host()->GetLastCommittedURL());
 
-  shared_storage_originated_document_data =
-      SharedStorageOriginatedDocumentData::GetForCurrentDocument(
-          fenced_frame_root_node->current_frame_host());
-  EXPECT_TRUE(shared_storage_originated_document_data);
-  EXPECT_EQ(shared_storage_originated_document_data->budget_metadata().origin,
+  budget_metadata = fenced_frame_root_node->FindSharedStorageBudgetMetadata();
+  EXPECT_TRUE(budget_metadata);
+  EXPECT_EQ(budget_metadata->origin,
             url::Origin::Create(GURL("https://bar.com")));
-  EXPECT_DOUBLE_EQ(shared_storage_originated_document_data->budget_metadata()
-                       .budget_to_charge,
-                   2.0);
+  EXPECT_DOUBLE_EQ(budget_metadata->budget_to_charge, 2.0);
 }
 
 // Test the scenario where the FF navigation is deferred and then resumed, and
@@ -1317,10 +1301,8 @@
   observer.Wait();
   EXPECT_EQ(observer.last_net_error_code(), net::ERR_BLOCKED_BY_RESPONSE);
 
-  SharedStorageOriginatedDocumentData* shared_storage_originated_document_data =
-      SharedStorageOriginatedDocumentData::GetForCurrentDocument(
-          fenced_frame_root_node->current_frame_host());
-  EXPECT_FALSE(shared_storage_originated_document_data);
+  auto* metadata = fenced_frame_root_node->FindSharedStorageBudgetMetadata();
+  EXPECT_FALSE(metadata);
 }
 
 IN_PROC_BROWSER_TEST_P(
diff --git a/content/browser/renderer_host/frame_tree_node.cc b/content/browser/renderer_host/frame_tree_node.cc
index aec3d76..a05b462cc 100644
--- a/content/browser/renderer_host/frame_tree_node.cc
+++ b/content/browser/renderer_host/frame_tree_node.cc
@@ -961,6 +961,26 @@
   srcdoc_value_ = srcdoc_value;
 }
 
+FencedFrameURLMapping::SharedStorageBudgetMetadata*
+FrameTreeNode::FindSharedStorageBudgetMetadata() {
+  FrameTreeNode* node = this;
+
+  while (true) {
+    if (node->shared_storage_budget_metadata()) {
+      DCHECK(node->IsFencedFrameRoot());
+      return node->shared_storage_budget_metadata();
+    }
+
+    if (node->GetParentOrOuterDocument()) {
+      node = node->GetParentOrOuterDocument()->frame_tree_node();
+    } else {
+      break;
+    }
+  }
+
+  return nullptr;
+}
+
 const scoped_refptr<BrowsingContextState>&
 FrameTreeNode::GetBrowsingContextStateForSubframe() const {
   DCHECK(!IsMainFrame());
diff --git a/content/browser/renderer_host/frame_tree_node.h b/content/browser/renderer_host/frame_tree_node.h
index 6a0c8686..f5bdb145 100644
--- a/content/browser/renderer_host/frame_tree_node.h
+++ b/content/browser/renderer_host/frame_tree_node.h
@@ -522,6 +522,27 @@
   void SetSrcdocValue(const std::string& srcdoc_value);
   const std::string& srcdoc_value() const { return srcdoc_value_; }
 
+  void set_shared_storage_budget_metadata(
+      FencedFrameURLMapping::SharedStorageBudgetMetadata*
+          shared_storage_budget_metadata) {
+    DCHECK_EQ(fenced_frame_status_,
+              RenderFrameHostImpl::FencedFrameStatus::kFencedFrameRoot);
+    shared_storage_budget_metadata_ = shared_storage_budget_metadata;
+  }
+
+  FencedFrameURLMapping::SharedStorageBudgetMetadata*
+  shared_storage_budget_metadata() const {
+    return shared_storage_budget_metadata_;
+  }
+
+  // Traverse up from this node. The `shared_storage_budget_metadata()` of the
+  // first seen node with a non-null budget metadata will be returned (i.e. this
+  // node inherits that budget metadata), and this node is expected to be an
+  // outermost fenced frame root. Return nullptr if not found (i.e. this node is
+  // not subjected to shared storage budgeting).
+  FencedFrameURLMapping::SharedStorageBudgetMetadata*
+  FindSharedStorageBudgetMetadata();
+
   // Accessor to BrowsingContextState for subframes only. Only main frame
   // navigations can change BrowsingInstances and BrowsingContextStates,
   // therefore for subframes associated BrowsingContextState never changes. This
@@ -733,6 +754,21 @@
   const RenderFrameHostImpl::FencedFrameStatus fenced_frame_status_ =
       RenderFrameHostImpl::FencedFrameStatus::kNotNestedInFencedFrame;
 
+  // If this is a fenced frame resulting from a shared storage url selection
+  // operation, this contains the metadata for shared storage budget charging.
+  // This metadata will persist across self navigations, or be replaced by a new
+  // metadata if this gets navigated to another shared storage generated URN.
+  //
+  // This can only be possibly set for the outermost fenced frame root, because
+  // selectURL() is disallowed inside fenced frame, and the URN generated
+  // outside the a fenced frame cannot be recognized from inside, so a nested
+  // fenced frame can never navigate to a shared storage generated URN.
+  //
+  // This metadata is stored to the outermost page's FencedFrameURLMapping, thus
+  // `shared_storage_budget_metadata_` must outlive `this`.
+  raw_ptr<FencedFrameURLMapping::SharedStorageBudgetMetadata>
+      shared_storage_budget_metadata_ = nullptr;
+
   // Manages creation and swapping of RenderFrameHosts for this frame.
   //
   // This field needs to be declared last, because destruction of
diff --git a/content/browser/renderer_host/ipc_utils.cc b/content/browser/renderer_host/ipc_utils.cc
index e802df83..51cdaaa 100644
--- a/content/browser/renderer_host/ipc_utils.cc
+++ b/content/browser/renderer_host/ipc_utils.cc
@@ -9,6 +9,8 @@
 #include "content/browser/bad_message.h"
 #include "content/browser/blob_storage/chrome_blob_storage_context.h"
 #include "content/browser/child_process_security_policy_impl.h"
+#include "content/browser/renderer_host/frame_tree_node.h"
+#include "content/browser/renderer_host/render_frame_host_impl.h"
 #include "content/common/frame.mojom.h"
 #include "content/common/navigation_params_utils.h"
 #include "content/public/browser/browser_context.h"
@@ -95,12 +97,14 @@
   return true;
 }
 
-bool VerifyOpenURLParams(SiteInstance* site_instance,
+bool VerifyOpenURLParams(RenderFrameHostImpl* current_rfh,
+                         SiteInstance* site_instance,
                          const blink::mojom::OpenURLParamsPtr& params,
                          GURL* out_validated_url,
                          scoped_refptr<network::SharedURLLoaderFactory>*
                              out_blob_url_loader_factory) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(current_rfh);
   DCHECK(site_instance);
   DCHECK(out_validated_url);
   DCHECK(out_blob_url_loader_factory);
@@ -135,6 +139,12 @@
   if (!VerifyInitiatorOrigin(process_id, params->initiator_origin))
     return false;
 
+  // Verify that the initiator frame can navigate `current_rfh`.
+  if (!VerifyNavigationInitiator(current_rfh, params->initiator_frame_token,
+                                 process_id)) {
+    return false;
+  }
+
   // Verification succeeded.
   return true;
 }
@@ -200,4 +210,63 @@
   return true;
 }
 
+bool VerifyNavigationInitiator(
+    RenderFrameHostImpl* current_rfh,
+    const absl::optional<blink::LocalFrameToken>& initiator_frame_token,
+    int initiator_process_id) {
+  // Verify that a frame inside a fenced frame cannot navigate its ancestors,
+  // unless the frame being navigated is the outermost main frame.
+  if (current_rfh->IsOutermostMainFrame())
+    return true;
+
+  if (!initiator_frame_token)
+    return true;
+
+  RenderFrameHostImpl* initiator_render_frame_host =
+      RenderFrameHostImpl::FromFrameToken(initiator_process_id,
+                                          initiator_frame_token.value());
+  if (!initiator_render_frame_host)
+    return true;
+
+  // Verify that a frame cannot navigate a frame with a different fenced frame
+  // nonce, unless the navigating frame is a fenced frame root and its owner
+  // frame has the same fenced frame nonce as the initiator frame (e.g. in a
+  // A(A1,A2(FF)) setup, A, A1, and A2 are all allowed to navigate FF).
+  absl::optional<base::UnguessableToken> initiator_fenced_frame_nonce =
+      initiator_render_frame_host->frame_tree_node()->fenced_frame_nonce();
+  if (initiator_fenced_frame_nonce !=
+      current_rfh->frame_tree_node()->fenced_frame_nonce()) {
+    if (!current_rfh->IsFencedFrameRoot() ||
+        current_rfh->frame_tree_node()
+                ->GetParentOrOuterDocument()
+                ->frame_tree_node()
+                ->fenced_frame_nonce() != initiator_fenced_frame_nonce) {
+      mojo::ReportBadMessage(
+          "The fenced frame nonces of initiator and current frame don't match, "
+          "nor is the current frame a fenced frame root whose owner frame has "
+          "the same fenced frame nonce as the initiator frame.");
+      return false;
+    }
+  }
+
+  if (!initiator_render_frame_host->IsNestedWithinFencedFrame())
+    return true;
+
+  FrameTreeNode* node = initiator_render_frame_host->frame_tree_node();
+  if (node == current_rfh->frame_tree_node())
+    return true;
+
+  while (node) {
+    node = node->parent() ? node->parent()->frame_tree_node() : nullptr;
+
+    if (node == current_rfh->frame_tree_node()) {
+      mojo::ReportBadMessage(
+          "A frame in a fenced frame tree cannot navigate an ancestor frame.");
+      return false;
+    }
+  }
+
+  return true;
+}
+
 }  // namespace content
diff --git a/content/browser/renderer_host/ipc_utils.h b/content/browser/renderer_host/ipc_utils.h
index 15939f9d..902a42c 100644
--- a/content/browser/renderer_host/ipc_utils.h
+++ b/content/browser/renderer_host/ipc_utils.h
@@ -15,6 +15,7 @@
 namespace content {
 
 class SiteInstance;
+class RenderFrameHostImpl;
 
 // Verifies that |params| are valid and can be accessed by the renderer process
 // associated with |site_instance|.
@@ -29,7 +30,8 @@
                              const blink::mojom::DownloadURLParams& params);
 
 // Verifies that |params| are valid and can be accessed by the renderer process
-// associated with |site_instance|.
+// associated with |site_instance|. |current_rfh| represents the current frame
+// on which OpenURL is being called
 //
 // Returns true if the |params| are valid.  As a side-effect of the verification
 // |out_validated_url| and |out_blob_url_loader_factory| will be populated.
@@ -38,7 +40,8 @@
 // returns false if the |params| are invalid.
 //
 // This function has to be called on the UI thread.
-bool VerifyOpenURLParams(SiteInstance* site_instance,
+bool VerifyOpenURLParams(RenderFrameHostImpl* current_rfh,
+                         SiteInstance* site_instance,
                          const blink::mojom::OpenURLParamsPtr& params,
                          GURL* out_validated_url,
                          scoped_refptr<network::SharedURLLoaderFactory>*
@@ -59,6 +62,22 @@
     SiteInstance* site_instance,
     blink::mojom::CommonNavigationParams* common_params);
 
+// Verify that the initiator frame identified by `initiator_frame_token` and
+// `initiator_process_id` can navigate `current_rfh`.
+//
+// This is best effort: the frame with the corresponding frame token may have
+// been deleted before the navigation begins.
+//
+// Returns true if the navigation is valid, or if the an initiator frame is not
+// found. Terminates the renderer the process associated with
+// |initiator_process_id| and returns false if the navigation is not allowed.
+//
+// This function has to be called on the UI thread.
+bool VerifyNavigationInitiator(
+    RenderFrameHostImpl* current_rfh,
+    const absl::optional<blink::LocalFrameToken>& initiator_frame_token,
+    int initiator_process_id);
+
 }  // namespace content
 
 #endif  // CONTENT_BROWSER_RENDERER_HOST_IPC_UTILS_H_
diff --git a/content/browser/renderer_host/navigation_controller_android.cc b/content/browser/renderer_host/navigation_controller_android.cc
index d35c9f7..e06bc12 100644
--- a/content/browser/renderer_host/navigation_controller_android.cc
+++ b/content/browser/renderer_host/navigation_controller_android.cc
@@ -14,6 +14,7 @@
 #include "base/callback_helpers.h"
 #include "base/containers/flat_map.h"
 #include "base/debug/crash_logging.h"
+#include "base/debug/dump_without_crashing.h"
 #include "content/browser/renderer_host/navigation_controller_impl.h"
 #include "content/browser/renderer_host/navigation_entry_impl.h"
 #include "content/public/android/content_jni_headers/NavigationControllerImpl_jni.h"
@@ -388,6 +389,30 @@
   if (GetUseDesktopUserAgent(env, obj) == enabled)
     return;
 
+  if (navigation_controller_->in_navigate_to_pending_entry() &&
+      reload_on_state_change) {
+    // Sometimes it's possible to call this function  in response to a
+    // navigation to a pending entry. In this case, we should avoid triggering
+    // another navigation synchronously, as it will crash due to navigation
+    // re-entrancy checks. To do that, post a task to update the UA and
+    // reload asynchronously.
+    // TODO(https://crbug.com/1327907): Figure out the case that leads to this
+    // situation and avoid calling this function entirely in that case. For now,
+    // do a do a DumpWithoutCrashing so that we can investigate.
+    GetUIThreadTaskRunner({})->PostTask(
+        FROM_HERE,
+        base::BindOnce(
+            &NavigationControllerAndroid::SetUseDesktopUserAgentInternal,
+            weak_factory_.GetWeakPtr(), enabled, reload_on_state_change));
+    base::debug::DumpWithoutCrashing();
+  } else {
+    SetUseDesktopUserAgentInternal(enabled, reload_on_state_change);
+  }
+}
+
+void NavigationControllerAndroid::SetUseDesktopUserAgentInternal(
+    bool enabled,
+    bool reload_on_state_change) {
   // Make sure the navigation entry actually exists.
   NavigationEntry* entry = navigation_controller_->GetLastCommittedEntry();
   if (!entry)
diff --git a/content/browser/renderer_host/navigation_controller_android.h b/content/browser/renderer_host/navigation_controller_android.h
index 9cfa2d4..792616d 100644
--- a/content/browser/renderer_host/navigation_controller_android.h
+++ b/content/browser/renderer_host/navigation_controller_android.h
@@ -9,6 +9,7 @@
 
 #include "base/android/scoped_java_ref.h"
 #include "base/memory/raw_ptr.h"
+#include "base/memory/weak_ptr.h"
 #include "content/common/content_export.h"
 #include "url/origin.h"
 
@@ -146,8 +147,12 @@
       jint index);
 
  private:
+  void SetUseDesktopUserAgentInternal(bool enabled,
+                                      bool reload_on_state_change);
+
   raw_ptr<NavigationControllerImpl> navigation_controller_;
   base::android::ScopedJavaGlobalRef<jobject> obj_;
+  base::WeakPtrFactory<NavigationControllerAndroid> weak_factory_{this};
 };
 
 }  // namespace content
diff --git a/content/browser/renderer_host/navigation_controller_impl.h b/content/browser/renderer_host/navigation_controller_impl.h
index 6a9eb9a..13f4c8e 100644
--- a/content/browser/renderer_host/navigation_controller_impl.h
+++ b/content/browser/renderer_host/navigation_controller_impl.h
@@ -427,6 +427,14 @@
     return entry_replaced_by_post_commit_error_ != nullptr;
   }
 
+  // Whether the current call stack includes NavigateToPendingEntry, to avoid
+  // re-entrant calls to NavigateToPendingEntry.
+  // TODO(https://crbug.com/1327907): Don't expose this once we figure out the
+  // root cause for the navigation re-entrancy case in the linked bug.
+  bool in_navigate_to_pending_entry() const {
+    return in_navigate_to_pending_entry_;
+  }
+
  private:
   friend class RestoreHelper;
 
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index 71d8807..e3e73a2 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -73,7 +73,6 @@
 #include "content/browser/scoped_active_url.h"
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
 #include "content/browser/service_worker/service_worker_main_resource_handle.h"
-#include "content/browser/shared_storage/shared_storage_originated_document_data.h"
 #include "content/browser/site_info.h"
 #include "content/browser/site_instance_impl.h"
 #include "content/browser/storage_partition_impl.h"
@@ -2019,9 +2018,14 @@
   is_deferred_on_fenced_frame_url_mapping_ = false;
 
   if (mapped_url) {
-    shared_storage_budget_metadata_ =
-        GetFencedFrameURLMap().GetSharedStorageBudgetMetadata(
-            common_params_->url);
+    // The URN mapping can happen on regular iframes if the feature
+    // `AllowURNsInIframes` is enabled. We will ignore the leakage via iframe,
+    // and will only track the shared storage budget for fenced frame.
+    if (frame_tree_node_->IsFencedFrameRoot()) {
+      shared_storage_budget_metadata_ =
+          GetFencedFrameURLMap().GetSharedStorageBudgetMetadata(
+              common_params_->url);
+    }
 
     common_params_->url = mapped_url.value();
     commit_params_->original_url = mapped_url.value();
@@ -5940,9 +5944,46 @@
   previous_main_frame_url_ = previous_main_frame_url;
   navigation_type_ = navigation_type;
 
-  if (shared_storage_budget_metadata_ && !DidEncounterError()) {
-    SharedStorageOriginatedDocumentData::CreateForCurrentDocument(
-        render_frame_host_, shared_storage_budget_metadata_);
+  // Same-document navigations won't affect budget metadata.
+  if (!DidEncounterError() && !IsSameDocument()) {
+    FencedFrameURLMapping::SharedStorageBudgetMetadata*
+        original_budget_metadata =
+            frame_tree_node()->shared_storage_budget_metadata();
+    if (original_budget_metadata) {
+      // Clear the previous shared_storage_budget_metadata on the
+      // `FrameTreeNode` if this navigation is not initiated from itself. In
+      // this case (including the case when `initiator_render_frame_host` is
+      // gone), this navigation had to be initiated from outside the fenced
+      // frame because a frame inside a fenced frame is not allowed to navigate
+      // ancestors, so the previous knowledge from inside the fenced frame can
+      // never be transferred.
+      RenderFrameHostImpl* initiator_render_frame_host = nullptr;
+      if (GetInitiatorFrameToken()) {
+        initiator_render_frame_host = RenderFrameHostImpl::FromFrameToken(
+            GetInitiatorProcessID(), GetInitiatorFrameToken().value());
+      }
+
+      if (!initiator_render_frame_host ||
+          initiator_render_frame_host->frame_tree_node() !=
+              render_frame_host_->frame_tree_node()) {
+        // The policy of disallowing a frame inside a fenced frame to navigate
+        // ancestors should've already been enforced in BeginNavigation().
+        CHECK(!initiator_render_frame_host ||
+              !initiator_render_frame_host->IsNestedWithinFencedFrame());
+
+        render_frame_host_->frame_tree_node()
+            ->set_shared_storage_budget_metadata(nullptr);
+      }
+    }
+
+    // If this is a load to a new URN, update the shared_storage_budget_metadata
+    // on the `FrameTreeNode`. Note that explicit clearing of budget metadata
+    // above is still needed for cases where a fenced frame is navigated from a
+    // URN to a non-URN URL.
+    if (shared_storage_budget_metadata_) {
+      frame_tree_node()->set_shared_storage_budget_metadata(
+          shared_storage_budget_metadata_);
+    }
   }
 
   // It should be kept in sync with the check in
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 0d16bcd..b697c912 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -6836,7 +6836,7 @@
   // Verify and unpack the Mojo payload.
   GURL validated_url;
   scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory;
-  if (!VerifyOpenURLParams(GetSiteInstance(), params, &validated_url,
+  if (!VerifyOpenURLParams(this, GetSiteInstance(), params, &validated_url,
                            &blob_url_loader_factory)) {
     return;
   }
@@ -7431,6 +7431,14 @@
   if (!VerifyBeginNavigationCommonParams(GetSiteInstance(), &*validated_params))
     return;
 
+  // BeginNavigation() should only be triggered when the navigation is
+  // initiated by a frame in the same process.
+  int initiator_process_id = GetProcess()->GetID();
+  if (!VerifyNavigationInitiator(this, begin_params->initiator_frame_token,
+                                 initiator_process_id)) {
+    return;
+  }
+
   // If the request is bearing Trust Tokens parameters:
   // - it must not be a main-frame navigation, and
   // - for certain Trust Tokens operations, the frame's parent needs the
diff --git a/content/browser/renderer_host/render_frame_proxy_host.cc b/content/browser/renderer_host/render_frame_proxy_host.cc
index 48c875f..ce9ef78 100644
--- a/content/browser/renderer_host/render_frame_proxy_host.cc
+++ b/content/browser/renderer_host/render_frame_proxy_host.cc
@@ -646,13 +646,13 @@
   // Verify and unpack IPC payload.
   GURL validated_url;
   scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory;
-  if (!VerifyOpenURLParams(GetSiteInstance(), params, &validated_url,
-                           &blob_url_loader_factory)) {
+  RenderFrameHostImpl* current_rfh = frame_tree_node_->current_frame_host();
+
+  if (!VerifyOpenURLParams(current_rfh, GetSiteInstance(), params,
+                           &validated_url, &blob_url_loader_factory)) {
     return;
   }
 
-  RenderFrameHostImpl* current_rfh = frame_tree_node_->current_frame_host();
-
   // Only active documents are allowed to navigate from frame proxy:
   // - If the document is in pending deletion, ignore the navigation, because
   // the frame is going to disappear soon anyway.
diff --git a/content/browser/renderer_host/scroll_into_view_browsertest.cc b/content/browser/renderer_host/scroll_into_view_browsertest.cc
index f5fd3405..b2466ef 100644
--- a/content/browser/renderer_host/scroll_into_view_browsertest.cc
+++ b/content/browser/renderer_host/scroll_into_view_browsertest.cc
@@ -201,24 +201,10 @@
   }
 
   FrameTreeNode* InnerMostFrameTreeNode() {
-    FrameTreeNode* node = web_contents()->GetPrimaryFrameTree().root();
-    while (node->child_count() ||
-           node->current_frame_host()->inner_tree_main_frame_tree_node_id() !=
-               FrameTreeNode::kFrameTreeNodeInvalidId) {
-      if (node->child_count()) {
-        CHECK_EQ(
-            node->current_frame_host()->inner_tree_main_frame_tree_node_id(),
-            FrameTreeNode::kFrameTreeNodeInvalidId);
-        // These tests never have multiple child frames.
-        CHECK_EQ(node->child_count(), 1ul);
-        node = node->child_at(0);
-      } else {
-        CHECK_EQ(node->child_count(), 0ul);
-        node = FrameTreeNode::GloballyFindByID(
-            node->current_frame_host()->inner_tree_main_frame_tree_node_id());
-      }
-    }
-    return node;
+    FrameTreeNode* inner_most_node = nullptr;
+    ForEachFrameFromRootToInnerMost(
+        [&inner_most_node](FrameTreeNode* node) { inner_most_node = node; });
+    return inner_most_node;
   }
 
   FrameTreeNode* RootFrameTreeNode() {
@@ -450,6 +436,66 @@
 #endif
   }
 
+  // Calls `func` with each FrameTreeNode in the page, starting from the root
+  // and descending into the inner most frame, traversing frame tree boundaries
+  // such as fenced frames/portals.
+  template <typename Function>
+  void ForEachFrameFromRootToInnerMost(const Function& func) {
+    FrameTreeNode* node = web_contents()->GetPrimaryFrameTree().root();
+    while (node) {
+      bool is_proxy_for_inner_frame_tree =
+          node->current_frame_host()->inner_tree_main_frame_tree_node_id() !=
+          FrameTreeNode::kFrameTreeNodeInvalidId;
+
+      // The functor isn't called for the placeholder FrameTreeNode, it'll be
+      // called on the inner tree's root.
+      if (!is_proxy_for_inner_frame_tree)
+        func(node);
+
+      if (node->child_count()) {
+        CHECK_EQ(
+            node->current_frame_host()->inner_tree_main_frame_tree_node_id(),
+            FrameTreeNode::kFrameTreeNodeInvalidId);
+        // These tests never have multiple child frames.
+        CHECK_EQ(node->child_count(), 1ul);
+        node = node->child_at(0);
+      } else if (is_proxy_for_inner_frame_tree) {
+        CHECK_EQ(node->child_count(), 0ul);
+        node = FrameTreeNode::GloballyFindByID(
+            node->current_frame_host()->inner_tree_main_frame_tree_node_id());
+      } else {
+        node = nullptr;
+      }
+    }
+  }
+
+  // Cross origin frames may throttle their lifecycle when not visible.
+  // This method ensure each frame is brought into view and a frame produced to
+  // ensure up-to-date layout.
+  void EnsureAllFramesCompletedLifecycle() {
+    // Wait until each frame presents a CompositorFrame and then scroll its
+    // child frame (if it has one) into view, so that it is unthrottled and
+    // able to generate and present CompositorFrames.
+    ForEachFrameFromRootToInnerMost([](FrameTreeNode* node) {
+      base::RunLoop loop;
+      node->current_frame_host()->InsertVisualStateCallback(
+          base::BindLambdaForTesting(
+              [&loop](bool visual_state_updated) { loop.Quit(); }));
+      loop.Run();
+
+      EXPECT_TRUE(ExecJs(node, R"JS(
+              if (document.getElementById('childframe'))
+                document.getElementById('childframe').scrollIntoView()
+          )JS"));
+    });
+
+    // Now that each frame has been in view and produced a frame, reset each
+    // scroll offset.
+    ForEachFrameFromRootToInnerMost([](FrameTreeNode* node) {
+      EXPECT_TRUE(ExecJs(node, "window.scrollTo(0, 0)"));
+    });
+  }
+
   // For frame_tree syntax see tree_parser_util.js.
   // These tests place two additional restrictions to make some simplifying
   // assumptions:
@@ -466,6 +512,8 @@
     if (!NavigateToURL(shell(), kMainUrl))
       return false;
 
+    EnsureAllFramesCompletedLifecycle();
+
     VisualViewport viewport = GetVisualViewport();
     double page_scale_factor_before = viewport.scale;
     double page_left_before = viewport.page_left;
@@ -614,21 +662,11 @@
 }
 
 IN_PROC_BROWSER_TEST_P(ScrollIntoViewBrowserTest, EditableInLocalRoot) {
-// TODO(crbug.com/1323876) Flaky on Mac.
-#if BUILDFLAG(IS_MAC)
-  if (!IsForceLocalFrames())
-    return;
-#endif
   ASSERT_TRUE(SetupTest("siteA(siteB(siteA))"));
   RunTest();
 }
 
 IN_PROC_BROWSER_TEST_P(ScrollIntoViewBrowserTest, EditableInDoublyNestedFrame) {
-// TODO(crbug.com/1323876) Flaky on Mac.
-#if BUILDFLAG(IS_MAC)
-  if (!IsForceLocalFrames())
-    return;
-#endif
   ASSERT_TRUE(SetupTest("siteA(siteB(siteC))"));
   RunTest();
 }
@@ -636,11 +674,6 @@
 IN_PROC_BROWSER_TEST_P(
     ScrollIntoViewBrowserTest,
     CrossesEditableInDoublyNestedFrameLocalAndRemoteBoundaries) {
-// TODO(crbug.com/1323876) Flaky on Mac.
-#if BUILDFLAG(IS_MAC)
-  if (!IsForceLocalFrames())
-    return;
-#endif
   ASSERT_TRUE(SetupTest("siteA(siteA(siteB(siteB)))"));
   RunTest();
 }
diff --git a/content/browser/shared_storage/shared_storage_browsertest.cc b/content/browser/shared_storage/shared_storage_browsertest.cc
index 56bcbb63..9a346f4 100644
--- a/content/browser/shared_storage/shared_storage_browsertest.cc
+++ b/content/browser/shared_storage/shared_storage_browsertest.cc
@@ -5,6 +5,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/strings/strcat.h"
 #include "base/test/scoped_feature_list.h"
+#include "base/test/test_future.h"
 #include "content/browser/renderer_host/navigation_request.h"
 #include "content/browser/shared_storage/shared_storage_worklet_driver.h"
 #include "content/browser/shared_storage/shared_storage_worklet_host.h"
@@ -21,6 +22,7 @@
 #include "content/public/test/content_browser_test_utils.h"
 #include "content/public/test/fenced_frame_test_util.h"
 #include "content/public/test/test_frame_navigation_observer.h"
+#include "content/public/test/test_navigation_observer.h"
 #include "content/shell/browser/shell.h"
 #include "content/test/content_browser_test_utils_internal.h"
 #include "content/test/fenced_frame_test_utils.h"
@@ -37,12 +39,21 @@
 
 const char kSimplePagePath[] = "/simple_page.html";
 
+const char kFencedFramePath[] = "/fenced_frames/title0.html";
+
 const char kPageWithBlankIframePath[] = "/page_with_blank_iframe.html";
 
-net::Error InvalidUrnError() {
-  return blink::features::IsFencedFramesShadowDOMBased() ? net::ERR_ABORTED
-                                                         : net::ERR_INVALID_URL;
-}
+const double kBudgetAllowed = 5.0;
+
+const char kSelectFrom8URLsScript[] = R"(
+    let urls = [];
+    for (let i = 0; i < 8; ++i) {
+      urls.push('fenced_frames/title' + i.toString() + '.html');
+    }
+
+    sharedStorage.selectURL(
+        'test-url-selection-operation', urls, {data: {'mockResult': 1}});
+  )";
 
 }  // namespace
 
@@ -156,30 +167,34 @@
 
   void OnRunURLSelectionOperationOnWorkletFinished(
       const GURL& urn_uuid,
-      bool success,
-      const std::string& error_message,
-      uint32_t index) override {
-    OnRunURLSelectionOperationOnWorkletFinishedHelper(urn_uuid, success,
-                                                      error_message, index,
-                                                      /*initial_message=*/true);
+      bool script_execution_success,
+      const std::string& script_execution_error_message,
+      uint32_t index,
+      BudgetResult budget_result) override {
+    OnRunURLSelectionOperationOnWorkletFinishedHelper(
+        urn_uuid, script_execution_success, script_execution_error_message,
+        index, std::move(budget_result),
+        /*initial_message=*/true);
   }
 
   void OnRunURLSelectionOperationOnWorkletFinishedHelper(
       const GURL& urn_uuid,
-      bool success,
-      const std::string& error_message,
+      bool script_execution_success,
+      const std::string& script_execution_error_message,
       uint32_t index,
+      BudgetResult budget_result,
       bool initial_message) {
     if (should_defer_worklet_messages_ && initial_message) {
-      pending_worklet_messages_.push_back(
-          base::BindOnce(&TestSharedStorageWorkletHost::
-                             OnRunURLSelectionOperationOnWorkletFinishedHelper,
-                         weak_ptr_factory_.GetWeakPtr(), urn_uuid, success,
-                         error_message, index,
-                         /*initial_message=*/false));
+      pending_worklet_messages_.push_back(base::BindOnce(
+          &TestSharedStorageWorkletHost::
+              OnRunURLSelectionOperationOnWorkletFinishedHelper,
+          weak_ptr_factory_.GetWeakPtr(), urn_uuid, script_execution_success,
+          script_execution_error_message, index, std::move(budget_result),
+          /*initial_message=*/false));
     } else {
       SharedStorageWorkletHost::OnRunURLSelectionOperationOnWorkletFinished(
-          urn_uuid, success, error_message, index);
+          urn_uuid, script_execution_success, script_execution_error_message,
+          index, std::move(budget_result));
     }
 
     if (initial_message)
@@ -245,6 +260,25 @@
         GetKeepAliveWorkletHostsForTesting().begin()->second.get());
   }
 
+  // Precondition: there's only one eligible worklet host.
+  TestSharedStorageWorkletHost* GetAttachedWorkletHostForOrigin(
+      const url::Origin& origin) {
+    size_t count = 0;
+    TestSharedStorageWorkletHost* result_host = nullptr;
+    for (auto& p : GetAttachedWorkletHostsForTesting()) {
+      if (p.second->shared_storage_origin_for_testing() == origin) {
+        ++count;
+        DCHECK(!result_host);
+        result_host =
+            static_cast<TestSharedStorageWorkletHost*>(p.second.get());
+      }
+    }
+
+    DCHECK_EQ(count, 1u);
+    DCHECK(result_host);
+    return result_host;
+  }
+
   void ConfigureShouldDeferWorkletMessagesOnWorkletHostCreation(
       bool should_defer_worklet_messages) {
     should_defer_worklet_messages_ = should_defer_worklet_messages;
@@ -265,10 +299,16 @@
 class SharedStorageBrowserTest : public ContentBrowserTest {
  public:
   SharedStorageBrowserTest() {
-    scoped_feature_list_.InitWithFeatures(
-        /*enabled_features=*/{blink::features::kSharedStorageAPI,
-                              features::kPrivacySandboxAdsAPIsOverride},
-        /*disabled_features=*/{});
+    scoped_feature_list_
+        .InitWithFeaturesAndParameters(/*enabled_features=*/
+                                       {{blink::features::kSharedStorageAPI,
+                                         {{"SharedStorageBitBudget",
+                                           base::NumberToString(
+                                               kBudgetAllowed)}}},
+                                        {features::
+                                             kPrivacySandboxAdsAPIsOverride,
+                                         {}}},
+                                       /*disabled_features=*/{});
   }
 
   void SetUpOnMainThread() override {
@@ -292,6 +332,17 @@
     ASSERT_TRUE(https_server()->Start());
   }
 
+  double GetRemainingBudget(const url::Origin& origin) {
+    base::test::TestFuture<SharedStorageWorkletHost::BudgetResult> future;
+    static_cast<StoragePartitionImpl*>(shell()
+                                           ->web_contents()
+                                           ->GetBrowserContext()
+                                           ->GetDefaultStoragePartition())
+        ->GetSharedStorageManager()
+        ->GetRemainingBudget(origin, future.GetCallback());
+    return future.Take().bits;
+  }
+
   FencedFrameURLMapping::SharedStorageBudgetMetadata*
   GetSharedStorageBudgetMetadata(const GURL& urn_uuid) {
     FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
@@ -348,8 +399,6 @@
   ~SharedStorageBrowserTest() override = default;
 
  protected:
-  test::FencedFrameTestHelper fenced_frame_test_helper_;
-
   base::test::ScopedFeatureList scoped_feature_list_;
   net::EmbeddedTestServer https_server_{net::EmbeddedTestServer::TYPE_HTTPS};
 
@@ -959,479 +1008,6 @@
   // SharedStorageWorkletHost. Expect no fatal error.
 }
 
-IN_PROC_BROWSER_TEST_F(
-    SharedStorageBrowserTest,
-    RunURLSelectionOperation_FinishBeforeStartingFencedFrameNavigation) {
-  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
-  EXPECT_TRUE(NavigateToURL(shell(), main_url));
-
-  WebContentsConsoleObserver console_observer(shell()->web_contents());
-
-  EXPECT_TRUE(ExecJs(shell(), R"(
-      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
-    )"));
-
-  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
-  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
-  EXPECT_EQ(2u, console_observer.messages().size());
-  EXPECT_EQ("Start executing simple_module.js",
-            base::UTF16ToUTF8(console_observer.messages()[0].message));
-  EXPECT_EQ("Finish executing simple_module.js",
-            base::UTF16ToUTF8(console_observer.messages()[1].message));
-
-  std::string urn_uuid = EvalJs(shell(), R"(
-      sharedStorage.selectURL(
-          'test-url-selection-operation',
-          ["fenced_frames/title0.html", "fenced_frames/title1.html",
-          "fenced_frames/title2.html"], {data: {'mockResult': 1}});
-    )")
-                             .ExtractString();
-
-  EXPECT_TRUE(blink::IsValidUrnUuidURL(GURL(urn_uuid)));
-
-  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
-  test_worklet_host_manager()
-      .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
-
-  FencedFrameURLMapping::SharedStorageBudgetMetadata* metadata =
-      GetSharedStorageBudgetMetadata(GURL(urn_uuid));
-  EXPECT_TRUE(metadata);
-  EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test"));
-  EXPECT_DOUBLE_EQ(metadata->budget_to_charge, std::log2(3));
-
-  GURL url0 = https_server()->GetURL("a.test", "/fenced_frames/title0.html");
-  GURL url1 = https_server()->GetURL("a.test", "/fenced_frames/title1.html");
-  GURL url2 = https_server()->GetURL("a.test", "/fenced_frames/title2.html");
-
-  EXPECT_EQ(6u, console_observer.messages().size());
-  EXPECT_EQ("Start executing 'test-url-selection-operation'",
-            base::UTF16ToUTF8(console_observer.messages()[2].message));
-  EXPECT_EQ(base::StrCat({"[\"", url0.spec(), "\",\"", url1.spec(), "\",\"",
-                          url2.spec(), "\"]"}),
-            base::UTF16ToUTF8(console_observer.messages()[3].message));
-  EXPECT_EQ("{\"mockResult\":1}",
-            base::UTF16ToUTF8(console_observer.messages()[4].message));
-  EXPECT_EQ("Finish executing 'test-url-selection-operation'",
-            base::UTF16ToUTF8(console_observer.messages()[5].message));
-
-  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
-                            ->GetPrimaryFrameTree()
-                            .root();
-
-  EXPECT_TRUE(ExecJs(root,
-                     "var f = document.createElement('fencedframe');"
-                     "f.mode = 'opaque-ads';"
-                     "document.body.appendChild(f);"));
-
-  EXPECT_EQ(1U, root->child_count());
-  FrameTreeNode* fenced_frame_root_node =
-      GetFencedFrameRootNode(root->child_at(0));
-
-  std::string navigate_fenced_frame_to_urn_script =
-      JsReplace("f.src = $1;", urn_uuid);
-
-  TestFrameNavigationObserver observer(
-      fenced_frame_root_node->current_frame_host());
-
-  EXPECT_EQ(urn_uuid, EvalJs(root, navigate_fenced_frame_to_urn_script));
-
-  observer.Wait();
-
-  EXPECT_EQ(
-      https_server()->GetURL("a.test", "/fenced_frames/title1.html"),
-      fenced_frame_root_node->current_frame_host()->GetLastCommittedURL());
-}
-
-IN_PROC_BROWSER_TEST_F(SharedStorageBrowserTest,
-                       RunURLSelectionOperationNotAllowedInFencedFrame) {
-  GURL main_frame_url = https_server()->GetURL("a.test", kSimplePagePath);
-
-  EXPECT_TRUE(NavigateToURL(shell(), main_frame_url));
-
-  GURL fenced_frame_url =
-      https_server()->GetURL("a.test", "/fenced_frames/title1.html");
-
-  RenderFrameHostWrapper fenced_frame_rfh_wrapper(
-      fenced_frame_test_helper_.CreateFencedFrame(
-          shell()->web_contents()->GetMainFrame(), fenced_frame_url));
-
-  EXPECT_TRUE(ExecJs(fenced_frame_rfh_wrapper.get(), R"(
-      sharedStorage.worklet.addModule('/shared_storage/simple_module.js');
-    )"));
-
-  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
-  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
-
-  EvalJsResult result = EvalJs(fenced_frame_rfh_wrapper.get(), R"(
-      sharedStorage.selectURL(
-          'test-url-selection-operation',
-          ["title0.html"], {data: {'mockResult': 0}});
-    )");
-
-  EXPECT_TRUE(result.error.find("sharedStorage.selectURL() is not allowed in "
-                                "fenced frame") != std::string::npos);
-}
-
-IN_PROC_BROWSER_TEST_F(
-    SharedStorageBrowserTest,
-    RunURLSelectionOperation_FinishAfterStartingFencedFrameNavigation) {
-  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
-  EXPECT_TRUE(NavigateToURL(shell(), main_url));
-
-  EXPECT_TRUE(ExecJs(shell(), R"(
-      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
-    )"));
-
-  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
-  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
-
-  // Configure the worklet host to defer processing the subsequent
-  // `selectURL()` response.
-  test_worklet_host_manager()
-      .GetAttachedWorkletHost()
-      ->set_should_defer_worklet_messages(true);
-
-  std::string urn_uuid = EvalJs(shell(), R"(
-      sharedStorage.selectURL(
-          'test-url-selection-operation',
-          ["fenced_frames/title0.html", "fenced_frames/title1.html",
-          "fenced_frames/title2.html"], {data: {'mockResult': 1}});
-    )")
-                             .ExtractString();
-
-  EXPECT_TRUE(blink::IsValidUrnUuidURL(GURL(urn_uuid)));
-
-  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
-  test_worklet_host_manager()
-      .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
-
-  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
-                            ->GetPrimaryFrameTree()
-                            .root();
-
-  EXPECT_TRUE(ExecJs(root,
-                     "var f = document.createElement('fencedframe');"
-                     "f.mode = 'opaque-ads';"
-                     "document.body.appendChild(f);"));
-
-  EXPECT_EQ(1U, root->child_count());
-  FrameTreeNode* fenced_frame_root_node =
-      GetFencedFrameRootNode(root->child_at(0));
-
-  std::string navigate_fenced_frame_to_urn_script =
-      JsReplace("f.src = $1;", urn_uuid);
-
-  TestFrameNavigationObserver observer(
-      fenced_frame_root_node->current_frame_host());
-
-  EXPECT_EQ(urn_uuid, EvalJs(root, navigate_fenced_frame_to_urn_script));
-
-  // After the previous EvalJs, the NavigationRequest should have been created,
-  // but may not have begun. Wait for BeginNavigation() and expect it to be
-  // deferred on fenced frame url mapping.
-  NavigationRequest* request = fenced_frame_root_node->navigation_request();
-  if (!request->is_deferred_on_fenced_frame_url_mapping_for_testing()) {
-    base::RunLoop run_loop;
-    request->set_begin_navigation_callback_for_testing(
-        run_loop.QuitWhenIdleClosure());
-    run_loop.Run();
-
-    EXPECT_TRUE(request->is_deferred_on_fenced_frame_url_mapping_for_testing());
-  }
-
-  FencedFrameURLMapping& url_mapping =
-      root->current_frame_host()->GetPage().fenced_frame_urls_map();
-
-  EXPECT_TRUE(url_mapping.HasObserverForTesting(GURL(urn_uuid), request));
-
-  // Execute the deferred messages. This should finish the url mapping and
-  // resume the deferred navigation.
-  test_worklet_host_manager()
-      .GetAttachedWorkletHost()
-      ->ExecutePendingWorkletMessages();
-
-  observer.Wait();
-
-  FencedFrameURLMapping::SharedStorageBudgetMetadata* metadata =
-      GetSharedStorageBudgetMetadata(GURL(urn_uuid));
-  EXPECT_TRUE(metadata);
-  EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test"));
-  EXPECT_DOUBLE_EQ(metadata->budget_to_charge, std::log2(3));
-
-  EXPECT_EQ(
-      https_server()->GetURL("a.test", "/fenced_frames/title1.html"),
-      fenced_frame_root_node->current_frame_host()->GetLastCommittedURL());
-}
-
-// Tests that the URN from RunURLSelectionOperation() is valid in different
-// context in the page, but it's not valid in a new page.
-IN_PROC_BROWSER_TEST_F(SharedStorageBrowserTest,
-                       RunURLSelectionOperation_URNLifetime) {
-  EXPECT_TRUE(NavigateToURL(
-      shell(), https_server()->GetURL("a.test", kPageWithBlankIframePath)));
-
-  RenderFrameHost* iframe =
-      static_cast<WebContentsImpl*>(shell()->web_contents())
-          ->GetPrimaryFrameTree()
-          .root()
-          ->child_at(0)
-          ->current_frame_host();
-
-  EXPECT_TRUE(ExecJs(iframe, R"(
-      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
-    )"));
-
-  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
-  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
-
-  std::string urn_uuid = EvalJs(iframe, R"(
-      sharedStorage.selectURL(
-          'test-url-selection-operation',
-          ["fenced_frames/title0.html", "fenced_frames/title1.html",
-          "fenced_frames/title2.html"], {data: {'mockResult': 1}});
-    )")
-                             .ExtractString();
-
-  EXPECT_TRUE(blink::IsValidUrnUuidURL(GURL(urn_uuid)));
-
-  // Navigate the iframe to about:blank.
-  NavigateIframeToURL(shell()->web_contents(), "test_iframe",
-                      GURL(url::kAboutBlankURL));
-
-  // Verify that the `urn_uuid` is still valid in the main page.
-  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
-                            ->GetPrimaryFrameTree()
-                            .root();
-
-  EXPECT_TRUE(ExecJs(root,
-                     "var f = document.createElement('fencedframe');"
-                     "f.mode = 'opaque-ads';"
-                     "document.body.appendChild(f);"));
-
-  EXPECT_EQ(2U, root->child_count());
-  FrameTreeNode* fenced_frame_root_node =
-      GetFencedFrameRootNode(root->child_at(1));
-
-  std::string navigate_fenced_frame_to_urn_script =
-      JsReplace("f.src = $1;", urn_uuid);
-
-  TestFrameNavigationObserver observer1(
-      fenced_frame_root_node->current_frame_host());
-
-  EXPECT_EQ(urn_uuid, EvalJs(root, navigate_fenced_frame_to_urn_script));
-
-  observer1.Wait();
-
-  EXPECT_EQ(
-      https_server()->GetURL("a.test", "/fenced_frames/title1.html"),
-      fenced_frame_root_node->current_frame_host()->GetLastCommittedURL());
-
-  // Navigate to a new page. Verify that the `urn_uuid` is not valid in this
-  // new page.
-  GURL new_page_main_url = https_server()->GetURL("a.test", kSimplePagePath);
-  EXPECT_TRUE(NavigateToURL(shell(), new_page_main_url));
-
-  root = static_cast<WebContentsImpl*>(shell()->web_contents())
-             ->GetPrimaryFrameTree()
-             .root();
-
-  EXPECT_TRUE(ExecJs(root,
-                     "var f = document.createElement('fencedframe');"
-                     "f.mode = 'opaque-ads';"
-                     "document.body.appendChild(f);"));
-
-  EXPECT_EQ(1U, root->child_count());
-  fenced_frame_root_node = GetFencedFrameRootNode(root->child_at(0));
-
-  TestFrameNavigationObserver observer2(
-      fenced_frame_root_node->current_frame_host());
-
-  EXPECT_EQ(urn_uuid, EvalJs(root, navigate_fenced_frame_to_urn_script));
-
-  observer2.Wait();
-  EXPECT_EQ(observer2.last_net_error_code(), InvalidUrnError());
-}
-
-// Tests that if the URN mapping is not finished before the keep-alive timeout,
-// the mapping will be considered to be failed when the timeout is reached.
-IN_PROC_BROWSER_TEST_F(
-    SharedStorageBrowserTest,
-    RunURLSelectionOperation_NotFinishBeforeKeepAliveTimeout) {
-  // The test assumes pages get deleted after navigation. To ensure this,
-  // disable back/forward cache.
-  content::DisableBackForwardCacheForTesting(
-      shell()->web_contents(),
-      content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
-
-  EXPECT_TRUE(NavigateToURL(
-      shell(), https_server()->GetURL("a.test", kPageWithBlankIframePath)));
-
-  RenderFrameHost* iframe =
-      static_cast<WebContentsImpl*>(shell()->web_contents())
-          ->GetPrimaryFrameTree()
-          .root()
-          ->child_at(0)
-          ->current_frame_host();
-
-  EXPECT_TRUE(ExecJs(iframe, R"(
-      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
-    )"));
-
-  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
-  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
-
-  // Configure the worklet host to defer processing the subsequent
-  // `selectURL()` response.
-  test_worklet_host_manager()
-      .GetAttachedWorkletHost()
-      ->set_should_defer_worklet_messages(true);
-
-  std::string urn_uuid = EvalJs(iframe, R"(
-      sharedStorage.selectURL(
-          'test-url-selection-operation',
-          ["fenced_frames/title0.html", "fenced_frames/title1.html",
-          "fenced_frames/title2.html"], {data: {'mockResult': 1}});
-    )")
-                             .ExtractString();
-
-  // Navigate away to let the subframe's worklet enter keep-alive.
-  NavigateIframeToURL(shell()->web_contents(), "test_iframe",
-                      GURL(url::kAboutBlankURL));
-
-  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
-  EXPECT_EQ(1u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
-
-  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
-  test_worklet_host_manager()
-      .GetKeepAliveWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
-
-  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
-                            ->GetPrimaryFrameTree()
-                            .root();
-
-  EXPECT_TRUE(ExecJs(root,
-                     "var f = document.createElement('fencedframe');"
-                     "f.mode = 'opaque-ads';"
-                     "document.body.appendChild(f);"));
-
-  EXPECT_EQ(2U, root->child_count());
-  FrameTreeNode* fenced_frame_root_node =
-      GetFencedFrameRootNode(root->child_at(1));
-
-  std::string navigate_fenced_frame_to_urn_script =
-      JsReplace("f.src = $1;", urn_uuid);
-
-  TestFrameNavigationObserver observer(
-      fenced_frame_root_node->current_frame_host());
-
-  EXPECT_EQ(urn_uuid, EvalJs(root, navigate_fenced_frame_to_urn_script));
-
-  // After the previous EvalJs, the NavigationRequest should have been created,
-  // but may not have begun. Wait for BeginNavigation() and expect it to be
-  // deferred on fenced frame url mapping.
-  NavigationRequest* request = fenced_frame_root_node->navigation_request();
-  if (!request->is_deferred_on_fenced_frame_url_mapping_for_testing()) {
-    base::RunLoop run_loop;
-    request->set_begin_navigation_callback_for_testing(
-        run_loop.QuitWhenIdleClosure());
-    run_loop.Run();
-
-    EXPECT_TRUE(request->is_deferred_on_fenced_frame_url_mapping_for_testing());
-  }
-
-  // Fire the keep-alive timer. This will terminate the keep-alive, and the
-  // deferred navigation will resume to navigate to the default url (at index
-  // 0).
-  test_worklet_host_manager()
-      .GetKeepAliveWorkletHost()
-      ->FireKeepAliveTimerNow();
-
-  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
-  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
-
-  observer.Wait();
-
-  FencedFrameURLMapping::SharedStorageBudgetMetadata* metadata =
-      GetSharedStorageBudgetMetadata(GURL(urn_uuid));
-  EXPECT_TRUE(metadata);
-  EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test"));
-  EXPECT_DOUBLE_EQ(metadata->budget_to_charge, 1.0);
-
-  EXPECT_EQ(
-      https_server()->GetURL("a.test", "/fenced_frames/title0.html"),
-      fenced_frame_root_node->current_frame_host()->GetLastCommittedURL());
-}
-
-IN_PROC_BROWSER_TEST_F(SharedStorageBrowserTest,
-                       RunURLSelectionOperation_WorkletReturnInvalidIndex) {
-  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
-  EXPECT_TRUE(NavigateToURL(shell(), main_url));
-
-  WebContentsConsoleObserver console_observer(shell()->web_contents());
-
-  EXPECT_TRUE(ExecJs(shell(), R"(
-      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
-    )"));
-
-  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
-  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
-
-  std::string urn_uuid = EvalJs(shell(), R"(
-      sharedStorage.selectURL(
-          'test-url-selection-operation',
-          ["fenced_frames/title0.html", "fenced_frames/title1.html",
-          "fenced_frames/title2.html"], {data: {'mockResult': 3}});
-    )")
-                             .ExtractString();
-
-  EXPECT_TRUE(blink::IsValidUrnUuidURL(GURL(urn_uuid)));
-
-  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
-  test_worklet_host_manager()
-      .GetAttachedWorkletHost()
-      ->WaitForWorkletResponsesCount(2);
-
-  EXPECT_EQ(
-      "Promise resolved to a number outside the length of the input urls.",
-      base::UTF16ToUTF8(console_observer.messages().back().message));
-
-  FencedFrameURLMapping::SharedStorageBudgetMetadata* metadata =
-      GetSharedStorageBudgetMetadata(GURL(urn_uuid));
-  EXPECT_TRUE(metadata);
-  EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test"));
-  EXPECT_DOUBLE_EQ(metadata->budget_to_charge, 1.0);
-
-  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
-                            ->GetPrimaryFrameTree()
-                            .root();
-
-  EXPECT_TRUE(ExecJs(root,
-                     "var f = document.createElement('fencedframe');"
-                     "f.mode = 'opaque-ads';"
-                     "document.body.appendChild(f);"));
-
-  EXPECT_EQ(1U, root->child_count());
-  FrameTreeNode* fenced_frame_root_node =
-      GetFencedFrameRootNode(root->child_at(0));
-
-  std::string navigate_fenced_frame_to_urn_script =
-      JsReplace("f.src = $1;", urn_uuid);
-
-  TestFrameNavigationObserver observer(
-      fenced_frame_root_node->current_frame_host());
-
-  EXPECT_EQ(urn_uuid, EvalJs(root, navigate_fenced_frame_to_urn_script));
-
-  observer.Wait();
-
-  EXPECT_EQ(
-      https_server()->GetURL("a.test", "/fenced_frames/title0.html"),
-      fenced_frame_root_node->current_frame_host()->GetLastCommittedURL());
-}
-
 // Test that there's no need to charge budget if the input urls' size is 1.
 // This specifically tests the operation success scenario.
 IN_PROC_BROWSER_TEST_F(
@@ -1869,4 +1445,938 @@
   }
 }
 
+class SharedStorageFencedFrameInteractionBrowserTest
+    : public SharedStorageBrowserTest,
+      public ::testing::WithParamInterface<
+          blink::features::FencedFramesImplementationType> {
+ public:
+  // Provides meaningful param names instead of /0 and /1.
+  static std::string DescribeParams(
+      const ::testing::TestParamInfo<ParamType>& info) {
+    switch (info.param) {
+      case blink::features::FencedFramesImplementationType::kShadowDOM:
+        return "ShadowDOM";
+      case blink::features::FencedFramesImplementationType::kMPArch:
+        return "MPArch";
+    }
+  }
+
+  SharedStorageFencedFrameInteractionBrowserTest() {
+    scoped_feature_list_
+        .InitWithFeaturesAndParameters(/*enabled_features=*/
+                                       {{blink::features::kFencedFrames,
+                                         {{"implementation_type",
+                                           GetParam() ==
+                                                   blink::features::
+                                                       FencedFramesImplementationType::
+                                                           kShadowDOM
+                                               ? "shadow_dom"
+                                               : "mparch"}}}},
+                                       /*disabled_features=*/{});
+  }
+
+  FrameTreeNode* CreateFencedFrame(FrameTreeNode* root, const GURL& url) {
+    size_t initial_child_count = root->child_count();
+
+    EXPECT_TRUE(ExecJs(root,
+                       "var f = document.createElement('fencedframe');"
+                       "f.mode = 'opaque-ads';"
+                       "document.body.appendChild(f);"));
+
+    EXPECT_EQ(initial_child_count + 1, root->child_count());
+    FrameTreeNode* fenced_frame_root_node =
+        GetFencedFrameRootNode(root->child_at(initial_child_count));
+
+    std::string navigate_fenced_frame_script =
+        JsReplace("f.src = $1;", url.spec());
+
+    TestFrameNavigationObserver observer(
+        fenced_frame_root_node->current_frame_host());
+
+    EXPECT_EQ(url.spec(), EvalJs(root, navigate_fenced_frame_script));
+
+    observer.Wait();
+
+    return fenced_frame_root_node;
+  }
+
+  FrameTreeNode* CreateFencedFrame(const GURL& url) {
+    FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                              ->GetPrimaryFrameTree()
+                              .root();
+
+    return CreateFencedFrame(root, url);
+  }
+
+  FrameTreeNode* CreateIFrame(FrameTreeNode* root, const GURL& url) {
+    size_t initial_child_count = root->child_count();
+
+    EXPECT_TRUE(ExecJs(root,
+                       "var f = document.createElement('iframe');"
+                       "document.body.appendChild(f);"));
+
+    EXPECT_EQ(initial_child_count + 1, root->child_count());
+    FrameTreeNode* child_node = root->child_at(initial_child_count);
+
+    std::string navigate_frame_script = JsReplace("f.src = $1;", url.spec());
+
+    TestFrameNavigationObserver observer(child_node->current_frame_host());
+
+    EXPECT_EQ(url.spec(), EvalJs(root, navigate_frame_script));
+
+    observer.Wait();
+
+    return child_node;
+  }
+
+  // Create an iframe and run sharedStorage.selectURL() on 8 urls. This
+  // generates an URN associated with `origin` and 3 bits of shared storage
+  // budget. This can be called at most once per origin per test, because
+  // `GetAttachedWorkletHostForOrigin()` will expect only one worklet host for
+  // this origin, and `WaitForWorkletResponsesCount()` is expected to be invoked
+  // once per worklet host.
+  GURL SelectFrom8URLsInContext(const url::Origin& origin) {
+    FrameTreeNode* iframe =
+        CreateIFrame(static_cast<WebContentsImpl*>(shell()->web_contents())
+                         ->GetPrimaryFrameTree()
+                         .root(),
+                     origin.GetURL());
+
+    EXPECT_TRUE(ExecJs(iframe, R"(
+        sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+      )"));
+
+    std::string urn_uuid =
+        EvalJs(iframe, kSelectFrom8URLsScript).ExtractString();
+
+    // There are 2 "worklet operations": `addModule()` and `run()`.
+    test_worklet_host_manager()
+        .GetAttachedWorkletHostForOrigin(origin)
+        ->WaitForWorkletResponsesCount(2);
+
+    return GURL(urn_uuid);
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageFencedFrameInteractionBrowserTest,
+    RunURLSelectionOperation_FinishBeforeStartingFencedFrameNavigation) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+  EXPECT_EQ(2u, console_observer.messages().size());
+  EXPECT_EQ("Start executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[0].message));
+  EXPECT_EQ("Finish executing simple_module.js",
+            base::UTF16ToUTF8(console_observer.messages()[1].message));
+
+  std::string urn_uuid = EvalJs(shell(), R"(
+      sharedStorage.selectURL(
+          'test-url-selection-operation',
+          ["fenced_frames/title0.html", "fenced_frames/title1.html",
+          "fenced_frames/title2.html"], {data: {'mockResult': 1}});
+    )")
+                             .ExtractString();
+
+  EXPECT_TRUE(blink::IsValidUrnUuidURL(GURL(urn_uuid)));
+
+  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponsesCount(2);
+
+  FencedFrameURLMapping::SharedStorageBudgetMetadata* metadata =
+      GetSharedStorageBudgetMetadata(GURL(urn_uuid));
+  EXPECT_TRUE(metadata);
+  EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test"));
+  EXPECT_DOUBLE_EQ(metadata->budget_to_charge, std::log2(3));
+
+  GURL url0 = https_server()->GetURL("a.test", "/fenced_frames/title0.html");
+  GURL url1 = https_server()->GetURL("a.test", "/fenced_frames/title1.html");
+  GURL url2 = https_server()->GetURL("a.test", "/fenced_frames/title2.html");
+
+  EXPECT_EQ(6u, console_observer.messages().size());
+  EXPECT_EQ("Start executing 'test-url-selection-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[2].message));
+  EXPECT_EQ(base::StrCat({"[\"", url0.spec(), "\",\"", url1.spec(), "\",\"",
+                          url2.spec(), "\"]"}),
+            base::UTF16ToUTF8(console_observer.messages()[3].message));
+  EXPECT_EQ("{\"mockResult\":1}",
+            base::UTF16ToUTF8(console_observer.messages()[4].message));
+  EXPECT_EQ("Finish executing 'test-url-selection-operation'",
+            base::UTF16ToUTF8(console_observer.messages()[5].message));
+
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetPrimaryFrameTree()
+                            .root();
+
+  EXPECT_TRUE(ExecJs(root,
+                     "var f = document.createElement('fencedframe');"
+                     "f.mode = 'opaque-ads';"
+                     "document.body.appendChild(f);"));
+
+  EXPECT_EQ(1U, root->child_count());
+  FrameTreeNode* fenced_frame_root_node =
+      GetFencedFrameRootNode(root->child_at(0));
+
+  std::string navigate_fenced_frame_to_urn_script =
+      JsReplace("f.src = $1;", urn_uuid);
+
+  TestFrameNavigationObserver observer(
+      fenced_frame_root_node->current_frame_host());
+
+  EXPECT_EQ(urn_uuid, EvalJs(root, navigate_fenced_frame_to_urn_script));
+
+  observer.Wait();
+
+  EXPECT_EQ(
+      https_server()->GetURL("a.test", "/fenced_frames/title1.html"),
+      fenced_frame_root_node->current_frame_host()->GetLastCommittedURL());
+}
+
+IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest,
+                       RunURLSelectionOperationNotAllowedInFencedFrame) {
+  GURL main_frame_url = https_server()->GetURL("a.test", kSimplePagePath);
+
+  EXPECT_TRUE(NavigateToURL(shell(), main_frame_url));
+
+  GURL fenced_frame_url =
+      https_server()->GetURL("a.test", "/fenced_frames/title1.html");
+
+  FrameTreeNode* fenced_frame_node = CreateFencedFrame(fenced_frame_url);
+
+  EXPECT_TRUE(ExecJs(fenced_frame_node, R"(
+      sharedStorage.worklet.addModule('/shared_storage/simple_module.js');
+    )"));
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  EvalJsResult result = EvalJs(fenced_frame_node, R"(
+      sharedStorage.selectURL(
+          'test-url-selection-operation',
+          ["title0.html"], {data: {'mockResult': 0}});
+    )");
+
+  EXPECT_TRUE(result.error.find("sharedStorage.selectURL() is not allowed in "
+                                "fenced frame") != std::string::npos);
+}
+
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageFencedFrameInteractionBrowserTest,
+    RunURLSelectionOperation_FinishAfterStartingFencedFrameNavigation) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  // Configure the worklet host to defer processing the subsequent
+  // `selectURL()` response.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->set_should_defer_worklet_messages(true);
+
+  std::string urn_uuid = EvalJs(shell(), R"(
+      sharedStorage.selectURL(
+          'test-url-selection-operation',
+          ["fenced_frames/title0.html", "fenced_frames/title1.html",
+          "fenced_frames/title2.html"], {data: {'mockResult': 1}});
+    )")
+                             .ExtractString();
+
+  EXPECT_TRUE(blink::IsValidUrnUuidURL(GURL(urn_uuid)));
+
+  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponsesCount(2);
+
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetPrimaryFrameTree()
+                            .root();
+
+  EXPECT_TRUE(ExecJs(root,
+                     "var f = document.createElement('fencedframe');"
+                     "f.mode = 'opaque-ads';"
+                     "document.body.appendChild(f);"));
+
+  EXPECT_EQ(1U, root->child_count());
+  FrameTreeNode* fenced_frame_root_node =
+      GetFencedFrameRootNode(root->child_at(0));
+
+  std::string navigate_fenced_frame_to_urn_script =
+      JsReplace("f.src = $1;", urn_uuid);
+
+  TestFrameNavigationObserver observer(
+      fenced_frame_root_node->current_frame_host());
+
+  EXPECT_EQ(urn_uuid, EvalJs(root, navigate_fenced_frame_to_urn_script));
+
+  // After the previous EvalJs, the NavigationRequest should have been created,
+  // but may not have begun. Wait for BeginNavigation() and expect it to be
+  // deferred on fenced frame url mapping.
+  NavigationRequest* request = fenced_frame_root_node->navigation_request();
+  if (!request->is_deferred_on_fenced_frame_url_mapping_for_testing()) {
+    base::RunLoop run_loop;
+    request->set_begin_navigation_callback_for_testing(
+        run_loop.QuitWhenIdleClosure());
+    run_loop.Run();
+
+    EXPECT_TRUE(request->is_deferred_on_fenced_frame_url_mapping_for_testing());
+  }
+
+  FencedFrameURLMapping& url_mapping =
+      root->current_frame_host()->GetPage().fenced_frame_urls_map();
+
+  EXPECT_TRUE(url_mapping.HasObserverForTesting(GURL(urn_uuid), request));
+
+  // Execute the deferred messages. This should finish the url mapping and
+  // resume the deferred navigation.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->ExecutePendingWorkletMessages();
+
+  observer.Wait();
+
+  FencedFrameURLMapping::SharedStorageBudgetMetadata* metadata =
+      GetSharedStorageBudgetMetadata(GURL(urn_uuid));
+  EXPECT_TRUE(metadata);
+  EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test"));
+  EXPECT_DOUBLE_EQ(metadata->budget_to_charge, std::log2(3));
+
+  EXPECT_EQ(
+      https_server()->GetURL("a.test", "/fenced_frames/title1.html"),
+      fenced_frame_root_node->current_frame_host()->GetLastCommittedURL());
+}
+
+// Tests that the URN from RunURLSelectionOperation() is valid in different
+// context in the page, but it's not valid in a new page.
+IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest,
+                       RunURLSelectionOperation_URNLifetime) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetPrimaryFrameTree()
+                            .root();
+
+  GURL urn_uuid = SelectFrom8URLsInContext(url::Origin::Create(main_url));
+  EXPECT_TRUE(blink::IsValidUrnUuidURL(GURL(urn_uuid)));
+
+  FrameTreeNode* iframe_node = root->child_at(0);
+
+  // Navigate the iframe to about:blank.
+  TestFrameNavigationObserver observer(iframe_node->current_frame_host());
+  EXPECT_TRUE(ExecJs(iframe_node, JsReplace("window.location.href=$1",
+                                            GURL(url::kAboutBlankURL).spec())));
+  observer.Wait();
+
+  // Verify that the `urn_uuid` is still valid in the main page.
+  FrameTreeNode* fenced_frame_root_node = CreateFencedFrame(urn_uuid);
+  EXPECT_EQ(
+      https_server()->GetURL("a.test", "/fenced_frames/title1.html"),
+      fenced_frame_root_node->current_frame_host()->GetLastCommittedURL());
+
+  // Navigate to a new page. Verify that the `urn_uuid` is not valid in this
+  // new page.
+  GURL new_page_main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), new_page_main_url));
+
+  fenced_frame_root_node = CreateFencedFrame(urn_uuid);
+  EXPECT_NE(
+      https_server()->GetURL("a.test", "/fenced_frames/title1.html"),
+      fenced_frame_root_node->current_frame_host()->GetLastCommittedURL());
+}
+
+// Tests that if the URN mapping is not finished before the keep-alive timeout,
+// the mapping will be considered to be failed when the timeout is reached.
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageFencedFrameInteractionBrowserTest,
+    RunURLSelectionOperation_NotFinishBeforeKeepAliveTimeout) {
+  // The test assumes pages get deleted after navigation. To ensure this,
+  // disable back/forward cache.
+  content::DisableBackForwardCacheForTesting(
+      shell()->web_contents(),
+      content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
+
+  EXPECT_TRUE(NavigateToURL(
+      shell(), https_server()->GetURL("a.test", kPageWithBlankIframePath)));
+
+  RenderFrameHost* iframe =
+      static_cast<WebContentsImpl*>(shell()->web_contents())
+          ->GetPrimaryFrameTree()
+          .root()
+          ->child_at(0)
+          ->current_frame_host();
+
+  EXPECT_TRUE(ExecJs(iframe, R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  // Configure the worklet host to defer processing the subsequent
+  // `selectURL()` response.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->set_should_defer_worklet_messages(true);
+
+  std::string urn_uuid = EvalJs(iframe, kSelectFrom8URLsScript).ExtractString();
+
+  // Navigate away to let the subframe's worklet enter keep-alive.
+  NavigateIframeToURL(shell()->web_contents(), "test_iframe",
+                      GURL(url::kAboutBlankURL));
+
+  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(1u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
+  test_worklet_host_manager()
+      .GetKeepAliveWorkletHost()
+      ->WaitForWorkletResponsesCount(2);
+
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetPrimaryFrameTree()
+                            .root();
+
+  EXPECT_TRUE(ExecJs(root,
+                     "var f = document.createElement('fencedframe');"
+                     "f.mode = 'opaque-ads';"
+                     "document.body.appendChild(f);"));
+
+  EXPECT_EQ(2U, root->child_count());
+  FrameTreeNode* fenced_frame_root_node =
+      GetFencedFrameRootNode(root->child_at(1));
+
+  std::string navigate_fenced_frame_to_urn_script =
+      JsReplace("f.src = $1;", urn_uuid);
+
+  TestFrameNavigationObserver observer(
+      fenced_frame_root_node->current_frame_host());
+
+  EXPECT_EQ(urn_uuid, EvalJs(root, navigate_fenced_frame_to_urn_script));
+
+  // After the previous EvalJs, the NavigationRequest should have been created,
+  // but may not have begun. Wait for BeginNavigation() and expect it to be
+  // deferred on fenced frame url mapping.
+  NavigationRequest* request = fenced_frame_root_node->navigation_request();
+  if (!request->is_deferred_on_fenced_frame_url_mapping_for_testing()) {
+    base::RunLoop run_loop;
+    request->set_begin_navigation_callback_for_testing(
+        run_loop.QuitWhenIdleClosure());
+    run_loop.Run();
+
+    EXPECT_TRUE(request->is_deferred_on_fenced_frame_url_mapping_for_testing());
+  }
+
+  // Fire the keep-alive timer. This will terminate the keep-alive, and the
+  // deferred navigation will resume to navigate to the default url (at index
+  // 0).
+  test_worklet_host_manager()
+      .GetKeepAliveWorkletHost()
+      ->FireKeepAliveTimerNow();
+
+  EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  observer.Wait();
+
+  FencedFrameURLMapping::SharedStorageBudgetMetadata* metadata =
+      GetSharedStorageBudgetMetadata(GURL(urn_uuid));
+  EXPECT_TRUE(metadata);
+  EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test"));
+  EXPECT_DOUBLE_EQ(metadata->budget_to_charge, 0.0);
+
+  EXPECT_EQ(
+      https_server()->GetURL("a.test", "/fenced_frames/title0.html"),
+      fenced_frame_root_node->current_frame_host()->GetLastCommittedURL());
+}
+
+IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest,
+                       RunURLSelectionOperation_WorkletReturnInvalidIndex) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  std::string urn_uuid = EvalJs(shell(), R"(
+      sharedStorage.selectURL(
+          'test-url-selection-operation',
+          ["fenced_frames/title0.html", "fenced_frames/title1.html",
+          "fenced_frames/title2.html"], {data: {'mockResult': 3}});
+    )")
+                             .ExtractString();
+
+  EXPECT_TRUE(blink::IsValidUrnUuidURL(GURL(urn_uuid)));
+
+  // There are 2 "worklet operations": `addModule()` and `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponsesCount(2);
+
+  EXPECT_EQ(
+      "Promise resolved to a number outside the length of the input urls.",
+      base::UTF16ToUTF8(console_observer.messages().back().message));
+
+  FencedFrameURLMapping::SharedStorageBudgetMetadata* metadata =
+      GetSharedStorageBudgetMetadata(GURL(urn_uuid));
+  EXPECT_TRUE(metadata);
+  EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test"));
+  EXPECT_DOUBLE_EQ(metadata->budget_to_charge, 1.0);
+
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetPrimaryFrameTree()
+                            .root();
+
+  EXPECT_TRUE(ExecJs(root,
+                     "var f = document.createElement('fencedframe');"
+                     "f.mode = 'opaque-ads';"
+                     "document.body.appendChild(f);"));
+
+  EXPECT_EQ(1U, root->child_count());
+  FrameTreeNode* fenced_frame_root_node =
+      GetFencedFrameRootNode(root->child_at(0));
+
+  std::string navigate_fenced_frame_to_urn_script =
+      JsReplace("f.src = $1;", urn_uuid);
+
+  TestFrameNavigationObserver observer(
+      fenced_frame_root_node->current_frame_host());
+
+  EXPECT_EQ(urn_uuid, EvalJs(root, navigate_fenced_frame_to_urn_script));
+
+  observer.Wait();
+
+  EXPECT_EQ(
+      https_server()->GetURL("a.test", "/fenced_frames/title0.html"),
+      fenced_frame_root_node->current_frame_host()->GetLastCommittedURL());
+}
+
+IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest,
+                       FencedFrameNavigateSelf_NoBudgetWithdrawal) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  url::Origin shared_storage_origin =
+      url::Origin::Create(https_server()->GetURL("b.test", kSimplePagePath));
+
+  GURL urn_uuid = SelectFrom8URLsInContext(shared_storage_origin);
+
+  FrameTreeNode* fenced_frame_root_node = CreateFencedFrame(urn_uuid);
+
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin), kBudgetAllowed);
+
+  TestFrameNavigationObserver observer(
+      fenced_frame_root_node->current_frame_host());
+  EXPECT_TRUE(ExecJs(fenced_frame_root_node, "location.reload()"));
+  observer.Wait();
+
+  // No budget withdrawal as the fenced frame did not initiate a top navigation.
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin), kBudgetAllowed);
+}
+
+IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest,
+                       FencedFrameNavigateTop_BudgetWithdrawal) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  url::Origin shared_storage_origin =
+      url::Origin::Create(https_server()->GetURL("b.test", kSimplePagePath));
+
+  GURL urn_uuid = SelectFrom8URLsInContext(shared_storage_origin);
+
+  FrameTreeNode* fenced_frame_root_node = CreateFencedFrame(urn_uuid);
+
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin), kBudgetAllowed);
+
+  GURL new_page_url = https_server()->GetURL("c.test", kSimplePagePath);
+
+  TestNavigationObserver top_navigation_observer(shell()->web_contents());
+  EXPECT_TRUE(ExecJs(
+      fenced_frame_root_node,
+      JsReplace("window.open($1, '_unfencedTop')", new_page_url.spec())));
+  top_navigation_observer.Wait();
+
+  // After the top navigation, log(8)=3 bits should have been withdrawn from the
+  // original shared storage origin.
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin),
+                   kBudgetAllowed - 3);
+}
+
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageFencedFrameInteractionBrowserTest,
+    FencedFrameNavigateFromParentToRegularURLAndThenNavigateTop_NoBudgetWithdrawal) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  url::Origin shared_storage_origin =
+      url::Origin::Create(https_server()->GetURL("b.test", kSimplePagePath));
+
+  GURL urn_uuid = SelectFrom8URLsInContext(shared_storage_origin);
+
+  FrameTreeNode* fenced_frame_root_node = CreateFencedFrame(urn_uuid);
+
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin), kBudgetAllowed);
+
+  GURL new_frame_url = https_server()->GetURL("c.test", kFencedFramePath);
+
+  TestFrameNavigationObserver observer(
+      fenced_frame_root_node->current_frame_host());
+  std::string navigate_fenced_frame_script = JsReplace(
+      "var f = document.getElementsByTagName('fencedframe')[0]; f.src = $1;",
+      new_frame_url.spec());
+
+  EXPECT_TRUE(ExecJs(shell(), navigate_fenced_frame_script));
+  observer.Wait();
+
+  GURL new_page_url = https_server()->GetURL("d.test", kSimplePagePath);
+
+  TestNavigationObserver top_navigation_observer(shell()->web_contents());
+  EXPECT_TRUE(ExecJs(
+      fenced_frame_root_node,
+      JsReplace("window.open($1, '_unfencedTop')", new_page_url.spec())));
+  top_navigation_observer.Wait();
+
+  // No budget withdrawal as the initial fenced frame was navigated away by its
+  // parent before it triggers a top navigation.
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin), kBudgetAllowed);
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(url::Origin::Create(new_frame_url)),
+                   kBudgetAllowed);
+}
+
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageFencedFrameInteractionBrowserTest,
+    FencedFrameNavigateSelfAndThenNavigateTop_BudgetWithdrawal) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  url::Origin shared_storage_origin =
+      url::Origin::Create(https_server()->GetURL("b.test", kSimplePagePath));
+
+  GURL urn_uuid = SelectFrom8URLsInContext(shared_storage_origin);
+
+  FrameTreeNode* fenced_frame_root_node = CreateFencedFrame(urn_uuid);
+
+  {
+    GURL new_frame_url = https_server()->GetURL("c.test", kFencedFramePath);
+
+    TestFrameNavigationObserver observer(
+        fenced_frame_root_node->current_frame_host());
+    EXPECT_TRUE(
+        ExecJs(fenced_frame_root_node,
+               JsReplace("window.location.href=$1", new_frame_url.spec())));
+    observer.Wait();
+  }
+
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin), kBudgetAllowed);
+
+  {
+    GURL new_page_url = https_server()->GetURL("d.test", kSimplePagePath);
+
+    TestNavigationObserver top_navigation_observer(shell()->web_contents());
+    EXPECT_TRUE(ExecJs(
+        fenced_frame_root_node,
+        JsReplace("window.open($1, '_unfencedTop')", new_page_url.spec())));
+    top_navigation_observer.Wait();
+  }
+
+  // After the top navigation, log(8)=3 bits should have been withdrawn from the
+  // original shared storage origin.
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin),
+                   kBudgetAllowed - 3);
+}
+
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageFencedFrameInteractionBrowserTest,
+    FencedFrameNavigateSelfToNewURNAndThenNavigateTop_BudgetWithdrawal) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  url::Origin shared_storage_origin1 =
+      url::Origin::Create(https_server()->GetURL("b.test", kSimplePagePath));
+  url::Origin shared_storage_origin2 =
+      url::Origin::Create(https_server()->GetURL("c.test", kSimplePagePath));
+
+  GURL urn_uuid1 = SelectFrom8URLsInContext(shared_storage_origin1);
+  GURL urn_uuid2 = SelectFrom8URLsInContext(shared_storage_origin2);
+
+  FrameTreeNode* fenced_frame_root_node = CreateFencedFrame(urn_uuid1);
+
+  {
+    TestFrameNavigationObserver observer(
+        fenced_frame_root_node->current_frame_host());
+    EXPECT_TRUE(ExecJs(fenced_frame_root_node,
+                       JsReplace("window.location.href=$1", urn_uuid2.spec())));
+    observer.Wait();
+  }
+
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin1), kBudgetAllowed);
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin2), kBudgetAllowed);
+
+  {
+    GURL new_page_url = https_server()->GetURL("d.test", kSimplePagePath);
+
+    TestNavigationObserver top_navigation_observer(shell()->web_contents());
+    EXPECT_TRUE(ExecJs(
+        fenced_frame_root_node,
+        JsReplace("window.open($1, '_unfencedTop')", new_page_url.spec())));
+    top_navigation_observer.Wait();
+  }
+
+  // After the top navigation, log(8)=3 bits should have been withdrawn from the
+  // new shared storage origin. The original origin is unaffected.
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin1), kBudgetAllowed);
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin2),
+                   kBudgetAllowed - 3);
+}
+
+IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest,
+                       NestedFencedFrameNavigateTop_BudgetWithdrawal) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  url::Origin shared_storage_origin =
+      url::Origin::Create(https_server()->GetURL("b.test", kSimplePagePath));
+
+  GURL urn_uuid = SelectFrom8URLsInContext(shared_storage_origin);
+
+  FrameTreeNode* fenced_frame_root_node = CreateFencedFrame(urn_uuid);
+
+  GURL nested_fenced_frame_url =
+      https_server()->GetURL("c.test", kFencedFramePath);
+  FrameTreeNode* nested_fenced_frame_root_node =
+      CreateFencedFrame(fenced_frame_root_node, nested_fenced_frame_url);
+
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin), kBudgetAllowed);
+
+  GURL new_page_url = https_server()->GetURL("d.test", kSimplePagePath);
+  TestNavigationObserver top_navigation_observer(shell()->web_contents());
+  EXPECT_TRUE(ExecJs(
+      nested_fenced_frame_root_node,
+      JsReplace("window.open($1, '_unfencedTop')", new_page_url.spec())));
+  top_navigation_observer.Wait();
+
+  // After the top navigation, log(8)=3 bits should have been withdrawn from the
+  // original shared storage origin.
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin),
+                   kBudgetAllowed - 3);
+}
+
+IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest,
+                       IframeInFencedFrameNavigateTop_BudgetWithdrawal) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  url::Origin shared_storage_origin =
+      url::Origin::Create(https_server()->GetURL("b.test", kSimplePagePath));
+
+  GURL urn_uuid = SelectFrom8URLsInContext(shared_storage_origin);
+
+  FrameTreeNode* fenced_frame_root_node = CreateFencedFrame(urn_uuid);
+
+  GURL nested_fenced_frame_url =
+      https_server()->GetURL("c.test", kFencedFramePath);
+  FrameTreeNode* nested_fenced_frame_root_node =
+      CreateIFrame(fenced_frame_root_node, nested_fenced_frame_url);
+
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin), kBudgetAllowed);
+
+  GURL new_page_url = https_server()->GetURL("d.test", kSimplePagePath);
+  TestNavigationObserver top_navigation_observer(shell()->web_contents());
+  EXPECT_TRUE(ExecJs(
+      nested_fenced_frame_root_node,
+      JsReplace("window.open($1, '_unfencedTop')", new_page_url.spec())));
+  top_navigation_observer.Wait();
+
+  // After the top navigation, log(8)=3 bits should have been withdrawn from the
+  // original shared storage origin.
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin),
+                   kBudgetAllowed - 3);
+}
+
+IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest,
+                       FencedFrame_PopupTwice_BudgetWithdrawalOnce) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  url::Origin shared_storage_origin =
+      url::Origin::Create(https_server()->GetURL("b.test", kSimplePagePath));
+
+  GURL urn_uuid = SelectFrom8URLsInContext(shared_storage_origin);
+
+  FrameTreeNode* fenced_frame_root_node = CreateFencedFrame(urn_uuid);
+
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin), kBudgetAllowed);
+
+  OpenPopup(fenced_frame_root_node,
+            https_server()->GetURL("c.test", kSimplePagePath), /*name=*/"");
+
+  // After the popup, log(8)=3 bits should have been withdrawn from the
+  // original shared storage origin.
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin),
+                   kBudgetAllowed - 3);
+
+  OpenPopup(fenced_frame_root_node,
+            https_server()->GetURL("c.test", kSimplePagePath), /*name=*/"");
+
+  // The budget can only be withdrawn once for each urn_uuid.
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin),
+                   kBudgetAllowed - 3);
+}
+
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageFencedFrameInteractionBrowserTest,
+    TwoFencedFrames_DifferentURNs_EachPopupOnce_BudgetWithdrawalTwice) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  url::Origin shared_storage_origin = url::Origin::Create(main_url);
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  GURL urn_uuid1 =
+      GURL(EvalJs(shell(), kSelectFrom8URLsScript).ExtractString());
+  GURL urn_uuid2 =
+      GURL(EvalJs(shell(), kSelectFrom8URLsScript).ExtractString());
+
+  // There are three "worklet operations": one `addModule()` and two
+  // `selectURL()`.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponsesCount(3);
+
+  FrameTreeNode* fenced_frame_root_node1 = CreateFencedFrame(urn_uuid1);
+  FrameTreeNode* fenced_frame_root_node2 = CreateFencedFrame(urn_uuid2);
+
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin), kBudgetAllowed);
+
+  OpenPopup(fenced_frame_root_node1,
+            https_server()->GetURL("b.test", kSimplePagePath), /*name=*/"");
+
+  // After the popup, log(8)=3 bits should have been withdrawn from the
+  // original shared storage origin.
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin),
+                   kBudgetAllowed - 3);
+
+  OpenPopup(fenced_frame_root_node2,
+            https_server()->GetURL("b.test", kSimplePagePath), /*name=*/"");
+
+  // After the popup, log(8)=3 bits should have been withdrawn from the
+  // original shared storage origin. The budget for `shared_storage_origin` can
+  // be charged once for each distinct URN, and therefore here it gets charged
+  // twice.
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin),
+                   kBudgetAllowed - 3 - 3);
+}
+
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageFencedFrameInteractionBrowserTest,
+    TwoFencedFrames_SameURNs_EachPopupOnce_BudgetWithdrawalOnce) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  url::Origin shared_storage_origin = url::Origin::Create(main_url);
+
+  GURL urn_uuid = SelectFrom8URLsInContext(shared_storage_origin);
+
+  FrameTreeNode* fenced_frame_root_node1 = CreateFencedFrame(urn_uuid);
+  FrameTreeNode* fenced_frame_root_node2 = CreateFencedFrame(urn_uuid);
+
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin), kBudgetAllowed);
+
+  OpenPopup(fenced_frame_root_node1,
+            https_server()->GetURL("b.test", kSimplePagePath), /*name=*/"");
+
+  // After the popup, log(8)=3 bits should have been withdrawn from the
+  // original shared storage origin.
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin),
+                   kBudgetAllowed - 3);
+
+  OpenPopup(fenced_frame_root_node2,
+            https_server()->GetURL("b.test", kSimplePagePath), /*name=*/"");
+
+  // The budget can only be withdrawn once for each urn_uuid.
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin),
+                   kBudgetAllowed - 3);
+}
+
+IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest,
+                       RunURLSelectionOperation_InsufficientBudget) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  url::Origin shared_storage_origin = url::Origin::Create(main_url);
+
+  WebContentsConsoleObserver console_observer(shell()->web_contents());
+
+  EXPECT_TRUE(ExecJs(shell(), R"(
+      sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+    )"));
+
+  GURL urn_uuid1 =
+      GURL(EvalJs(shell(), kSelectFrom8URLsScript).ExtractString());
+
+  FrameTreeNode* fenced_frame_root_node1 = CreateFencedFrame(urn_uuid1);
+  OpenPopup(fenced_frame_root_node1,
+            https_server()->GetURL("b.test", kSimplePagePath), /*name=*/"");
+
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin),
+                   kBudgetAllowed - 3);
+
+  GURL urn_uuid2 =
+      GURL(EvalJs(shell(), kSelectFrom8URLsScript).ExtractString());
+
+  // Wait for the `addModule()` and two `selectURL()` to finish.
+  test_worklet_host_manager()
+      .GetAttachedWorkletHost()
+      ->WaitForWorkletResponsesCount(3);
+
+  EXPECT_EQ("Insufficient budget for selectURL().",
+            base::UTF16ToUTF8(console_observer.messages().back().message));
+
+  // The failed mapping due to insufficient budget (i.e. `urn_uuid2`) should not
+  // incur any budget withdrawal on subsequent top navigation from inside
+  // the fenced frame.
+  FrameTreeNode* fenced_frame_root_node2 = CreateFencedFrame(urn_uuid2);
+  OpenPopup(fenced_frame_root_node2,
+            https_server()->GetURL("c.test", kSimplePagePath), /*name=*/"");
+
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin),
+                   kBudgetAllowed - 3);
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    SharedStorageFencedFrameInteractionBrowserTest,
+    ::testing::Values(
+        blink::features::FencedFramesImplementationType::kShadowDOM,
+        blink::features::FencedFramesImplementationType::kMPArch),
+    &SharedStorageFencedFrameInteractionBrowserTest::DescribeParams);
+
 }  // namespace content
diff --git a/content/browser/shared_storage/shared_storage_budget_charger.cc b/content/browser/shared_storage/shared_storage_budget_charger.cc
new file mode 100644
index 0000000..baad9f0
--- /dev/null
+++ b/content/browser/shared_storage/shared_storage_budget_charger.cc
@@ -0,0 +1,77 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/shared_storage/shared_storage_budget_charger.h"
+
+#include "components/services/storage/shared_storage/shared_storage_manager.h"
+#include "content/browser/renderer_host/frame_tree.h"
+#include "content/browser/renderer_host/frame_tree_node.h"
+#include "content/browser/renderer_host/render_frame_host_impl.h"
+#include "content/public/browser/navigation_handle.h"
+
+namespace content {
+
+SharedStorageBudgetCharger::SharedStorageBudgetCharger(
+    WebContents* web_contents)
+    : WebContentsObserver(web_contents),
+      WebContentsUserData<SharedStorageBudgetCharger>(*web_contents) {}
+
+SharedStorageBudgetCharger::~SharedStorageBudgetCharger() = default;
+
+void SharedStorageBudgetCharger::DidStartNavigation(
+    NavigationHandle* navigation_handle) {
+  // We are only interested in renderer-initiated navigations taking place in
+  // the main frame of the primary frame tree.
+  if (!navigation_handle->IsInPrimaryMainFrame() ||
+      !navigation_handle->IsRendererInitiated()) {
+    return;
+  }
+
+  RenderFrameHostImpl* initiator_frame_host =
+      navigation_handle->GetInitiatorFrameToken().has_value()
+          ? RenderFrameHostImpl::FromFrameToken(
+                navigation_handle->GetInitiatorProcessID(),
+                navigation_handle->GetInitiatorFrameToken().value())
+          : nullptr;
+
+  base::UmaHistogramBoolean(
+      "Navigation.MainFrame.RendererInitiated.InitiatorFramePresentAtStart",
+      initiator_frame_host);
+
+  // Skip if we cannot find the initiator frame host. This can happen when the
+  // initiator frame starts a top navigation and then triggers its own
+  // destruction by navigating to a cross-origin frame, so that it may no longer
+  // exist by the time we get here.
+  //
+  // The risk of getting unlimited budget this way seems to be small: the ideal
+  // timing can vary from time to time, and whether the timing exist at all also
+  // depends on the ordering of messaging.
+  //
+  // For now, allow the leak and track with UMA (and revisit as needed).
+  // https://crbug.com/1331111
+  if (!initiator_frame_host)
+    return;
+
+  FencedFrameURLMapping::SharedStorageBudgetMetadata*
+      shared_storage_budget_metadata = initiator_frame_host->frame_tree_node()
+                                           ->FindSharedStorageBudgetMetadata();
+
+  // Skip if the initiator frame is not originated from shared storage.
+  if (!shared_storage_budget_metadata)
+    return;
+
+  if (shared_storage_budget_metadata->budget_to_charge > 0) {
+    storage::SharedStorageManager* shared_storage_manager =
+        initiator_frame_host->GetStoragePartition()->GetSharedStorageManager();
+    shared_storage_manager->MakeBudgetWithdrawal(
+        shared_storage_budget_metadata->origin,
+        shared_storage_budget_metadata->budget_to_charge, base::DoNothing());
+
+    shared_storage_budget_metadata->budget_to_charge = 0;
+  }
+}
+
+WEB_CONTENTS_USER_DATA_KEY_IMPL(SharedStorageBudgetCharger);
+
+}  // namespace content
diff --git a/content/browser/shared_storage/shared_storage_budget_charger.h b/content/browser/shared_storage/shared_storage_budget_charger.h
new file mode 100644
index 0000000..eabfb739
--- /dev/null
+++ b/content/browser/shared_storage/shared_storage_budget_charger.h
@@ -0,0 +1,43 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_SHARED_STORAGE_SHARED_STORAGE_BUDGET_CHARGER_H_
+#define CONTENT_BROWSER_SHARED_STORAGE_SHARED_STORAGE_BUDGET_CHARGER_H_
+
+#include "content/common/content_export.h"
+#include "content/public/browser/web_contents_observer.h"
+#include "content/public/browser/web_contents_user_data.h"
+
+namespace content {
+
+// Class responsible for observing top navigations initiated from fenced frames
+// originated (directly or indirectly) from shared storage url selection. In
+// that case, we will charge the privacy budget to the shared storage origin.
+// This class is owned by the `WebContents` and its lifetime is bound to
+// lifetime of the `WebContents`.
+class CONTENT_EXPORT SharedStorageBudgetCharger
+    : public WebContentsObserver,
+      public WebContentsUserData<SharedStorageBudgetCharger> {
+ public:
+  explicit SharedStorageBudgetCharger(WebContents* web_contents);
+  SharedStorageBudgetCharger(const SharedStorageBudgetCharger& other) = delete;
+  SharedStorageBudgetCharger& operator=(
+      const SharedStorageBudgetCharger& other) = delete;
+  SharedStorageBudgetCharger(SharedStorageBudgetCharger&& other) = delete;
+  SharedStorageBudgetCharger& operator=(SharedStorageBudgetCharger&& other) =
+      delete;
+  ~SharedStorageBudgetCharger() override;
+
+ private:
+  friend class WebContentsUserData<SharedStorageBudgetCharger>;
+
+  // WebContentsObserver:
+  void DidStartNavigation(NavigationHandle* navigation_handle) override;
+
+  WEB_CONTENTS_USER_DATA_KEY_DECL();
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_SHARED_STORAGE_SHARED_STORAGE_BUDGET_CHARGER_H_
diff --git a/content/browser/shared_storage/shared_storage_originated_document_data.cc b/content/browser/shared_storage/shared_storage_originated_document_data.cc
deleted file mode 100644
index 57e0aeb..0000000
--- a/content/browser/shared_storage/shared_storage_originated_document_data.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2022 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/shared_storage/shared_storage_originated_document_data.h"
-
-namespace content {
-
-SharedStorageOriginatedDocumentData::~SharedStorageOriginatedDocumentData() =
-    default;
-
-SharedStorageOriginatedDocumentData::SharedStorageOriginatedDocumentData(
-    RenderFrameHost* rfh,
-    FencedFrameURLMapping::SharedStorageBudgetMetadata* budget_metadata)
-    : DocumentUserData(rfh), budget_metadata_(*budget_metadata) {}
-
-DOCUMENT_USER_DATA_KEY_IMPL(SharedStorageOriginatedDocumentData);
-
-}  // namespace content
diff --git a/content/browser/shared_storage/shared_storage_originated_document_data.h b/content/browser/shared_storage/shared_storage_originated_document_data.h
deleted file mode 100644
index 00cc87a..0000000
--- a/content/browser/shared_storage/shared_storage_originated_document_data.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2022 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_SHARED_STORAGE_SHARED_STORAGE_ORIGINATED_DOCUMENT_DATA_H_
-#define CONTENT_BROWSER_SHARED_STORAGE_SHARED_STORAGE_ORIGINATED_DOCUMENT_DATA_H_
-
-#include "content/browser/fenced_frame/fenced_frame_url_mapping.h"
-#include "content/common/content_export.h"
-#include "content/public/browser/document_user_data.h"
-
-namespace content {
-
-// Contains the originated-from shared storage data for a document (i.e. fenced
-// frame where its URL was from a URN from
-// `sharedStorage.runURLSelectionOperation()`).
-class CONTENT_EXPORT SharedStorageOriginatedDocumentData
-    : public DocumentUserData<SharedStorageOriginatedDocumentData> {
- public:
-  ~SharedStorageOriginatedDocumentData() override;
-
-  FencedFrameURLMapping::SharedStorageBudgetMetadata& budget_metadata() const {
-    return budget_metadata_;
-  }
-
- private:
-  // No public constructors to force going through static methods of
-  // `DocumentUserData` (e.g. `CreateForCurrentDocument()`).
-  explicit SharedStorageOriginatedDocumentData(
-      RenderFrameHost* rfh,
-      FencedFrameURLMapping::SharedStorageBudgetMetadata* budget_metadata);
-
-  friend DocumentUserData;
-  DOCUMENT_USER_DATA_KEY_DECL();
-
-  // The budgeting `url::Origin`, and the amount of budget to charge whenever
-  // this document is navigating a top frame. `budget_metadata_` lives in
-  // `FencedFrameURLMapping`. The amount of budget to charge can be 0 if no
-  // budget charging is needed from the beginning, or if the budget was already
-  // charged (e.g. another document referencing the same metadata has triggered
-  // a top navigation).
-  FencedFrameURLMapping::SharedStorageBudgetMetadata& budget_metadata_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_SHARED_STORAGE_SHARED_STORAGE_ORIGINATED_DOCUMENT_DATA_H_
diff --git a/content/browser/shared_storage/shared_storage_worklet_host.cc b/content/browser/shared_storage/shared_storage_worklet_host.cc
index b9cf01e..9d770bf 100644
--- a/content/browser/shared_storage/shared_storage_worklet_host.cc
+++ b/content/browser/shared_storage/shared_storage_worklet_host.cc
@@ -5,7 +5,6 @@
 #include "content/browser/shared_storage/shared_storage_worklet_host.h"
 #include "components/services/storage/shared_storage/public/mojom/shared_storage.mojom.h"
 
-#include "components/services/storage/shared_storage/shared_storage_manager.h"
 #include "content/browser/devtools/devtools_instrumentation.h"
 #include "content/browser/renderer_host/page_impl.h"
 #include "content/browser/renderer_host/render_frame_host_impl.h"
@@ -30,20 +29,32 @@
 using GetResult = storage::SharedStorageManager::GetResult;
 
 SharedStorageURNMappingResult CalculateSharedStorageURNMappingResult(
-    bool url_selection_succeeded,
+    bool script_execution_succeeded,
     const url::Origin& shared_storage_origin,
     const std::vector<GURL>& urls,
-    uint32_t index) {
+    uint32_t index,
+    double budget_remaining,
+    bool& failed_due_to_no_budget) {
+  DCHECK(!failed_due_to_no_budget);
   DCHECK_GT(urls.size(), 0u);
   DCHECK_LT(index, urls.size());
-  DCHECK(url_selection_succeeded || index == 0);
+  DCHECK(script_execution_succeeded || index == 0);
 
-  GURL mapped_url = urls[index];
   double budget_to_charge =
       (urls.size() > 1u)
-          ? (url_selection_succeeded ? std::log2(urls.size()) : 1.0)
+          ? (script_execution_succeeded ? std::log2(urls.size()) : 1.0)
           : 0.0;
 
+  // If we are running out of budget, consider this mapping to be failed. Use
+  // the default URL, and there's no need to further charge the budget.
+  if (budget_to_charge > 0.0 && budget_to_charge > budget_remaining) {
+    failed_due_to_no_budget = true;
+    index = 0;
+    budget_to_charge = 0.0;
+  }
+
+  GURL mapped_url = urls[index];
+
   return SharedStorageURNMappingResult{
       .mapped_url = mapped_url,
       .metadata =
@@ -83,10 +94,12 @@
     const GURL& urn_uuid = it->first;
     const std::vector<GURL>& urls = it->second;
 
+    bool failed_due_to_no_budget = false;
     page_->fenced_frame_urls_map().OnSharedStorageURNMappingResultDetermined(
-        urn_uuid, CalculateSharedStorageURNMappingResult(
-                      /*url_selection_succeeded=*/false, shared_storage_origin_,
-                      urls, /*index=*/0));
+        urn_uuid,
+        CalculateSharedStorageURNMappingResult(
+            /*script_execution_succeeded=*/false, shared_storage_origin_, urls,
+            /*index=*/0, /*budget_remaining=*/0.0, failed_due_to_no_budget));
 
     it = unresolved_urns_.erase(it);
   }
@@ -188,9 +201,10 @@
 
   GetAndConnectToSharedStorageWorkletService()->RunURLSelectionOperation(
       name, urls, serialized_data,
-      base::BindOnce(&SharedStorageWorkletHost::
-                         OnRunURLSelectionOperationOnWorkletFinished,
-                     weak_ptr_factory_.GetWeakPtr(), urn_uuid));
+      base::BindOnce(
+          &SharedStorageWorkletHost::
+              OnRunURLSelectionOperationOnWorkletScriptExecutionFinished,
+          weak_ptr_factory_.GetWeakPtr(), urn_uuid));
 }
 
 bool SharedStorageWorkletHost::HasPendingOperations() {
@@ -486,34 +500,74 @@
   DecrementPendingOperationsCount();
 }
 
-void SharedStorageWorkletHost::OnRunURLSelectionOperationOnWorkletFinished(
-    const GURL& urn_uuid,
-    bool success,
-    const std::string& error_message,
-    uint32_t index) {
-  std::vector<GURL> urls = unresolved_urns_.at(urn_uuid);
-  unresolved_urns_.erase(urn_uuid);
+void SharedStorageWorkletHost::
+    OnRunURLSelectionOperationOnWorkletScriptExecutionFinished(
+        const GURL& urn_uuid,
+        bool success,
+        const std::string& error_message,
+        uint32_t index) {
+  auto it = unresolved_urns_.find(urn_uuid);
+  DCHECK(it != unresolved_urns_.end());
 
-  if ((success && index >= urls.size()) || (!success && index != 0)) {
+  if ((success && index >= it->second.size()) || (!success && index != 0)) {
     // This could indicate a compromised worklet environment, so let's terminate
     // it.
     mojo::ReportBadMessage(
         "Unexpected index number returned from selectURL().");
+
+    unresolved_urns_.erase(it);
+    DecrementPendingOperationsCount();
     return;
   }
 
-  if (!success && document_service_) {
-    DCHECK(!IsInKeepAlivePhase());
-    devtools_instrumentation::LogWorkletMessage(
-        static_cast<RenderFrameHostImpl&>(
-            document_service_->render_frame_host()),
-        blink::mojom::ConsoleMessageLevel::kError, error_message);
-  }
+  shared_storage_manager_->GetRemainingBudget(
+      shared_storage_origin_,
+      base::BindOnce(&SharedStorageWorkletHost::
+                         OnRunURLSelectionOperationOnWorkletFinished,
+                     weak_ptr_factory_.GetWeakPtr(), urn_uuid, success,
+                     error_message, index));
+}
+
+void SharedStorageWorkletHost::OnRunURLSelectionOperationOnWorkletFinished(
+    const GURL& urn_uuid,
+    bool script_execution_succeeded,
+    const std::string& script_execution_error_message,
+    uint32_t index,
+    BudgetResult budget_result) {
+  auto it = unresolved_urns_.find(urn_uuid);
+  DCHECK(it != unresolved_urns_.end());
+
+  std::vector<GURL> urls = std::move(it->second);
+  unresolved_urns_.erase(it);
 
   if (page_) {
+    bool failed_due_to_no_budget = false;
+    SharedStorageURNMappingResult mapping_result =
+        CalculateSharedStorageURNMappingResult(
+            script_execution_succeeded, shared_storage_origin_, urls, index,
+            budget_result.bits, failed_due_to_no_budget);
+
+    if (document_service_) {
+      DCHECK(!IsInKeepAlivePhase());
+
+      // Let the insufficient-budget failure supersede the script failure.
+      if (failed_due_to_no_budget) {
+        devtools_instrumentation::LogWorkletMessage(
+            static_cast<RenderFrameHostImpl&>(
+                document_service_->render_frame_host()),
+            blink::mojom::ConsoleMessageLevel::kError,
+            "Insufficient budget for selectURL().");
+      } else if (!script_execution_succeeded) {
+        devtools_instrumentation::LogWorkletMessage(
+            static_cast<RenderFrameHostImpl&>(
+                document_service_->render_frame_host()),
+            blink::mojom::ConsoleMessageLevel::kError,
+            script_execution_error_message);
+      }
+    }
+
     page_->fenced_frame_urls_map().OnSharedStorageURNMappingResultDetermined(
-        urn_uuid, CalculateSharedStorageURNMappingResult(
-                      success, shared_storage_origin_, urls, index));
+        urn_uuid, std::move(mapping_result));
   }
 
   DecrementPendingOperationsCount();
diff --git a/content/browser/shared_storage/shared_storage_worklet_host.h b/content/browser/shared_storage/shared_storage_worklet_host.h
index 46f53d1..6613ab5 100644
--- a/content/browser/shared_storage/shared_storage_worklet_host.h
+++ b/content/browser/shared_storage/shared_storage_worklet_host.h
@@ -6,6 +6,7 @@
 #define CONTENT_BROWSER_SHARED_STORAGE_SHARED_STORAGE_WORKLET_HOST_H_
 
 #include "base/memory/raw_ptr.h"
+#include "components/services/storage/shared_storage/shared_storage_manager.h"
 #include "content/common/content_export.h"
 #include "content/services/shared_storage_worklet/public/mojom/shared_storage_worklet_service.mojom.h"
 #include "mojo/public/cpp/bindings/associated_receiver.h"
@@ -14,10 +15,6 @@
 #include "third_party/blink/public/mojom/shared_storage/shared_storage.mojom.h"
 #include "url/origin.h"
 
-namespace storage {
-class SharedStorageManager;
-}
-
 namespace content {
 
 class BrowserContext;
@@ -43,6 +40,8 @@
 class CONTENT_EXPORT SharedStorageWorkletHost
     : public shared_storage_worklet::mojom::SharedStorageWorkletServiceClient {
  public:
+  using BudgetResult = storage::SharedStorageManager::BudgetResult;
+
   enum class AddModuleState {
     kNotInitiated,
     kInitiated,
@@ -104,6 +103,10 @@
   void SharedStorageLength(SharedStorageLengthCallback callback) override;
   void ConsoleLog(const std::string& message) override;
 
+  const url::Origin& shared_storage_origin_for_testing() const {
+    return shared_storage_origin_;
+  }
+
  protected:
   // virtual for testing
   virtual void OnAddModuleOnWorkletFinished(
@@ -118,15 +121,22 @@
 
   virtual void OnRunURLSelectionOperationOnWorkletFinished(
       const GURL& urn_uuid,
-      bool success,
-      const std::string& error_message,
-      uint32_t index);
+      bool script_execution_succeeded,
+      const std::string& script_execution_error_message,
+      uint32_t index,
+      BudgetResult budget_result);
 
   base::OneShotTimer& GetKeepAliveTimerForTesting() {
     return keep_alive_timer_;
   }
 
  private:
+  void OnRunURLSelectionOperationOnWorkletScriptExecutionFinished(
+      const GURL& urn_uuid,
+      bool success,
+      const std::string& error_message,
+      uint32_t index);
+
   // Returns whether the the worklet has entered keep-alive phase. During
   // keep-alive: the attempt to log console messages will be ignored; and the
   // completion of the last pending operation will terminate the worklet.
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 4893e261..9655de6 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -97,6 +97,7 @@
 #include "content/browser/renderer_host/visible_time_request_trigger.h"
 #include "content/browser/screen_enumeration/screen_change_monitor.h"
 #include "content/browser/screen_orientation/screen_orientation_provider.h"
+#include "content/browser/shared_storage/shared_storage_budget_charger.h"
 #include "content/browser/site_instance_impl.h"
 #include "content/browser/starscan_load_observer.h"
 #include "content/browser/wake_lock/wake_lock_context_host.h"
@@ -977,6 +978,10 @@
     AttributionHost::CreateForWebContents(this);
   }
 
+  if (base::FeatureList::IsEnabled(blink::features::kSharedStorageAPI)) {
+    SharedStorageBudgetCharger::CreateForWebContents(this);
+  }
+
 #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && defined(PA_ALLOW_PCSCAN)
   // TODO(1231679): Remove or move to another place after finishing the PCScan
   // experiment.
diff --git a/content/public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java b/content/public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java
index 8574d767..53683b5 100644
--- a/content/public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java
@@ -9,6 +9,7 @@
 
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.base.Log;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
@@ -29,6 +30,7 @@
 // TODO(tedchoc): Remove the package restriction once this class moves to a non-public content
 //                package whose visibility will be enforced via DEPS.
 /* package */ class NavigationControllerImpl implements NavigationController {
+    private static final String TAG = "NavigationController";
 
     private long mNativeNavigationControllerAndroid;
 
@@ -231,6 +233,11 @@
     @Override
     public void setUseDesktopUserAgent(boolean override, boolean reloadOnChange) {
         if (mNativeNavigationControllerAndroid != 0) {
+            Log.i(TAG,
+                    "Thread dump for debugging, override: " + override
+                            + " reloadOnChange: " + reloadOnChange);
+            Thread.dumpStack();
+
             NavigationControllerImplJni.get().setUseDesktopUserAgent(
                     mNativeNavigationControllerAndroid, NavigationControllerImpl.this, override,
                     reloadOnChange);
diff --git a/content/public/browser/bluetooth_delegate.h b/content/public/browser/bluetooth_delegate.h
index e2796ae9..e36682f 100644
--- a/content/public/browser/bluetooth_delegate.h
+++ b/content/public/browser/bluetooth_delegate.h
@@ -53,12 +53,22 @@
     kCancelled,  // User cancelled, or agent cancelled on their behalf.
   };
 
+  // The result of the prompt when requesting confirm-only pairing.
+  enum class DevicePairConfirmPromptResult {
+    kSuccess,    // User grant permission for pairing.
+    kCancelled,  // User cancelled, or agent cancelled on their behalf.
+  };
+
   // Callback for Bluetooth device auth credential (i.e. PIN) prompt.
   // |result| is only valid when status is SUCCESS.
   using CredentialsCallback =
       base::OnceCallback<void(DeviceCredentialsPromptResult status,
                               const std::u16string& result)>;
 
+  // Callback for Bluetooth device confirm-only prompt.
+  using PairConfirmCallback =
+      base::OnceCallback<void(DevicePairConfirmPromptResult status)>;
+
   // An observer used to track permission revocation events for a particular
   // render frame host.
   class CONTENT_EXPORT FramePermissionObserver : public base::CheckedObserver {
@@ -94,6 +104,17 @@
       const std::u16string& device_identifier,
       CredentialsCallback callback) = 0;
 
+  // Prompt the user to consent to pair Bluetooth device
+  // |device_identifier| is any string the caller wants to display
+  // to the user to identify the device (MAC address, name, etc.). |callback|
+  // will be called with the prompt result. |callback| may be called immediately
+  // from this function, for example, if a pair confirm prompt for the given
+  // |frame| is already displayed.
+  virtual void ShowDevicePairConfirmPrompt(
+      RenderFrameHost* frame,
+      const std::u16string& device_identifier,
+      PairConfirmCallback callback) = 0;
+
   // This should return the WebBluetoothDeviceId that corresponds to the device
   // with |device_address| in the current |frame|. If there is not a
   // corresponding ID, then an invalid WebBluetoothDeviceId should be returned.
diff --git a/content/public/browser/render_frame_host_receiver_set.h b/content/public/browser/render_frame_host_receiver_set.h
index 6b5ce9b8..e88dd8fd 100644
--- a/content/public/browser/render_frame_host_receiver_set.h
+++ b/content/public/browser/render_frame_host_receiver_set.h
@@ -14,6 +14,7 @@
 #include "content/public/browser/web_contents_observer.h"
 #include "mojo/public/cpp/bindings/associated_receiver_set.h"
 #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
+#include "third_party/abseil-cpp/absl/base/attributes.h"
 
 namespace content {
 
@@ -67,7 +68,10 @@
     frame_to_receivers_map_[render_frame_host].push_back(id);
   }
 
-  RenderFrameHost* GetCurrentTargetFrame() {
+  // Implementations of `Interface` can call `GetCurrentTargetFrame()` to
+  // determine which frame sent the message. `GetCurrentTargetFrame()` will
+  // never return `nullptr`.
+  RenderFrameHost* GetCurrentTargetFrame() ABSL_ATTRIBUTE_RETURNS_NONNULL {
     if (current_target_frame_for_testing_)
       return current_target_frame_for_testing_;
     return receivers_.current_context();
diff --git a/content/web_test/browser/fake_bluetooth_delegate.cc b/content/web_test/browser/fake_bluetooth_delegate.cc
index 87b633d..c1b79a5 100644
--- a/content/web_test/browser/fake_bluetooth_delegate.cc
+++ b/content/web_test/browser/fake_bluetooth_delegate.cc
@@ -55,6 +55,13 @@
   std::move(callback).Run(DeviceCredentialsPromptResult::kCancelled, u"");
 }
 
+void FakeBluetoothDelegate::ShowDevicePairConfirmPrompt(
+    RenderFrameHost* frame,
+    const std::u16string& device_identifier,
+    PairConfirmCallback callback) {
+  std::move(callback).Run(DevicePairConfirmPromptResult::kCancelled);
+}
+
 WebBluetoothDeviceId FakeBluetoothDelegate::GetWebBluetoothDeviceId(
     RenderFrameHost* frame,
     const std::string& device_address) {
diff --git a/content/web_test/browser/fake_bluetooth_delegate.h b/content/web_test/browser/fake_bluetooth_delegate.h
index 0d9d046..a23b40d 100644
--- a/content/web_test/browser/fake_bluetooth_delegate.h
+++ b/content/web_test/browser/fake_bluetooth_delegate.h
@@ -53,6 +53,9 @@
   void ShowDeviceCredentialsPrompt(RenderFrameHost* frame,
                                    const std::u16string& device_identifier,
                                    CredentialsCallback callback) override;
+  void ShowDevicePairConfirmPrompt(RenderFrameHost* frame,
+                                   const std::u16string& device_identifier,
+                                   PairConfirmCallback callback) override;
   blink::WebBluetoothDeviceId GetWebBluetoothDeviceId(
       RenderFrameHost* frame,
       const std::string& device_address) override;
diff --git a/device/bluetooth/bluetooth_adapter_unittest.cc b/device/bluetooth/bluetooth_adapter_unittest.cc
index 04107af..df72dad 100644
--- a/device/bluetooth/bluetooth_adapter_unittest.cc
+++ b/device/bluetooth/bluetooth_adapter_unittest.cc
@@ -708,7 +708,8 @@
 }
 
 // TODO(scheib): Enable BluetoothTest fixture tests on all platforms.
-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
+// Flaky on Mac. See crbug.com/1334462
+#if BUILDFLAG(IS_ANDROID)
 #define MAYBE_ConstructDefaultAdapter ConstructDefaultAdapter
 #else
 #define MAYBE_ConstructDefaultAdapter DISABLED_ConstructDefaultAdapter
diff --git a/extensions/browser/updater/extension_downloader.cc b/extensions/browser/updater/extension_downloader.cc
index 04fc0f7..542137d 100644
--- a/extensions/browser/updater/extension_downloader.cc
+++ b/extensions/browser/updater/extension_downloader.cc
@@ -649,15 +649,17 @@
     // have expected version and expected hash. Thus, passing empty hash and
     // version would not be a problem as we only check for the expected hash and
     // version if we have them.
-    auto extension_fetch_data(std::make_unique<ExtensionFetch>(
-        task.id, fetch_data->base_url(), /*hash not fetched*/ "",
-        /*version not fetched*/ "", fetch_data->request_ids(),
-        fetch_data->fetch_priority()));
-    absl::optional<base::FilePath> cached_crx_path = GetCachedExtension(
-        *extension_fetch_data, /*manifest_fetch_failed*/ true);
+    absl::optional<base::FilePath> cached_crx_path =
+        GetCachedExtension(task.id, /*hash not fetched*/ "",
+                           /*version not fetched*/ base::Version(),
+                           /*manifest_fetch_failed*/ true);
     if (cached_crx_path) {
       delegate_->OnExtensionDownloadStageChanged(
           task.id, ExtensionDownloaderDelegate::Stage::FINISHED);
+      auto extension_fetch_data(std::make_unique<ExtensionFetch>(
+          task.id, fetch_data->base_url(), /*hash not fetched*/ "",
+          /*version not fetched*/ "", fetch_data->request_ids(),
+          fetch_data->fetch_priority()));
       NotifyDelegateDownloadFinished(std::move(extension_fetch_data), true,
                                      cached_crx_path.value(), false);
       extensions_fetched_from_cache.insert(task.id);
@@ -1018,44 +1020,42 @@
 }
 
 absl::optional<base::FilePath> ExtensionDownloader::GetCachedExtension(
-    const ExtensionFetch& fetch_data,
+    const ExtensionId& id,
+    const std::string& package_hash,
+    const base::Version& expected_version,
     bool manifest_fetch_failed) {
   if (!extension_cache_) {
     delegate_->OnExtensionDownloadCacheStatusRetrieved(
-        fetch_data.id,
-        ExtensionDownloaderDelegate::CacheStatus::CACHE_DISABLED);
+        id, ExtensionDownloaderDelegate::CacheStatus::CACHE_DISABLED);
     return absl::nullopt;
   }
 
   std::string version;
-  if (!extension_cache_->GetExtension(fetch_data.id, fetch_data.package_hash,
-                                      nullptr, &version)) {
+  if (!extension_cache_->GetExtension(id, package_hash, nullptr, &version)) {
     delegate_->OnExtensionDownloadCacheStatusRetrieved(
-        fetch_data.id, ExtensionDownloaderDelegate::CacheStatus::CACHE_MISS);
+        id, ExtensionDownloaderDelegate::CacheStatus::CACHE_MISS);
     return absl::nullopt;
   }
   // If manifest fetch is failed, we need not verify the version of the cache as
   // we will try to install the version present in the cache.
-  if (!manifest_fetch_failed && fetch_data.version != base::Version(version)) {
+  if (!manifest_fetch_failed && expected_version != base::Version(version)) {
     delegate_->OnExtensionDownloadCacheStatusRetrieved(
-        fetch_data.id,
-        ExtensionDownloaderDelegate::CacheStatus::CACHE_OUTDATED);
+        id, ExtensionDownloaderDelegate::CacheStatus::CACHE_OUTDATED);
     return absl::nullopt;
   }
 
   delegate_->OnExtensionDownloadCacheStatusRetrieved(
-      fetch_data.id, manifest_fetch_failed
-                         ? ExtensionDownloaderDelegate::CacheStatus::
-                               CACHE_HIT_ON_MANIFEST_FETCH_FAILURE
-                         : ExtensionDownloaderDelegate::CacheStatus::CACHE_HIT);
+      id, manifest_fetch_failed
+              ? ExtensionDownloaderDelegate::CacheStatus::
+                    CACHE_HIT_ON_MANIFEST_FETCH_FAILURE
+              : ExtensionDownloaderDelegate::CacheStatus::CACHE_HIT);
 
   base::FilePath crx_path;
   // Now get .crx file path.
   // TODO(https://crbug.com/1018271#c2) This has a  side-effect in extension
   // cache implementation: extension in the cache will be marked as recently
   // used.
-  extension_cache_->GetExtension(fetch_data.id, fetch_data.package_hash,
-                                 &crx_path, &version);
+  extension_cache_->GetExtension(id, package_hash, &crx_path, &version);
   return std::move(crx_path);
 }
 
@@ -1105,7 +1105,8 @@
     return;
   }
   absl::optional<base::FilePath> cached_crx_path =
-      GetCachedExtension(*fetch_data, /*manifest_fetch_failed*/ false);
+      GetCachedExtension(fetch_data->id, fetch_data->package_hash,
+                         fetch_data->version, /*manifest_fetch_failed*/ false);
   if (cached_crx_path) {
     delegate_->OnExtensionDownloadStageChanged(
         fetch_data->id, ExtensionDownloaderDelegate::Stage::FINISHED);
diff --git a/extensions/browser/updater/extension_downloader.h b/extensions/browser/updater/extension_downloader.h
index 0540c9bc..b77c260 100644
--- a/extensions/browser/updater/extension_downloader.h
+++ b/extensions/browser/updater/extension_downloader.h
@@ -304,7 +304,9 @@
   // whether the lookup in cache is performed after the manifest is fetched or
   // due to failure while fetching or parsing manifest.
   absl::optional<base::FilePath> GetCachedExtension(
-      const ExtensionFetch& fetch_data,
+      const ExtensionId& id,
+      const std::string& package_hash,
+      const base::Version& expected_version,
       bool manifest_fetch_failed);
 
   // Begins (or queues up) download of an updated extension. |info| represents
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 1502597..0915d8d 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1528,6 +1528,9 @@
 
 Handoff must also be enabled in the General section of Settings, and your devices must use the same iCloud account.
       </message>
+      <message name="IDS_IOS_OPTIONS_ENABLE_INCOGNITO_INTERSTITIAL" desc="Title for the option to enable the Incognito interstitial, which lets users open links from other apps in Incognito. [iOS only]">
+        Ask to Open Links from Other Apps in Incognito
+      </message>
       <message name="IDS_IOS_OPTIONS_GENERAL_TAB_LABEL" desc="The title of the Basics section of the Settings page. [iOS only]" meaning="The title of the Basics section of the Settings page.">
         Basics
       </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OPTIONS_ENABLE_INCOGNITO_INTERSTITIAL.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OPTIONS_ENABLE_INCOGNITO_INTERSTITIAL.png.sha1
new file mode 100644
index 0000000..558846b
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OPTIONS_ENABLE_INCOGNITO_INTERSTITIAL.png.sha1
@@ -0,0 +1 @@
+4d96ff6647d399d1f124491a46a7eba5edbf14c4
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb
index bc74737..cd999c5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">የእርስዎ አሳሽ ይተዳደራል። <ph name="BEGIN_LINK" />ዝርዝሮች<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">የይለፍ ቃል ደብቅ</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> ንጥሎች</translation>
+<translation id="1450170672351507823">መደበኛ ጥበቃ በርቷል። ከዚህም ለሚበልጥ ደህንነት የላቀ ጥበቃን ይጠቀሙ።</translation>
 <translation id="149095475893949513">ይህ ድር ጣቢያ የውቅረት መገለጫ ለማውረድ እየሞከረ ነው።</translation>
 <translation id="1491277525950327607">ቅንብርን ለመቀያየር ሁለቴ መታ ያድርጉ</translation>
 <translation id="1492417797159476138">ይህንን የተጠቃሚ ስም ለዚህ ጣቢያ ቀድሞውኑ አስቀምጠዋል</translation>
@@ -738,6 +739,7 @@
 <translation id="7099761977003084116">የቅርብ ጊዜ ትሮች</translation>
 <translation id="7102005569666697658">በማውረድ ላይ… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">ደብቅ</translation>
+<translation id="7108762695052995889">ጣቢያ ይጎብኙ</translation>
 <translation id="7133798577887235672">ሙሉ ስም</translation>
 <translation id="7136892417564438900">ካሜራ አይገኝም</translation>
 <translation id="7153999225810839758">የ<ph name="TIME" /> ደቂቃ ንባብ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index 2e2891cc..e353f71 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">تتم إدارة متصفّحك. <ph name="BEGIN_LINK" />التفاصيل<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">إخفاء كلمة المرور</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> من العناصر</translation>
+<translation id="1450170672351507823">الحماية العادية مفعَّلة. لزيادة مستوى الأمان، يمكنك استخدام "الحماية المُحسَّنة".</translation>
 <translation id="149095475893949513">يحاول هذا الموقع الإلكتروني تنزيل ملف شخصي يتضمّن إعدادات.</translation>
 <translation id="1491277525950327607">انقر مرّتين لتبديل الإعداد</translation>
 <translation id="1492417797159476138">سبق لك حفظ اسم المستخدم لهذا الموقع الإلكتروني.</translation>
@@ -740,6 +741,7 @@
 <translation id="7099761977003084116">علامات التبويب الأخيرة</translation>
 <translation id="7102005569666697658">جارٍ تنزيل… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">إخفاء</translation>
+<translation id="7108762695052995889">زيارة الموقع الإلكتروني</translation>
 <translation id="7133798577887235672">الاسم بالكامل</translation>
 <translation id="7136892417564438900">الكاميرا غير متاحة</translation>
 <translation id="7153999225810839758">تستغرق القراءة <ph name="TIME" /> دقيقة.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb
index a7edfd0..049a1f03 100644
--- a/ios/chrome/app/strings/resources/ios_strings_as.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -741,6 +741,7 @@
 <translation id="7099761977003084116">শেহতীয়া টেব</translation>
 <translation id="7102005569666697658">ডাউনল’ড কৰি থকা হৈছে… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">লুকুৱাওক</translation>
+<translation id="7108762695052995889">ছাইটটোলৈ যাওক</translation>
 <translation id="7133798577887235672">সম্পূৰ্ণ নাম</translation>
 <translation id="7136892417564438900">কেমেৰা উপলব্ধ নহয়</translation>
 <translation id="7153999225810839758">পঢ়িবলৈ আনুমানিক <ph name="TIME" /> মিনিট লাগে</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb
index 3b305b6c..4e234dd3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_az.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -163,6 +163,7 @@
 <translation id="236977714248711277">Saytlar baxış təcrübənizi yaxşılaşdırmaq üçün, məsələn, sizi daxil olmuş vəziyyətdə saxlamaq və ya alış-veriş səbətindəki elementləri yadda saxlamaq üçün kukilərdən istifadə edə bilmir.
 
 Saytlar müxtəlif saytlarda baxış fəaliyyətinizi görmək üçün kukilərinizdən istifadə edə bilmir (məsələn, reklamları fərdiləşdirmək üçün).</translation>
+<translation id="2375243552872247702">Sizin üçün məzmuna baxın</translation>
 <translation id="2381405137052800939">Əsaslar</translation>
 <translation id="2386793615875593361">1 ədəd seçildi</translation>
 <translation id="2421004566762153674">Üçüncü tərəf kukilərinin bloklanması</translation>
@@ -602,6 +603,7 @@
 <translation id="6136914049981179737">Saniyələr əvvəl</translation>
 <translation id="6144589619057374135">${url} keçidini Anonim rejimdə açın</translation>
 <translation id="6149061208933997199">Parol istifadə edin</translation>
+<translation id="6152406514676263192">Maraqlarınıza əsaslanan ən uyğun məzmun üçün sinxronizasiya edin.</translation>
 <translation id="6159839020698489198">istəyə görə</translation>
 <translation id="6177442314419606057">Chrome'da axtarın</translation>
 <translation id="6184086493125982861">Panelləri Göstərin</translation>
@@ -739,6 +741,7 @@
 <translation id="7099761977003084116">Ən Son İstifadə Olunan Tablar</translation>
 <translation id="7102005569666697658">Endirilir… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">Gizlədin</translation>
+<translation id="7108762695052995889">Sayta daxil olun</translation>
 <translation id="7133798577887235672">Tam Ad</translation>
 <translation id="7136892417564438900">Kamera əlçatan deyil</translation>
 <translation id="7153999225810839758">Oxumaq üçün <ph name="TIME" /> dəqiqə lazımdır</translation>
@@ -749,6 +752,7 @@
 <translation id="7189598951263744875">Paylaşın...</translation>
 <translation id="7192050974311852563">Qeydiyyata Başlayın</translation>
 <translation id="7203585745079012652">Geri Cavab</translation>
+<translation id="7207023858769244910">Maraqlarınıza əsaslanan məzmun əldə etmək üçün sinxronizasiya edin.</translation>
 <translation id="7207383424303353046">Yeni: Defolt Brauzer tətbiqiniz etməklə, saytları Chrome'da avtomatik açın. <ph name="BEGIN_LINK" />Ayarları açın<ph name="END_LINK" /></translation>
 <translation id="721597782417389033">Yanlış Kart Ləqəbi</translation>
 <translation id="722454870747268814">Yeni Gizli Panel</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
index 141a30b..b47c1f18 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -163,6 +163,7 @@
 <translation id="236977714248711277">Web lokacije ne mogu koristiti kolačiće da poboljšaju vaše iskustvo pregledanja, naprimjer, da ostanete prijavljeni ili da stavke u kolicima za kupovinu ostanu sačuvane.
 
 Web lokacije ne mogu koristiti kolačiće da vide vašu aktivnost pregledanja na različitim web lokacijama, naprimjer, radi personaliziranja oglasa.</translation>
+<translation id="2375243552872247702">Pogledajte sadržaj za vas</translation>
 <translation id="2381405137052800939">Osnove</translation>
 <translation id="2386793615875593361">1 odabrana</translation>
 <translation id="2421004566762153674">Blokiranje kolačića treće strane</translation>
@@ -602,6 +603,7 @@
 <translation id="6136914049981179737">Prije nekoliko sekundi</translation>
 <translation id="6144589619057374135">Otvorite ${url} u anonimnom načinu rada</translation>
 <translation id="6149061208933997199">Upotrijebi zaporku</translation>
+<translation id="6152406514676263192">Omogućite sinkronizaciju da biste dobivali najrelevantniji sadržaj na temelju svojih interesa.</translation>
 <translation id="6159839020698489198">nije obavezno</translation>
 <translation id="6177442314419606057">Pretražite u Chromeu</translation>
 <translation id="6184086493125982861">Prikaz kartica</translation>
@@ -750,6 +752,7 @@
 <translation id="7189598951263744875">Dijeli...</translation>
 <translation id="7192050974311852563">Pokreni zapisivanje</translation>
 <translation id="7203585745079012652">Izgovori odgovore</translation>
+<translation id="7207023858769244910">Omogućite sinkronizaciju da biste dobivali sadržaj na temelju svojih interesa.</translation>
 <translation id="7207383424303353046">Novo: Postavite Chrome kao zadanu aplikaciju preglednika i automatski u njemu otvarajte web lokacije. <ph name="BEGIN_LINK" />Otvori Postavke<ph name="END_LINK" /></translation>
 <translation id="721597782417389033">Nevažeći nadimak kartice</translation>
 <translation id="722454870747268814">Nova anonimna kartica</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
index e28a5e1..8da53ee9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -739,6 +739,7 @@
 <translation id="7099761977003084116">Pestanyes recents</translation>
 <translation id="7102005569666697658">S'està baixant… (<ph name="FILE_SIZE" />)</translation>
 <translation id="7108338896283013870">Amaga</translation>
+<translation id="7108762695052995889">Visita el lloc web</translation>
 <translation id="7133798577887235672">Nom complet</translation>
 <translation id="7136892417564438900">La càmera no està disponible</translation>
 <translation id="7153999225810839758">Temps de lectura: <ph name="TIME" /> min</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index 6cfe6e8..6714588b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -738,6 +738,7 @@
 <translation id="7099761977003084116">Seneste faner</translation>
 <translation id="7102005569666697658">Downloader… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">Skjul</translation>
+<translation id="7108762695052995889">Besøg website</translation>
 <translation id="7133798577887235672">Fulde navn</translation>
 <translation id="7136892417564438900">Kameraet er ikke tilgængeligt</translation>
 <translation id="7153999225810839758"><ph name="TIME" /> min. læsning</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
index ec66f126..6748e29f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -406,6 +406,7 @@
 <translation id="4502566650163919158">Check now</translation>
 <translation id="4505980578794259603">Last checked <ph name="TIME" />.</translation>
 <translation id="4508750114462689118">Close sign-in promo</translation>
+<translation id="4511669830082467224">Search image with Google</translation>
 <translation id="4526249700380860531">View and manage saved passwords at <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="452750746583162491">Review your synced data</translation>
 <translation id="4536418791685807335">Try signing in again.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb
index 07412c1..b58f78e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">Tu navegador está administrado. <ph name="BEGIN_LINK" />Detalles<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">Ocultar contraseña</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> elementos</translation>
+<translation id="1450170672351507823">La protección estándar está activada. Para tener aún más seguridad, usa la protección mejorada.</translation>
 <translation id="149095475893949513">Este sitio web está intentando descargar un perfil de configuración.</translation>
 <translation id="1491277525950327607">Toca dos veces para activar o desactivar esta opción</translation>
 <translation id="1492417797159476138">Ya has guardado ese nombre de usuario en este sitio web</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index 64a9134..6009cfe 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">Teie brauserit hallatakse. <ph name="BEGIN_LINK" />Üksikasjad<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">Peida parool</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> üksust</translation>
+<translation id="1450170672351507823">Tavakaitse on sisse lülitatud. Turvalisuse suurendamiseks kasutage täiustatud kaitset.</translation>
 <translation id="149095475893949513">See veebisait üritab alla laadida seadistusprofiili.</translation>
 <translation id="1491277525950327607">Seade vahetamiseks topeltpuudutage</translation>
 <translation id="1492417797159476138">Olete selle kasutajanime selle saidi jaoks juba salvestanud</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
index cfa4f2a..9063dc3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">Arakatzailea kudeatuta dago. <ph name="BEGIN_LINK" />Xehetasunak<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">Ezkutatu pasahitza</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> elementu</translation>
+<translation id="1450170672351507823">Babes estandarra dago aktibatuta. Segurtasuna areagotzeko, erabili babes hobetua.</translation>
 <translation id="149095475893949513">Webgunea konfigurazio-profil bat deskargatu nahian dabil.</translation>
 <translation id="1491277525950327607">Sakatu birritan ezarpena aldatzeko</translation>
 <translation id="1492417797159476138">Dagoeneko gorde duzu erabiltzaile-izen hau webgune honetarako</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
index df118ff..dbeac98 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -739,6 +739,7 @@
 <translation id="7099761977003084116">برگه‌های اخیر</translation>
 <translation id="7102005569666697658">درحال بارگیری… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">عدم نمایش</translation>
+<translation id="7108762695052995889">مشاهده سایت</translation>
 <translation id="7133798577887235672">نام کامل</translation>
 <translation id="7136892417564438900">دوربین غیرقابل‌ دسترسی است</translation>
 <translation id="7153999225810839758"><ph name="TIME" /> دقیقه زمان خواندن</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
index 4777ac9..f80a6c6e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -163,6 +163,7 @@
 <translation id="236977714248711277">Hindi puwedeng gumamit ng cookies ang mga site para pahusayin ang iyong karanasan sa pag-browse, halimbawa, para mapanatili kang naka-sign in o para maalala ang mga item sa shopping cart mo.
 
 Hindi magagamit ng mga site ang cookies para makita ang iyong aktibidad sa pag-browse sa iba't ibang site, halimbawa, para mag-personalize ng mga ad.</translation>
+<translation id="2375243552872247702">Makakita ng Content na Para sa Iyo</translation>
 <translation id="2381405137052800939">Mga Pangunahing Kaalaman</translation>
 <translation id="2386793615875593361">1 ang napili</translation>
 <translation id="2421004566762153674">Pag-block sa third-party na cookies</translation>
@@ -602,6 +603,7 @@
 <translation id="6136914049981179737">Segundo</translation>
 <translation id="6144589619057374135">Buksan ang ${url} sa Incognito</translation>
 <translation id="6149061208933997199">Gamitin ang Password</translation>
+<translation id="6152406514676263192">Mag-sync para sa pinakanauugnay na content batay sa iyong mga interes.</translation>
 <translation id="6159839020698489198">opsyonal</translation>
 <translation id="6177442314419606057">Search in Chrome</translation>
 <translation id="6184086493125982861">Ipakita ang Mga Tab</translation>
@@ -750,6 +752,7 @@
 <translation id="7189598951263744875">Ibahagi...</translation>
 <translation id="7192050974311852563">Simulan ang Pag-log</translation>
 <translation id="7203585745079012652">Bigkasin ang Mga Sagot</translation>
+<translation id="7207023858769244910">Mag-sync para makakuha ng content batay sa iyong mga interes.</translation>
 <translation id="7207383424303353046">Bago: Awtomatikong buksan ang mga site sa Chrome sa pamamagitan ng paggawa ritong Default na Browser App mo. <ph name="BEGIN_LINK" />Buksan ang Mga Setting<ph name="END_LINK" /></translation>
 <translation id="721597782417389033">Invalid ang Nickname ng Card</translation>
 <translation id="722454870747268814">Bagong Tab na Incognito</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
index d2b57ca..d4f91060 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -739,6 +739,7 @@
 <translation id="7099761977003084116">તાજેતરનાં ટૅબ</translation>
 <translation id="7102005569666697658">ડાઉનલોડ કરી રહ્યાં છીએ… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">છુપાવો</translation>
+<translation id="7108762695052995889">સાઇટની મુલાકાત લો</translation>
 <translation id="7133798577887235672">આખું નામ</translation>
 <translation id="7136892417564438900">કૅમેરા અનુપલબ્ધ છે</translation>
 <translation id="7153999225810839758">વાંચવા માટે <ph name="TIME" /> મિનિટ લાગશે</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
index 91f51f33..7be69dd 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -163,6 +163,7 @@
 <translation id="236977714248711277">साइटें आपके ब्राउज़ करने के अनुभव को बेहतर बनाने के लिए, कुकी इस्तेमाल नहीं कर सकतीं. जैसे कि आपको साइन इन बनाए रखने के लिए या आपने शॉपिंग कार्ट में जो आइटम सेव किए हैं उन्हें याद रखने के लिए.
 
 साइटें, अलग-अलग साइटों पर की गई आपकी ब्राउज़िंग गतिविधि देखने के लिए, कुकी इस्तेमाल नहीं कर सकतीं. जैसे कि दर्शकों की पसंद को ध्यान में रखकर विज्ञापन दिखाने के लिए.</translation>
+<translation id="2375243552872247702">अपने काम का कॉन्टेंट देखें</translation>
 <translation id="2381405137052800939">मूलभूत बातें</translation>
 <translation id="2386793615875593361">1 चयनित</translation>
 <translation id="2421004566762153674">तीसरे पक्ष की कुकी ब्लॉक की जा रही हैं</translation>
@@ -602,6 +603,7 @@
 <translation id="6136914049981179737">कुछ सेकंड पहले</translation>
 <translation id="6144589619057374135">${url} गुप्त मोड में खोलें</translation>
 <translation id="6149061208933997199">पासवर्ड का उपयोग करें</translation>
+<translation id="6152406514676263192">अपनी पसंद के हिसाब से, सबसे काम का कॉन्टेंट देखने के लिए सिंक करें.</translation>
 <translation id="6159839020698489198">ज़रूरी नहीं</translation>
 <translation id="6177442314419606057">Chrome में खोजें</translation>
 <translation id="6184086493125982861">टैब दिखाएं</translation>
@@ -749,6 +751,7 @@
 <translation id="7189598951263744875">शेयर करें...</translation>
 <translation id="7192050974311852563">लॉग करना शुरू करें</translation>
 <translation id="7203585745079012652">उत्तर फिर से बोलें</translation>
+<translation id="7207023858769244910">अपनी पसंद के हिसाब से कॉन्टेंट पाने के लिए सिंक करें.</translation>
 <translation id="7207383424303353046">नई सुविधा: Chrome को अपने डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन के रूप में सेट करके, साइटों को अपने-आप खोलें. <ph name="BEGIN_LINK" />सेटिंग खोलें<ph name="END_LINK" /></translation>
 <translation id="721597782417389033">कार्ड का प्रचलित नाम अमान्य है</translation>
 <translation id="722454870747268814">नया गुप्त टैब</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
index f5d6a16..0390ed6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -163,6 +163,7 @@
 <translation id="236977714248711277">Web-lokacije ne mogu upotrebljavati kolačiće za poboljšanje vašeg doživljaja pregledavanja, primjerice da biste ostali prijavljeni ili da bi stavke u vašoj košarici ostale zapamćene.
 
 Web-lokacije ne mogu upotrebljavati kolačiće za uvid u vašu aktivnost pregledavanja, primjerice radi prilagođavanja oglasa.</translation>
+<translation id="2375243552872247702">Pogledajte sadržaj za vas</translation>
 <translation id="2381405137052800939">Osnove</translation>
 <translation id="2386793615875593361">1 odabrana</translation>
 <translation id="2421004566762153674">Blokiranje kolačića trećih strana</translation>
@@ -602,6 +603,7 @@
 <translation id="6136914049981179737">Prije nekoliko sek.</translation>
 <translation id="6144589619057374135">Otvorite ${url} u anonimnom načinu</translation>
 <translation id="6149061208933997199">Upotrijebi zaporku</translation>
+<translation id="6152406514676263192">Omogućite sinkronizaciju da biste dobivali najrelevantniji sadržaj na temelju svojih interesa.</translation>
 <translation id="6159839020698489198">nije obavezno</translation>
 <translation id="6177442314419606057">Pretraživanje u Chromeu</translation>
 <translation id="6184086493125982861">Prikaz kartica</translation>
@@ -750,6 +752,7 @@
 <translation id="7189598951263744875">Dijeli...</translation>
 <translation id="7192050974311852563">Započni zapisivanje</translation>
 <translation id="7203585745079012652">Izgovaranje odgovora</translation>
+<translation id="7207023858769244910">Omogućite sinkronizaciju da biste dobivali sadržaj na temelju svojih interesa.</translation>
 <translation id="7207383424303353046">Novo: automatski otvorite web-lokacije u Chromeu tako što ćete ga postaviti kao zadanu aplikaciju preglednika. <ph name="BEGIN_LINK" />Otvorite Postavke<ph name="END_LINK" /></translation>
 <translation id="721597782417389033">Nadimak kartice nije važeći</translation>
 <translation id="722454870747268814">Nova anonimna kartica</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
index 442e716..3eb1540 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">A böngésző felügyelet alatt áll. <ph name="BEGIN_LINK" />Részletek<ph name="END_LINK" />.</translation>
 <translation id="1449835205994625556">Jelszó elrejtése</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> elem</translation>
+<translation id="1450170672351507823">A Normál védelem be van kapcsolva. A még nagyobb biztonság érdekében használjon Speciális védelmet.</translation>
 <translation id="149095475893949513">Ez a webhely konfigurációs profilt próbál letölteni.</translation>
 <translation id="1491277525950327607">A beállítás módosításához koppintson duplán</translation>
 <translation id="1492417797159476138">Már elmentette ezt a felhasználónevet ehhez a webhelyhez</translation>
@@ -738,6 +739,7 @@
 <translation id="7099761977003084116">Nemrég megnyitott lapok</translation>
 <translation id="7102005569666697658">Letöltés… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">Elrejtés</translation>
+<translation id="7108762695052995889">Webhely felkeresése</translation>
 <translation id="7133798577887235672">Teljes név</translation>
 <translation id="7136892417564438900">A kamera nem áll rendelkezésre</translation>
 <translation id="7153999225810839758"><ph name="TIME" /> percnyi olvasás</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index be546cab..d222c6d3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">Browser Anda dikelola. <ph name="BEGIN_LINK" />Detail<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">Sembunyikan Sandi</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> item</translation>
+<translation id="1450170672351507823">Perlindungan standar aktif. Untuk keamanan yang lebih baik, gunakan Perlindungan yang ditingkatkan.</translation>
 <translation id="149095475893949513">Situs ini mencoba mendownload profil konfigurasi.</translation>
 <translation id="1491277525950327607">Ketuk dua kali untuk beralih setelan</translation>
 <translation id="1492417797159476138">Anda telah menyimpan nama pengguna ini untuk situs ini</translation>
@@ -738,6 +739,7 @@
 <translation id="7099761977003084116">Tab Terbaru</translation>
 <translation id="7102005569666697658">Mendownload… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">Sembunyikan</translation>
+<translation id="7108762695052995889">Buka Situs</translation>
 <translation id="7133798577887235672">Nama Lengkap</translation>
 <translation id="7136892417564438900">Kamera tidak tersedia</translation>
 <translation id="7153999225810839758">Waktu baca <ph name="TIME" /> menit</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb
index e749dba..a9f95e76 100644
--- a/ios/chrome/app/strings/resources/ios_strings_is.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">Vafranum þínum er stjórnað. <ph name="BEGIN_LINK" />Nánar<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">Fela aðgangsorð</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> atriði</translation>
+<translation id="1450170672351507823">Kveikt er á hefðbundinni vörn. Þú getur aukið öryggið með því að nota aukna vörn.</translation>
 <translation id="149095475893949513">Þetta vefsvæði er að reyna að sækja stillingasnið.</translation>
 <translation id="1491277525950327607">Ýttu tvisvar til að breyta stillingum</translation>
 <translation id="1492417797159476138">Þú varst þegar búin(n) að vista þetta notandanafn fyrir vefsvæðið</translation>
@@ -738,6 +739,7 @@
 <translation id="7099761977003084116">Nýlegir flipar</translation>
 <translation id="7102005569666697658">Sækir… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">Fela</translation>
+<translation id="7108762695052995889">Fara á vefsvæði</translation>
 <translation id="7133798577887235672">Fullt nafn</translation>
 <translation id="7136892417564438900">Myndavélin er ekki tiltæk</translation>
 <translation id="7153999225810839758"><ph name="TIME" /> mínútu/mínútna lestur</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb
index ab9250aa..b15ed66 100644
--- a/ios/chrome/app/strings/resources/ios_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">Il tuo browser è gestito. <ph name="BEGIN_LINK" />Dettagli<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">Nascondi password</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> elementi</translation>
+<translation id="1450170672351507823">È attiva la protezione standard. Per una maggiore sicurezza, utilizza la Protezione avanzata.</translation>
 <translation id="149095475893949513">Questo sito web sta cercando di scaricare un profilo di configurazione.</translation>
 <translation id="1491277525950327607">Tocca due volte per attivare/disattivare l'impostazione</translation>
 <translation id="1492417797159476138">Hai già salvato questo nome utente per questo sito</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
index 82cc1e30..edc69b5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -739,6 +739,7 @@
 <translation id="7099761977003084116">最近使ったタブ</translation>
 <translation id="7102005569666697658">ダウンロードしています… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">非表示</translation>
+<translation id="7108762695052995889">サイトを見る</translation>
 <translation id="7133798577887235672">氏名</translation>
 <translation id="7136892417564438900">カメラを使用できません</translation>
 <translation id="7153999225810839758">所要時間: <ph name="TIME" /> 分</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
index 71195568..43f1f7f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">Браузеріңіз басқарылады. <ph name="BEGIN_LINK" />Мәліметтер<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">Құпия сөзді жасыру</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> элемент</translation>
+<translation id="1450170672351507823">Стандартты қорғаныс қосулы. Қауіпсіздікті жақсарту үшін күшейтілген қорғанысты пайдаланыңыз.</translation>
 <translation id="149095475893949513">Бұл веб-сайт конфигурация профилін жүктеп алмақшы.</translation>
 <translation id="1491277525950327607">Параметрді ауыстыру үшін екі рет түртіңіз</translation>
 <translation id="1492417797159476138">Бұл сайт үшін осы пайдаланушы аты сақтап қойылған.</translation>
@@ -350,7 +351,7 @@
 <translation id="3967822245660637423">Жүктеп алынды</translation>
 <translation id="3968505803272650567">Қызығушылықтарды басқару</translation>
 <translation id="3989635538409502728">Шығу</translation>
-<translation id="3995521777587992544">Беттің жүктелу барысын көрсететін жолақ, <ph name="EMAIL" /> жүктелді.</translation>
+<translation id="3995521777587992544">Бетті жүктеудің орындалу жолағы, <ph name="EMAIL" /> жүктелді.</translation>
 <translation id="4002066346123236978">Тақырып</translation>
 <translation id="4004204301268239848">Құпия сөздер Google аккаунтыңызда сақталады және оларды кез келген құрылғыда пайдалана аласыз.</translation>
 <translation id="4006921758705478413">Құрылғыларға жіберу</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb
index 460f90f..e1af995 100644
--- a/ios/chrome/app/strings/resources/ios_strings_km.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -163,6 +163,7 @@
 <translation id="236977714248711277">គេហទំព័រ​មិនអាច​ប្រើ​ខូគី ដើម្បី​កែលម្អ​បទពិសោធន៍​រុករក​របស់អ្នក ឧទាហរណ៍ ដើម្បីឱ្យអ្នក​បន្តចូលគណនី ឬ​ចងចាំ​ទំនិញ​នៅក្នុង​រទេះ​ទិញទំនិញ​របស់អ្នក​បានទេ​។
 
 គេហទំព័រមិន​អាចប្រើ​ខូគី ដើម្បីមើលសកម្មភាព​រុករក​តាមអ៊ីនធឺណិត​របស់អ្នក​នៅលើ​គេហទំព័រ​ផ្សេងៗ ឧទាហរណ៍ ដើម្បីកំណត់​ការផ្សាយ​ពាណិជ្ជកម្ម​ឱ្យ​ស្របនឹងអ្នកបានទេ​។</translation>
+<translation id="2375243552872247702">មើល​ឃើញ​ខ្លឹមសារ​សម្រាប់​អ្នក</translation>
 <translation id="2381405137052800939">មូលដ្ឋាន</translation>
 <translation id="2386793615875593361">បានជ្រើសរើស 1</translation>
 <translation id="2421004566762153674">ទប់ស្កាត់​ខូគី​ភាគី​ទីបី</translation>
@@ -602,6 +603,7 @@
 <translation id="6136914049981179737">វិនាទីមុន</translation>
 <translation id="6144589619057374135">បើក ${url} នៅក្នុង​មុខងារឯកជន</translation>
 <translation id="6149061208933997199">ប្រើពាក្យសម្ងាត់</translation>
+<translation id="6152406514676263192">ធ្វើសមកាលកម្ម​ខ្លឹមសារ​ដែលពាក់ព័ន្ធ​បំផុត ដោយផ្អែកលើ​ចំណាប់អារម្មណ៍​របស់អ្នក។</translation>
 <translation id="6159839020698489198">មិនតម្រូវ</translation>
 <translation id="6177442314419606057">ការស្វែងរកនៅក្នុង Chrome</translation>
 <translation id="6184086493125982861">បង្ហាញផ្ទាំង</translation>
@@ -750,6 +752,7 @@
 <translation id="7189598951263744875">ចែករំលែក…</translation>
 <translation id="7192050974311852563">ចាប់ផ្ដើម​ការធ្វើកំណត់ហេតុ</translation>
 <translation id="7203585745079012652">ឆ្លើយតបទៅវិញ</translation>
+<translation id="7207023858769244910">ធ្វើសមកាលកម្ម ដើម្បី​យក​ខ្លឹមសារដោយផ្អែកលើ​ចំណាប់អារម្មណ៍​របស់អ្នក។</translation>
 <translation id="7207383424303353046">ថ្មី៖ បើកគេហទំព័រ​នៅក្នុង Chrome ដោយស្វ័យប្រវត្តិ​ដោយធ្វើឱ្យ Chrome ក្លាយជា​កម្មវិធីរុករកតាម​អ៊ីនធឺណិតលំនាំដើម​របស់អ្នក។ <ph name="BEGIN_LINK" />បើក​ការកំណត់<ph name="END_LINK" /></translation>
 <translation id="721597782417389033">ឈ្មោះហៅក្រៅរបស់​កាតមិនត្រឹមត្រូវ</translation>
 <translation id="722454870747268814">ផ្ទាំងអនាមិកថ្មី</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
index 0a420916..54979fb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -163,6 +163,7 @@
 <translation id="236977714248711277">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಅನುಭವವನ್ನು ಸುಧಾರಿಸಲು, ಉದಾಹರಣೆಗೆ, ನಿಮ್ಮನ್ನು ಸೈನ್ ಇನ್ ಆಗಿರಿಸಲು ಅಥವಾ ನಿಮ್ಮ ಶಾಪಿಂಗ್ ಕಾರ್ಟ್‌ನಲ್ಲಿರುವ ಐಟಂಗಳನ್ನು ನೆನಪಿಟ್ಟುಕೊಳ್ಳಲು ಕುಕೀಗಳನ್ನು ಬಳಸಲು, ಸೈಟ್‌ಗಳಿಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.
 
 ವಿವಿಧ ಸೈಟ್‌ಗಳಾದ್ಯಂತ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನೋಡಲು, ಉದಾಹರಣೆಗೆ ಜಾಹೀರಾತುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸುವುದಕ್ಕಾಗಿ, ಕುಕೀಗಳನ್ನು ಬಳಸಲು ಸೈಟ್‌ಗಳಿಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.</translation>
+<translation id="2375243552872247702">ನಿಮಗಾಗಿ ಆರಿಸಿರುವ ವಿಷಯವನ್ನು ನೋಡಿ</translation>
 <translation id="2381405137052800939">ಪ್ರಾಥಮಿಕ ಸಂಗತಿಗಳು</translation>
 <translation id="2386793615875593361">1 ಆಯ್ಕೆಮಾಡಿದೆ</translation>
 <translation id="2421004566762153674">ಥರ್ಡ್-ಪಾರ್ಟಿ ಕುಕೀಗಳನ್ನು ನಿರ್ಬಂಧಿಸುವುದು</translation>
@@ -602,6 +603,7 @@
 <translation id="6136914049981179737">ಸೆಕೆಂಡ್ ಹಿಂದೆ</translation>
 <translation id="6144589619057374135">${url} ಅನ್ನು ಅದೃಶ್ಯ ಮೋಡ್‌ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation>
 <translation id="6149061208933997199">ಪಾಸ್‌ವರ್ಡ್ ಬಳಸಿ</translation>
+<translation id="6152406514676263192">ನಿಮ್ಮ ಆಸಕ್ತಿಗಳನ್ನು ಆಧರಿಸಿದ ಅತ್ಯಂತ ಸೂಕ್ತ ವಿಷಯವನ್ನು ಪಡೆಯಲು ಸಿಂಕ್ ಮಾಡಿ.</translation>
 <translation id="6159839020698489198">ಐಚ್ಛಿಕ</translation>
 <translation id="6177442314419606057">Chrome ನಲ್ಲಿ ಹುಡುಕಿ</translation>
 <translation id="6184086493125982861">ಟ್ಯಾಬ್‌ಗಳನ್ನು ತೋರಿಸಿ</translation>
@@ -739,6 +741,7 @@
 <translation id="7099761977003084116">ಇತ್ತೀಚಿನ ಟ್ಯಾಬ್‌ಗಳು</translation>
 <translation id="7102005569666697658">ಡೌನ್‌ಲೋಡ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">ಮರೆಮಾಡಿ</translation>
+<translation id="7108762695052995889">ಸೈಟ್‌ಗೆ ಭೇಟಿ ನೀಡಿ</translation>
 <translation id="7133798577887235672">ಪೂರ್ಣ ಹೆಸರು</translation>
 <translation id="7136892417564438900">ಕ್ಯಾಮರಾ ಲಭ್ಯವಿಲ್ಲ</translation>
 <translation id="7153999225810839758"><ph name="TIME" /> ನಿಮಿಷ ಓದಲಾಗಿದೆ</translation>
@@ -749,6 +752,7 @@
 <translation id="7189598951263744875">ಹಂಚಿ...</translation>
 <translation id="7192050974311852563">ಲಾಗ್‌ ಮಾಡುವುದನ್ನು ಪ್ರಾರಂಭಿಸಿ</translation>
 <translation id="7203585745079012652">ಉತ್ತರಗಳನ್ನು ಮತ್ತೆ ಮಾತನಾಡಿ</translation>
+<translation id="7207023858769244910">ನಿಮ್ಮ ಆಸಕ್ತಿಗಳನ್ನು ಆಧರಿಸಿದ ವಿಷಯವನ್ನು ಪಡೆಯಲು ಸಿಂಕ್ ಮಾಡಿ.</translation>
 <translation id="7207383424303353046">ಹೊಸತು: Chrome ಅನ್ನು ನಿಮ್ಮ ಡೀಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಆ್ಯಪ್ ಮಾಡಿಕೊಳ್ಳುವ ಮೂಲಕ ಅದರಲ್ಲಿ ಸೈಟ್‌ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ತೆರೆಯಿರಿ. <ph name="BEGIN_LINK" />ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ<ph name="END_LINK" /></translation>
 <translation id="721597782417389033">ಕಾರ್ಡ್ ಅಡ್ಡಹೆಸರು ಅಮಾನ್ಯವಾಗಿದೆ</translation>
 <translation id="722454870747268814">ಹೊಸ ಅದೃಶ್ಯ ಟ್ಯಾಬ್</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index b7fd9b7..650a9435 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">관리 대상 브라우저입니다 <ph name="BEGIN_LINK" />세부정보<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">비밀번호 숨기기</translation>
 <translation id="145015347812617860">항목 <ph name="COUNT" />개</translation>
+<translation id="1450170672351507823">표준 보호 모드가 사용 설정되어 있습니다. 보안을 더욱 강화하려면 향상된 보호 모드를 사용하세요.</translation>
 <translation id="149095475893949513">웹사이트에서 구성 프로필을 다운로드하려고 합니다.</translation>
 <translation id="1491277525950327607">설정을 전환하려면 두 번 탭하세요.</translation>
 <translation id="1492417797159476138">이미 사이트에 사용 중인 사용자 이름입니다.</translation>
@@ -738,6 +739,7 @@
 <translation id="7099761977003084116">최근 탭</translation>
 <translation id="7102005569666697658">다운로드 중… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">숨기기</translation>
+<translation id="7108762695052995889">사이트 방문</translation>
 <translation id="7133798577887235672">이름</translation>
 <translation id="7136892417564438900">카메라를 사용할 수 없음</translation>
 <translation id="7153999225810839758">읽는 데 <ph name="TIME" />분 소요 예상</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
index 40a3956..e919bfb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">Серепчиңиз башкарылып жатат. <ph name="BEGIN_LINK" />Чоо-жайы<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">Сырсөздү жашыруу</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> нерсе</translation>
+<translation id="1450170672351507823">Стандарттуу коргоо күйүк. Анын ордуна Жакшыртылган коргоону колдонуңуз.</translation>
 <translation id="149095475893949513">Бул вебсайт конфигурациялык профилди жүктөп алууга аракет кылып жатат.</translation>
 <translation id="1491277525950327607">Жөндөөнү которуштуруу үчүн, эки жолу таптаңыз</translation>
 <translation id="1492417797159476138">Бул сайт үчүн ушул колдонуучунун атын сактап койгонсуз</translation>
@@ -738,6 +739,7 @@
 <translation id="7099761977003084116">Акыркы өтмөктөр</translation>
 <translation id="7102005569666697658">Жүктөлүп алынууда… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">Жашыруу</translation>
+<translation id="7108762695052995889">Сайтка баш багуу</translation>
 <translation id="7133798577887235672">Толук аты-жөнү</translation>
 <translation id="7136892417564438900">Камера жеткиликсиз</translation>
 <translation id="7153999225810839758"><ph name="TIME" /> мүнөт окуу</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
index aa84bd0..5784bbe 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -739,6 +739,7 @@
 <translation id="7099761977003084116">ແຖບຫຼ້າສຸດ</translation>
 <translation id="7102005569666697658">ກຳລັງດາວໂຫຼດ… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">ເຊື່ອງ</translation>
+<translation id="7108762695052995889">ເຂົ້າເບິ່ງເວັບໄຊ</translation>
 <translation id="7133798577887235672">ຊື່​ເຕັມ</translation>
 <translation id="7136892417564438900">ກ້ອງຖ່າຍຮູບບໍ່ສາມາດໃຊ້ໄດ້</translation>
 <translation id="7153999225810839758">ອ່ານ <ph name="TIME" /> ນາທີ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
index 05d767c..9adb4d64 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">Jūsų naršyklė tvarkoma. <ph name="BEGIN_LINK" />Išsami informacija<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">Slėpti slaptažodį</translation>
 <translation id="145015347812617860">Elementų: <ph name="COUNT" /></translation>
+<translation id="1450170672351507823">Įprasta apsauga įjungta. Jei norite apsisaugoti dar labiau, naudokite sustiprintą apsaugą.</translation>
 <translation id="149095475893949513">Ši svetainė bando atsisiųsti konfigūracijos profilį.</translation>
 <translation id="1491277525950327607">Dukart palieskite, kad perjungtumėte nustatymą</translation>
 <translation id="1492417797159476138">Jau išsaugojote šį naudotojo vardą šioje svetainėje</translation>
@@ -740,6 +741,7 @@
 <translation id="7099761977003084116">Naujausi skirtukai</translation>
 <translation id="7102005569666697658">Atsisiunčiama… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">Slėpti</translation>
+<translation id="7108762695052995889">Apsilankyti svetainėje</translation>
 <translation id="7133798577887235672">Vardas ir pav.</translation>
 <translation id="7136892417564438900">Fotoaparatas nepasiekiamas</translation>
 <translation id="7153999225810839758">Perskaitoma per <ph name="TIME" /> min.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
index 765951b..068df3c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -738,6 +738,7 @@
 <translation id="7099761977003084116">Pēdējās cilnes</translation>
 <translation id="7102005569666697658">Notiek lejupielāde… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">Slēpt</translation>
+<translation id="7108762695052995889">Apmeklēt vietni</translation>
 <translation id="7133798577887235672">Vārds, uzvārds</translation>
 <translation id="7136892417564438900">Kamera nav pieejama.</translation>
 <translation id="7153999225810839758">Lasīšanas ilgums: <ph name="TIME" /> min</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
index 56a5bfab..c73b093 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -163,6 +163,7 @@
 <translation id="236977714248711277">Сајтовите не може да користат колачиња за да го подобрат вашето доживување со прелистувањето, на пример, да останете најавени или да запомнат ставки во кошничката за купување.
 
 Сајтовите не може да користат колачиња за да ја следат вашата активност од прелистувањето на различни сајтови, на пример, за персонализирање реклами.</translation>
+<translation id="2375243552872247702">Видете содржини за вас</translation>
 <translation id="2381405137052800939">Основи</translation>
 <translation id="2386793615875593361">1 избрано</translation>
 <translation id="2421004566762153674">Се блокираат колачиња од трети страни</translation>
@@ -602,6 +603,7 @@
 <translation id="6136914049981179737">Пред секунди</translation>
 <translation id="6144589619057374135">Отвори ${url} во „Инкогнито“</translation>
 <translation id="6149061208933997199">Користи лозинка</translation>
+<translation id="6152406514676263192">Синхронизирање со најрелевантните содржини според вашите интереси.</translation>
 <translation id="6159839020698489198">изборно</translation>
 <translation id="6177442314419606057">Пребарувајте во Chrome</translation>
 <translation id="6184086493125982861">Прикажи картички</translation>
@@ -750,6 +752,7 @@
 <translation id="7189598951263744875">Сподели…</translation>
 <translation id="7192050974311852563">Започни со собирање евиденција</translation>
 <translation id="7203585745079012652">Изговарај ги одговорите</translation>
+<translation id="7207023858769244910">Синхронизирање за да добиете содржини според вашите интереси.</translation>
 <translation id="7207383424303353046">Ново: автоматски отворајте сајтови во Chrome така што ќе го направите ваша стандардна апликација за прелистувач. <ph name="BEGIN_LINK" />Отворете „Поставки“<ph name="END_LINK" /></translation>
 <translation id="721597782417389033">Неважечки прекар на картичка</translation>
 <translation id="722454870747268814">Нова инкогнито картичка</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
index 7990db47..9941bf6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -406,6 +406,7 @@
 <translation id="4502566650163919158">Одоо шалгах</translation>
 <translation id="4505980578794259603">Сүүлд <ph name="TIME" /> шалгасан.</translation>
 <translation id="4508750114462689118">Нэвтрэх сурталчилгааг хаах</translation>
+<translation id="4511669830082467224">Google-р зураг хайх</translation>
 <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />-д хадгалсан нууц үгээ нээж, удирдах</translation>
 <translation id="452750746583162491">Синк хийсэн өгөгдлөө шалгах</translation>
 <translation id="4536418791685807335">Дахин нэвтрэхээр оролдоно уу.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
index c6a53c8..9c2521d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">तुमचा ब्राउझर व्यवस्थापित केला आहे. <ph name="BEGIN_LINK" />तपशील<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">पासवर्ड लपवा</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> आयटम</translation>
+<translation id="1450170672351507823">साधारण संरक्षण सुरू आहे. याहून अधिक सुरक्षेसाठी, वर्धित संरक्षण वापरा.</translation>
 <translation id="149095475893949513">ही वेबसाइट प्रोफाइल कॉंफिगरेशन डाउनलोड करण्याचा प्रयत्न करत आहे.</translation>
 <translation id="1491277525950327607">सेटिंग टॉगल करण्यासाठी दोनदा टॅप करा</translation>
 <translation id="1492417797159476138">तुम्ही या साइटसाठी आधीच वापरकर्ता नाव सेव्ह केले आहे</translation>
@@ -162,6 +163,7 @@
 <translation id="236977714248711277">तुमच्या ब्राउझिंग अनुभवात सुधारणा करण्यासाठी, उदाहरणार्थ, तुम्हाला साइन इन केलेले ठेवण्यासाठी किंवा तुमच्या शॉपिंग कार्टमधील आयटम लक्षात ठेवण्यासाठी साइट कुकी वापरू शकत नाहीत.
 
 वेगवेगळ्या साइटवरील तुमची ब्राउझिंग ॲक्टिव्हिटी पाहण्यासाठी साइट कुकी वापरू शकत नाहीत, उदाहरणार्थ, जाहिराती पर्सनलाइझ करण्यासाठी.</translation>
+<translation id="2375243552872247702">तुमच्यासाठीचा आशय पहा</translation>
 <translation id="2381405137052800939">मूलतत्त्वे</translation>
 <translation id="2386793615875593361">1 निवडले</translation>
 <translation id="2421004566762153674">तृतीय पक्षाच्या कुकी ब्लॉक करत आहे</translation>
@@ -602,6 +604,7 @@
 <translation id="6136914049981179737">सेकंदांपूर्वी</translation>
 <translation id="6144589619057374135">${url} गुप्त मोडमध्ये उघडा</translation>
 <translation id="6149061208933997199">पासवर्ड वापरा</translation>
+<translation id="6152406514676263192">तुमच्या स्वारस्यांनुसार सर्वात उपयुक्त असलेल्या आशयासाठी सिंक करा.</translation>
 <translation id="6159839020698489198">पर्यायी</translation>
 <translation id="6177442314419606057">Chrome मध्ये शोधा</translation>
 <translation id="6184086493125982861">टॅब दर्शवा</translation>
@@ -751,6 +754,7 @@
 <translation id="7189598951263744875">सामयिक करा...</translation>
 <translation id="7192050974311852563">लॉग इन करणे सुरू करा</translation>
 <translation id="7203585745079012652">उत्तरे वाचून सांगा</translation>
+<translation id="7207023858769244910">तुमच्या स्वारस्यांनुसार आशय मिळवण्यासाठी सिंक करा.</translation>
 <translation id="7207383424303353046">नवीन: Chrome ला तुमचे डीफॉल्ट ब्राउझर अ‍ॅप सेट करून त्यामध्ये आपोआप साइट उघडा. <ph name="BEGIN_LINK" />सेटिंग्ज उघडा<ph name="END_LINK" /></translation>
 <translation id="721597782417389033">कार्डाचे चुकीचे टोपणनाव</translation>
 <translation id="722454870747268814">नवीन गुप्त टॅब</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index 111eb24..f69d2e0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -739,6 +739,7 @@
 <translation id="7099761977003084116">Recente tabbladen</translation>
 <translation id="7102005569666697658">Downloaden… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">Verbergen</translation>
+<translation id="7108762695052995889">Site bezoeken</translation>
 <translation id="7133798577887235672">Volledige naam</translation>
 <translation id="7136892417564438900">Camera is niet beschikbaar</translation>
 <translation id="7153999225810839758">Leestijd: <ph name="TIME" /> minuut/minuten</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb
index e933dea..c53cf3c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_or.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -736,6 +736,7 @@
 <translation id="7099761977003084116">ସାମ୍ପ୍ରତିକ ଟାବ୍‌</translation>
 <translation id="7102005569666697658"><ph name="FILE_SIZE" /> ଡାଉନ୍‌ଲୋଡ୍ ହେଉଛି…</translation>
 <translation id="7108338896283013870">ଲୁଚାନ୍ତୁ</translation>
+<translation id="7108762695052995889">ସାଇଟକୁ ଭିଜିଟ କରନ୍ତୁ</translation>
 <translation id="7133798577887235672">ସମ୍ପୂର୍ଣ୍ଣ ନାମ</translation>
 <translation id="7136892417564438900">କ୍ୟାମେରା ଉପଲବ୍ଧ ନାହିଁ</translation>
 <translation id="7153999225810839758">ପଢ଼ିବା ପାଇଁ <ph name="TIME" /> ମିନିଟ୍ ଲାଗିବ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
index e90225c..ffc9fc827 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -737,6 +737,7 @@
 <translation id="7099761977003084116">Ostatnie karty</translation>
 <translation id="7102005569666697658">Pobieram… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">Ukryj</translation>
+<translation id="7108762695052995889">Otwórz stronę</translation>
 <translation id="7133798577887235672">Imię i nazwisko</translation>
 <translation id="7136892417564438900">Aparat jest niedostępny</translation>
 <translation id="7153999225810839758">Czas czytania: <ph name="TIME" /> min</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
index 60c54cc..48726dd0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -163,6 +163,7 @@
 <translation id="236977714248711277">Os sites não podem usar cookies para melhorar sua experiência de navegação, como manter sua conta conectada ou se lembrar dos itens em um carrinho de compras.
 
 Eles também não podem usar cookies para ver sua atividade de navegação em diferentes sites, por exemplo, para personalizar anúncios.</translation>
+<translation id="2375243552872247702">Tenha acesso a conteúdo personalizado</translation>
 <translation id="2381405137052800939">Conceitos básicos</translation>
 <translation id="2386793615875593361">Uma selecionada</translation>
 <translation id="2421004566762153674">Bloqueando cookies de terceiros</translation>
@@ -602,6 +603,7 @@
 <translation id="6136914049981179737">Segundos atrás</translation>
 <translation id="6144589619057374135">Abrir ${url} na navegação anônima</translation>
 <translation id="6149061208933997199">Usar senha</translation>
+<translation id="6152406514676263192">Sincronize para receber conteúdo mais relevante com base nos seus interesses.</translation>
 <translation id="6159839020698489198">opcional</translation>
 <translation id="6177442314419606057">Pesquisar no Chrome</translation>
 <translation id="6184086493125982861">Mostrar guias</translation>
@@ -749,6 +751,7 @@
 <translation id="7189598951263744875">Compartilhar...</translation>
 <translation id="7192050974311852563">Iniciar registro</translation>
 <translation id="7203585745079012652">Falar as respostas</translation>
+<translation id="7207023858769244910">Sincronize para receber conteúdo com base nos seus interesses.</translation>
 <translation id="7207383424303353046">Novidade: defina o Chrome como seu navegador padrão para abrir sites automaticamente nele. <ph name="BEGIN_LINK" />Abrir Configurações<ph name="END_LINK" /></translation>
 <translation id="721597782417389033">Apelido do cartão inválido</translation>
 <translation id="722454870747268814">Nova guia anônima</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index fda4411..c6e338bc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -163,6 +163,7 @@
 <translation id="236977714248711277">Site-urile nu pot folosi cookie-uri pentru a-ți îmbunătăți experiența de navigare, de exemplu, pentru a te menține conectat(ă) sau pentru a reține articolele din coșul de cumpărături.
 
 Site-urile nu pot folosi cookie-uri pentru a-ți vedea activitatea de navigare de pe diferite site-uri, de exemplu, pentru a personaliza anunțurile.</translation>
+<translation id="2375243552872247702">Vezi conținut relevant pentru tine</translation>
 <translation id="2381405137052800939">Setări de bază</translation>
 <translation id="2386793615875593361">1 selectată</translation>
 <translation id="2421004566762153674">Blocarea cookie-urilor terță parte</translation>
@@ -602,6 +603,7 @@
 <translation id="6136914049981179737">Secunde</translation>
 <translation id="6144589619057374135">Deschide ${url} în modul incognito</translation>
 <translation id="6149061208933997199">Folosește parola</translation>
+<translation id="6152406514676263192">Sincronizează pentru conținutul cel mai relevant în funcție de interesele tale.</translation>
 <translation id="6159839020698489198">opțional</translation>
 <translation id="6177442314419606057">Caută în Chrome</translation>
 <translation id="6184086493125982861">Afișează butonul File</translation>
@@ -739,6 +741,7 @@
 <translation id="7099761977003084116">File recente</translation>
 <translation id="7102005569666697658">Se descarcă… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">Ascunde</translation>
+<translation id="7108762695052995889">Accesează site-ul</translation>
 <translation id="7133798577887235672">Numele complet</translation>
 <translation id="7136892417564438900">Camera foto nu este disponibilă</translation>
 <translation id="7153999225810839758">Lectură de <ph name="TIME" /> minute</translation>
@@ -749,6 +752,7 @@
 <translation id="7189598951263744875">Trimite...</translation>
 <translation id="7192050974311852563">Activează înregistrarea în jurnal</translation>
 <translation id="7203585745079012652">Primești răspunsuri vocale</translation>
+<translation id="7207023858769244910">Sincronizează pentru a obține conținut în funcție de interesele tale.</translation>
 <translation id="7207383424303353046">Nou: deschide automat site-uri în Chrome setând-o ca aplicație browser prestabilită. <ph name="BEGIN_LINK" />Deschide Setările<ph name="END_LINK" /></translation>
 <translation id="721597782417389033">Pseudonimul cardului nu este valid</translation>
 <translation id="722454870747268814">Filă incognito nouă</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
index 6bb7777..f9815dc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">Этот браузер управляется администратором. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">Скрыть пароль</translation>
 <translation id="145015347812617860">Закладок: <ph name="COUNT" /></translation>
+<translation id="1450170672351507823">Стандартная защита включена. Для большей безопасности используйте улучшенную защиту.</translation>
 <translation id="149095475893949513">Этот сайт пытается скачать профиль конфигурации.</translation>
 <translation id="1491277525950327607">Для переключения нажмите дважды</translation>
 <translation id="1492417797159476138">Вы уже сохранили это имя пользователя для данного сайта.</translation>
@@ -738,6 +739,7 @@
 <translation id="7099761977003084116">Недавние вкладки</translation>
 <translation id="7102005569666697658">Скачивание… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">Скрыть</translation>
+<translation id="7108762695052995889">Перейти на сайт</translation>
 <translation id="7133798577887235672">Полное имя</translation>
 <translation id="7136892417564438900">Камера недоступна</translation>
 <translation id="7153999225810839758">Чтение займет около <ph name="TIME" /> мин.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb
index 92848d46..8a35780 100644
--- a/ios/chrome/app/strings/resources/ios_strings_si.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -739,6 +739,7 @@
 <translation id="7099761977003084116">මෑතකාලීන පටිති</translation>
 <translation id="7102005569666697658">බාගනිමින්… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">සඟවන්න</translation>
+<translation id="7108762695052995889">අඩවිය වෙත යන්න</translation>
 <translation id="7133798577887235672">සම්පූර්ණ නම</translation>
 <translation id="7136892417564438900">කැමරාව නොතිබේ</translation>
 <translation id="7153999225810839758">මිනිත්තු <ph name="TIME" /> කියවීම</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
index 71de883..aaa50dc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -162,6 +162,7 @@
 <translation id="236977714248711277">Weby nemôžu pomocou súborov cookie zlepšovať vaše prostredie prehliadania, napríklad zabrániť odhláseniu alebo zapamätať si položky vo vašom nákupnom košíku.
 
 Weby si nemôžu na základe súborov cookie zobraziť vašu históriu prehliadania v rámci rôznych webov (napríklad na prispôsobenie reklám).</translation>
+<translation id="2375243552872247702">Pozrite si obsah pre vás</translation>
 <translation id="2381405137052800939">Základy</translation>
 <translation id="2386793615875593361">Počet vybratých fotografií: 1</translation>
 <translation id="2421004566762153674">Blokovanie súborov cookie tretích strán</translation>
@@ -404,6 +405,7 @@
 <translation id="4502566650163919158">Skontrolovať</translation>
 <translation id="4505980578794259603">Posledná kontrola: <ph name="TIME" /></translation>
 <translation id="4508750114462689118">Zavrieť propagáciu prihlásenia</translation>
+<translation id="4511669830082467224">Vyhľadať obrázok Googlom</translation>
 <translation id="4526249700380860531">Zobrazte si a spravujte uložené heslá na stránke <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation>
 <translation id="452750746583162491">Skontrolovať synchronizované údaje</translation>
 <translation id="4536418791685807335">Skúste sa znova prihlásiť.</translation>
@@ -601,6 +603,7 @@
 <translation id="6136914049981179737">Pred chvíľou</translation>
 <translation id="6144589619057374135">Otvoriť adresu ${url} v režime inkognito</translation>
 <translation id="6149061208933997199">Použiť heslo</translation>
+<translation id="6152406514676263192">Synchronizujte a získavajte tak najrelevantnejší obsah na základe svojich záujmov.</translation>
 <translation id="6159839020698489198">nepovinné</translation>
 <translation id="6177442314419606057">Hľadať v Chrome</translation>
 <translation id="6184086493125982861">Zobraziť karty</translation>
@@ -749,6 +752,7 @@
 <translation id="7189598951263744875">Zdieľať...</translation>
 <translation id="7192050974311852563">Spustiť zapisovanie do denníka</translation>
 <translation id="7203585745079012652">Vysloviť odpovede</translation>
+<translation id="7207023858769244910">Synchronizujte a získavajte tak obsah na základe svojich záujmov.</translation>
 <translation id="7207383424303353046">Novinka: Nastavte si Chrome ako predvolenú aplikáciu prehliadača a otvárajte v ňom weby automaticky. <ph name="BEGIN_LINK" />Otvoriť nastavenia<ph name="END_LINK" /></translation>
 <translation id="721597782417389033">Neplatná prezývka karty</translation>
 <translation id="722454870747268814">Nová karta inkognito</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
index 1ed500c..b8a2e19 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">Vaš brskalnik je upravljan. <ph name="BEGIN_LINK" />Podrobnosti<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">Skrivanje gesla</translation>
 <translation id="145015347812617860">Št. elementov: <ph name="COUNT" /></translation>
+<translation id="1450170672351507823">Standardna zaščita je vklopljena. Za večjo varnost uporabite izboljšano zaščito.</translation>
 <translation id="149095475893949513">To spletno mesto poskuša prenesti profil konfiguracije.</translation>
 <translation id="1491277525950327607">Dvakrat se dotaknite, da preklopite nastavitev</translation>
 <translation id="1492417797159476138">Za to spletno mesto ste že shranili to uporabniško ime.</translation>
@@ -738,6 +739,7 @@
 <translation id="7099761977003084116">Nedavni zavihki</translation>
 <translation id="7102005569666697658">Prenašanje … <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">Skrij</translation>
+<translation id="7108762695052995889">Na spletno mesto</translation>
 <translation id="7133798577887235672">Polno ime</translation>
 <translation id="7136892417564438900">Fotoaparat ni na voljo</translation>
 <translation id="7153999225810839758"><ph name="TIME" />-minutno branje</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
index 0486ab8..4d5143f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">Pregledačem se upravlja. <ph name="BEGIN_LINK" />Detalji<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">Sakrijte lozinku</translation>
 <translation id="145015347812617860">Stavki: <ph name="COUNT" /></translation>
+<translation id="1450170672351507823">Standardna zaštita je uključena. Koristite naprednu zaštitu da biste se dodatno zaštitili.</translation>
 <translation id="149095475893949513">Ovaj veb-sajt pokušava da preuzme profil konfiguracije.</translation>
 <translation id="1491277525950327607">Dvaput dodirnite da biste uključili/isključili podešavanje</translation>
 <translation id="1492417797159476138">Već ste sačuvali ovo korisničko ime za ovaj sajt</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index f07e7ad0..7407039 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">Прегледачем се управља. <ph name="BEGIN_LINK" />Детаљи<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">Сакријте лозинку</translation>
 <translation id="145015347812617860">Ставки: <ph name="COUNT" /></translation>
+<translation id="1450170672351507823">Стандардна заштита је укључена. Користите напредну заштиту да бисте се додатно заштитили.</translation>
 <translation id="149095475893949513">Овај веб-сајт покушава да преузме профил конфигурације.</translation>
 <translation id="1491277525950327607">Двапут додирните да бисте укључили/искључили подешавање</translation>
 <translation id="1492417797159476138">Већ сте сачували ово корисничко име за овај сајт</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
index a13224b3..7e5d19e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -739,6 +739,7 @@
 <translation id="7099761977003084116">சமீபத்திய தாவல்கள்</translation>
 <translation id="7102005569666697658">பதிவிறக்குகிறது… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">மறை</translation>
+<translation id="7108762695052995889">தளத்திற்குச் செல்</translation>
 <translation id="7133798577887235672">முழுப் பெயர்</translation>
 <translation id="7136892417564438900">கேமரா இல்லை</translation>
 <translation id="7153999225810839758">படிக்க <ph name="TIME" /> நிமிடம் ஆகும்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb
index 91cfef9..bc22491 100644
--- a/ios/chrome/app/strings/resources/ios_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">మీ బ్రౌజర్ మేనేజ్ చేయబడుతుంది. <ph name="BEGIN_LINK" />వివరాలు<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">పాస్‌వర్డ్‌ను దాచండి</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> అంశాలు</translation>
+<translation id="1450170672351507823">స్టాండర్డ్ రక్షణ ఆన్‌లో ఉంది. మరింత సెక్యూరిటీ కోసం, మెరుగైన రక్షణను ఉపయోగించండి.</translation>
 <translation id="149095475893949513">ఈ వెబ్‌సైట్, కాన్ఫిగరేషన్ ప్రొఫైల్‌ను డౌన్‌లోడ్ చేయడానికి ప్రయత్నిస్తోంది.</translation>
 <translation id="1491277525950327607">సెట్టింగ్‌ను టోగుల్ చేయడానికి రెండుసార్లు నొక్కండి</translation>
 <translation id="1492417797159476138">మీరు ఇప్పటికే ఈ సైట్ కోసం ఈ యూజర్‌నేమ్‌ను సేవ్ చేశారు</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb
index 18742d85..f3d214e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -163,6 +163,7 @@
 <translation id="236977714248711277">เว็บไซต์ไม่อาจใช้คุกกี้เพื่อปรับปรุงประสบการณ์การท่องเว็บ เช่น ให้คุณลงชื่อเข้าใช้ต่อไปเรื่อยๆ หรือจดจำรายการในรถเข็นช็อปปิ้งได้อีก
 
 เว็บไซต์ไม่อาจใช้คุกกี้เพื่อดูกิจกรรมการท่องเว็บของคุณในเว็บไซต์และดำเนินการต่างๆ เช่น เพื่อปรับโฆษณาตามโปรไฟล์ของคุณได้อีก</translation>
+<translation id="2375243552872247702">ดูเนื้อหาสำหรับคุณ</translation>
 <translation id="2381405137052800939">พื้นฐาน</translation>
 <translation id="2386793615875593361">เลือก 1 รูป</translation>
 <translation id="2421004566762153674">การบล็อกคุกกี้ของบุคคลที่สาม</translation>
@@ -602,6 +603,7 @@
 <translation id="6136914049981179737">วินาทีแล้ว</translation>
 <translation id="6144589619057374135">เปิด ${url} ในโหมดไม่ระบุตัวตน</translation>
 <translation id="6149061208933997199">ใช้รหัสผ่าน</translation>
+<translation id="6152406514676263192">ซิงค์เพื่อดูเนื้อหาที่เกี่ยวข้องที่สุดตามความสนใจของคุณ</translation>
 <translation id="6159839020698489198">ไม่บังคับ</translation>
 <translation id="6177442314419606057">ค้นหาใน Chrome</translation>
 <translation id="6184086493125982861">แสดงแท็บ</translation>
@@ -750,6 +752,7 @@
 <translation id="7189598951263744875">แชร์...</translation>
 <translation id="7192050974311852563">เริ่มต้นการบันทึก</translation>
 <translation id="7203585745079012652">พูดคำตอบกลับ</translation>
+<translation id="7207023858769244910">ซิงค์เพื่อรับเนื้อหาตามความสนใจของคุณ</translation>
 <translation id="7207383424303353046">ใหม่: เปิดเว็บไซต์ใน Chrome โดยอัตโนมัติด้วยการตั้งเป็นแอปเบราว์เซอร์เริ่มต้น <ph name="BEGIN_LINK" />เปิดการตั้งค่า<ph name="END_LINK" /></translation>
 <translation id="721597782417389033">ชื่อเล่นของบัตรไม่ถูกต้อง</translation>
 <translation id="722454870747268814">แท็บที่ไม่ระบุตัวตนใหม่</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
index d13ed59..dcabb01 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -163,6 +163,7 @@
 <translation id="236977714248711277">سائٹس آپ کے براؤزنگ کے تجربہ کو بہتر بنانے کے لیے کوکیز کا استعمال نہیں کر سکتی ہیں، مثال کے طور پر آپ کو سائن ان رکھنا یا آپ کی شاپنگ کارٹ میں آئٹمز کو یاد رکھنا۔
 
 سائٹس مختلف سائٹس پر آپ کی براؤزنگ کی سرگرمی دیکھنے کیلئے کوکیز کا استعمال نہیں کر سکتی ہیں، مثال کے طور پر اشتہارات کو ذاتی نوعیت کا بنانا۔</translation>
+<translation id="2375243552872247702">اپنے لیے مواد دیکھیں</translation>
 <translation id="2381405137052800939">مبادیات</translation>
 <translation id="2386793615875593361">1 کو منتخب کیا گیا</translation>
 <translation id="2421004566762153674">فریق ثالث کوکیز کو مسدود کیا جا رہا ہے</translation>
@@ -602,6 +603,7 @@
 <translation id="6136914049981179737">کچھ سیکنڈ پہلے</translation>
 <translation id="6144589619057374135">‏پوشیدگی میں {url}$ کھولیں</translation>
 <translation id="6149061208933997199">پاس ورڈ استعمال کریں</translation>
+<translation id="6152406514676263192">اپنی دلچسپیوں کی بنیاد پر انتہائی متعلقہ مواد کے لیے مطابقت پذیری کریں۔</translation>
 <translation id="6159839020698489198">اختیاری</translation>
 <translation id="6177442314419606057">‏Chrome میں تلاش کریں</translation>
 <translation id="6184086493125982861">ٹیبز دکھائیں</translation>
@@ -739,6 +741,7 @@
 <translation id="7099761977003084116">حالیہ ٹیبز</translation>
 <translation id="7102005569666697658">ڈاؤن لوڈ ہو رہی ہے… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">چھپائیں</translation>
+<translation id="7108762695052995889">سائٹ ملاحظہ کریں</translation>
 <translation id="7133798577887235672">پورا نام</translation>
 <translation id="7136892417564438900">کیمرا دستیاب نہیں ہے</translation>
 <translation id="7153999225810839758"><ph name="TIME" /> منٹ پڑھیں</translation>
@@ -749,6 +752,7 @@
 <translation id="7189598951263744875">اشتراک کریں…</translation>
 <translation id="7192050974311852563">لاگ کرنا شروع کریں</translation>
 <translation id="7203585745079012652">جوابات دوبارہ بولیں</translation>
+<translation id="7207023858769244910">اپنی دلچسپیوں کی بنیاد پر مواد حاصل کرنے کے لیے مطابقت پذیری کریں۔</translation>
 <translation id="7207383424303353046">‏نیا: Chrome کو اپنی ڈیفالٹ براؤزر ایپ بنا کر سائٹس کو اس میں خودکار طور پر کھولیں۔ <ph name="BEGIN_LINK" />ترتیبات کھولیں<ph name="END_LINK" /></translation>
 <translation id="721597782417389033">کارڈ کا غلط عرفی نام</translation>
 <translation id="722454870747268814">نیا پوشیدگی ٹیب</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
index 906ed143..71c9d3f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">您的浏览器处于受管理状态。<ph name="BEGIN_LINK" />详细信息<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">隐藏密码</translation>
 <translation id="145015347812617860">有<ph name="COUNT" />个书签</translation>
+<translation id="1450170672351507823">已开启标准保护。若要进一步提升安全性,请使用增强型保护。</translation>
 <translation id="149095475893949513">此网站正要尝试下载一个配置文件。</translation>
 <translation id="1491277525950327607">点按两次即可切换设置</translation>
 <translation id="1492417797159476138">您已为此网站保存该用户名</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
index 68bf961..86b6ccd 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -737,7 +737,7 @@
 <translation id="7099761977003084116">最近開啟的分頁</translation>
 <translation id="7102005569666697658">正在下載…<ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">隱藏</translation>
-<translation id="7108762695052995889">造訪網站</translation>
+<translation id="7108762695052995889">瀏覽網站</translation>
 <translation id="7133798577887235672">完整名稱</translation>
 <translation id="7136892417564438900">無法使用相機</translation>
 <translation id="7153999225810839758">閱讀時間:<ph name="TIME" /> 分鐘</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
index 698c0b62..8c9c9a56 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -65,6 +65,7 @@
 <translation id="1434356225517321998">Isiphequluli sakho siphethwe. <ph name="BEGIN_LINK" />Imininingwane<ph name="END_LINK" /></translation>
 <translation id="1449835205994625556">Fihla iphasiwedi</translation>
 <translation id="145015347812617860"><ph name="COUNT" /> izinto</translation>
+<translation id="1450170672351507823">Ukuvikela okujwayelekile kuvuliwe. Ukuze uthole ukuvikeleka okwengeziwe, sebenzisa ukuvikela Okuthuthukisiwe.</translation>
 <translation id="149095475893949513">Le webhusayithi izama ukudawuniloda iphrofayela yokulungiselela.</translation>
 <translation id="1491277525950327607">Thepha kabili ukuze ushintshe isilungiselelo</translation>
 <translation id="1492417797159476138">Ulondoloze leli gama lomsebenzisi kakade mayelana naleli sayithi</translation>
@@ -162,6 +163,7 @@
 <translation id="236977714248711277">Amasayithi awakwazi ukusebenzisa amakhukhi ukuthuthukisa ukuzizwela kwakho kokuphequlula, ngokwesibonelo, ukukugcina ungene ngemvume noma ukukhumbula izinto ezikukalishi yakho yokuthenga.
 
 Amasayithi awakwazi ukusebenzisa amakhukhi ukubona umsebenzi wakho wokuphequlula kumasayithi ahlukahlukene, ngokwesibonelo, ukwenza izikhangiso ngokwezifiso.</translation>
+<translation id="2375243552872247702">Bona Okuqukethwe Kwakho</translation>
 <translation id="2381405137052800939">Izisekelo</translation>
 <translation id="2386793615875593361">1 ikhethiwe</translation>
 <translation id="2421004566762153674">Ivimba amakhukhi enkampani yangaphandle</translation>
@@ -601,6 +603,7 @@
 <translation id="6136914049981179737">Amasekhondi adlule</translation>
 <translation id="6144589619057374135">Vula i-${url} ku-Incognito</translation>
 <translation id="6149061208933997199">Sebenzisa iphasiwedi</translation>
+<translation id="6152406514676263192">Vumelanisa ngokuqukethwe okuhlobene kakhulu ngokusekelwe kuzintshisekelo zakho.</translation>
 <translation id="6159839020698489198">ongakukhetha</translation>
 <translation id="6177442314419606057">Sesha ku-Chrome</translation>
 <translation id="6184086493125982861">Bonisa amthebhu</translation>
@@ -738,6 +741,7 @@
 <translation id="7099761977003084116">Amathebhu akamuva</translation>
 <translation id="7102005569666697658">Iyalanda… <ph name="FILE_SIZE" /></translation>
 <translation id="7108338896283013870">Fihla</translation>
+<translation id="7108762695052995889">Vakashela Isayithi</translation>
 <translation id="7133798577887235672">Igama eligcwele lomzali/umnakekeli</translation>
 <translation id="7136892417564438900">Ikhamera ayitholakali</translation>
 <translation id="7153999225810839758">kufundwe umzuzu ongu-<ph name="TIME" /></translation>
@@ -748,6 +752,7 @@
 <translation id="7189598951263744875">Yabelana...</translation>
 <translation id="7192050974311852563">Qala ukuloga</translation>
 <translation id="7203585745079012652">Khulumela emuva izimpendulo</translation>
+<translation id="7207023858769244910">Vumelanisa ukuze uthole okuqukethwe ngokusekelwe kuzintshisekelo zakho.</translation>
 <translation id="7207383424303353046">Okusha: Vula amasayithi ku-Chrome ngokuzenzekelayo ngokwenza kube Uhlelo Lwakho Lokusebenza Lwesiphequluli Oluzenzakalelayo. <ph name="BEGIN_LINK" />Vula Amasethingi<ph name="END_LINK" /></translation>
 <translation id="721597782417389033">Isiteketiso Sekhadi Esingavumelekile</translation>
 <translation id="722454870747268814">Ithebhu entsha ye-incognito</translation>
diff --git a/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm b/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm
index f87d0e7..b4dfbc4 100644
--- a/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm
+++ b/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm
@@ -157,7 +157,7 @@
     // See crbug.com/1312449.
     // TODO(crbug.com/1314012): Need test for this case.
     self.authenticationService->SignOut(signin_metrics::ABORT_SIGNIN,
-                                        /*force_clear_browsing_data=*/true,
+                                        /*force_clear_browsing_data=*/false,
                                         startSignInCompletion);
     return;
   }
@@ -185,7 +185,7 @@
     }
   };
   self.authenticationService->SignOut(signin_metrics::ABORT_SIGNIN,
-                                      /*force_clear_browsing_data=*/true,
+                                      /*force_clear_browsing_data=*/false,
                                       signOutCompletion);
 }
 
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h
index fd5f9fb..5b10b83 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.h
@@ -79,6 +79,12 @@
 
 - (instancetype)init NS_UNAVAILABLE;
 
+// Call this method before actually using the data manager.
+- (void)prepare;
+
+// Call this method when data manager is not used anymore.
+- (void)disconnect;
+
 // Fills `model` with appropriate sections and items.
 - (void)loadModel:(ListModel*)model;
 
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
index b38d30d..de7cc8c 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
@@ -223,19 +223,6 @@
 
     _prefChangeRegistrar.Init(_browserState->GetPrefs());
     _prefObserverBridge.reset(new PrefObserverBridge(self));
-    _prefObserverBridge->ObserveChangesForPreference(
-        browsing_data::prefs::kDeleteTimePeriod, &_prefChangeRegistrar);
-
-    _prefObserverBridge->ObserveChangesForPreference(
-        browsing_data::prefs::kDeleteBrowsingHistory, &_prefChangeRegistrar);
-    _prefObserverBridge->ObserveChangesForPreference(
-        browsing_data::prefs::kDeleteCookies, &_prefChangeRegistrar);
-    _prefObserverBridge->ObserveChangesForPreference(
-        browsing_data::prefs::kDeleteCache, &_prefChangeRegistrar);
-    _prefObserverBridge->ObserveChangesForPreference(
-        browsing_data::prefs::kDeletePasswords, &_prefChangeRegistrar);
-    _prefObserverBridge->ObserveChangesForPreference(
-        browsing_data::prefs::kDeleteFormData, &_prefChangeRegistrar);
   }
   return self;
 }
@@ -252,6 +239,26 @@
   [self addSyncProfileItemsToModel:model];
 }
 
+- (void)prepare {
+  _prefObserverBridge->ObserveChangesForPreference(
+      browsing_data::prefs::kDeleteTimePeriod, &_prefChangeRegistrar);
+
+  _prefObserverBridge->ObserveChangesForPreference(
+      browsing_data::prefs::kDeleteBrowsingHistory, &_prefChangeRegistrar);
+  _prefObserverBridge->ObserveChangesForPreference(
+      browsing_data::prefs::kDeleteCookies, &_prefChangeRegistrar);
+  _prefObserverBridge->ObserveChangesForPreference(
+      browsing_data::prefs::kDeleteCache, &_prefChangeRegistrar);
+  _prefObserverBridge->ObserveChangesForPreference(
+      browsing_data::prefs::kDeletePasswords, &_prefChangeRegistrar);
+  _prefObserverBridge->ObserveChangesForPreference(
+      browsing_data::prefs::kDeleteFormData, &_prefChangeRegistrar);
+}
+
+- (void)disconnect {
+  _prefChangeRegistrar.RemoveAll();
+}
+
 // Add items for types of browsing data to clear.
 - (void)addClearBrowsingDataItemsToModel:(ListModel*)model {
   // Data types section.
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm
index 3f1ab37c..5ec9ea0 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager_unittest.mm
@@ -106,6 +106,7 @@
                        browsingDataRemover:remover_.get()
         browsingDataCounterWrapperProducer:
             [[FakeBrowsingDataCounterWrapperProducer alloc] init]];
+    [manager_ prepare];
 
     test_sync_service_ = static_cast<syncer::TestSyncService*>(
         SyncServiceFactory::GetForBrowserState(browser_state_.get()));
@@ -114,6 +115,8 @@
                           browser_state_->GetPrefs());
   }
 
+  ~ClearBrowsingDataManagerTest() override { [manager_ disconnect]; }
+
   ChromeIdentity* fake_identity() {
     return account_manager_service_->GetDefaultIdentity();
   }
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
index 3b11542..aa0847a9 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
@@ -165,6 +165,7 @@
 
 - (void)viewWillAppear:(BOOL)animated {
   [super viewWillAppear:animated];
+  [self.dataManager prepare];
   [self.dataManager restartCounters:BrowsingDataRemoveMask::REMOVE_ALL];
 
   [self updateToolbarButtons];
@@ -173,6 +174,11 @@
   self.navigationController.toolbarHidden = NO;
 }
 
+- (void)viewWillDisappear:(BOOL)animated {
+  [super viewWillDisappear:animated];
+  [self.dataManager disconnect];
+}
+
 - (void)loadModel {
   [super loadModel];
   [self.dataManager loadModel:self.tableViewModel];
diff --git a/ios/chrome/browser/ui/settings/elements/BUILD.gn b/ios/chrome/browser/ui/settings/elements/BUILD.gn
index b18e00d..dc651b85 100644
--- a/ios/chrome/browser/ui/settings/elements/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/elements/BUILD.gn
@@ -4,6 +4,28 @@
 
 # import("//build/config/ios/ios_sdk.gni")
 
+source_set("info_popover_view_controller") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+
+  sources = [
+    "info_popover_view_controller.h",
+    "info_popover_view_controller.mm",
+  ]
+
+  frameworks = [ "UIKit.framework" ]
+
+  deps = [
+    ":constants",
+    "//base:base",
+    "//ios/chrome/app/strings",
+    "//ios/chrome/common:string_util",
+    "//ios/chrome/common/ui/colors",
+    "//ios/chrome/common/ui/elements:popover_label_view_controller",
+    "//ios/chrome/common/ui/util",
+    "//ui/base",
+  ]
+}
+
 source_set("enterprise_info_popover_view_controller") {
   configs += [ "//build/config/compiler:enable_arc" ]
 
@@ -16,12 +38,12 @@
 
   deps = [
     ":constants",
+    ":info_popover_view_controller",
     "//base:base",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser:chrome_url_constants",
     "//ios/chrome/common:string_util",
     "//ios/chrome/common/ui/colors",
-    "//ios/chrome/common/ui/elements:popover_label_view_controller",
     "//ios/chrome/common/ui/util",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/settings/elements/enterprise_info_popover_view_controller.h b/ios/chrome/browser/ui/settings/elements/enterprise_info_popover_view_controller.h
index 5eb693d..6df6e61a 100644
--- a/ios/chrome/browser/ui/settings/elements/enterprise_info_popover_view_controller.h
+++ b/ios/chrome/browser/ui/settings/elements/enterprise_info_popover_view_controller.h
@@ -5,10 +5,10 @@
 #ifndef IOS_CHROME_BROWSER_UI_SETTINGS_ELEMENTS_ENTERPRISE_INFO_POPOVER_VIEW_CONTROLLER_H_
 #define IOS_CHROME_BROWSER_UI_SETTINGS_ELEMENTS_ENTERPRISE_INFO_POPOVER_VIEW_CONTROLLER_H_
 
-#import "ios/chrome/common/ui/elements/popover_label_view_controller.h"
+#import "ios/chrome/browser/ui/settings/elements/info_popover_view_controller.h"
 
 // Static popover presenting the information of the enterprise.
-@interface EnterpriseInfoPopoverViewController : PopoverLabelViewController
+@interface EnterpriseInfoPopoverViewController : InfoPopoverViewController
 
 // Initializes the popover with default primary text, and secondary text based
 // on the given `enterpriseName`.
@@ -36,12 +36,9 @@
                     (NSAttributedString*)primaryAttributedString
                       secondaryAttributedString:
                           (NSAttributedString*)secondaryAttributedString
+                                           icon:(UIImage*)icon
+                         isPresentingFromButton:(BOOL)isPresentingFromButton
     NS_UNAVAILABLE;
-- (instancetype)initWithPrimaryAttributedString:
-                    (NSAttributedString*)primaryAttributedString
-                      secondaryAttributedString:
-                          (NSAttributedString*)secondaryAttributedString
-                                           icon:(UIImage*)icon NS_UNAVAILABLE;
 
 @end
 
diff --git a/ios/chrome/browser/ui/settings/elements/enterprise_info_popover_view_controller.mm b/ios/chrome/browser/ui/settings/elements/enterprise_info_popover_view_controller.mm
index 19ca329..b71a506 100644
--- a/ios/chrome/browser/ui/settings/elements/enterprise_info_popover_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/elements/enterprise_info_popover_view_controller.mm
@@ -10,7 +10,6 @@
 #import "ios/chrome/browser/ui/settings/elements/elements_constants.h"
 #import "ios/chrome/common/string_util.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
-#import "ios/chrome/common/ui/elements/popover_label_view_controller.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
@@ -80,9 +79,6 @@
 
 @interface EnterpriseInfoPopoverViewController ()
 
-// YES if it is presented by a UIButton.
-@property(nonatomic, assign) BOOL isPresentingFromButton;
-
 @end
 
 @implementation EnterpriseInfoPopoverViewController
@@ -105,15 +101,12 @@
                  enterpriseName:(NSString*)enterpriseName
          isPresentingFromButton:(BOOL)isPresentingFromButton
                addLearnMoreLink:(BOOL)addLearnMoreLink {
-  self = [super
+  return [super
       initWithPrimaryAttributedString:PrimaryMessage(message)
             secondaryAttributedString:SecondaryMessage(enterpriseName,
                                                        addLearnMoreLink)
-                                 icon:[UIImage imageNamed:kEnterpriseIconName]];
-  if (self) {
-    _isPresentingFromButton = isPresentingFromButton;
-  }
-  return self;
+                                 icon:[UIImage imageNamed:kEnterpriseIconName]
+               isPresentingFromButton:isPresentingFromButton];
 }
 
 #pragma mark - UIViewController
@@ -123,15 +116,4 @@
   self.view.accessibilityIdentifier = kEnterpriseInfoBubbleViewId;
 }
 
-#pragma mark - UIPopoverPresentationControllerDelegate
-
-- (void)popoverPresentationControllerDidDismissPopover:
-    (UIPopoverPresentationController*)popoverPresentationController {
-  if (self.isPresentingFromButton) {
-    UIButton* buttonView = base::mac::ObjCCastStrict<UIButton>(
-        popoverPresentationController.sourceView);
-    buttonView.enabled = YES;
-  }
-}
-
 @end
diff --git a/ios/chrome/browser/ui/settings/elements/info_popover_view_controller.h b/ios/chrome/browser/ui/settings/elements/info_popover_view_controller.h
new file mode 100644
index 0000000..c0ebf0d
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/elements/info_popover_view_controller.h
@@ -0,0 +1,44 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_ELEMENTS_INFO_POPOVER_VIEW_CONTROLLER_H_
+#define IOS_CHROME_BROWSER_UI_SETTINGS_ELEMENTS_INFO_POPOVER_VIEW_CONTROLLER_H_
+
+#import "ios/chrome/common/ui/elements/popover_label_view_controller.h"
+
+// Static popover presenting some information.
+@interface InfoPopoverViewController : PopoverLabelViewController
+
+// Init with only a main message shown as the primary label. By default,
+// the value of |isPresentingFromButton| is set to YES.
+- (instancetype)initWithMessage:(NSString*)message;
+
+// Init with the primary text, the secondary text with an attributed string,
+// an |icon| at the left of the secondary text, and a boolean
+// |isPresentingFromButton| to determine if it is shown from a button. The size
+// of the icon will be of equal height and width. There won't be an icon if
+// |icon| is left empty. The icon won't be shown if |secondaryAttributedString|
+// is empty.
+- (instancetype)initWithPrimaryAttributedString:
+                    (NSAttributedString*)primaryAttributedString
+                      secondaryAttributedString:
+                          (NSAttributedString*)secondaryAttributedString
+                                           icon:(UIImage*)icon
+                         isPresentingFromButton:(BOOL)isPresentingFromButton
+    NS_DESIGNATED_INITIALIZER;
+
+- (instancetype)initWithPrimaryAttributedString:
+                    (NSAttributedString*)primaryAttributedString
+                      secondaryAttributedString:
+                          (NSAttributedString*)secondaryAttributedString
+    NS_UNAVAILABLE;
+- (instancetype)initWithPrimaryAttributedString:
+                    (NSAttributedString*)primaryAttributedString
+                      secondaryAttributedString:
+                          (NSAttributedString*)secondaryAttributedString
+                                           icon:(UIImage*)icon NS_UNAVAILABLE;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_SETTINGS_ELEMENTS_INFO_POPOVER_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/settings/elements/info_popover_view_controller.mm b/ios/chrome/browser/ui/settings/elements/info_popover_view_controller.mm
new file mode 100644
index 0000000..81fadcd
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/elements/info_popover_view_controller.mm
@@ -0,0 +1,84 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/settings/elements/info_popover_view_controller.h"
+
+#include "base/mac/foundation_util.h"
+#include "base/strings/sys_string_conversions.h"
+#import "ios/chrome/browser/ui/settings/elements/elements_constants.h"
+#import "ios/chrome/common/string_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/util/constraints_ui_util.h"
+#include "ios/chrome/grit/ios_strings.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+
+NSAttributedString* PrimaryMessage(NSString* full_text) {
+  DCHECK(full_text);
+  NSDictionary* general_attributes = @{
+    NSForegroundColorAttributeName : [UIColor colorNamed:kTextPrimaryColor],
+    NSFontAttributeName :
+        [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]
+  };
+
+  return [[NSAttributedString alloc] initWithString:full_text
+                                         attributes:general_attributes];
+}
+
+}  // namespace
+
+@interface InfoPopoverViewController ()
+
+@end
+
+@implementation InfoPopoverViewController {
+  // YES if it is presented by a UIButton.
+  BOOL _isPresentingFromButton;
+}
+
+- (instancetype)initWithMessage:(NSString*)message {
+  return [self initWithPrimaryAttributedString:PrimaryMessage(message)
+                     secondaryAttributedString:nil
+                                          icon:nil
+                        isPresentingFromButton:YES];
+}
+
+- (instancetype)initWithPrimaryAttributedString:
+                    (NSAttributedString*)primaryAttributedString
+                      secondaryAttributedString:
+                          (NSAttributedString*)secondaryAttributedString
+                                           icon:(UIImage*)icon
+                         isPresentingFromButton:(BOOL)isPresentingFromButton {
+  self = [super initWithPrimaryAttributedString:primaryAttributedString
+                      secondaryAttributedString:secondaryAttributedString
+                                           icon:icon];
+  if (self) {
+    _isPresentingFromButton = isPresentingFromButton;
+  }
+  return self;
+}
+
+#pragma mark - UIViewController
+
+- (void)viewDidLoad {
+  [super viewDidLoad];
+  self.view.accessibilityIdentifier = kEnterpriseInfoBubbleViewId;
+}
+
+#pragma mark - UIPopoverPresentationControllerDelegate
+
+- (void)popoverPresentationControllerDidDismissPopover:
+    (UIPopoverPresentationController*)popoverPresentationController {
+  if (_isPresentingFromButton) {
+    UIButton* buttonView = base::mac::ObjCCastStrict<UIButton>(
+        popoverPresentationController.sourceView);
+    buttonView.enabled = YES;
+  }
+}
+
+@end
diff --git a/ios/chrome/browser/ui/settings/privacy/BUILD.gn b/ios/chrome/browser/ui/settings/privacy/BUILD.gn
index 813bb42..24b4b9e 100644
--- a/ios/chrome/browser/ui/settings/privacy/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/privacy/BUILD.gn
@@ -53,6 +53,7 @@
     "//ios/chrome/browser/ui/settings/cells",
     "//ios/chrome/browser/ui/settings/clear_browsing_data",
     "//ios/chrome/browser/ui/settings/elements:enterprise_info_popover_view_controller",
+    "//ios/chrome/browser/ui/settings/elements:info_popover_view_controller",
     "//ios/chrome/browser/ui/settings/privacy/safe_browsing",
     "//ios/chrome/browser/ui/settings/sync/utils",
     "//ios/chrome/browser/ui/settings/utils",
@@ -114,6 +115,7 @@
   testonly = true
   sources = [
     "privacy_safe_browsing_mediator_unittest.mm",
+    "privacy_safe_browsing_view_controller_unittest.mm",
     "privacy_table_view_controller_unittest.mm",
   ]
   deps = [
@@ -133,12 +135,15 @@
     "//ios/chrome/browser/browser_state:test_support",
     "//ios/chrome/browser/browsing_data:feature_flags",
     "//ios/chrome/browser/main:test_support",
+    "//ios/chrome/browser/policy:policy_util",
     "//ios/chrome/browser/prefs:browser_prefs",
     "//ios/chrome/browser/sync",
+    "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/browser/ui/list_model",
     "//ios/chrome/browser/ui/settings/privacy:privacy_ui",
     "//ios/chrome/browser/ui/settings/utils",
     "//ios/chrome/browser/ui/table_view:test_support",
+    "//ios/chrome/browser/ui/table_view:utils",
     "//ios/chrome/browser/ui/table_view/cells",
     "//ios/chrome/test:test_support",
     "//ios/web/public/test",
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_view_controller_unittest.mm
new file mode 100644
index 0000000..6531dccf
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_view_controller_unittest.mm
@@ -0,0 +1,82 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_view_controller.h"
+
+#import "components/prefs/testing_pref_service.h"
+#import "components/safe_browsing/core/common/features.h"
+#import "components/safe_browsing/core/common/safe_browsing_prefs.h"
+#import "components/sync_preferences/testing_pref_service_syncable.h"
+#import "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
+#import "ios/chrome/browser/prefs/browser_prefs.h"
+#import "ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_mediator.h"
+#import "ios/chrome/browser/ui/table_view/chrome_table_view_controller_test.h"
+#import "ios/chrome/browser/ui/table_view/table_view_utils.h"
+#import "ios/chrome/grit/ios_strings.h"
+#import "ios/web/public/test/web_task_environment.h"
+#import "ui/base/l10n/l10n_util.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+class PrivacySafeBrowsingViewControllerTest
+    : public ChromeTableViewControllerTest {
+ protected:
+  void SetUp() override {
+    ChromeTableViewControllerTest::SetUp();
+    TestChromeBrowserState::Builder test_cbs_builder;
+    test_cbs_builder.SetPrefService(CreatePrefService());
+    chrome_browser_state_ = test_cbs_builder.Build();
+  }
+
+  // Makes a PrefService to be used by the test.
+  std::unique_ptr<sync_preferences::PrefServiceSyncable> CreatePrefService() {
+    auto prefs =
+        std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
+    user_prefs::PrefRegistrySyncable* registry = prefs->registry();
+    RegisterBrowserStatePrefs(registry);
+    return prefs;
+  }
+
+  ChromeTableViewController* InstantiateController() override {
+    mediator_ = [[PrivacySafeBrowsingMediator alloc]
+        initWithUserPrefService:chrome_browser_state_->GetPrefs()];
+    PrivacySafeBrowsingViewController* view_controller =
+        [[PrivacySafeBrowsingViewController alloc]
+            initWithStyle:ChromeTableViewStyle()];
+    mediator_.consumer = view_controller;
+    return view_controller;
+  }
+
+  web::WebTaskEnvironment task_environment_;
+  std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
+  PrivacySafeBrowsingMediator* mediator_;
+};
+
+TEST_F(PrivacySafeBrowsingViewControllerTest, TestModel) {
+  CreateController();
+  CheckController();
+
+  CheckTitle(l10n_util::GetNSString(IDS_IOS_PRIVACY_SAFE_BROWSING_TITLE));
+  EXPECT_EQ(1, NumberOfSections());
+  EXPECT_EQ(3, NumberOfItemsInSection(0));
+  CheckTextCellTextAndDetailText(
+      l10n_util::GetNSString(
+          IDS_IOS_PRIVACY_SAFE_BROWSING_ENHANCED_PROTECTION_TITLE),
+      l10n_util::GetNSString(
+          IDS_IOS_PRIVACY_SAFE_BROWSING_ENHANCED_PROTECTION_SUMMARY),
+      0, 0);
+  CheckTextCellTextAndDetailText(
+      l10n_util::GetNSString(
+          IDS_IOS_PRIVACY_SAFE_BROWSING_STANDARD_PROTECTION_TITLE),
+      l10n_util::GetNSString(
+          IDS_IOS_PRIVACY_SAFE_BROWSING_STANDARD_PROTECTION_SUMMARY),
+      0, 1);
+  CheckTextCellTextAndDetailText(
+      l10n_util::GetNSString(IDS_IOS_PRIVACY_SAFE_BROWSING_NO_PROTECTION_TITLE),
+      l10n_util::GetNSString(
+          IDS_IOS_PRIVACY_SAFE_BROWSING_NO_PROTECTION_SUMMARY),
+      0, 2);
+}
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm
index 4b75740..42a39ce 100644
--- a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm
@@ -28,12 +28,16 @@
 #include "ios/chrome/browser/pref_names.h"
 #include "ios/chrome/browser/sync/sync_service_factory.h"
 #import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
+#import "ios/chrome/browser/ui/settings/elements/enterprise_info_popover_view_controller.h"
+#import "ios/chrome/browser/ui/settings/elements/info_popover_view_controller.h"
 #import "ios/chrome/browser/ui/settings/privacy/privacy_constants.h"
 #import "ios/chrome/browser/ui/settings/privacy/privacy_navigation_commands.h"
 #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
 #import "ios/chrome/browser/ui/settings/settings_table_view_controller_constants.h"
 #import "ios/chrome/browser/ui/settings/utils/pref_backed_boolean.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.h"
+#import "ios/chrome/browser/ui/table_view/cells/table_view_info_button_cell.h"
+#import "ios/chrome/browser/ui/table_view/cells/table_view_info_button_item.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_link_header_footer_item.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_switch_cell.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_switch_item.h"
@@ -41,6 +45,7 @@
 #import "ios/chrome/browser/ui/table_view/table_view_utils.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/common/string_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/reauthentication/reauthentication_protocol.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
@@ -60,6 +65,7 @@
   SectionIdentifierSafeBrowsing,
   SectionIdentifierWebServices,
   SectionIdentifierIncognitoAuth,
+  SectionIdentifierIncognitoInterstitial,
 };
 
 typedef NS_ENUM(NSInteger, ItemType) {
@@ -68,9 +74,11 @@
   ItemTypePrivacyFooter,
   ItemTypeOtherDevicesHandoff,
   ItemTypeIncognitoReauth,
-  ItemTypeIncognitoReauthFooter,
+  ItemTypeIncognitoReauthDisabled,
   ItemTypePrivacySafeBrowsing,
   ItemTypeHTTPSOnlyMode,
+  ItemTypeIncognitoInterstitial,
+  ItemTypeIncognitoInterstitialDisabled,
 };
 
 // Only used in this class to openn the Sync and Google services settings.
@@ -81,7 +89,8 @@
 }  // namespace
 
 @interface PrivacyTableViewController () <BooleanObserver,
-                                          PrefObserverDelegate> {
+                                          PrefObserverDelegate,
+                                          PopoverLabelViewControllerDelegate> {
   ChromeBrowserState* _browserState;  // weak
 
   // Pref observer to track changes to prefs.
@@ -113,6 +122,12 @@
 // The item related to the switch for the "HTTPS Only Mode" setting.
 @property(nonatomic, strong) TableViewSwitchItem* HTTPSOnlyModeItem;
 
+// Accessor for the Incognito interstitial pref.
+@property(nonatomic, strong) PrefBackedBoolean* incognitoInterstitialPref;
+
+// The item related to the Incognito interstitial setting.
+@property(nonatomic, strong) TableViewSwitchItem* incognitoInterstitialItem;
+
 @end
 
 @implementation PrivacyTableViewController
@@ -157,6 +172,13 @@
         initWithPrefService:prefService
                    prefName:prefs::kHttpsOnlyModeEnabled];
     [_HTTPSOnlyModePref setObserver:self];
+
+    if (base::FeatureList::IsEnabled(kIOS3PIntentsInIncognito)) {
+      _incognitoInterstitialPref = [[PrefBackedBoolean alloc]
+          initWithPrefService:browser->GetBrowserState()->GetPrefs()
+                     prefName:prefs::kIncognitoInterstitialEnabled];
+      [_incognitoInterstitialPref setObserver:self];
+    }
   }
   return self;
 }
@@ -189,6 +211,9 @@
   }
   [model addSectionWithIdentifier:SectionIdentifierWebServices];
   [model addSectionWithIdentifier:SectionIdentifierIncognitoAuth];
+  if (base::FeatureList::IsEnabled(kIOS3PIntentsInIncognito)) {
+    [model addSectionWithIdentifier:SectionIdentifierIncognitoInterstitial];
+  }
 
   // Clear Browsing item.
   [model addItem:[self clearBrowsingDetailItem]
@@ -199,7 +224,10 @@
     [model addItem:[self safeBrowsingDetailItem]
         toSectionWithIdentifier:SectionIdentifierSafeBrowsing];
     [model setFooter:[self showPrivacyFooterItem]
-        forSectionWithIdentifier:SectionIdentifierIncognitoAuth];
+        forSectionWithIdentifier:base::FeatureList::IsEnabled(
+                                     kIOS3PIntentsInIncognito)
+                                     ? SectionIdentifierIncognitoInterstitial
+                                     : SectionIdentifierIncognitoAuth];
   } else {
     [model setFooter:[self showPrivacyFooterItem]
         forSectionWithIdentifier:SectionIdentifierPrivacyContent];
@@ -209,19 +237,29 @@
   [model addItem:[self handoffDetailItem]
       toSectionWithIdentifier:SectionIdentifierWebServices];
 
-  // Do not show the incognito authentication setting when Incognito mode is
-  // disabled.
-  if (!IsIncognitoModeDisabled(_browserState->GetPrefs())) {
-    // Incognito authentication item.
-    [model addItem:self.incognitoReauthItem
-        toSectionWithIdentifier:SectionIdentifierIncognitoAuth];
+  // Incognito reauth item is added. If Incognito mode is disabled, or device
+  // authentication is not supported, a disabled version is shown instead with
+  // relevant information as a popover.
+  TableViewItem* incognitoReauthItem =
+      (IsIncognitoModeDisabled(_browserState->GetPrefs()) ||
+       ![self deviceSupportsAuthentication])
+          ? self.incognitoReauthItemDisabled
+          : self.incognitoReauthItem;
+  [model addItem:incognitoReauthItem
+      toSectionWithIdentifier:SectionIdentifierIncognitoAuth];
 
-    // If necessary, add the instuctional footer
-    if ([self shouldShowReauthFooter]) {
-      [model setFooter:[PrivacyTableViewController
-                           newIncognitoReauthSetupPasscodeFooter]
-          forSectionWithIdentifier:SectionIdentifierIncognitoAuth];
-    }
+  // Show "Ask to Open Links from Other Apps in Incognito" setting.
+  if (base::FeatureList::IsEnabled(kIOS3PIntentsInIncognito)) {
+    // Incognito interstitial item is added. If Incognito mode is
+    // disabled or forced, a disabled version is shown with information
+    // to learn more.
+    TableViewItem* incognitoInterstitialItem =
+        (IsIncognitoModeDisabled(_browserState->GetPrefs()) ||
+         IsIncognitoModeForced(_browserState->GetPrefs()))
+            ? self.incognitoInterstitialItemDisabled
+            : self.incognitoInterstitialItem;
+    [model addItem:incognitoInterstitialItem
+        toSectionWithIdentifier:SectionIdentifierIncognitoInterstitial];
   }
 
   if (base::FeatureList::IsEnabled(
@@ -248,6 +286,33 @@
   return _HTTPSOnlyModeItem;
 }
 
+- (TableViewSwitchItem*)incognitoInterstitialItem {
+  if (!_incognitoInterstitialItem) {
+    _incognitoInterstitialItem = [[TableViewSwitchItem alloc]
+        initWithType:ItemTypeIncognitoInterstitial];
+    _incognitoInterstitialItem.text =
+        l10n_util::GetNSString(IDS_IOS_OPTIONS_ENABLE_INCOGNITO_INTERSTITIAL);
+    _incognitoInterstitialItem.on = self.incognitoInterstitialPref.value;
+    _incognitoInterstitialItem.enabled = YES;
+    _incognitoInterstitialItem.accessibilityIdentifier =
+        kSettingsIncognitoInterstitialId;
+  }
+  return _incognitoInterstitialItem;
+}
+
+- (TableViewInfoButtonItem*)incognitoInterstitialItemDisabled {
+  TableViewInfoButtonItem* itemDisabled = [[TableViewInfoButtonItem alloc]
+      initWithType:ItemTypeIncognitoInterstitialDisabled];
+  itemDisabled.text =
+      l10n_util::GetNSString(IDS_IOS_OPTIONS_ENABLE_INCOGNITO_INTERSTITIAL);
+  itemDisabled.statusText = l10n_util::GetNSString(IDS_IOS_SETTING_OFF);
+  itemDisabled.accessibilityIdentifier =
+      kSettingsIncognitoInterstitialDisabledId;
+  itemDisabled.tintColor = [UIColor colorNamed:kGrey300Color];
+  itemDisabled.textColor = [UIColor colorNamed:kTextSecondaryColor];
+  return itemDisabled;
+}
+
 - (TableViewItem*)handoffDetailItem {
   NSString* detailText =
       _browserState->GetPrefs()->GetBoolean(prefs::kIosHandoffToOtherDevices)
@@ -308,18 +373,6 @@
   return _safeBrowsingDetailItem;
 }
 
-// Footer to the incognito reauth section that appears when the user has no
-// passcode/biometric auth set up.
-+ (TableViewHeaderFooterItem*)newIncognitoReauthSetupPasscodeFooter {
-  TableViewLinkHeaderFooterItem* setupPasscodeFooter =
-      [[TableViewLinkHeaderFooterItem alloc]
-          initWithType:ItemTypeIncognitoReauthFooter];
-  setupPasscodeFooter.text =
-      l10n_util::GetNSString(IDS_IOS_INCOGNITO_REAUTH_SET_UP_PASSCODE_HINT);
-
-  return setupPasscodeFooter;
-}
-
 - (TableViewSwitchItem*)incognitoReauthItem {
   if (_incognitoReauthItem) {
     return _incognitoReauthItem;
@@ -329,10 +382,21 @@
   _incognitoReauthItem.text =
       l10n_util::GetNSString(IDS_IOS_INCOGNITO_REAUTH_SETTING_NAME);
   _incognitoReauthItem.on = self.incognitoReauthPref.value;
-  _incognitoReauthItem.enabled = [self deviceSupportsAuthentication];
+  _incognitoReauthItem.enabled = YES;
   return _incognitoReauthItem;
 }
 
+- (TableViewInfoButtonItem*)incognitoReauthItemDisabled {
+  TableViewInfoButtonItem* itemDisabled = [[TableViewInfoButtonItem alloc]
+      initWithType:ItemTypeIncognitoReauthDisabled];
+  itemDisabled.text =
+      l10n_util::GetNSString(IDS_IOS_INCOGNITO_REAUTH_SETTING_NAME);
+  itemDisabled.statusText = l10n_util::GetNSString(IDS_IOS_SETTING_OFF);
+  itemDisabled.tintColor = [UIColor colorNamed:kGrey300Color];
+  itemDisabled.textColor = [UIColor colorNamed:kTextSecondaryColor];
+  return itemDisabled;
+}
+
 - (TableViewDetailIconItem*)detailItemWithType:(NSInteger)type
                                        titleId:(NSInteger)titleId
                                     detailText:(NSString*)detailText
@@ -411,12 +475,34 @@
     [switchCell.switchView addTarget:self
                               action:@selector(switchTapped:)
                     forControlEvents:UIControlEventTouchUpInside];
+  } else if (itemType == ItemTypeIncognitoReauthDisabled) {
+    TableViewInfoButtonCell* managedCell =
+        base::mac::ObjCCastStrict<TableViewInfoButtonCell>(cell);
+    [managedCell.trailingButton
+               addTarget:self
+                  action:@selector(didTapIncognitoReauthDisabledInfoButton:)
+        forControlEvents:UIControlEventTouchUpInside];
   } else if (itemType == ItemTypeHTTPSOnlyMode) {
     TableViewSwitchCell* switchCell =
         base::mac::ObjCCastStrict<TableViewSwitchCell>(cell);
     [switchCell.switchView addTarget:self
                               action:@selector(HTTPSOnlyModeTapped:)
                     forControlEvents:UIControlEventTouchUpInside];
+  } else if (itemType == ItemTypeIncognitoInterstitial) {
+    TableViewSwitchCell* switchCell =
+        base::mac::ObjCCastStrict<TableViewSwitchCell>(cell);
+    [switchCell.switchView
+               addTarget:self
+                  action:@selector(incognitoInterstitialSwitchTapped:)
+        forControlEvents:UIControlEventTouchUpInside];
+  } else if (itemType == ItemTypeIncognitoInterstitialDisabled) {
+    TableViewInfoButtonCell* managedCell =
+        base::mac::ObjCCastStrict<TableViewInfoButtonCell>(cell);
+    [managedCell.trailingButton
+               addTarget:self
+                  action:@selector
+                  (didTapIncognitoInterstitialDisabledInfoButton:)
+        forControlEvents:UIControlEventTouchUpInside];
   }
   return cell;
 }
@@ -447,12 +533,15 @@
 #pragma mark - BooleanObserver
 
 - (void)booleanDidChange:(id<ObservableBoolean>)observableBoolean {
-  // Update the cell.
+  // Update the cells.
   self.incognitoReauthItem.on = self.incognitoReauthPref.value;
   [self reconfigureCellsForItems:@[ self.incognitoReauthItem ]];
 
   self.HTTPSOnlyModeItem.on = self.HTTPSOnlyModePref.value;
   [self reconfigureCellsForItems:@[ self.HTTPSOnlyModeItem ]];
+
+  self.incognitoInterstitialItem.on = self.incognitoInterstitialPref.value;
+  [self reconfigureCellsForItems:@[ self.incognitoInterstitialItem ]];
 }
 
 #pragma mark - TableViewLinkHeaderFooterItemDelegate
@@ -469,8 +558,68 @@
   }
 }
 
+#pragma mark - PopoverLabelViewControllerDelegate
+
+- (void)didTapLinkURL:(NSURL*)URL {
+  [super view:nil didTapLinkURL:[[CrURL alloc] initWithNSURL:URL]];
+}
+
 #pragma mark - private
 
+// Called when the user taps on the information button of the disabled Incognito
+// reauth setting's UI cell.
+- (void)didTapIncognitoReauthDisabledInfoButton:(UIButton*)buttonView {
+  NSString* popoverMessage =
+      IsIncognitoModeDisabled(_browserState->GetPrefs())
+          ? l10n_util::GetNSString(IDS_IOS_SNACKBAR_MESSAGE_ICOGNITO_DISABLED)
+          : l10n_util::GetNSString(
+                IDS_IOS_INCOGNITO_REAUTH_SET_UP_PASSCODE_HINT);
+  InfoPopoverViewController* popover =
+      IsIncognitoModeDisabled(_browserState->GetPrefs())
+          ? [[EnterpriseInfoPopoverViewController alloc]
+                initWithMessage:popoverMessage
+                 enterpriseName:nil]
+          : [[InfoPopoverViewController alloc] initWithMessage:popoverMessage];
+
+  [self showInfoPopover:popover forInfoButton:buttonView];
+}
+
+// Called when the user taps on the information button of the disabled Incognito
+// interstitial setting's UI cell.
+- (void)didTapIncognitoInterstitialDisabledInfoButton:(UIButton*)buttonView {
+  NSString* popoverMessage =
+      IsIncognitoModeDisabled(_browserState->GetPrefs())
+          ? l10n_util::GetNSString(IDS_IOS_SNACKBAR_MESSAGE_ICOGNITO_DISABLED)
+          : l10n_util::GetNSString(IDS_IOS_SNACKBAR_MESSAGE_ICOGNITO_FORCED);
+  EnterpriseInfoPopoverViewController* popover =
+      [[EnterpriseInfoPopoverViewController alloc]
+          initWithMessage:popoverMessage
+           enterpriseName:nil];
+
+  [self showInfoPopover:popover forInfoButton:buttonView];
+}
+
+// Shows a contextual bubble explaining that the tapped setting is managed and
+// includes a link to the chrome://management page.
+- (void)showInfoPopover:(PopoverLabelViewController*)popover
+          forInfoButton:(UIButton*)buttonView {
+  popover.delegate = self;
+
+  // Disable the button when showing the bubble.
+  // The button will be enabled when closing the bubble in
+  // (void)popoverPresentationControllerDidDismissPopover: of
+  // EnterpriseInfoPopoverViewController.
+  buttonView.enabled = NO;
+
+  // Set the anchor and arrow direction of the bubble.
+  popover.popoverPresentationController.sourceView = buttonView;
+  popover.popoverPresentationController.sourceRect = buttonView.bounds;
+  popover.popoverPresentationController.permittedArrowDirections =
+      UIPopoverArrowDirectionAny;
+
+  [self presentViewController:popover animated:YES completion:nil];
+}
+
 // Called from the HTTPS-Only Mode setting's UIControlEventTouchUpInside.
 // When this is called, `switchView` already has the updated value:
 // If the switch was off, and user taps it, when this method is called,
@@ -480,6 +629,14 @@
   [_HTTPSOnlyModePref setValue:isOn];
 }
 
+// Called from the Incognito interstitial setting's UIControlEventTouchUpInside.
+// When this is called, |switchView| already has the updated value:
+// If the switch was off, and user taps it, when this method is called,
+// switchView.on is YES.
+- (void)incognitoInterstitialSwitchTapped:(UISwitch*)switchView {
+  self.incognitoInterstitialPref.value = switchView.on;
+}
+
 // Called from the reauthentication setting's UIControlEventTouchUpInside.
 // When this is called, `switchView` already has the updated value:
 // If the switch was off, and user taps it, when this method is called,
@@ -511,12 +668,6 @@
                                }];
 }
 
-// Whether the explanatory footer for the incognito reauth setting should be
-// shown. It's shown when the setting cannot be enabled due to the device state.
-- (BOOL)shouldShowReauthFooter {
-  return ![self deviceSupportsAuthentication];
-}
-
 // Checks if the device has Passcode, Face ID, or Touch ID set up.
 - (BOOL)deviceSupportsAuthentication {
   LAContext* context = [[LAContext alloc] init];
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller_unittest.mm
index 4de452a..f7cb5c52 100644
--- a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller_unittest.mm
@@ -4,10 +4,12 @@
 
 #import "ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.h"
 
+#import <LocalAuthentication/LAContext.h>
 #include <memory>
 
 #include "base/memory/ptr_util.h"
 #include "base/strings/sys_string_conversions.h"
+#import "base/test/scoped_feature_list.h"
 #include "components/content_settings/core/common/features.h"
 #include "components/handoff/pref_names_ios.h"
 #include "components/prefs/pref_service.h"
@@ -20,11 +22,13 @@
 #include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
 #import "ios/chrome/browser/main/test_browser.h"
+#import "ios/chrome/browser/policy/policy_util.h"
 #include "ios/chrome/browser/pref_names.h"
 #include "ios/chrome/browser/prefs/browser_prefs.h"
 #include "ios/chrome/browser/sync/sync_service_factory.h"
 #include "ios/chrome/browser/system_flags.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller_test.h"
+#import "ios/chrome/browser/ui/ui_feature_flags.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/chrome/test/ios_chrome_scoped_testing_local_state.h"
@@ -46,10 +50,72 @@
   return std::make_unique<syncer::MockSyncService>();
 }
 
-class PrivacyTableViewControllerTest : public ChromeTableViewControllerTest {
+// Checks if the device has Passcode, Face ID, or Touch ID set up.
+BOOL DeviceSupportsAuthentication() {
+  LAContext* context = [[LAContext alloc] init];
+  return [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication
+                              error:nil];
+}
+
+// Bitset
+typedef NS_ENUM(NSUInteger, PrivacyTableViewControllerTestConfig) {
+  // Tests should run with Enhanced Protection flag enabled.
+  PrivacyTableViewControllerTestConfigEnhancedProtectionEnabled = 1 << 0,
+  // Tests should run with Third-party intents in Incognito flag enabled.
+  PrivacyTableViewControllerTestConfig3PIntentsInIncognitoEnabled = 1 << 1,
+};
+
+// `ScopedFeatureList` wrapper so `PrivacyTableViewControllerTest` can ensure
+// proper initialization of the feature list before all of its own attributes.
+class WithScopedFeatureList {
  protected:
+  WithScopedFeatureList(
+      std::pair<std::vector<base::Feature>, std::vector<base::Feature>> const&
+          enabled_disabled_features) {
+    feature_list_.InitWithFeatures(enabled_disabled_features.first,
+                                   enabled_disabled_features.second);
+  }
+
+  base::test::ScopedFeatureList feature_list_;
+};
+
+class PrivacyTableViewControllerTest
+    : public ChromeTableViewControllerTest,
+      public testing::WithParamInterface<PrivacyTableViewControllerTestConfig>,
+      public WithScopedFeatureList {
+ protected:
+  PrivacyTableViewControllerTest()
+      : WithScopedFeatureList(EnabledDisabledFeatures()) {}
+
+  std::pair<std::vector<base::Feature>, std::vector<base::Feature>>
+  EnabledDisabledFeatures() const {
+    std::pair<std::vector<base::Feature>, std::vector<base::Feature>>
+        enabledDisabledFeatures;
+
+    // Explicitly enable/disable Enhanced Protection flag.
+    if (GetParam() &
+        PrivacyTableViewControllerTestConfigEnhancedProtectionEnabled) {
+      enabledDisabledFeatures.first.push_back(
+          safe_browsing::kEnhancedProtection);
+    } else {
+      enabledDisabledFeatures.second.push_back(
+          safe_browsing::kEnhancedProtection);
+    }
+
+    // Explicitly enable/disable Third-party intents in Incognito flag.
+    if (GetParam() &
+        PrivacyTableViewControllerTestConfigEnhancedProtectionEnabled) {
+      enabledDisabledFeatures.first.push_back(kIOS3PIntentsInIncognito);
+    } else {
+      enabledDisabledFeatures.second.push_back(kIOS3PIntentsInIncognito);
+    }
+
+    return enabledDisabledFeatures;
+  }
+
   void SetUp() override {
     ChromeTableViewControllerTest::SetUp();
+
     TestChromeBrowserState::Builder test_cbs_builder;
     test_cbs_builder.SetPrefService(CreatePrefService());
     test_cbs_builder.AddTestingFactory(
@@ -120,68 +186,84 @@
 
 // Tests PrivacyTableViewController is set up with all appropriate items
 // and sections.
-TEST_F(PrivacyTableViewControllerTest, TestModel) {
+TEST_P(PrivacyTableViewControllerTest, TestModel) {
+  PrefService* prefService = chrome_browser_state_->GetPrefs();
   CreateController();
   CheckController();
+
+  int expectedNumberOfSections = 3;
   if (base::FeatureList::IsEnabled(safe_browsing::kEnhancedProtection)) {
-    EXPECT_EQ(4, NumberOfSections());
+    expectedNumberOfSections++;
+  }
+  if (base::FeatureList::IsEnabled(kIOS3PIntentsInIncognito)) {
+    expectedNumberOfSections++;
+  }
+  EXPECT_EQ(expectedNumberOfSections, NumberOfSections());
 
-    // Sections[0].
-    EXPECT_EQ(1, NumberOfItemsInSection(0));
-    CheckTextCellTextAndDetailText(
-        l10n_util::GetNSString(IDS_IOS_CLEAR_BROWSING_DATA_TITLE), nil, 0, 0);
+  int currentSection = 0;
+  // PrivacyContent section.
+  EXPECT_EQ(1, NumberOfItemsInSection(currentSection));
+  CheckTextCellTextAndDetailText(
+      l10n_util::GetNSString(IDS_IOS_CLEAR_BROWSING_DATA_TITLE), nil,
+      currentSection, 0);
 
-    // Sections[1].
-    EXPECT_EQ(1, NumberOfItemsInSection(1));
+  // SafeBrowsing section.
+  if (base::FeatureList::IsEnabled(safe_browsing::kEnhancedProtection)) {
+    currentSection++;
+    EXPECT_EQ(currentSection, NumberOfItemsInSection(1));
     CheckTextCellTextAndDetailText(
         l10n_util::GetNSString(IDS_IOS_PRIVACY_SAFE_BROWSING_TITLE),
         SafeBrowsingDetailText(), 1, 0);
+  }
 
-    // Sections[2].
-    EXPECT_EQ(1, NumberOfItemsInSection(2));
-    NSString* handoffSubtitle =
-        chrome_browser_state_->GetPrefs()->GetBoolean(
-            prefs::kIosHandoffToOtherDevices)
-            ? l10n_util::GetNSString(IDS_IOS_SETTING_ON)
-            : l10n_util::GetNSString(IDS_IOS_SETTING_OFF);
-    CheckTextCellTextAndDetailText(
-        l10n_util::GetNSString(IDS_IOS_OPTIONS_ENABLE_HANDOFF_TO_OTHER_DEVICES),
-        handoffSubtitle, 2, 0);
+  // WebServices section.
+  currentSection++;
+  EXPECT_EQ(1, NumberOfItemsInSection(currentSection));
+  NSString* handoffSubtitle = chrome_browser_state_->GetPrefs()->GetBoolean(
+                                  prefs::kIosHandoffToOtherDevices)
+                                  ? l10n_util::GetNSString(IDS_IOS_SETTING_ON)
+                                  : l10n_util::GetNSString(IDS_IOS_SETTING_OFF);
+  CheckTextCellTextAndDetailText(
+      l10n_util::GetNSString(IDS_IOS_OPTIONS_ENABLE_HANDOFF_TO_OTHER_DEVICES),
+      handoffSubtitle, currentSection, 0);
 
-    // Sections[3].
-    EXPECT_EQ(1, NumberOfItemsInSection(3));
-    CheckSwitchCellStateAndText(
-        NO, l10n_util::GetNSString(IDS_IOS_INCOGNITO_REAUTH_SETTING_NAME), 3,
-        0);
+  // IncognitoAuth section.
+  currentSection++;
+  EXPECT_EQ(1, NumberOfItemsInSection(currentSection));
+  if ((IsIncognitoModeDisabled(prefService) ||
+       !DeviceSupportsAuthentication())) {
+    // Disabled version of Incognito auth item is expected in this case.
+    CheckInfoButtonCellStatusWithIdAndTextWithId(
+        IDS_IOS_SETTING_OFF, IDS_IOS_INCOGNITO_REAUTH_SETTING_NAME,
+        currentSection, 0);
+  } else {
+    CheckSwitchCellStateAndTextWithId(NO, IDS_IOS_INCOGNITO_REAUTH_SETTING_NAME,
+                                      currentSection, 0);
+  }
 
+  // IncognitoInterstitial section.
+  if (base::FeatureList::IsEnabled(kIOS3PIntentsInIncognito)) {
+    currentSection++;
+    EXPECT_EQ(1, NumberOfItemsInSection(currentSection));
+    if ((IsIncognitoModeDisabled(prefService) ||
+         IsIncognitoModeForced(prefService))) {
+      // Disabled version of Incognito interstitial item is expected in this
+      // case.
+      CheckInfoButtonCellStatusWithIdAndTextWithId(
+          IDS_IOS_SETTING_OFF, IDS_IOS_OPTIONS_ENABLE_INCOGNITO_INTERSTITIAL,
+          currentSection, 0);
+    } else {
+      CheckSwitchCellStateAndTextWithId(
+          NO, IDS_IOS_OPTIONS_ENABLE_INCOGNITO_INTERSTITIAL, currentSection, 0);
+    }
+  }
+
+  // Testing section index and text of the privacy footer.
+  if (base::FeatureList::IsEnabled(safe_browsing::kEnhancedProtection)) {
     CheckSectionFooter(
         l10n_util::GetNSString(IDS_IOS_PRIVACY_GOOGLE_SERVICES_FOOTER),
-        /* section= */ 3);
+        /* section= */ expectedNumberOfSections - 1);
   } else {
-    EXPECT_EQ(3, NumberOfSections());
-
-    // Sections[0].
-    EXPECT_EQ(1, NumberOfItemsInSection(0));
-    CheckTextCellTextAndDetailText(
-        l10n_util::GetNSString(IDS_IOS_CLEAR_BROWSING_DATA_TITLE), nil, 0, 0);
-
-    // Sections[1].
-    EXPECT_EQ(1, NumberOfItemsInSection(1));
-    NSString* handoffSubtitle =
-        chrome_browser_state_->GetPrefs()->GetBoolean(
-            prefs::kIosHandoffToOtherDevices)
-            ? l10n_util::GetNSString(IDS_IOS_SETTING_ON)
-            : l10n_util::GetNSString(IDS_IOS_SETTING_OFF);
-    CheckTextCellTextAndDetailText(
-        l10n_util::GetNSString(IDS_IOS_OPTIONS_ENABLE_HANDOFF_TO_OTHER_DEVICES),
-        handoffSubtitle, 1, 0);
-
-    // Sections[2].
-    EXPECT_EQ(1, NumberOfItemsInSection(2));
-    CheckSwitchCellStateAndText(
-        NO, l10n_util::GetNSString(IDS_IOS_INCOGNITO_REAUTH_SETTING_NAME), 2,
-        0);
-
     CheckSectionFooter(
         l10n_util::GetNSString(IDS_IOS_PRIVACY_GOOGLE_SERVICES_FOOTER),
         /* section= */ 0);
@@ -190,22 +272,28 @@
 
 // Tests PrivacyTableViewController sets the correct privacy footer for a
 // non-syncing user.
-TEST_F(PrivacyTableViewControllerTest, TestModelFooterWithSyncDisabled) {
+TEST_P(PrivacyTableViewControllerTest, TestModelFooterWithSyncDisabled) {
   ON_CALL(*mock_sync_service()->GetMockUserSettings(), IsFirstSetupComplete())
       .WillByDefault(Return(false));
 
   CreateController();
   CheckController();
 
+  int expectedNumberOfSections = 3;
   if (base::FeatureList::IsEnabled(safe_browsing::kEnhancedProtection)) {
-    EXPECT_EQ(4, NumberOfSections());
+    expectedNumberOfSections++;
+  }
+  if (base::FeatureList::IsEnabled(kIOS3PIntentsInIncognito)) {
+    expectedNumberOfSections++;
+  }
+  EXPECT_EQ(expectedNumberOfSections, NumberOfSections());
 
+  // Testing section index and text of the privacy footer.
+  if (base::FeatureList::IsEnabled(safe_browsing::kEnhancedProtection)) {
     CheckSectionFooter(
         l10n_util::GetNSString(IDS_IOS_PRIVACY_GOOGLE_SERVICES_FOOTER),
-        /* section= */ 3);
+        /* section= */ expectedNumberOfSections - 1);
   } else {
-    EXPECT_EQ(3, NumberOfSections());
-
     CheckSectionFooter(
         l10n_util::GetNSString(IDS_IOS_PRIVACY_GOOGLE_SERVICES_FOOTER),
         /* section= */ 0);
@@ -214,26 +302,43 @@
 
 // Tests PrivacyTableViewController sets the correct privacy footer for a
 // syncing user.
-TEST_F(PrivacyTableViewControllerTest, TestModelFooterWithSyncEnabled) {
+TEST_P(PrivacyTableViewControllerTest, TestModelFooterWithSyncEnabled) {
   ON_CALL(*mock_sync_service()->GetMockUserSettings(), IsFirstSetupComplete())
       .WillByDefault(Return(true));
   ON_CALL(*mock_sync_service(), HasSyncConsent()).WillByDefault(Return(true));
 
   CreateController();
   CheckController();
-  if (base::FeatureList::IsEnabled(safe_browsing::kEnhancedProtection)) {
-    EXPECT_EQ(4, NumberOfSections());
 
+  int expectedNumberOfSections = 3;
+  if (base::FeatureList::IsEnabled(safe_browsing::kEnhancedProtection)) {
+    expectedNumberOfSections++;
+  }
+  if (base::FeatureList::IsEnabled(kIOS3PIntentsInIncognito)) {
+    expectedNumberOfSections++;
+  }
+  EXPECT_EQ(expectedNumberOfSections, NumberOfSections());
+
+  // Testing section index and text of the privacy footer.
+  if (base::FeatureList::IsEnabled(safe_browsing::kEnhancedProtection)) {
     CheckSectionFooter(
         l10n_util::GetNSString(IDS_IOS_PRIVACY_SYNC_AND_GOOGLE_SERVICES_FOOTER),
-        /* section= */ 3);
+        /* section= */ expectedNumberOfSections - 1);
   } else {
-    EXPECT_EQ(3, NumberOfSections());
-
     CheckSectionFooter(
         l10n_util::GetNSString(IDS_IOS_PRIVACY_SYNC_AND_GOOGLE_SERVICES_FOOTER),
         /* section= */ 0);
   }
 }
 
+INSTANTIATE_TEST_SUITE_P(
+    PrivacyTableViewControllerTestAllConfigs,
+    PrivacyTableViewControllerTest,
+    testing::Values(
+        0,
+        PrivacyTableViewControllerTestConfigEnhancedProtectionEnabled,
+        PrivacyTableViewControllerTestConfig3PIntentsInIncognitoEnabled,
+        PrivacyTableViewControllerTestConfigEnhancedProtectionEnabled |
+            PrivacyTableViewControllerTestConfig3PIntentsInIncognitoEnabled));
+
 }  // namespace
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller_constants.h b/ios/chrome/browser/ui/settings/settings_table_view_controller_constants.h
index d10c24c..80fd59bc 100644
--- a/ios/chrome/browser/ui/settings/settings_table_view_controller_constants.h
+++ b/ios/chrome/browser/ui/settings/settings_table_view_controller_constants.h
@@ -148,4 +148,11 @@
 
 extern NSString* const kSettingsHttpsOnlyModeCellId;
 
+// The accessibility identifier of the Incognito interstitial setting.
+extern NSString* const kSettingsIncognitoInterstitialId;
+
+// The accessibility identifier of the Incognito interstitial setting
+// when the setting is disabled because of Enterprise policy.
+extern NSString* const kSettingsIncognitoInterstitialDisabledId;
+
 #endif  // IOS_CHROME_BROWSER_UI_SETTINGS_SETTINGS_TABLE_VIEW_CONTROLLER_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller_constants.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller_constants.mm
index 97f41b2..535a7de 100644
--- a/ios/chrome/browser/ui/settings/settings_table_view_controller_constants.mm
+++ b/ios/chrome/browser/ui/settings/settings_table_view_controller_constants.mm
@@ -55,3 +55,7 @@
 NSString* const kDefaultBrowserSettingsTableViewId =
     @"kDefaultBrowserSettingsTableViewId";
 NSString* const kSettingsHttpsOnlyModeCellId = @"kSettingsHttpsOnlyModeCellId";
+NSString* const kSettingsIncognitoInterstitialId =
+    @"kSettingsIncognitoInterstitialId";
+NSString* const kSettingsIncognitoInterstitialDisabledId =
+    @"kSettingsIncognitoInterstitialDisabledId";
diff --git a/ios/chrome/browser/ui/table_view/chrome_table_view_controller_test.h b/ios/chrome/browser/ui/table_view/chrome_table_view_controller_test.h
index 7f58d7e4..2e103a6 100644
--- a/ios/chrome/browser/ui/table_view/chrome_table_view_controller_test.h
+++ b/ios/chrome/browser/ui/table_view/chrome_table_view_controller_test.h
@@ -118,6 +118,22 @@
                                          int section,
                                          int item);
 
+  // Verifies that the info button cell at `item` in `section` has a text
+  // property which matches `expected_title` and a status text which matches
+  // `expected_status text`.
+  void CheckInfoButtonCellStatusAndText(NSString* expected_status_text,
+                                        NSString* expected_title,
+                                        int section,
+                                        int item);
+
+  // Verifies that the info button cell at `item` in `section` has a text
+  // property which matches the l10n string for `expected_title_id` and a status
+  // text which matches `expected_status text`.
+  void CheckInfoButtonCellStatusWithIdAndTextWithId(int expected_status_text_id,
+                                                    int expected_title_id,
+                                                    int section,
+                                                    int item);
+
   // Verifies that the cell at `item` in `section` has the given
   // `accessory_type`.
   void CheckAccessoryType(UITableViewCellAccessoryType accessory_type,
diff --git a/ios/chrome/browser/ui/table_view/chrome_table_view_controller_test.mm b/ios/chrome/browser/ui/table_view/chrome_table_view_controller_test.mm
index 13a2610..8dfb1ef 100644
--- a/ios/chrome/browser/ui/table_view/chrome_table_view_controller_test.mm
+++ b/ios/chrome/browser/ui/table_view/chrome_table_view_controller_test.mm
@@ -6,6 +6,7 @@
 
 #include "base/check.h"
 #import "base/mac/foundation_util.h"
+#import "ios/chrome/browser/ui/table_view/cells/table_view_info_button_item.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_button_item.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_item.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller.h"
@@ -200,6 +201,29 @@
       expected_state, l10n_util::GetNSString(expected_title_id), section, item);
 }
 
+void ChromeTableViewControllerTest::CheckInfoButtonCellStatusAndText(
+    NSString* expected_status_text,
+    NSString* expected_title,
+    int section,
+    int item) {
+  id info_button_item = base::mac::ObjCCastStrict<TableViewInfoButtonItem>(
+      GetTableViewItem(section, item));
+  EXPECT_TRUE([info_button_item respondsToSelector:@selector(text)]);
+  EXPECT_NSEQ(expected_title, [info_button_item text]);
+  EXPECT_TRUE([info_button_item respondsToSelector:@selector(statusText)]);
+  EXPECT_NSEQ(expected_status_text, [info_button_item statusText]);
+}
+
+void ChromeTableViewControllerTest::
+    CheckInfoButtonCellStatusWithIdAndTextWithId(int expected_status_text_id,
+                                                 int expected_title_id,
+                                                 int section,
+                                                 int item) {
+  CheckInfoButtonCellStatusAndText(
+      l10n_util::GetNSString(expected_status_text_id),
+      l10n_util::GetNSString(expected_title_id), section, item);
+}
+
 void ChromeTableViewControllerTest::CheckAccessoryType(
     UITableViewCellAccessoryType accessory_type,
     int section,
diff --git a/media/gpu/v4l2/test/video_decoder.cc b/media/gpu/v4l2/test/video_decoder.cc
index deaad7db..c86241d 100644
--- a/media/gpu/v4l2/test/video_decoder.cc
+++ b/media/gpu/v4l2/test/video_decoder.cc
@@ -4,11 +4,95 @@
 
 #include "media/gpu/v4l2/test/video_decoder.h"
 
+#include "base/bits.h"
 #include "base/logging.h"
 
 namespace media {
 namespace v4l2_test {
 
+namespace {
+
+// Unpacks an NV12 UV plane into separate U and V planes.
+void UnpackUVPlane(std::vector<char>& dest_u,
+                   std::vector<char>& dest_v,
+                   std::vector<char>& src_uv,
+                   gfx::Size size) {
+  dest_u.reserve(size.GetArea() / 4);
+  dest_v.reserve(size.GetArea() / 4);
+  for (int i = 0; i < size.GetArea() / 4; i++) {
+    dest_u.push_back(src_uv[2 * i]);
+    dest_v.push_back(src_uv[2 * i + 1]);
+  }
+}
+
+// Detiles a single MM21 plane. MM21 is an NV12-like pixel format that is stored
+// in 16x32 tiles in the Y plane and 16x16 tiles in the UV plane (since it's
+// 4:2:0 subsampled, but UV are interlaced). This function converts a single
+// MM21 plane into its equivalent NV12 plane.
+void DetilePlane(std::vector<char>& dest,
+                 char* src,
+                 gfx::Size size,
+                 gfx::Size tile_size) {
+  // Tile size in bytes.
+  const int tile_len = tile_size.GetArea();
+  // |width| rounded down to the nearest multiple of |tile_width|.
+  const int aligned_width =
+      base::bits::AlignDown(size.width(), tile_size.width());
+  // |width| rounded up to the nearest multiple of |tile_width|.
+  const int padded_width = base::bits::AlignUp(size.width(), tile_size.width());
+  // |height| rounded up to the nearest multiple of |tile_height|.
+  const int padded_height =
+      base::bits::AlignUp(size.height(), tile_size.height());
+  // Size of one row of tiles in bytes.
+  const int src_row_size = padded_width * tile_size.height();
+  // Size of the entire coded image.
+  const int coded_image_num_pixels = padded_width * padded_height;
+
+  // Index in bytes to the start of the current tile row.
+  int src_tile_row_start = 0;
+  // Offset in pixels from top of the screen of the current tile row.
+  int y_offset = 0;
+
+  // Iterates over each row of tiles.
+  while (src_tile_row_start < coded_image_num_pixels) {
+    // Maximum relative y-axis value that we should process for the given tile
+    // row. Important for cropping.
+    const int max_in_tile_row_index =
+        size.height() - y_offset < tile_size.height()
+            ? (size.height() - y_offset)
+            : tile_size.height();
+
+    // Offset in bytes into the current tile row to start reading data for the
+    // next pixel row.
+    int src_row_start = 0;
+
+    // Iterates over each row of pixels within the tile row.
+    for (int in_tile_row_index = 0; in_tile_row_index < max_in_tile_row_index;
+         in_tile_row_index++) {
+      int src_index = src_tile_row_start + src_row_start;
+
+      // Iterates over each pixel in the row of pixels.
+      for (int col_index = 0; col_index < aligned_width;
+           col_index += tile_size.width()) {
+        dest.insert(dest.end(), src + src_index,
+                    src + src_index + tile_size.width());
+        src_index += tile_len;
+      }
+      // Finish last partial tile in the row.
+      dest.insert(dest.end(), src + src_index,
+                  src + src_index + size.width() - aligned_width);
+
+      // Shift to the next pixel row in the tile row.
+      src_row_start += tile_size.width();
+    }
+
+    src_tile_row_start += src_row_size;
+    y_offset += tile_size.height();
+  }
+}
+
+}  // namespace
+
 VideoDecoder::VideoDecoder(std::unique_ptr<IvfParser> ivf_parser,
                            std::unique_ptr<V4L2IoctlShim> v4l2_ioctl,
                            std::unique_ptr<V4L2Queue> OUTPUT_queue,
@@ -78,5 +162,29 @@
     LOG(FATAL) << "StreamOn for CAPTURE queue failed.";
 }
 
+void VideoDecoder::ConvertMM21ToYUV(std::vector<char>& dest_y,
+                                    std::vector<char>& dest_u,
+                                    std::vector<char>& dest_v,
+                                    char* src_y,
+                                    char* src_uv,
+                                    gfx::Size size) {
+  // Detile MM21's luma plane.
+  constexpr int kMM21TileWidth = 16;
+  constexpr int kMM21TileHeight = 32;
+  constexpr gfx::Size kYTileSize(kMM21TileWidth, kMM21TileHeight);
+  dest_y.reserve(size.GetArea());
+  DetilePlane(dest_y, src_y, size, kYTileSize);
+
+  // Detile MM21's chroma plane in a temporary |detiled_uv|.
+  std::vector<char> detiled_uv;
+  const gfx::Size uv_size(size.width(), size.height() / 2);
+  constexpr gfx::Size kUVTileSize(kMM21TileWidth, kMM21TileHeight / 2);
+  detiled_uv.reserve(size.GetArea() / 2);
+  DetilePlane(detiled_uv, src_uv, uv_size, kUVTileSize);
+
+  // Unpack NV12's UV plane into separate U and V planes.
+  UnpackUVPlane(dest_u, dest_v, detiled_uv, size);
+}
+
 }  // namespace v4l2_test
 }  // namespace media
diff --git a/media/gpu/v4l2/test/video_decoder.h b/media/gpu/v4l2/test/video_decoder.h
index 4243c0a..abbf3c5a 100644
--- a/media/gpu/v4l2/test/video_decoder.h
+++ b/media/gpu/v4l2/test/video_decoder.h
@@ -46,6 +46,14 @@
   bool LastDecodedFrameVisible() const { return last_decoded_frame_visible_; }
 
  protected:
+  // Helper method for converting MM21 frames to I420.
+  static void ConvertMM21ToYUV(std::vector<char>& dest_y,
+                               std::vector<char>& dest_u,
+                               std::vector<char>& dest_v,
+                               char* src_y,
+                               char* src_uv,
+                               gfx::Size size);
+
   // Parser for the IVF stream to decode.
   const std::unique_ptr<IvfParser> ivf_parser_;
 
diff --git a/media/gpu/v4l2/test/vp9_decoder.cc b/media/gpu/v4l2/test/vp9_decoder.cc
index 6f1139c..010dfa4 100644
--- a/media/gpu/v4l2/test/vp9_decoder.cc
+++ b/media/gpu/v4l2/test/vp9_decoder.cc
@@ -94,109 +94,6 @@
   SafeArrayMemcpy(v4l2_seg->feature_data, vp9_seg_params.feature_data);
 }
 
-// Detiles a single MM21 plane. MM21 is an NV12-like pixel format that is stored
-// in 16x32 tiles in the Y plane and 16x16 tiles in the UV plane (since it's
-// 4:2:0 subsampled, but UV are interlaced). This function converts a single
-// MM21 plane into its equivalent NV12 plane.
-void DetilePlane(std::vector<char>& dest,
-                 char* src,
-                 gfx::Size size,
-                 gfx::Size tile_size) {
-  // Tile size in bytes.
-  const int tile_len = tile_size.GetArea();
-  // |width| rounded down to the nearest multiple of |tile_width|.
-  const int aligned_width =
-      base::bits::AlignDown(size.width(), tile_size.width());
-  // |width| rounded up to the nearest multiple of |tile_width|.
-  const int padded_width = base::bits::AlignUp(size.width(), tile_size.width());
-  // |height| rounded up to the nearest multiple of |tile_height|.
-  const int padded_height =
-      base::bits::AlignUp(size.height(), tile_size.height());
-  // Size of one row of tiles in bytes.
-  const int src_row_size = padded_width * tile_size.height();
-  // Size of the entire coded image.
-  const int coded_image_num_pixels = padded_width * padded_height;
-
-  // Index in bytes to the start of the current tile row.
-  int src_tile_row_start = 0;
-  // Offset in pixels from top of the screen of the current tile row.
-  int y_offset = 0;
-
-  // Iterates over each row of tiles.
-  while (src_tile_row_start < coded_image_num_pixels) {
-    // Maximum relative y-axis value that we should process for the given tile
-    // row. Important for cropping.
-    const int max_in_tile_row_index =
-        size.height() - y_offset < tile_size.height()
-            ? (size.height() - y_offset)
-            : tile_size.height();
-
-    // Offset in bytes into the current tile row to start reading data for the
-    // next pixel row.
-    int src_row_start = 0;
-
-    // Iterates over each row of pixels within the tile row.
-    for (int in_tile_row_index = 0; in_tile_row_index < max_in_tile_row_index;
-         in_tile_row_index++) {
-      int src_index = src_tile_row_start + src_row_start;
-
-      // Iterates over each pixel in the row of pixels.
-      for (int col_index = 0; col_index < aligned_width;
-           col_index += tile_size.width()) {
-        dest.insert(dest.end(), src + src_index,
-                    src + src_index + tile_size.width());
-        src_index += tile_len;
-      }
-      // Finish last partial tile in the row.
-      dest.insert(dest.end(), src + src_index,
-                  src + src_index + size.width() - aligned_width);
-
-      // Shift to the next pixel row in the tile row.
-      src_row_start += tile_size.width();
-    }
-
-    src_tile_row_start += src_row_size;
-    y_offset += tile_size.height();
-  }
-}
-
-// Unpacks an NV12 UV plane into separate U and V planes.
-void UnpackUVPlane(std::vector<char>& dest_u,
-                   std::vector<char>& dest_v,
-                   std::vector<char>& src_uv,
-                   gfx::Size size) {
-  dest_u.reserve(size.GetArea() / 4);
-  dest_v.reserve(size.GetArea() / 4);
-  for (int i = 0; i < size.GetArea() / 4; i++) {
-    dest_u.push_back(src_uv[2 * i]);
-    dest_v.push_back(src_uv[2 * i + 1]);
-  }
-}
-
-void ConvertMM21ToYUV(std::vector<char>& dest_y,
-                      std::vector<char>& dest_u,
-                      std::vector<char>& dest_v,
-                      char* src_y,
-                      char* src_uv,
-                      gfx::Size size) {
-  // Detile MM21's luma plane.
-  constexpr int kMM21TileWidth = 16;
-  constexpr int kMM21TileHeight = 32;
-  constexpr gfx::Size kYTileSize(kMM21TileWidth, kMM21TileHeight);
-  dest_y.reserve(size.GetArea());
-  DetilePlane(dest_y, src_y, size, kYTileSize);
-
-  // Detile MM21's chroma plane in a temporary |detiled_uv|.
-  std::vector<char> detiled_uv;
-  const gfx::Size uv_size(size.width(), size.height() / 2);
-  constexpr gfx::Size kUVTileSize(kMM21TileWidth, kMM21TileHeight / 2);
-  detiled_uv.reserve(size.GetArea() / 2);
-  DetilePlane(detiled_uv, src_uv, uv_size, kUVTileSize);
-
-  // Unpack NV12's UV plane into separate U and V planes.
-  UnpackUVPlane(dest_u, dest_v, detiled_uv, size);
-}
-
 // TODO(b/228876644): assert that |parsing_compressed_header| is indeed false.
 Vp9Decoder::Vp9Decoder(std::unique_ptr<IvfParser> ivf_parser,
                        std::unique_ptr<V4L2IoctlShim> v4l2_ioctl,
diff --git a/mojo/core/dispatcher.h b/mojo/core/dispatcher.h
index 7dd7fe4f..9d05fb7 100644
--- a/mojo/core/dispatcher.h
+++ b/mojo/core/dispatcher.h
@@ -51,7 +51,7 @@
 class MOJO_SYSTEM_IMPL_EXPORT Dispatcher
     : public base::RefCountedThreadSafe<Dispatcher> {
  public:
-  struct DispatcherInTransit {
+  struct MOJO_SYSTEM_IMPL_EXPORT DispatcherInTransit {
     DispatcherInTransit();
     DispatcherInTransit(const DispatcherInTransit& other);
     ~DispatcherInTransit();
diff --git a/mojo/core/handle_table_unittest.cc b/mojo/core/handle_table_unittest.cc
index 75edb11..c0c0d74 100644
--- a/mojo/core/handle_table_unittest.cc
+++ b/mojo/core/handle_table_unittest.cc
@@ -16,15 +16,19 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 using base::trace_event::MemoryAllocatorDump;
+using testing::ByRef;
 using testing::Contains;
 using testing::Eq;
-using testing::Contains;
-using testing::ByRef;
 
 namespace mojo {
 namespace core {
 namespace {
 
+using ::testing::IsNull;
+using ::testing::Ne;
+using ::testing::NotNull;
+using ::testing::SizeIs;
+
 class FakeMessagePipeDispatcher : public Dispatcher {
  public:
   FakeMessagePipeDispatcher() = default;
@@ -54,6 +58,228 @@
 
 }  // namespace
 
+TEST(HandleTableTest, GetInvalidDispatcher) {
+  HandleTable handle_table;
+  const base::AutoLock auto_lock(handle_table.GetLock());
+  EXPECT_THAT(handle_table.GetDispatcher(MojoHandle(2)), IsNull());
+}
+
+TEST(HandleTableTest, GetDispatcher) {
+  const scoped_refptr<Dispatcher> dispatcher(new FakeMessagePipeDispatcher);
+
+  HandleTable handle_table;
+  const base::AutoLock auto_lock(handle_table.GetLock());
+
+  const MojoHandle handle = handle_table.AddDispatcher(dispatcher);
+  ASSERT_THAT(handle, Ne(MOJO_HANDLE_INVALID));
+  EXPECT_THAT(handle_table.GetDispatcher(handle), Eq(dispatcher));
+}
+
+TEST(HandleTableTest, AddAndGetDispatchers) {
+  const scoped_refptr<Dispatcher> one(new FakeMessagePipeDispatcher);
+  const scoped_refptr<Dispatcher> two(new FakeMessagePipeDispatcher);
+  const scoped_refptr<Dispatcher> three(new FakeMessagePipeDispatcher);
+
+  HandleTable handle_table;
+  const base::AutoLock auto_lock(handle_table.GetLock());
+
+  const MojoHandle one_handle = handle_table.AddDispatcher(one);
+  ASSERT_THAT(one_handle, Ne(MOJO_HANDLE_INVALID));
+  EXPECT_THAT(handle_table.GetDispatcher(one_handle), Eq(one));
+
+  const MojoHandle two_handle = handle_table.AddDispatcher(two);
+  ASSERT_THAT(two_handle, Ne(MOJO_HANDLE_INVALID));
+  EXPECT_THAT(handle_table.GetDispatcher(two_handle), Eq(two));
+
+  const MojoHandle three_handle = handle_table.AddDispatcher(three);
+  ASSERT_THAT(three_handle, Ne(MOJO_HANDLE_INVALID));
+  EXPECT_THAT(handle_table.GetDispatcher(three_handle), Eq(three));
+
+  EXPECT_THAT(handle_table.GetDispatcher(one_handle), Eq(one));
+  EXPECT_THAT(handle_table.GetDispatcher(two_handle), Eq(two));
+  EXPECT_THAT(handle_table.GetDispatcher(three_handle), Eq(three));
+}
+
+TEST(HandleTableTest, GetAndRemoveInvalidDispatcher) {
+  HandleTable handle_table;
+  const base::AutoLock auto_lock(handle_table.GetLock());
+
+  scoped_refptr<Dispatcher> dispatcher;
+  EXPECT_THAT(handle_table.GetAndRemoveDispatcher(MojoHandle(2), &dispatcher),
+              Eq(MOJO_RESULT_INVALID_ARGUMENT));
+  EXPECT_THAT(dispatcher, IsNull());
+}
+
+TEST(HandleTableTest, GetAndRemoveDispatchers) {
+  const scoped_refptr<Dispatcher> one(new FakeMessagePipeDispatcher);
+  const scoped_refptr<Dispatcher> two(new FakeMessagePipeDispatcher);
+  const scoped_refptr<Dispatcher> three(new FakeMessagePipeDispatcher);
+
+  HandleTable handle_table;
+  const base::AutoLock auto_lock(handle_table.GetLock());
+
+  const MojoHandle one_handle = handle_table.AddDispatcher(one);
+  const MojoHandle two_handle = handle_table.AddDispatcher(two);
+  const MojoHandle three_handle = handle_table.AddDispatcher(three);
+  EXPECT_THAT(handle_table.GetDispatcher(one_handle), Eq(one));
+  EXPECT_THAT(handle_table.GetDispatcher(two_handle), Eq(two));
+  EXPECT_THAT(handle_table.GetDispatcher(three_handle), Eq(three));
+
+  scoped_refptr<Dispatcher> dispatcher;
+  EXPECT_THAT(handle_table.GetAndRemoveDispatcher(three_handle, &dispatcher),
+              Eq(MOJO_RESULT_OK));
+  EXPECT_THAT(dispatcher, NotNull());
+  EXPECT_THAT(handle_table.GetDispatcher(three_handle), IsNull());
+
+  dispatcher.reset();
+  EXPECT_THAT(handle_table.GetAndRemoveDispatcher(two_handle, &dispatcher),
+              Eq(MOJO_RESULT_OK));
+  EXPECT_THAT(dispatcher, NotNull());
+  EXPECT_THAT(handle_table.GetDispatcher(two_handle), IsNull());
+
+  dispatcher.reset();
+  EXPECT_THAT(handle_table.GetAndRemoveDispatcher(one_handle, &dispatcher),
+              Eq(MOJO_RESULT_OK));
+  EXPECT_THAT(dispatcher, NotNull());
+  EXPECT_THAT(handle_table.GetDispatcher(one_handle), IsNull());
+}
+
+TEST(HandleTableTest, GetAndRemoveDispatcherInTransit) {
+  const scoped_refptr<Dispatcher> one(new FakeMessagePipeDispatcher);
+  const scoped_refptr<Dispatcher> two(new FakeMessagePipeDispatcher);
+  const scoped_refptr<Dispatcher> three(new FakeMessagePipeDispatcher);
+
+  HandleTable handle_table;
+  const base::AutoLock auto_lock(handle_table.GetLock());
+
+  const MojoHandle one_handle = handle_table.AddDispatcher(one);
+  const MojoHandle two_handle = handle_table.AddDispatcher(two);
+  const MojoHandle three_handle = handle_table.AddDispatcher(three);
+  const MojoHandle handles[] = {one_handle, two_handle, three_handle};
+
+  std::vector<Dispatcher::DispatcherInTransit> dispatchers_in_transit;
+  // Leave out the last handle.
+  EXPECT_THAT(
+      handle_table.BeginTransit(handles,
+                                /*num_handles=*/2, &dispatchers_in_transit),
+      Eq(MOJO_RESULT_OK));
+  EXPECT_THAT(dispatchers_in_transit, SizeIs(2));
+
+  scoped_refptr<Dispatcher> dispatcher;
+  EXPECT_THAT(handle_table.GetAndRemoveDispatcher(three_handle, &dispatcher),
+              Eq(MOJO_RESULT_OK));
+  EXPECT_THAT(dispatcher, NotNull());
+  EXPECT_THAT(handle_table.GetDispatcher(three_handle), IsNull());
+
+  dispatcher.reset();
+  EXPECT_THAT(handle_table.GetAndRemoveDispatcher(two_handle, &dispatcher),
+              Eq(MOJO_RESULT_BUSY));
+  EXPECT_THAT(dispatcher, IsNull());
+  EXPECT_THAT(handle_table.GetDispatcher(two_handle), NotNull());
+
+  dispatcher.reset();
+  EXPECT_THAT(handle_table.GetAndRemoveDispatcher(one_handle, &dispatcher),
+              Eq(MOJO_RESULT_BUSY));
+  EXPECT_THAT(dispatcher, IsNull());
+  EXPECT_THAT(handle_table.GetDispatcher(one_handle), NotNull());
+}
+
+TEST(HandleTableTest, InvalidExtraBeginTransit) {
+  const scoped_refptr<Dispatcher> one(new FakeMessagePipeDispatcher);
+  const scoped_refptr<Dispatcher> two(new FakeMessagePipeDispatcher);
+  const scoped_refptr<Dispatcher> three(new FakeMessagePipeDispatcher);
+
+  HandleTable handle_table;
+  const base::AutoLock auto_lock(handle_table.GetLock());
+
+  const MojoHandle one_handle = handle_table.AddDispatcher(one);
+  const MojoHandle two_handle = handle_table.AddDispatcher(two);
+  const MojoHandle three_handle = handle_table.AddDispatcher(three);
+  const MojoHandle handles[] = {one_handle, two_handle, three_handle};
+
+  std::vector<Dispatcher::DispatcherInTransit> dispatchers_in_transit;
+  // Leave out the first handle.
+  EXPECT_THAT(
+      handle_table.BeginTransit(handles + 1,
+                                /*num_handles=*/2, &dispatchers_in_transit),
+      Eq(MOJO_RESULT_OK));
+  EXPECT_THAT(dispatchers_in_transit, SizeIs(2));
+
+  dispatchers_in_transit.clear();
+  EXPECT_THAT(
+      handle_table.BeginTransit(handles,
+                                /*num_handles=*/3, &dispatchers_in_transit),
+      Eq(MOJO_RESULT_BUSY));
+  EXPECT_THAT(dispatchers_in_transit, SizeIs(1));
+}
+
+TEST(HandleTableTest, CompleteTransitAndClose) {
+  const scoped_refptr<Dispatcher> one(new FakeMessagePipeDispatcher);
+  const scoped_refptr<Dispatcher> two(new FakeMessagePipeDispatcher);
+  const scoped_refptr<Dispatcher> three(new FakeMessagePipeDispatcher);
+
+  HandleTable handle_table;
+  const base::AutoLock auto_lock(handle_table.GetLock());
+
+  const MojoHandle one_handle = handle_table.AddDispatcher(one);
+  const MojoHandle two_handle = handle_table.AddDispatcher(two);
+  const MojoHandle three_handle = handle_table.AddDispatcher(three);
+  const MojoHandle handles[] = {one_handle, two_handle, three_handle};
+
+  std::vector<Dispatcher::DispatcherInTransit> dispatchers_in_transit;
+  EXPECT_THAT(
+      handle_table.BeginTransit(handles,
+                                /*num_handles=*/3, &dispatchers_in_transit),
+      Eq(MOJO_RESULT_OK));
+  EXPECT_THAT(dispatchers_in_transit, SizeIs(3));
+
+  handle_table.CompleteTransitAndClose(dispatchers_in_transit);
+  EXPECT_THAT(handle_table.GetDispatcher(three_handle), IsNull());
+  EXPECT_THAT(handle_table.GetDispatcher(two_handle), IsNull());
+  EXPECT_THAT(handle_table.GetDispatcher(one_handle), IsNull());
+}
+
+TEST(HandleTableTest, CancelTransit) {
+  const scoped_refptr<Dispatcher> one(new FakeMessagePipeDispatcher);
+  const scoped_refptr<Dispatcher> two(new FakeMessagePipeDispatcher);
+  const scoped_refptr<Dispatcher> three(new FakeMessagePipeDispatcher);
+
+  HandleTable handle_table;
+  const base::AutoLock auto_lock(handle_table.GetLock());
+
+  const MojoHandle one_handle = handle_table.AddDispatcher(one);
+  const MojoHandle two_handle = handle_table.AddDispatcher(two);
+  const MojoHandle three_handle = handle_table.AddDispatcher(three);
+  const MojoHandle handles[] = {one_handle, two_handle, three_handle};
+
+  std::vector<Dispatcher::DispatcherInTransit> dispatchers_in_transit;
+  EXPECT_THAT(
+      handle_table.BeginTransit(handles,
+                                /*num_handles=*/3, &dispatchers_in_transit),
+      Eq(MOJO_RESULT_OK));
+  EXPECT_THAT(dispatchers_in_transit, SizeIs(3));
+
+  handle_table.CancelTransit(dispatchers_in_transit);
+
+  scoped_refptr<Dispatcher> dispatcher;
+  EXPECT_THAT(handle_table.GetAndRemoveDispatcher(three_handle, &dispatcher),
+              Eq(MOJO_RESULT_OK));
+  EXPECT_THAT(dispatcher, NotNull());
+  EXPECT_THAT(handle_table.GetDispatcher(three_handle), IsNull());
+
+  dispatcher.reset();
+  EXPECT_THAT(handle_table.GetAndRemoveDispatcher(two_handle, &dispatcher),
+              Eq(MOJO_RESULT_OK));
+  EXPECT_THAT(dispatcher, NotNull());
+  EXPECT_THAT(handle_table.GetDispatcher(two_handle), IsNull());
+
+  dispatcher.reset();
+  EXPECT_THAT(handle_table.GetAndRemoveDispatcher(one_handle, &dispatcher),
+              Eq(MOJO_RESULT_OK));
+  EXPECT_THAT(dispatcher, NotNull());
+  EXPECT_THAT(handle_table.GetDispatcher(one_handle), IsNull());
+}
+
 TEST(HandleTableTest, OnMemoryDump) {
   HandleTable ht;
 
diff --git a/remoting/codec/webrtc_video_encoder_av1.cc b/remoting/codec/webrtc_video_encoder_av1.cc
index b537c94..c4455c0 100644
--- a/remoting/codec/webrtc_video_encoder_av1.cc
+++ b/remoting/codec/webrtc_video_encoder_av1.cc
@@ -79,9 +79,8 @@
   }
 
   // The param for the tile column control is a log2 value so 0 is ok.
-  error =
-      aom_codec_control(codec.get(), AV1E_SET_TILE_COLUMNS,
-                        std::min(static_cast<int>(config_.g_threads >> 1), 6));
+  error = aom_codec_control(codec.get(), AV1E_SET_TILE_COLUMNS,
+                            static_cast<int>(std::log2(config_.g_threads)));
   DCHECK_EQ(error, AOM_CODEC_OK) << "Failed to set AV1E_SET_TILE_COLUMNS";
 
   // TODO(joedow): Experiment with AV1E_SET_TILE_ROWS. Note that the total
@@ -228,7 +227,8 @@
   config_.g_error_resilient = 0;
   config_.g_timebase.num = 1;
   config_.g_timebase.den = base::Time::kMicrosecondsPerSecond;
-  config_.g_threads = (base::SysInfo::NumberOfProcessors() + 1) / 2;
+  config_.g_threads =
+      std::min(((base::SysInfo::NumberOfProcessors() + 1) / 2), 8);
 
   config_.kf_mode = AOM_KF_DISABLED;
 
diff --git a/services/metrics/ukm_api.md b/services/metrics/ukm_api.md
index db484fe..1a8feee 100644
--- a/services/metrics/ukm_api.md
+++ b/services/metrics/ukm_api.md
@@ -61,7 +61,7 @@
 [`tools/metrics/ukm/ukm.xml`](https://cs.chromium.org/chromium/src/tools/metrics/ukm/ukm.xml)
 file in the Chromium codebase. To have a metric aggregated, `<history>`,
 `<aggregation>` and `<statistics>` tags need to be added along with the type of
-statistic to be generated..
+statistic to be generated.
 
 ```xml
 <event name="Goat.Teleported">
@@ -175,7 +175,7 @@
 
 ### Get A ukm::SourceId
 
-UKM identifies navigations by their source ID and you'll need to associate an ID with your event in order to tie it to a main frame URL.  Preferably, get an existing ID for the navigation from another object.
+UKM identifies navigations by their source ID and you'll need to associate an ID with your event in order to tie it to a main frame URL. Preferably, get an existing ID for the navigation from another object.
 
 Prefer using `ukm::SourceId` if only the underlying int64 value is required to identify a source and is used in Mojo interface, and no type conversion needs to be performed. If additional source type information is needed, `ukm::SourceIdObj` can be used.
 
@@ -269,16 +269,16 @@
   <summary>
     Recorded when a page uses on of a list of known web frameworks. This records various performance measurements.
   </summary>
- <metric name="WebFramework" enum="WebFrameworkName">
+  <metric name="WebFramework" enum="WebFrameworkName">
     <summary>
       Web Framework used.
-   </summary>
- </metric>
- <metric name="FrameworkLoadInMs">
+    </summary>
+  </metric>
+  <metric name="FrameworkLoadInMs">
     <summary>
       Time to load the framework in milliseconds.
-   </summary>
- </metric>
+    </summary>
+  </metric>
 </event>
 ```
 
@@ -286,10 +286,10 @@
 
 ```xml
 <enum name="WebFrameworkName">
- <int value="0" label="Unknown"/>
- <int value="1" label="WebFramework1"/>
- <int value="1" label="WebFramework2"/>
-…
+  <int value="0" label="Unknown"/>
+  <int value="1" label="WebFramework1"/>
+  <int value="1" label="WebFramework2"/>
+  ...
 </enum>
 ```
 
diff --git a/services/network/cookie_access_delegate_impl.cc b/services/network/cookie_access_delegate_impl.cc
index e264b93b..e58d9a8 100644
--- a/services/network/cookie_access_delegate_impl.cc
+++ b/services/network/cookie_access_delegate_impl.cc
@@ -13,8 +13,6 @@
 #include "net/cookies/cookie_constants.h"
 #include "net/cookies/cookie_util.h"
 #include "net/cookies/first_party_set_metadata.h"
-#include "services/network/first_party_sets/first_party_sets_context_config.h"
-#include "services/network/first_party_sets/first_party_sets_manager.h"
 #include "services/network/public/cpp/is_potentially_trustworthy.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -22,16 +20,11 @@
 
 CookieAccessDelegateImpl::CookieAccessDelegateImpl(
     mojom::CookieAccessDelegateType type,
-    FirstPartySetsManager* const first_party_sets_manager,
+    FirstPartySetsAccessDelegate* const first_party_sets_access_delegate,
     const CookieSettings* cookie_settings)
     : type_(type),
       cookie_settings_(cookie_settings),
-      first_party_sets_manager_(first_party_sets_manager),
-      // TODO(crbug.com/1325050): Will be replaced in a follow up change.
-      // Currently have context config set to true to maintain the existing
-      // behavior.
-      first_party_sets_context_config_(
-          FirstPartySetsContextConfig(/*enabled=*/true)) {
+      first_party_sets_access_delegate_(first_party_sets_access_delegate) {
   if (type == mojom::CookieAccessDelegateType::USE_CONTENT_SETTINGS) {
     DCHECK(cookie_settings);
   }
@@ -73,45 +66,43 @@
     const net::SchemefulSite* top_frame_site,
     const std::set<net::SchemefulSite>& party_context,
     base::OnceCallback<void(net::FirstPartySetMetadata)> callback) const {
-  if (!first_party_sets_manager_)
+  if (!first_party_sets_access_delegate_)
     return {net::FirstPartySetMetadata()};
-  return first_party_sets_manager_->ComputeMetadata(
-      site, top_frame_site, party_context, first_party_sets_context_config_,
-      std::move(callback));
+  return first_party_sets_access_delegate_->ComputeMetadata(
+      site, top_frame_site, party_context, std::move(callback));
 }
 
-absl::optional<FirstPartySetsManager::OwnerResult>
+absl::optional<FirstPartySetsAccessDelegate::OwnerResult>
 CookieAccessDelegateImpl::FindFirstPartySetOwner(
     const net::SchemefulSite& site,
     base::OnceCallback<void(FirstPartySetsManager::OwnerResult)> callback)
     const {
-  if (!first_party_sets_manager_) {
+  if (!first_party_sets_access_delegate_) {
     return absl::make_optional<FirstPartySetsManager::OwnerResult>(
         absl::nullopt);
   }
-  return first_party_sets_manager_->FindOwner(
-      site, first_party_sets_context_config_, std::move(callback));
+  return first_party_sets_access_delegate_->FindOwner(site,
+                                                      std::move(callback));
 }
 
-absl::optional<FirstPartySetsManager::OwnersResult>
+absl::optional<FirstPartySetsAccessDelegate::OwnersResult>
 CookieAccessDelegateImpl::FindFirstPartySetOwners(
     const base::flat_set<net::SchemefulSite>& sites,
-    base::OnceCallback<void(FirstPartySetsManager::OwnersResult)> callback)
-    const {
-  if (!first_party_sets_manager_)
+    base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnersResult)>
+        callback) const {
+  if (!first_party_sets_access_delegate_)
     return {{}};
-  return first_party_sets_manager_->FindOwners(
-      sites, first_party_sets_context_config_, std::move(callback));
+  return first_party_sets_access_delegate_->FindOwners(sites,
+                                                       std::move(callback));
 }
 
-absl::optional<FirstPartySetsManager::SetsByOwner>
+absl::optional<FirstPartySetsAccessDelegate::SetsByOwner>
 CookieAccessDelegateImpl::RetrieveFirstPartySets(
-    base::OnceCallback<void(FirstPartySetsManager::SetsByOwner)> callback)
-    const {
-  if (!first_party_sets_manager_)
+    base::OnceCallback<void(FirstPartySetsAccessDelegate::SetsByOwner)>
+        callback) const {
+  if (!first_party_sets_access_delegate_)
     return {{}};
-  return first_party_sets_manager_->Sets(first_party_sets_context_config_,
-                                         std::move(callback));
+  return first_party_sets_access_delegate_->Sets(std::move(callback));
 }
 
 }  // namespace network
diff --git a/services/network/cookie_access_delegate_impl.h b/services/network/cookie_access_delegate_impl.h
index db47b40..15461367 100644
--- a/services/network/cookie_access_delegate_impl.h
+++ b/services/network/cookie_access_delegate_impl.h
@@ -17,7 +17,7 @@
 #include "net/cookies/cookie_constants.h"
 #include "net/cookies/first_party_set_metadata.h"
 #include "services/network/cookie_settings.h"
-#include "services/network/first_party_sets/first_party_sets_manager.h"
+#include "services/network/first_party_sets/first_party_sets_access_delegate.h"
 #include "services/network/public/mojom/cookie_manager.mojom.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
@@ -40,10 +40,10 @@
   // expected. |cookie_settings| contains the set of content settings that
   // describes which cookies should be subject to legacy access rules.
   // If non-null, |cookie_settings| is expected to outlive this class. If
-  // non-null, `first_party_sets_manager` must outlive `this`.
+  // non-null, `first_party_sets_access_delegate` must outlive `this`.
   CookieAccessDelegateImpl(
       mojom::CookieAccessDelegateType type,
-      FirstPartySetsManager* const first_party_sets_manager,
+      FirstPartySetsAccessDelegate* const first_party_sets_access_delegate,
       const CookieSettings* cookie_settings = nullptr);
 
   ~CookieAccessDelegateImpl() override;
@@ -62,26 +62,25 @@
       const std::set<net::SchemefulSite>& party_context,
       base::OnceCallback<void(net::FirstPartySetMetadata)> callback)
       const override;
-  [[nodiscard]] absl::optional<FirstPartySetsManager::OwnerResult>
+  [[nodiscard]] absl::optional<FirstPartySetsAccessDelegate::OwnerResult>
   FindFirstPartySetOwner(
       const net::SchemefulSite& site,
-      base::OnceCallback<void(FirstPartySetsManager::OwnerResult)> callback)
-      const override;
-  [[nodiscard]] absl::optional<FirstPartySetsManager::OwnersResult>
+      base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnerResult)>
+          callback) const override;
+  [[nodiscard]] absl::optional<FirstPartySetsAccessDelegate::OwnersResult>
   FindFirstPartySetOwners(
       const base::flat_set<net::SchemefulSite>& sites,
-      base::OnceCallback<void(FirstPartySetsManager::OwnersResult)> callback)
-      const override;
-  [[nodiscard]] absl::optional<FirstPartySetsManager::SetsByOwner>
+      base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnersResult)>
+          callback) const override;
+  [[nodiscard]] absl::optional<FirstPartySetsAccessDelegate::SetsByOwner>
   RetrieveFirstPartySets(
-      base::OnceCallback<void(FirstPartySetsManager::SetsByOwner)> callback)
-      const override;
+      base::OnceCallback<void(FirstPartySetsAccessDelegate::SetsByOwner)>
+          callback) const override;
 
  private:
   const mojom::CookieAccessDelegateType type_;
   const raw_ptr<const CookieSettings> cookie_settings_;
-  const raw_ptr<FirstPartySetsManager> first_party_sets_manager_;
-  const FirstPartySetsContextConfig first_party_sets_context_config_;
+  const raw_ptr<FirstPartySetsAccessDelegate> first_party_sets_access_delegate_;
 };
 
 }  // namespace network
diff --git a/services/network/cookie_manager.cc b/services/network/cookie_manager.cc
index 5778b0c..77c0984 100644
--- a/services/network/cookie_manager.cc
+++ b/services/network/cookie_manager.cc
@@ -52,7 +52,7 @@
 
 CookieManager::CookieManager(
     net::URLRequestContext* url_request_context,
-    FirstPartySetsManager* const first_party_sets_manager,
+    FirstPartySetsAccessDelegate* const first_party_sets_access_delegate,
     scoped_refptr<SessionCleanupCookieStore> session_cleanup_cookie_store,
     mojom::CookieManagerParamsPtr params)
     : cookie_store_(url_request_context->cookie_store()),
@@ -67,9 +67,9 @@
                            base::DoNothing());
   }
   cookie_store_->SetCookieAccessDelegate(
-      std::make_unique<CookieAccessDelegateImpl>(cookie_access_delegate_type,
-                                                 first_party_sets_manager,
-                                                 &cookie_settings_));
+      std::make_unique<CookieAccessDelegateImpl>(
+          cookie_access_delegate_type, first_party_sets_access_delegate,
+          &cookie_settings_));
 }
 
 CookieManager::~CookieManager() {
diff --git a/services/network/cookie_manager.h b/services/network/cookie_manager.h
index 8e808d64..360f8092 100644
--- a/services/network/cookie_manager.h
+++ b/services/network/cookie_manager.h
@@ -29,7 +29,7 @@
 class GURL;
 
 namespace network {
-class FirstPartySetsManager;
+class FirstPartySetsAccessDelegate;
 class SessionCleanupCookieStore;
 
 // Wrap a cookie store in an implementation of the mojo cookie interface.
@@ -38,11 +38,11 @@
  public:
   // Construct a CookieService that can serve mojo requests for the underlying
   // cookie store.  |url_request_context->cookie_store()| must outlive this
-  // object. `*first_party_sets_manager` must outlive
+  // object. `*first_party_sets_access_delegate` must outlive
   // `url_request_context->cookie_store()`.
   CookieManager(
       net::URLRequestContext* url_request_context,
-      FirstPartySetsManager* const first_party_sets_manager,
+      FirstPartySetsAccessDelegate* const first_party_sets_access_delegate,
       scoped_refptr<SessionCleanupCookieStore> session_cleanup_cookie_store,
       mojom::CookieManagerParamsPtr params);
 
diff --git a/services/network/first_party_sets/BUILD.gn b/services/network/first_party_sets/BUILD.gn
index 619e547..094e9899 100644
--- a/services/network/first_party_sets/BUILD.gn
+++ b/services/network/first_party_sets/BUILD.gn
@@ -14,6 +14,8 @@
   defines = [ "IS_NETWORK_SERVICE_IMPL" ]
 
   sources = [
+    "first_party_sets_access_delegate.cc",
+    "first_party_sets_access_delegate.h",
     "first_party_sets_context_config.cc",
     "first_party_sets_context_config.h",
     "first_party_sets_manager.cc",
@@ -57,7 +59,10 @@
 
   defines = [ "IS_NETWORK_SERVICE_IMPL" ]
 
-  sources = [ "first_party_sets_manager_unittest.cc" ]
+  sources = [
+    "first_party_sets_access_delegate_unittest.cc",
+    "first_party_sets_manager_unittest.cc",
+  ]
 
   deps = [
     ":first_party_sets_manager",
diff --git a/services/network/first_party_sets/first_party_sets_access_delegate.cc b/services/network/first_party_sets/first_party_sets_access_delegate.cc
new file mode 100644
index 0000000..8da6112b
--- /dev/null
+++ b/services/network/first_party_sets/first_party_sets_access_delegate.cc
@@ -0,0 +1,209 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/network/first_party_sets/first_party_sets_access_delegate.h"
+
+#include <utility>
+
+#include "net/base/schemeful_site.h"
+#include "net/cookies/first_party_set_metadata.h"
+
+namespace network {
+
+namespace {
+
+bool IsEnabled(const mojom::FirstPartySetsAccessDelegateParamsPtr& params) {
+  return params.is_null() || params->enabled;
+}
+
+}  // namespace
+
+FirstPartySetsAccessDelegate::FirstPartySetsAccessDelegate(
+    mojo::PendingReceiver<mojom::FirstPartySetsAccessDelegate> receiver,
+    mojom::FirstPartySetsAccessDelegateParamsPtr params,
+    FirstPartySetsManager* const manager)
+    : manager_(manager),
+      context_config_(FirstPartySetsContextConfig(IsEnabled(params))),
+      pending_queries_(
+          IsEnabled(params) && receiver.is_valid() && manager_->is_enabled()
+              ? std::make_unique<base::circular_deque<base::OnceClosure>>()
+              : nullptr) {
+  if (receiver.is_valid())
+    receiver_.Bind(std::move(receiver));
+}
+
+FirstPartySetsAccessDelegate::~FirstPartySetsAccessDelegate() = default;
+
+void FirstPartySetsAccessDelegate::NotifyReady() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  InvokePendingQueries();
+}
+
+absl::optional<net::FirstPartySetMetadata>
+FirstPartySetsAccessDelegate::ComputeMetadata(
+    const net::SchemefulSite& site,
+    const net::SchemefulSite* top_frame_site,
+    const std::set<net::SchemefulSite>& party_context,
+    base::OnceCallback<void(net::FirstPartySetMetadata)> callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (pending_queries_) {
+    // base::Unretained() is safe because `this` owns `pending_queries_` and
+    // `pending_queries_` will not run the enqueued callbacks after `this` is
+    // destroyed.
+    EnqueuePendingQuery(
+        base::BindOnce(&FirstPartySetsAccessDelegate::ComputeMetadataAndInvoke,
+                       base::Unretained(this), site, top_frame_site,
+                       party_context, std::move(callback)));
+    return absl::nullopt;
+  }
+
+  return manager_->ComputeMetadata(site, top_frame_site, party_context,
+                                   context_config_, std::move(callback));
+}
+
+absl::optional<FirstPartySetsAccessDelegate::SetsByOwner>
+FirstPartySetsAccessDelegate::Sets(
+    base::OnceCallback<void(FirstPartySetsAccessDelegate::SetsByOwner)>
+        callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (pending_queries_) {
+    // base::Unretained() is safe because `this` owns `pending_queries_` and
+    // `pending_queries_` will not run the enqueued callbacks after `this` is
+    // destroyed.
+    EnqueuePendingQuery(
+        base::BindOnce(&FirstPartySetsAccessDelegate::SetsAndInvoke,
+                       base::Unretained(this), std::move(callback)));
+    return absl::nullopt;
+  }
+
+  return manager_->Sets(context_config_, std::move(callback));
+}
+
+absl::optional<FirstPartySetsAccessDelegate::OwnerResult>
+FirstPartySetsAccessDelegate::FindOwner(
+    const net::SchemefulSite& site,
+    base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnerResult)>
+        callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (pending_queries_) {
+    // base::Unretained() is safe because `this` owns `pending_queries_` and
+    // `pending_queries_` will not run the enqueued callbacks after `this` is
+    // destroyed.
+    EnqueuePendingQuery(
+        base::BindOnce(&FirstPartySetsAccessDelegate::FindOwnerAndInvoke,
+                       base::Unretained(this), site, std::move(callback)));
+    return absl::nullopt;
+  }
+
+  return manager_->FindOwner(site, context_config_, std::move(callback));
+}
+
+absl::optional<FirstPartySetsAccessDelegate::OwnersResult>
+FirstPartySetsAccessDelegate::FindOwners(
+    const base::flat_set<net::SchemefulSite>& sites,
+    base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnersResult)>
+        callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (pending_queries_) {
+    // base::Unretained() is safe because `this` owns `pending_queries_` and
+    // `pending_queries_` will not run the enqueued callbacks after `this` is
+    // destroyed.
+    EnqueuePendingQuery(
+        base::BindOnce(&FirstPartySetsAccessDelegate::FindOwnersAndInvoke,
+                       base::Unretained(this), sites, std::move(callback)));
+    return absl::nullopt;
+  }
+
+  return manager_->FindOwners(sites, context_config_, std::move(callback));
+}
+
+void FirstPartySetsAccessDelegate::ComputeMetadataAndInvoke(
+    const net::SchemefulSite& site,
+    const net::SchemefulSite* top_frame_site,
+    const std::set<net::SchemefulSite>& party_context,
+    base::OnceCallback<void(net::FirstPartySetMetadata)> callback) const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  std::pair<base::OnceCallback<void(net::FirstPartySetMetadata)>,
+            base::OnceCallback<void(net::FirstPartySetMetadata)>>
+      callbacks = base::SplitOnceCallback(std::move(callback));
+
+  absl::optional<net::FirstPartySetMetadata> sync_result =
+      manager_->ComputeMetadata(site, top_frame_site, party_context,
+                                context_config_, std::move(callbacks.first));
+
+  if (sync_result.has_value())
+    std::move(callbacks.second).Run(std::move(sync_result.value()));
+}
+
+void FirstPartySetsAccessDelegate::SetsAndInvoke(
+    base::OnceCallback<void(FirstPartySetsAccessDelegate::SetsByOwner)>
+        callback) const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  std::pair<base::OnceCallback<void(FirstPartySetsAccessDelegate::SetsByOwner)>,
+            base::OnceCallback<void(FirstPartySetsAccessDelegate::SetsByOwner)>>
+      callbacks = base::SplitOnceCallback(std::move(callback));
+
+  absl::optional<FirstPartySetsAccessDelegate::SetsByOwner> sync_result =
+      manager_->Sets(context_config_, std::move(callbacks.first));
+
+  if (sync_result.has_value())
+    std::move(callbacks.second).Run(std::move(sync_result.value()));
+}
+
+void FirstPartySetsAccessDelegate::FindOwnerAndInvoke(
+    const net::SchemefulSite& site,
+    base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnerResult)>
+        callback) const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  std::pair<base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnerResult)>,
+            base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnerResult)>>
+      callbacks = base::SplitOnceCallback(std::move(callback));
+
+  absl::optional<FirstPartySetsAccessDelegate::OwnerResult> sync_result =
+      manager_->FindOwner(site, context_config_, std::move(callbacks.first));
+
+  if (sync_result.has_value())
+    std::move(callbacks.second).Run(sync_result.value());
+}
+
+void FirstPartySetsAccessDelegate::FindOwnersAndInvoke(
+    const base::flat_set<net::SchemefulSite>& sites,
+    base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnersResult)>
+        callback) const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  std::pair<
+      base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnersResult)>,
+      base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnersResult)>>
+      callbacks = base::SplitOnceCallback(std::move(callback));
+
+  absl::optional<FirstPartySetsAccessDelegate::OwnersResult> sync_result =
+      manager_->FindOwners(sites, context_config_, std::move(callbacks.first));
+
+  if (sync_result.has_value())
+    std::move(callbacks.second).Run(sync_result.value());
+}
+
+void FirstPartySetsAccessDelegate::InvokePendingQueries() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (!pending_queries_)
+    return;
+
+  while (!pending_queries_->empty()) {
+    base::OnceClosure query_task = std::move(pending_queries_->front());
+    pending_queries_->pop_front();
+    std::move(query_task).Run();
+  }
+
+  pending_queries_ = nullptr;
+}
+
+void FirstPartySetsAccessDelegate::EnqueuePendingQuery(
+    base::OnceClosure run_query) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(pending_queries_);
+
+  pending_queries_->push_back(std::move(run_query));
+}
+
+}  // namespace network
\ No newline at end of file
diff --git a/services/network/first_party_sets/first_party_sets_access_delegate.h b/services/network/first_party_sets/first_party_sets_access_delegate.h
new file mode 100644
index 0000000..4365ff6
--- /dev/null
+++ b/services/network/first_party_sets/first_party_sets_access_delegate.h
@@ -0,0 +1,166 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_NETWORK_FIRST_PARTY_SETS_FIRST_PARTY_SETS_ACCESS_DELEGATE_H_
+#define SERVICES_NETWORK_FIRST_PARTY_SETS_FIRST_PARTY_SETS_ACCESS_DELEGATE_H_
+
+#include <memory>
+
+#include "base/callback.h"
+#include "base/containers/circular_deque.h"
+#include "base/containers/flat_map.h"
+#include "base/containers/flat_set.h"
+#include "base/memory/raw_ptr.h"
+#include "base/sequence_checker.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "services/network/first_party_sets/first_party_sets_context_config.h"
+#include "services/network/first_party_sets/first_party_sets_manager.h"
+#include "services/network/public/mojom/first_party_sets_access_delegate.mojom.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace net {
+class FirstPartySetMetadata;
+class SchemefulSite;
+}  // namespace net
+
+namespace network {
+
+class FirstPartySetsAccessDelegate
+    : public mojom::FirstPartySetsAccessDelegate {
+ public:
+  using SetsByOwner =
+      base::flat_map<net::SchemefulSite, std::set<net::SchemefulSite>>;
+  using OwnerResult = absl::optional<net::SchemefulSite>;
+  using OwnersResult = base::flat_map<net::SchemefulSite, net::SchemefulSite>;
+  using FlattenedSets = base::flat_map<net::SchemefulSite, net::SchemefulSite>;
+
+  // Construct a FirstPartySetsAccessDelegate that provides customizations
+  // and serves mojo requests for the underlying First-Party Sets info.
+  // `*manager` outlives this object.
+  explicit FirstPartySetsAccessDelegate(
+      mojo::PendingReceiver<mojom::FirstPartySetsAccessDelegate> receiver,
+      mojom::FirstPartySetsAccessDelegateParamsPtr params,
+      FirstPartySetsManager* const manager);
+
+  FirstPartySetsAccessDelegate(const FirstPartySetsAccessDelegate&) = delete;
+  FirstPartySetsAccessDelegate& operator=(const FirstPartySetsAccessDelegate&) =
+      delete;
+
+  ~FirstPartySetsAccessDelegate() override;
+
+  // mojom::FirstPartySetsAccessDelegate
+  void NotifyReady() override;
+
+  bool is_enabled() const {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    return context_config_.is_enabled() && manager_->is_enabled();
+  }
+
+  // Computes the First-Party Set metadata related to the given context.
+  //
+  // This may return a result synchronously, or asynchronously invoke `callback`
+  // with the result. The callback will be invoked iff the return value is
+  // nullopt; i.e. a result will be provided via return value or callback, but
+  // not both, and not neither.
+  [[nodiscard]] absl::optional<net::FirstPartySetMetadata> ComputeMetadata(
+      const net::SchemefulSite& site,
+      const net::SchemefulSite* top_frame_site,
+      const std::set<net::SchemefulSite>& party_context,
+      base::OnceCallback<void(net::FirstPartySetMetadata)> callback);
+
+  // Computes a mapping from owner to set members. For convenience of iteration,
+  // the members of the set includes the owner.
+  //
+  // This may return a result synchronously, or asynchronously invoke `callback`
+  // with the result. The callback will be invoked iff the return value is
+  // nullopt; i.e. a result will be provided via return value or callback, but
+  // not both, and not neither.
+  [[nodiscard]] absl::optional<SetsByOwner> Sets(
+      base::OnceCallback<void(SetsByOwner)> callback);
+
+  // Returns nullopt if First-Party Sets is disabled or if the input is not in
+  // a nontrivial set.
+  // If FPS is enabled and the input site is in a nontrivial set, then this
+  // returns the owner site of that set.
+  //
+  // This may return a result synchronously, or asynchronously invoke `callback`
+  // with the result. The callback will be invoked iff the return value is
+  // nullopt; i.e. a result will be provided via return value or callback, but
+  // not both, and not neither.
+  [[nodiscard]] absl::optional<OwnerResult> FindOwner(
+      const net::SchemefulSite& site,
+      base::OnceCallback<void(OwnerResult)> callback);
+
+  // Batched version of `FindOwner`. Returns the mapping of sites to owners for
+  // the given input sites (if an owner exists).
+  //
+  // When FPS is disabled, returns an empty map.
+  // When FPS is enabled, this maps each input site to its owner (if one
+  // exists), and returns the resulting mapping. If a site isn't in a
+  // non-trivial First-Party Set, it is not added to the output map.
+  //
+  // This may return a result synchronously, or asynchronously invoke `callback`
+  // with the result. The callback will be invoked iff the return value is
+  // nullopt; i.e. a result will be provided via return value or callback, but
+  // not both, and not neither.
+  [[nodiscard]] absl::optional<OwnersResult> FindOwners(
+      const base::flat_set<net::SchemefulSite>& sites,
+      base::OnceCallback<void(OwnersResult)> callback);
+
+ private:
+  // Same as `ComputeMetadata`, but plumbs the result into the callback. Must
+  // only be called once the instance is fully initialized.
+  void ComputeMetadataAndInvoke(
+      const net::SchemefulSite& site,
+      const net::SchemefulSite* top_frame_site,
+      const std::set<net::SchemefulSite>& party_context,
+      base::OnceCallback<void(net::FirstPartySetMetadata)> callback) const;
+
+  // Same as `Sets`, but plumbs the result into the callback. Must only be
+  // called once the instance is fully initialized.
+  void SetsAndInvoke(base::OnceCallback<void(SetsByOwner)> callback) const;
+
+  // Same as `FindOwner`, but plumbs the result into the callback. Must only be
+  // called once the instance is fully initialized.
+  void FindOwnerAndInvoke(const net::SchemefulSite& site,
+                          base::OnceCallback<void(OwnerResult)> callback) const;
+
+  // Same as `FindOwners`, but plumbs the result into the callback. Must only be
+  // called once the instance is fully initialized.
+  void FindOwnersAndInvoke(
+      const base::flat_set<net::SchemefulSite>& sites,
+      base::OnceCallback<void(OwnersResult)> callback) const;
+
+  // Runs all pending queries. Must not be called until the instance is fully
+  // initialized.
+  void InvokePendingQueries();
+
+  // Enqueues a query to be answered once the instance is fully initialized.
+  void EnqueuePendingQuery(base::OnceClosure run_query);
+
+  // The underlying FirstPartySetsManager instance, which lives on the network
+  // service.
+  const raw_ptr<FirstPartySetsManager> manager_
+      GUARDED_BY_CONTEXT(sequence_checker_);
+
+  // First-Party Sets configuration for this network context.
+  FirstPartySetsContextConfig context_config_
+      GUARDED_BY_CONTEXT(sequence_checker_);
+
+  // The queue of queries that are waiting for the instance to be initialized.
+  // This is only set if we haven't been notified that we're ready to answer
+  // queries.
+  std::unique_ptr<base::circular_deque<base::OnceClosure>> pending_queries_
+      GUARDED_BY_CONTEXT(sequence_checker_);
+
+  mojo::Receiver<mojom::FirstPartySetsAccessDelegate> receiver_
+      GUARDED_BY_CONTEXT(sequence_checker_){this};
+
+  SEQUENCE_CHECKER(sequence_checker_);
+};
+
+}  // namespace network
+
+#endif  // SERVICES_NETWORK_FIRST_PARTY_SETS_FIRST_PARTY_SETS_ACCESS_DELEGATE_H_
\ No newline at end of file
diff --git a/services/network/first_party_sets/first_party_sets_access_delegate_unittest.cc b/services/network/first_party_sets/first_party_sets_access_delegate_unittest.cc
new file mode 100644
index 0000000..8799563
--- /dev/null
+++ b/services/network/first_party_sets/first_party_sets_access_delegate_unittest.cc
@@ -0,0 +1,230 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/network/first_party_sets/first_party_sets_access_delegate.h"
+
+#include <set>
+#include <string>
+
+#include "base/containers/flat_set.h"
+#include "base/test/task_environment.h"
+#include "base/test/test_future.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "net/base/schemeful_site.h"
+#include "net/cookies/first_party_set_metadata.h"
+#include "net/cookies/same_party_context.h"
+#include "services/network/public/mojom/first_party_sets_access_delegate.mojom.h"
+#include "testing/gmock/include/gmock/gmock-matchers.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "url/gurl.h"
+
+using ::testing::IsEmpty;
+using Type = net::SamePartyContext::Type;
+
+namespace network {
+
+namespace {
+
+const net::SchemefulSite kSet1Owner(GURL("https://example.test"));
+const net::SchemefulSite kSet1Member1(GURL("https://member1.test"));
+const net::SchemefulSite kSet1Member2(GURL("https://member3.test"));
+const net::SchemefulSite kSet2Owner(GURL("https://foo.test"));
+const net::SchemefulSite kSet2Member1(GURL("https://member2.test"));
+
+mojom::FirstPartySetsAccessDelegateParamsPtr
+CreateFirstPartySetsAccessDelegateParams(bool enabled) {
+  auto params = mojom::FirstPartySetsAccessDelegateParams::New();
+  params->enabled = enabled;
+  return params;
+}
+
+}  // namespace
+
+class FirstPartySetsAccessDelegateTest : public ::testing::Test {
+ public:
+  explicit FirstPartySetsAccessDelegateTest(bool enabled)
+      : first_party_sets_manager_(/*enabled=*/true),
+        delegate_(delegate_remote_.BindNewPipeAndPassReceiver(),
+                  CreateFirstPartySetsAccessDelegateParams(enabled),
+                  &first_party_sets_manager_) {
+    first_party_sets_manager_.SetCompleteSets({
+        {kSet1Member1, kSet1Owner},
+        {kSet1Member2, kSet1Owner},
+        {kSet1Owner, kSet1Owner},
+        {kSet2Member1, kSet2Owner},
+        {kSet2Owner, kSet2Owner},
+    });
+  }
+
+  net::FirstPartySetMetadata ComputeMetadataAndWait(
+      const net::SchemefulSite& site,
+      const net::SchemefulSite* top_frame_site,
+      const std::set<net::SchemefulSite>& party_context) {
+    base::test::TestFuture<net::FirstPartySetMetadata> future;
+    absl::optional<net::FirstPartySetMetadata> result =
+        delegate_.ComputeMetadata(site, top_frame_site, party_context,
+                                  future.GetCallback());
+    return result.has_value() ? std::move(result).value() : future.Take();
+  }
+
+  FirstPartySetsAccessDelegate::SetsByOwner SetsAndWait() {
+    base::test::TestFuture<FirstPartySetsAccessDelegate::SetsByOwner> future;
+    absl::optional<FirstPartySetsAccessDelegate::SetsByOwner> result =
+        delegate_.Sets(future.GetCallback());
+    return result.has_value() ? result.value() : future.Get();
+  }
+
+  FirstPartySetsAccessDelegate::OwnerResult FindOwnerAndWait(
+      const net::SchemefulSite& site) {
+    base::test::TestFuture<FirstPartySetsAccessDelegate::OwnerResult> future;
+    absl::optional<FirstPartySetsAccessDelegate::OwnerResult> result =
+        delegate_.FindOwner(site, future.GetCallback());
+    return result.has_value() ? result.value() : future.Get();
+  }
+
+  FirstPartySetsAccessDelegate::OwnersResult FindOwnersAndWait(
+      const base::flat_set<net::SchemefulSite>& site) {
+    base::test::TestFuture<FirstPartySetsAccessDelegate::OwnersResult> future;
+    absl::optional<FirstPartySetsAccessDelegate::OwnersResult> result =
+        delegate_.FindOwners(site, future.GetCallback());
+    return result.has_value() ? result.value() : future.Get();
+  }
+
+  FirstPartySetsAccessDelegate& delegate() { return delegate_; }
+
+  mojom::FirstPartySetsAccessDelegate* delegate_remote() {
+    return delegate_remote_.get();
+  }
+
+ private:
+  base::test::TaskEnvironment env_;
+  FirstPartySetsManager first_party_sets_manager_;
+  mojo::Remote<mojom::FirstPartySetsAccessDelegate> delegate_remote_;
+  FirstPartySetsAccessDelegate delegate_;
+};
+
+class FirstPartySetsAccessDelegateDisabledTest
+    : public FirstPartySetsAccessDelegateTest {
+ public:
+  FirstPartySetsAccessDelegateDisabledTest()
+      : FirstPartySetsAccessDelegateTest(false) {}
+};
+
+TEST_F(FirstPartySetsAccessDelegateDisabledTest, ComputeMetadata) {
+  EXPECT_THAT(ComputeMetadataAndWait(kSet1Member1, &kSet1Member1,
+                                     {kSet1Member1, kSet1Owner})
+                  .context(),
+              net::SamePartyContext(Type::kCrossParty, Type::kCrossParty,
+                                    Type::kSameParty));
+}
+
+TEST_F(FirstPartySetsAccessDelegateDisabledTest, Sets_IsEmpty) {
+  EXPECT_THAT(SetsAndWait(), IsEmpty());
+}
+
+TEST_F(FirstPartySetsAccessDelegateDisabledTest, FindOwner) {
+  EXPECT_FALSE(FindOwnerAndWait(kSet1Owner));
+  EXPECT_FALSE(FindOwnerAndWait(kSet1Member1));
+}
+
+TEST_F(FirstPartySetsAccessDelegateDisabledTest, FindOwners) {
+  EXPECT_THAT(FindOwnersAndWait({kSet1Member1, kSet2Member1}), IsEmpty());
+}
+
+// Test fixture that allows precise control over when the instance gets FPS
+// data. Useful for testing async flows.
+class AsyncFirstPartySetsAccessDelegateTest
+    : public FirstPartySetsAccessDelegateTest {
+ public:
+  AsyncFirstPartySetsAccessDelegateTest()
+      : FirstPartySetsAccessDelegateTest(true) {}
+};
+
+TEST_F(AsyncFirstPartySetsAccessDelegateTest,
+       QueryBeforeReady_ComputeMetadata) {
+  base::test::TestFuture<net::FirstPartySetMetadata> future;
+  EXPECT_FALSE(delegate().ComputeMetadata(
+      kSet1Member1, &kSet1Member1, {kSet1Member1}, future.GetCallback()));
+
+  delegate_remote()->NotifyReady();
+
+  EXPECT_EQ(future.Get(),
+            net::FirstPartySetMetadata(
+                net::SamePartyContext(Type::kSameParty), &kSet1Owner,
+                &kSet1Owner, net::FirstPartySetsContextType::kHomogeneous));
+}
+
+TEST_F(AsyncFirstPartySetsAccessDelegateTest, QueryBeforeReady_Sets) {
+  base::test::TestFuture<FirstPartySetsAccessDelegate::SetsByOwner> future;
+  EXPECT_FALSE(delegate().Sets(future.GetCallback()));
+
+  delegate_remote()->NotifyReady();
+
+  EXPECT_THAT(future.Get(),
+              FirstPartySetsAccessDelegate::SetsByOwner({
+                  {kSet1Owner, {kSet1Owner, kSet1Member1, kSet1Member2}},
+                  {kSet2Owner, {kSet2Owner, kSet2Member1}},
+              }));
+}
+
+TEST_F(AsyncFirstPartySetsAccessDelegateTest, QueryBeforeReady_FindOwner) {
+  base::test::TestFuture<FirstPartySetsAccessDelegate::OwnerResult> future;
+  EXPECT_FALSE(delegate().FindOwner(kSet1Member1, future.GetCallback()));
+
+  delegate_remote()->NotifyReady();
+
+  EXPECT_THAT(future.Get(), absl::make_optional(kSet1Owner));
+}
+
+TEST_F(AsyncFirstPartySetsAccessDelegateTest, QueryBeforeReady_FindOwners) {
+  base::test::TestFuture<FirstPartySetsAccessDelegate::OwnersResult> future;
+  EXPECT_FALSE(delegate().FindOwners({kSet1Member1, kSet2Member1},
+                                     future.GetCallback()));
+
+  delegate_remote()->NotifyReady();
+
+  EXPECT_THAT(future.Get(), FirstPartySetsAccessDelegate::OwnersResult({
+                                {kSet1Member1, kSet1Owner},
+                                {kSet2Member1, kSet2Owner},
+                            }));
+}
+
+class SyncFirstPartySetsAccessDelegateTest
+    : public AsyncFirstPartySetsAccessDelegateTest {
+ public:
+  SyncFirstPartySetsAccessDelegateTest() { delegate_remote()->NotifyReady(); }
+};
+
+TEST_F(SyncFirstPartySetsAccessDelegateTest, ComputeMetadata) {
+  EXPECT_EQ(ComputeMetadataAndWait(kSet1Member1, &kSet1Member1, {kSet1Member1}),
+            net::FirstPartySetMetadata(
+                net::SamePartyContext(Type::kSameParty), &kSet1Owner,
+                &kSet1Owner, net::FirstPartySetsContextType::kHomogeneous));
+}
+
+TEST_F(SyncFirstPartySetsAccessDelegateTest, Sets) {
+  EXPECT_THAT(SetsAndWait(),
+              FirstPartySetsAccessDelegate::SetsByOwner({
+                  {kSet1Owner, {kSet1Owner, kSet1Member1, kSet1Member2}},
+                  {kSet2Owner, {kSet2Owner, kSet2Member1}},
+              }));
+}
+
+TEST_F(SyncFirstPartySetsAccessDelegateTest, FindOwner) {
+  EXPECT_THAT(FindOwnerAndWait(kSet1Member1), absl::make_optional(kSet1Owner));
+}
+
+TEST_F(SyncFirstPartySetsAccessDelegateTest, FindOwners) {
+  EXPECT_THAT(FindOwnersAndWait({kSet1Member1, kSet2Member1}),
+              FirstPartySetsAccessDelegate::OwnersResult({
+                  {kSet1Member1, kSet1Owner},
+                  {kSet2Member1, kSet2Owner},
+              }));
+}
+
+}  // namespace network
diff --git a/services/network/first_party_sets/first_party_sets_manager_unittest.cc b/services/network/first_party_sets/first_party_sets_manager_unittest.cc
index 5b72163..8e776e6 100644
--- a/services/network/first_party_sets/first_party_sets_manager_unittest.cc
+++ b/services/network/first_party_sets/first_party_sets_manager_unittest.cc
@@ -100,7 +100,7 @@
 class FirstPartySetsManagerDisabledTest : public FirstPartySetsManagerTest {
  public:
   FirstPartySetsManagerDisabledTest() : FirstPartySetsManagerTest(false) {
-    // FPS setting by the browser overrules FPS setting by a profile.
+    // FPS setting by the browser overrules FPS setting by the context.
     SetFirstPartySetsContextConfig(true);
   }
 };
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index 968649f..89bbba49 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -474,6 +474,10 @@
           std::make_unique<NetworkContextApplicationStatusListener>()),
 #endif
       receiver_(this, std::move(receiver)),
+      first_party_sets_access_delegate_(
+          std::move(params_->first_party_sets_access_delegate_receiver),
+          std::move(params_->first_party_sets_access_delegate_params),
+          network_service_->first_party_sets_manager()),
       cors_preflight_controller_(network_service),
       cors_non_wildcard_request_headers_support_(base::FeatureList::IsEnabled(
           features::kCorsNonWildcardRequestHeadersSupport)) {
@@ -510,8 +514,9 @@
       session_cleanup_cookie_store,
       std::move(on_url_request_context_builder_configured));
   url_request_context_ = url_request_context_owner_.url_request_context.get();
+
   cookie_manager_ = std::make_unique<CookieManager>(
-      url_request_context_, network_service_->first_party_sets_manager(),
+      url_request_context_, &first_party_sets_access_delegate_,
       std::move(session_cleanup_cookie_store),
       std::move(params_->cookie_manager_params));
 
@@ -589,11 +594,15 @@
           std::make_unique<NetworkContextApplicationStatusListener>()),
 #endif
       receiver_(this, std::move(receiver)),
-      cookie_manager_(
-          std::make_unique<CookieManager>(url_request_context,
-                                          nullptr,
-                                          nullptr /* first_party_sets */,
-                                          nullptr)),
+      first_party_sets_access_delegate_(
+          /*receiver=*/mojo::NullReceiver(),
+          /*params=*/nullptr,
+          /*manager=*/nullptr),
+      cookie_manager_(std::make_unique<CookieManager>(
+          url_request_context,
+          nullptr,
+          /*first_party_sets_access_delegate=*/nullptr,
+          nullptr)),
       socket_factory_(
           std::make_unique<SocketFactory>(url_request_context_->net_log(),
                                           url_request_context)),
@@ -788,7 +797,7 @@
           role, url_request_context_->cookie_store(),
           cookie_manager_->cookie_settings(), origin, isolation_info,
           std::move(cookie_observer),
-          network_service_->first_party_sets_manager()->is_enabled(),
+          first_party_sets_access_delegate_.is_enabled(),
           std::move(first_party_set_metadata)),
       std::move(receiver));
 }
@@ -2362,7 +2371,7 @@
     std::unique_ptr<net::CookieMonster> cookie_store =
         std::make_unique<net::CookieMonster>(
             session_cleanup_cookie_store.get(), net_log,
-            network_service_->first_party_sets_manager()->is_enabled());
+            first_party_sets_access_delegate_.is_enabled());
     if (params_->persist_session_cookies)
       cookie_store->SetPersistSessionCookies(true);
 
@@ -2580,7 +2589,7 @@
       command_line->GetSwitchValueASCII(switches::kHostResolverRules));
 
   builder.set_first_party_sets_enabled(
-      network_service_->first_party_sets_manager()->is_enabled());
+      first_party_sets_access_delegate_.is_enabled());
 
   // If `require_network_isolation_key_` is true, but the features that can
   // trigger another URLRequest are not set to respect NetworkIsolationKeys,
diff --git a/services/network/network_context.h b/services/network/network_context.h
index 56b0063..f253552 100644
--- a/services/network/network_context.h
+++ b/services/network/network_context.h
@@ -42,6 +42,7 @@
 #include "net/http/http_auth_preferences.h"
 #include "net/net_buildflags.h"
 #include "services/network/cors/preflight_controller.h"
+#include "services/network/first_party_sets/first_party_sets_access_delegate.h"
 #include "services/network/http_cache_data_counter.h"
 #include "services/network/http_cache_data_remover.h"
 #include "services/network/network_qualities_pref_delegate.h"
@@ -732,6 +733,8 @@
 
   mojo::Receiver<mojom::NetworkContext> receiver_;
 
+  FirstPartySetsAccessDelegate first_party_sets_access_delegate_;
+
   std::unique_ptr<CookieManager> cookie_manager_;
 
   std::unique_ptr<SocketFactory> socket_factory_;
diff --git a/services/network/public/mojom/BUILD.gn b/services/network/public/mojom/BUILD.gn
index 35fcfde..bc88840 100644
--- a/services/network/public/mojom/BUILD.gn
+++ b/services/network/public/mojom/BUILD.gn
@@ -894,6 +894,7 @@
     "default_credentials.mojom",
     "dhcp_wpad_url_client.mojom",
     "digitally_signed.mojom",
+    "first_party_sets_access_delegate.mojom",
     "host_resolver.mojom",
     "http_cache_backend_file_operations.mojom",
     "key_pinning.mojom",
diff --git a/services/network/public/mojom/first_party_sets_access_delegate.mojom b/services/network/public/mojom/first_party_sets_access_delegate.mojom
new file mode 100644
index 0000000..e335601
--- /dev/null
+++ b/services/network/public/mojom/first_party_sets_access_delegate.mojom
@@ -0,0 +1,28 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module network.mojom;
+
+// Lives in the network service and controlled by the browser process to
+// access First-Party Sets for each network context.
+//
+// TODO(shuuran): Expose APIs to enable browser process query the FPS info
+// and change whether the FPS is enabled during runtime.
+interface FirstPartySetsAccessDelegate {
+  // Signals to the receiver that the given network context has completed
+  // its initialization related to First-Party Sets, and the delegate
+  // should begin answering queries.
+  //
+  // Exactly one call is expected; subsequent calls with the same receiver
+  // have no effect.
+  //
+  // TODO(crbug.com/1325050): Add param to let browser process configure
+  // the customizations provided for each network context.
+  NotifyReady();
+};
+
+struct FirstPartySetsAccessDelegateParams {
+  // Whether First-Party Sets is enabled for this network context.
+  bool enabled;
+};
\ No newline at end of file
diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom
index a310af3..cd28ac0 100644
--- a/services/network/public/mojom/network_context.mojom
+++ b/services/network/public/mojom/network_context.mojom
@@ -21,6 +21,7 @@
 import "services/network/public/mojom/cross_origin_embedder_policy.mojom";
 import "services/network/public/mojom/default_credentials.mojom";
 import "services/network/public/mojom/devtools_observer.mojom";
+import "services/network/public/mojom/first_party_sets_access_delegate.mojom";
 import "services/network/public/mojom/host_resolver.mojom";
 import "services/network/public/mojom/http_cache_backend_file_operations.mojom";
 import "services/network/public/mojom/http_request_headers.mojom";
@@ -524,6 +525,14 @@
 
   // Is true, Trust Token operations should be blocked.
   bool block_trust_tokens;
+
+  // Parameters for constructing the FirstPartySetsAccessDelegate.
+  // |first_party_sets_access_delegate_params| is the initial configuration to
+  // use. If nullptr, uses the default configuration. Updated configurations
+  // can be passed in via |first_party_sets_access_delegate_receiver|.
+  FirstPartySetsAccessDelegateParams? first_party_sets_access_delegate_params;
+  pending_receiver<FirstPartySetsAccessDelegate>?
+      first_party_sets_access_delegate_receiver;
 };
 
 struct NetworkConditions {
diff --git a/services/network/restricted_cookie_manager_unittest.cc b/services/network/restricted_cookie_manager_unittest.cc
index 7ca5b6f..2bc086051 100644
--- a/services/network/restricted_cookie_manager_unittest.cc
+++ b/services/network/restricted_cookie_manager_unittest.cc
@@ -37,7 +37,7 @@
 #include "net/cookies/test_cookie_access_delegate.h"
 #include "services/network/cookie_access_delegate_impl.h"
 #include "services/network/cookie_settings.h"
-#include "services/network/first_party_sets/first_party_sets_manager.h"
+#include "services/network/first_party_sets/first_party_sets_access_delegate.h"
 #include "services/network/public/mojom/cookie_access_observer.mojom.h"
 #include "services/network/public/mojom/cookie_manager.mojom.h"
 #include "services/network/test/test_network_context_client.h"
@@ -436,19 +436,36 @@
   bool received_bad_message_ = false;
 };
 
+namespace {
+
+mojom::FirstPartySetsAccessDelegateParamsPtr
+CreateFirstPartySetsAccessDelegateParams() {
+  auto params = mojom::FirstPartySetsAccessDelegateParams::New();
+  params->enabled = true;
+  return params;
+}
+
+}  // namespace
+
 class SamePartyEnabledRestrictedCookieManagerTest
     : public RestrictedCookieManagerTest {
  public:
   SamePartyEnabledRestrictedCookieManagerTest()
-      : first_party_sets_manager_(/*enabled=*/true) {
+      : first_party_sets_manager_(/*enabled=*/true),
+        first_party_sets_access_delegate_(
+            first_party_sets_access_delegate_remote_
+                .BindNewPipeAndPassReceiver(),
+            CreateFirstPartySetsAccessDelegateParams(),
+            &first_party_sets_manager_) {
     first_party_sets_manager_.SetCompleteSets(
         {{net::SchemefulSite(GURL("https://example.com")),
           net::SchemefulSite(GURL("https://example.com"))},
          {net::SchemefulSite(GURL("https://member1.com")),
           net::SchemefulSite(GURL("https://example.com"))}});
+    first_party_sets_access_delegate_remote_->NotifyReady();
     auto cookie_access_delegate = std::make_unique<CookieAccessDelegateImpl>(
         mojom::CookieAccessDelegateType::USE_CONTENT_SETTINGS,
-        &first_party_sets_manager_, &cookie_settings_);
+        &first_party_sets_access_delegate_, &cookie_settings_);
     cookie_monster_.SetCookieAccessDelegate(std::move(cookie_access_delegate));
   }
   ~SamePartyEnabledRestrictedCookieManagerTest() override = default;
@@ -475,6 +492,9 @@
  private:
   base::test::ScopedFeatureList feature_list_;
   FirstPartySetsManager first_party_sets_manager_;
+  mojo::Remote<mojom::FirstPartySetsAccessDelegate>
+      first_party_sets_access_delegate_remote_;
+  FirstPartySetsAccessDelegate first_party_sets_access_delegate_;
 };
 
 INSTANTIATE_TEST_SUITE_P(
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json
index 53b9fa3b..66f7be38 100644
--- a/testing/buildbot/chrome.json
+++ b/testing/buildbot/chrome.json
@@ -1404,40 +1404,6 @@
         "trigger_script": {
           "script": "//testing/trigger_scripts/chromeos_device_trigger.py"
         }
-      },
-      {
-        "args": [
-          "--browser=cros-chrome",
-          "--remote=variable_chromeos_device_hostname",
-          "--jobs=1"
-        ],
-        "isolate_name": "telemetry_unittests",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "device_type": "eve",
-              "os": "ChromeOS",
-              "pool": "chrome.tests"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 10
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_unittests/",
-        "trigger_script": {
-          "script": "//testing/trigger_scripts/chromeos_device_trigger.py"
-        }
       }
     ]
   },
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 889ba60..7c9b87c1 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -2927,6 +2927,7 @@
     },
     'remove_from': [
       # TODO(crbug.com/1141234): Restore when there's more DUTs
+      'chromeos-eve-chrome',
       'chromeos-kevin-chrome',
       'chromeos-kevin-rel',
 
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 6f00536..08ee9a3 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -4095,6 +4095,7 @@
                 "android_webview",
                 "chromeos",
                 "chromeos_lacros",
+                "ios",
                 "linux",
                 "mac",
                 "windows"
@@ -5190,6 +5191,27 @@
             ]
         }
     ],
+    "LiteralBufferCreateStringWithEncoding": [
+        {
+            "platforms": [
+                "android",
+                "android_weblayer",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "LiteralBufferCreateStringWithEncoding"
+                    ]
+                }
+            ]
+        }
+    ],
     "LongMessageDurationIOS": [
         {
             "platforms": [
diff --git a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
index 4719e28..25373d0 100644
--- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -854,6 +854,17 @@
     style.ClearAppliedTextDecorations();
   else
     style.RestoreParentTextDecorations(layout_parent_style);
+
+  // The computed value of currentColor for highlight pseudos is the
+  // color that would have been used if no highlights were applied,
+  // i.e. the originating element's color.
+  if (((RuntimeEnabledFeatures::HighlightInheritanceEnabled() &&
+        state.IsForHighlight()) ||
+       state.IsForCustomHighlight()) &&
+      style.ColorIsCurrentColor() && state.OriginatingElementStyle()) {
+    style.SetColor(state.OriginatingElementStyle()->GetColor());
+  }
+
   if (style.Display() != EDisplay::kContents) {
     style.ApplyTextDecorations(
         parent_style.VisitedDependentColor(GetCSSPropertyTextDecorationColor()),
diff --git a/third_party/blink/renderer/core/css/rule_feature_set.cc b/third_party/blink/renderer/core/css/rule_feature_set.cc
index 8d2182a..07a6b19 100644
--- a/third_party/blink/renderer/core/css/rule_feature_set.cc
+++ b/third_party/blink/renderer/core/css/rule_feature_set.cc
@@ -982,9 +982,19 @@
         case CSSSelector::kPseudoIs:
         case CSSSelector::kPseudoWhere:
         case CSSSelector::kPseudoNot:
+          // Add features for each method to handle sibling descendant
+          // relationship in the logical combination.
+          // - For '.a:has(:is(.b ~ .c .d))',
+          //   -> '.b ~ .c .a' (kForAllNonRightmostCompounds)
+          //   -> '.b ~ .a' (kForCompoundImmediatelyFollowsAdjacentRelation)
           AddFeaturesToInvalidationSetsForLogicalCombinationInHas(
               *simple, compound_containing_has, sibling_features,
-              descendant_features, /* needs_skip_rightmost_compound */ true);
+              descendant_features, CSSSelector::kSubSelector,
+              kForAllNonRightmostCompounds);
+          AddFeaturesToInvalidationSetsForLogicalCombinationInHas(
+              *simple, compound_containing_has, sibling_features,
+              descendant_features, CSSSelector::kSubSelector,
+              kForCompoundImmediatelyFollowsAdjacentRelation);
           break;
         default:
           break;
@@ -998,7 +1008,9 @@
     const CSSSelector* compound_in_logical_combination,
     const CSSSelector* compound_containing_has,
     InvalidationSetFeatures* sibling_features,
-    InvalidationSetFeatures& descendant_features) {
+    InvalidationSetFeatures& descendant_features,
+    CSSSelector::RelationType previous_combinator,
+    AddFeaturesMethodForLogicalCombinationInHas add_features_method) {
   const CSSSelector* simple = compound_in_logical_combination;
   for (; simple; simple = simple->TagHistory()) {
     switch (simple->GetPseudoType()) {
@@ -1010,7 +1022,7 @@
         // (e.g. '.a:has(.a :is(.b :is(.c .d))) {}')
         AddFeaturesToInvalidationSetsForLogicalCombinationInHas(
             *simple, compound_containing_has, sibling_features,
-            descendant_features, /* needs_skip_rightmost_compound */ true);
+            descendant_features, previous_combinator, add_features_method);
         break;
       default:
         break;
@@ -1026,7 +1038,9 @@
     const CSSSelector* compound_in_logical_combination,
     const CSSSelector* compound_containing_has,
     InvalidationSetFeatures* sibling_features,
-    InvalidationSetFeatures& descendant_features) {
+    InvalidationSetFeatures& descendant_features,
+    CSSSelector::RelationType previous_combinator,
+    AddFeaturesMethodForLogicalCombinationInHas add_features_method) {
   DCHECK(compound_in_logical_combination);
   bool compound_has_features_for_rule_set_invalidation = false;
   const CSSSelector* simple = compound_in_logical_combination;
@@ -1042,7 +1056,7 @@
         // (e.g. '.a:has(:is(:is(.a .b) .c)) {}')
         AddFeaturesToInvalidationSetsForLogicalCombinationInHas(
             *simple, compound_containing_has, sibling_features,
-            descendant_features, /* needs_skip_rightmost_compound */ false);
+            descendant_features, previous_combinator, add_features_method);
         break;
       default:
         AddFeaturesToInvalidationSetsForSimpleSelector(
@@ -1071,19 +1085,101 @@
   return simple;
 }
 
+// Context for adding features for a compound selector in a logical combination
+// inside :has(). This struct provides these information so that the features
+// can be added correctly for the compound in logical combination.
+// - needs_skip_adding_features:
+//     - whether adding features needs to be skipped.
+// - needs_update_features:
+//     - whether updating features is needed.
+// - last_compound_in_adjacent_chain:
+//     - last compound in adjacent chain used for updating features.
+// - use_indirect_adjacent_combinator_for_updating_features:
+//     - whether we need to use adjacent combinator for updating features.
+// Please check the comments in the constructor for more details.
+struct AddFeaturesToInvalidationSetsForLogicalCombinationInHasContext {
+  bool needs_skip_adding_features;
+  bool needs_update_features;
+  const CSSSelector* last_compound_in_adjacent_chain;
+  bool use_indirect_adjacent_combinator_for_updating_features;
+
+  AddFeaturesToInvalidationSetsForLogicalCombinationInHasContext(
+      const CSSSelector* compound_in_logical_combination,
+      const CSSSelector* compound_containing_has,
+      CSSSelector::RelationType previous_combinator,
+      RuleFeatureSet::AddFeaturesMethodForLogicalCombinationInHas
+          add_features_method) {
+    last_compound_in_adjacent_chain = nullptr;
+    needs_skip_adding_features = false;
+    needs_update_features = false;
+    use_indirect_adjacent_combinator_for_updating_features = false;
+
+    bool is_in_has_argument_checking_scope =
+        previous_combinator == CSSSelector::kSubSelector;
+    bool add_features_for_compound_immediately_follows_adjacent_relation =
+        add_features_method ==
+        RuleFeatureSet::kForCompoundImmediatelyFollowsAdjacentRelation;
+
+    if (is_in_has_argument_checking_scope) {
+      // If the compound in the logical combination is for the element in the
+      // :has() argument checking scope, skip adding features.
+      needs_skip_adding_features = true;
+
+      // If the compound in the logical combination is for the element in the
+      // :has() argument checking scope, update features before moving to the
+      // next compound.
+      needs_update_features = true;
+
+      // For the rightmost compound that need to be skipped, use the compound
+      // selector containing :has() as last_compound_in_adjacent_chain for
+      // updating features so that the features can be added as if the next
+      // compounds are prepended to the compound containing :has().
+      // (e.g. '.a:has(:is(.b .c ~ .d)) .e' -> '.b .c ~ .a .e')
+      // The selector pointer of '.a:has(:is(.b .c ~ .d))' is passed though
+      // the argument 'compound_containing_has'.
+      last_compound_in_adjacent_chain = compound_containing_has;
+
+      // In case of adding features only for adjacent combinator and its
+      // next compound selector, update features as if the relation of the
+      // last-in-compound is indirect adjacent combinator ('~').
+      if (add_features_for_compound_immediately_follows_adjacent_relation)
+        use_indirect_adjacent_combinator_for_updating_features = true;
+    } else {
+      // If this method call is for the compound immediately follows an
+      // adjacent combinator in the logical combination but the compound
+      // doesn't follow any adjacent combinator, skip adding features.
+      if (add_features_for_compound_immediately_follows_adjacent_relation &&
+          !CSSSelector::IsAdjacentRelation(previous_combinator)) {
+        needs_skip_adding_features = true;
+      }
+
+      // Update features from the previous combinator when we add features
+      // for all non-rightmost compound selectors. In case of adding features
+      // only for adjacent combinator and its next compound selector, do not
+      // update features so that we can use the same features that was
+      // updated at the compound in :has() argument checking scope.
+      if (add_features_method == RuleFeatureSet::kForAllNonRightmostCompounds)
+        needs_update_features = true;
+
+      last_compound_in_adjacent_chain = compound_in_logical_combination;
+    }
+  }
+};
+
 void RuleFeatureSet::AddFeaturesToInvalidationSetsForLogicalCombinationInHas(
     const CSSSelector& logical_combination,
     const CSSSelector* compound_containing_has,
     InvalidationSetFeatures* sibling_features,
     InvalidationSetFeatures& descendant_features,
-    bool needs_skip_rightmost_compound) {
+    CSSSelector::RelationType previous_combinator,
+    AddFeaturesMethodForLogicalCombinationInHas add_features_method) {
   DCHECK(logical_combination.SelectorList());
   DCHECK(compound_containing_has);
 
   for (const CSSSelector* complex = logical_combination.SelectorList()->First();
        complex; complex = CSSSelectorList::Next(*complex)) {
-    base::AutoReset<bool> restore_skip_rightmost(&needs_skip_rightmost_compound,
-                                                 needs_skip_rightmost_compound);
+    base::AutoReset<CSSSelector::RelationType> restore_previous_combinator(
+        &previous_combinator, previous_combinator);
     AutoRestoreMaxDirectAdjacentSelectors restore_max(sibling_features);
     AutoRestoreDescendantFeaturesDepth restore_depth(&descendant_features);
     AutoRestoreTreeBoundaryCrossingFlag restore_tree_boundary(
@@ -1091,40 +1187,42 @@
     AutoRestoreInsertionPointCrossingFlag restore_insertion_point(
         descendant_features);
 
-    InvalidationSetFeatures last_compound_in_adjacent_chain_features;
     const CSSSelector* compound_in_logical_combination = complex;
-    const CSSSelector* last_in_compound;
-    const CSSSelector* last_compound_in_adjacent_chain;
+    InvalidationSetFeatures last_compound_in_adjacent_chain_features;
     while (compound_in_logical_combination) {
-      if (needs_skip_rightmost_compound) {
+      AddFeaturesToInvalidationSetsForLogicalCombinationInHasContext context(
+          compound_in_logical_combination, compound_containing_has,
+          previous_combinator, add_features_method);
+
+      const CSSSelector* last_in_compound;
+      if (context.needs_skip_adding_features) {
         last_in_compound =
             SkipAddingAndGetLastInCompoundForLogicalCombinationInHas(
                 compound_in_logical_combination, compound_containing_has,
-                sibling_features, descendant_features);
-        // For the rightmost compound that need to be skipped, use the compound
-        // selector containing :has() as last_compound_in_adjacent_chain for
-        // updating features so that the features can be added as if the next
-        // compounds are prepended to the compound containing :has().
-        // (e.g. '.a:has(:is(.b .c ~ .d)) .e' -> '.b .c ~ .a .e')
-        // The selector pointer of '.a:has(:is(.b .c ~ .d))' is passed though
-        // the argument 'compound_containing_has'.
-        last_compound_in_adjacent_chain = compound_containing_has;
+                sibling_features, descendant_features, previous_combinator,
+                add_features_method);
       } else {
         last_in_compound =
             AddFeaturesAndGetLastInCompoundForLogicalCombinationInHas(
                 compound_in_logical_combination, compound_containing_has,
-                sibling_features, descendant_features);
-        last_compound_in_adjacent_chain = compound_in_logical_combination;
+                sibling_features, descendant_features, previous_combinator,
+                add_features_method);
       }
+
       if (!last_in_compound)
         break;
 
-      needs_skip_rightmost_compound = false;
+      previous_combinator = last_in_compound->Relation();
 
-      UpdateFeaturesFromCombinatorForLogicalCombinationInHas(
-          last_in_compound->Relation(), last_compound_in_adjacent_chain,
-          last_compound_in_adjacent_chain_features, sibling_features,
-          descendant_features);
+      if (context.needs_update_features) {
+        UpdateFeaturesFromCombinatorForLogicalCombinationInHas(
+            context.use_indirect_adjacent_combinator_for_updating_features
+                ? CSSSelector::kIndirectAdjacent
+                : previous_combinator,
+            context.last_compound_in_adjacent_chain,
+            last_compound_in_adjacent_chain_features, sibling_features,
+            descendant_features);
+      }
 
       compound_in_logical_combination = last_in_compound->TagHistory();
     }
diff --git a/third_party/blink/renderer/core/css/rule_feature_set.h b/third_party/blink/renderer/core/css/rule_feature_set.h
index 2c3771ba..179a11bfd 100644
--- a/third_party/blink/renderer/core/css/rule_feature_set.h
+++ b/third_party/blink/renderer/core/css/rule_feature_set.h
@@ -582,9 +582,7 @@
   // previous siblings or its ancestor previous siblings)
   // To support invalidation for a mutation on the elements, we can add features
   // in invalidation sets only for the complex selectors in :is() inside :has()
-  // as if we have another rule with simple selector. (Add features as if the
-  // non-subject part of the logical combination argument is prepended to
-  // the compound containing :has())
+  // as if we have another rule with simple selector.
   //
   // Example 1) '.a:has(:is(.b .c)) {}'
   //   - For class 'b' change, invalidate descendant '.a' ('.b .a {}')
@@ -597,16 +595,43 @@
   //     ('.b ~ .a .d {}')
   //
   // Example 4) '.a:has(:is(.b ~ .c .d)) {}'
-  //   - For class 'b' change, invalidate descendant '.a' of sibling '.c'.
-  //     ('.b ~ .c .a {}')
-  //   - TODO(blee@igalia.com) For class 'b' change, we need to invalidate
-  //     sibling '.a' also. ('.b ~ .a {}')
+  //   - For class 'b' change, invalidate descendant '.a' of sibling '.c'
+  //     ('.b ~ .c .a {}'), and invalidate sibling '.a' ('.b ~ .a {}').
   void AddFeaturesToInvalidationSetsForHasPseudoClass(
       const CSSSelector& has_pseudo_class,
       const CSSSelector* compound_containing_has,
       InvalidationSetFeatures* sibling_features,
       InvalidationSetFeatures& descendant_features);
 
+  // There are two methods to add features for logical combinations in :has().
+  // - kForAllNonRightmostCompounds:
+  //     Add features as if the non-subject part of the logical combination
+  //     argument is prepended to the compound containing :has().
+  //     (e.g. In the above example, Example 1, 2, 3 and '.b ~ .c .a' of
+  //      Example 4)
+  // - kForCompoundImmediatelyFollowsAdjacentRelation:
+  //     Add features as if an adjacent combinator and its next compound
+  //     selector are prepended to the compound containing :has().
+  //     (e.g. In the above example, '.b ~ .a' of Example 4)
+  //
+  // Due to the difference between the two methods (how the features are
+  // updated from combinators), sibling features or descendant features for
+  // a certain compound can be different per the method.
+  // - For '.a:has(:is(.b ~ .c .d)) ~ .e',
+  //   - At '.b' when kForAllNonRightmostCompounds:
+  //     - sibling_features == '.c' / descendant_features == '.e'
+  //   - At '.b' when kForCompoundImmediatelyFollowsAdjacentRelation:
+  //     - sibling_features == descendant_features == '.e'
+  //
+  // To avoid maintaining multiple 'sibling_features' and 'descendant_features'
+  // for each compound selector, features are added separately for each method.
+  // (Call AddFeaturesToInvalidationSetsForLogicalCombinationInHas() for each
+  //  method in AddFeaturesToInvalidationSetsForHasPseudoClass())
+  enum AddFeaturesMethodForLogicalCombinationInHas {
+    kForAllNonRightmostCompounds,
+    kForCompoundImmediatelyFollowsAdjacentRelation
+  };
+
   // AddFeaturesToInvalidationSetsForLogicalCombinationInHas() is invoked for
   // each logical combination inside :has(). Same as the usual feature adding
   // logic, sibling features and descendant features extracted from the
@@ -625,18 +650,21 @@
   // - '.d' in '.a:has(:is(.b :is(.c .d)))' is always a descendant of :has()
   //   anchor element.
   //
-  // To differentiate between the two cases, this method has a bool argument
-  // 'needs_skip_rightmost_compound'.
-  // The argument is always true when the method is called for the non-nested
-  // logical combinations in AddFeaturesToInvalidationSetsForHasPseudoClass().
-  // After the rightmost compound is skipped, the value is changed to false
-  // for the rest compounds.
+  // To differentiate between the two cases, this method has an argument
+  // 'previous_combinator' that represents the previous combinator evaluated
+  // for updating features for logical combination inside :has().
+  // The argument is always kSubSelector when the method is called for the
+  // non-nested logical combinations inside :has() (when the method is called
+  // in AddFeaturesToInvalidationSetsForHasPseudoClass()).
+  // For the rest compounds, after the rightmost compound is skipped, the value
+  // is changed to the combinator at the left of the compound.
   void AddFeaturesToInvalidationSetsForLogicalCombinationInHas(
       const CSSSelector& logical_combination,
       const CSSSelector* compound_containing_has,
       InvalidationSetFeatures* sibling_features,
       InvalidationSetFeatures& descendant_features,
-      bool needs_skip_rightmost_compound);
+      CSSSelector::RelationType previous_combinator,
+      AddFeaturesMethodForLogicalCombinationInHas);
 
   void UpdateFeaturesFromCombinatorForLogicalCombinationInHas(
       CSSSelector::RelationType combinator,
@@ -648,12 +676,16 @@
       const CSSSelector* compound_in_logical_combination,
       const CSSSelector* compound_containing_has,
       InvalidationSetFeatures* sibling_features,
-      InvalidationSetFeatures& descendant_features);
+      InvalidationSetFeatures& descendant_features,
+      CSSSelector::RelationType previous_combinator,
+      AddFeaturesMethodForLogicalCombinationInHas);
   const CSSSelector* AddFeaturesAndGetLastInCompoundForLogicalCombinationInHas(
       const CSSSelector* compound_in_logical_combination,
       const CSSSelector* compound_containing_has,
       InvalidationSetFeatures* sibling_features,
-      InvalidationSetFeatures& descendant_features);
+      InvalidationSetFeatures& descendant_features,
+      CSSSelector::RelationType previous_combinator,
+      AddFeaturesMethodForLogicalCombinationInHas);
 
   static InvalidationSet& EnsureMutableInvalidationSet(
       scoped_refptr<InvalidationSet>&,
@@ -708,6 +740,7 @@
   unsigned is_alive_ : 1;
 
   friend class RuleFeatureSetTest;
+  friend struct AddFeaturesToInvalidationSetsForLogicalCombinationInHasContext;
 };
 
 CORE_EXPORT std::ostream& operator<<(std::ostream&, const RuleFeatureSet&);
diff --git a/third_party/blink/renderer/core/css/rule_feature_set_test.cc b/third_party/blink/renderer/core/css/rule_feature_set_test.cc
index 229342f1..c510361a 100644
--- a/third_party/blink/renderer/core/css/rule_feature_set_test.cc
+++ b/third_party/blink/renderer/core/css/rule_feature_set_test.cc
@@ -295,6 +295,27 @@
     EXPECT_TRUE(descendant_classes.Contains(descendant_name));
   }
 
+  void ExpectSiblingAndSiblingDescendantInvalidationForLogicalCombinationsInHas(
+      const AtomicString& sibling_name,
+      const AtomicString& sibling_name_for_sibling_descendant,
+      const AtomicString& descendant_name,
+      InvalidationSetVector& invalidation_sets) {
+    EXPECT_EQ(1u, invalidation_sets.size());
+    const auto& sibling_invalidation_set =
+        To<SiblingInvalidationSet>(*invalidation_sets[0]);
+    HashSet<AtomicString> classes = ClassSet(sibling_invalidation_set);
+    EXPECT_EQ(2u, classes.size());
+    EXPECT_TRUE(classes.Contains(sibling_name));
+    EXPECT_TRUE(classes.Contains(sibling_name_for_sibling_descendant));
+    EXPECT_EQ(SiblingInvalidationSet::kDirectAdjacentMax,
+              sibling_invalidation_set.MaxDirectAdjacentSelectors());
+
+    HashSet<AtomicString> descendant_classes =
+        ClassSet(*sibling_invalidation_set.SiblingDescendants());
+    EXPECT_EQ(1u, descendant_classes.size());
+    EXPECT_TRUE(descendant_classes.Contains(descendant_name));
+  }
+
   void ExpectSiblingNoDescendantInvalidation(
       InvalidationSetVector& invalidation_sets) {
     EXPECT_EQ(1u, invalidation_sets.size());
@@ -2201,10 +2222,8 @@
     InvalidationLists invalidation_lists;
     CollectInvalidationSetsForClass(invalidation_lists, "b");
     ExpectNoInvalidation(invalidation_lists.descendants);
-    ExpectSiblingDescendantInvalidation(
-        SiblingInvalidationSet::kDirectAdjacentMax, "c", "a",
-        invalidation_lists.siblings);
-    // TODO(blee@igalia.com) Need sibling class "a" invalidation
+    ExpectSiblingAndSiblingDescendantInvalidationForLogicalCombinationsInHas(
+        "a", "c", "a", invalidation_lists.siblings);
   }
 
   {
@@ -2237,10 +2256,8 @@
     InvalidationLists invalidation_lists;
     CollectInvalidationSetsForClass(invalidation_lists, "b");
     ExpectNoInvalidation(invalidation_lists.descendants);
-    ExpectSiblingDescendantInvalidation(
-        SiblingInvalidationSet::kDirectAdjacentMax, "c", "a",
-        invalidation_lists.siblings);
-    // TODO(blee@igalia.com) Need sibling class "a" invalidation
+    ExpectSiblingAndSiblingDescendantInvalidationForLogicalCombinationsInHas(
+        "a", "c", "a", invalidation_lists.siblings);
   }
 
   {
@@ -2382,10 +2399,8 @@
     InvalidationLists invalidation_lists;
     CollectInvalidationSetsForClass(invalidation_lists, "b");
     ExpectNoInvalidation(invalidation_lists.descendants);
-    ExpectSiblingDescendantInvalidation(
-        SiblingInvalidationSet::kDirectAdjacentMax, "c", "a",
-        invalidation_lists.siblings);
-    // TODO(blee@igalia.com) Need sibling class "a" invalidation
+    ExpectSiblingAndSiblingDescendantInvalidationForLogicalCombinationsInHas(
+        "a", "c", "a", invalidation_lists.siblings);
   }
 
   {
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index 8ae699a..3c84903 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -133,7 +133,6 @@
 #include "third_party/blink/renderer/core/html/forms/html_form_controls_collection.h"
 #include "third_party/blink/renderer/core/html/forms/html_options_collection.h"
 #include "third_party/blink/renderer/core/html/forms/html_select_element.h"
-#include "third_party/blink/renderer/core/html/forms/html_select_menu_element.h"
 #include "third_party/blink/renderer/core/html/html_body_element.h"
 #include "third_party/blink/renderer/core/html/html_collection.h"
 #include "third_party/blink/renderer/core/html/html_document.h"
@@ -4607,15 +4606,10 @@
   }
 
   // 4. If shadow host has a non-null shadow root whose "is declarative shadow
-  // root" property is false or it is not a user agent shadow root for
-  // <selectmenu>, then throw an "NotSupportedError" DOMException.
-  if (GetShadowRoot()) {
-    if (!GetShadowRoot()->IsDeclarativeShadowRoot() &&
-        !(RuntimeEnabledFeatures::HTMLSelectMenuElementEnabled() &&
-          IsA<HTMLSelectMenuElement>(this) && GetShadowRoot()->IsUserAgent())) {
-      return "Shadow root cannot be created on a host "
-             "which already hosts a shadow tree.";
-    }
+  // root" property is false, then throw an "NotSupportedError" DOMException.
+  if (GetShadowRoot() && !GetShadowRoot()->IsDeclarativeShadowRoot()) {
+    return "Shadow root cannot be created on a host "
+           "which already hosts a shadow tree.";
   }
   return nullptr;
 }
@@ -4714,37 +4708,16 @@
 
   if (auto* shadow_root = GetShadowRoot()) {
     // NEW. If shadow host has a non-null shadow root whose "is declarative
-    // shadow root property" is true or or it is a <selectmenu> with a user
-    // agent shadow root, then remove all of shadow root’s children, in tree
-    // order.
-    DCHECK(shadow_root->IsDeclarativeShadowRoot() ||
-           (RuntimeEnabledFeatures::HTMLSelectMenuElementEnabled() &&
-            IsA<HTMLSelectMenuElement>(this) && shadow_root->IsUserAgent()));
+    // shadow root property is true, then remove all of shadow root’s children,
+    // in tree order. Return shadow host’s shadow root.
+    DCHECK(shadow_root->IsDeclarativeShadowRoot());
     shadow_root->RemoveChildren();
-
-    // Ensure that current shadow root properties are updated for <selectmenu>.
-    if (IsA<HTMLSelectMenuElement>(this)) {
-      shadow_root->UpdateType(type);
-      InitializeShadowRootInternal(*shadow_root, focus_delegation,
-                                   slot_assignment_mode);
-    }
-
     return *shadow_root;
   }
 
   // 5. Let shadow be a new shadow root whose node document is this’s node
   // document, host is this, and mode is init’s mode.
   ShadowRoot& shadow_root = CreateAndAttachShadowRoot(type);
-  InitializeShadowRootInternal(shadow_root, focus_delegation,
-                               slot_assignment_mode);
-  // 8. Set this’s shadow root to shadow.
-  return shadow_root;
-}
-
-void Element::InitializeShadowRootInternal(
-    ShadowRoot& shadow_root,
-    FocusDelegation focus_delegation,
-    SlotAssignmentMode slot_assignment_mode) {
   // 6. Set shadow’s delegates focus to init’s delegatesFocus.
   shadow_root.SetDelegatesFocus(focus_delegation ==
                                 FocusDelegation::kDelegateFocus);
@@ -4759,6 +4732,8 @@
         GetCustomElementState() != CustomElementState::kPreCustomized));
 
   shadow_root.SetSlotAssignmentMode(slot_assignment_mode);
+  // 8. Set this’s shadow root to shadow.
+  return shadow_root;
 }
 
 ShadowRoot* Element::OpenShadowRoot() const {
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h
index 5b0e4e2..9def45e 100644
--- a/third_party/blink/renderer/core/dom/element.h
+++ b/third_party/blink/renderer/core/dom/element.h
@@ -655,9 +655,6 @@
       ShadowRootType,
       FocusDelegation focus_delegation = FocusDelegation::kNone,
       SlotAssignmentMode slot_assignment_mode = SlotAssignmentMode::kNamed);
-  void InitializeShadowRootInternal(ShadowRoot&,
-                                    FocusDelegation,
-                                    SlotAssignmentMode);
 
   // Returns the shadow root attached to this element if it is a shadow host.
   ShadowRoot* GetShadowRoot() const;
diff --git a/third_party/blink/renderer/core/dom/shadow_root.cc b/third_party/blink/renderer/core/dom/shadow_root.cc
index 064576d..b2743ccb 100644
--- a/third_party/blink/renderer/core/dom/shadow_root.cc
+++ b/third_party/blink/renderer/core/dom/shadow_root.cc
@@ -203,14 +203,6 @@
   return kInsertionDone;
 }
 
-void ShadowRoot::UpdateType(ShadowRootType type) {
-  DCHECK(GetType() == ShadowRootType::kUserAgent);
-  DCHECK(RuntimeEnabledFeatures::HTMLSelectMenuElementEnabled());
-  DCHECK(IsA<HTMLSelectMenuElement>(host()))
-      << "Updating the type is only supported for <selectmenu> elements";
-  type_ = static_cast<unsigned>(type);
-}
-
 void ShadowRoot::RemovedFrom(ContainerNode& insertion_point) {
   if (insertion_point.isConnected()) {
     if (NeedsSlotAssignmentRecalc())
diff --git a/third_party/blink/renderer/core/dom/shadow_root.h b/third_party/blink/renderer/core/dom/shadow_root.h
index c91574c..e507859b 100644
--- a/third_party/blink/renderer/core/dom/shadow_root.h
+++ b/third_party/blink/renderer/core/dom/shadow_root.h
@@ -36,7 +36,6 @@
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/dom/tree_scope.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
-#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/wtf/casting.h"
 
 namespace blink {
@@ -75,7 +74,6 @@
     return *To<Element>(ParentOrShadowHostNode());
   }
   ShadowRootType GetType() const { return static_cast<ShadowRootType>(type_); }
-  void UpdateType(ShadowRootType type);
   String mode() const {
     switch (GetType()) {
       case ShadowRootType::kUserAgent:
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index 487624c..5ec88be 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -1294,7 +1294,7 @@
       frame_->GetDocument()->Lifecycle().LifecyclePostponed())
     return;
 
-  if (frame_->IsMainFrame())
+  if (frame_->IsOutermostMainFrame())
     layout_shift_tracker_->NotifyViewportSizeChanged();
 
   auto* layout_view = GetLayoutView();
diff --git a/third_party/blink/renderer/core/html/forms/slider_thumb_element.cc b/third_party/blink/renderer/core/html/forms/slider_thumb_element.cc
index 1760571..f8b95f65 100644
--- a/third_party/blink/renderer/core/html/forms/slider_thumb_element.cc
+++ b/third_party/blink/renderer/core/html/forms/slider_thumb_element.cc
@@ -310,10 +310,7 @@
 // --------------------------------
 
 SliderContainerElement::SliderContainerElement(Document& document)
-    : HTMLDivElement(document),
-      has_touch_event_handler_(false),
-      touch_started_(false),
-      sliding_direction_(kNoMove) {
+    : HTMLDivElement(document) {
   UpdateTouchEventHandlerRegistry();
   SetHasCustomStyleCallbacks();
 }
@@ -340,12 +337,18 @@
   if (!input || input->IsDisabledFormControl() || !event)
     return;
 
+  auto* thumb = To<SliderThumbElement>(
+      GetTreeScope().getElementById(shadow_element_names::kIdSliderThumb));
+
+  // TODO: Also do this for touchcancel?
   if (event->type() == event_type_names::kTouchend) {
-    // TODO: Also do this for touchcancel?
+    if (!touch_moved_ && thumb)
+      thumb->SetPositionFromPoint(start_point_);
     input->DispatchFormControlChangeEvent();
     event->SetDefaultHandled();
     sliding_direction_ = kNoMove;
     touch_started_ = false;
+    touch_moved_ = false;
     return;
   }
 
@@ -356,8 +359,6 @@
   }
 
   TouchList* touches = event->targetTouches();
-  auto* thumb = To<SliderThumbElement>(
-      GetTreeScope().getElementById(shadow_element_names::kIdSliderThumb));
   if (!thumb || !touches)
     return;
 
@@ -366,8 +367,9 @@
       start_point_ = touches->item(0)->AbsoluteLocation();
       sliding_direction_ = kNoMove;
       touch_started_ = true;
-      thumb->SetPositionFromPoint(touches->item(0)->AbsoluteLocation());
+      touch_moved_ = false;
     } else if (touch_started_) {
+      touch_moved_ = true;
       LayoutPoint current_point = touches->item(0)->AbsoluteLocation();
       if (sliding_direction_ ==
           kNoMove) {  // Still needs to update the direction.
diff --git a/third_party/blink/renderer/core/html/forms/slider_thumb_element.h b/third_party/blink/renderer/core/html/forms/slider_thumb_element.h
index 0e7c6a3..3224c8e 100644
--- a/third_party/blink/renderer/core/html/forms/slider_thumb_element.h
+++ b/third_party/blink/renderer/core/html/forms/slider_thumb_element.h
@@ -109,9 +109,10 @@
   Direction GetDirection(LayoutPoint&, LayoutPoint&);
   bool CanSlide();
 
-  bool has_touch_event_handler_;
-  bool touch_started_;
-  Direction sliding_direction_;
+  bool has_touch_event_handler_ = false;
+  bool touch_started_ = false;
+  bool touch_moved_ = false;
+  Direction sliding_direction_ = kNoMove;
   LayoutPoint start_point_;
 };
 
diff --git a/third_party/blink/renderer/core/html/forms/text_field_input_type.cc b/third_party/blink/renderer/core/html/forms/text_field_input_type.cc
index 6b514f4..35145c5 100644
--- a/third_party/blink/renderer/core/html/forms/text_field_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/text_field_input_type.cc
@@ -280,10 +280,13 @@
 }
 
 bool TextFieldInputType::ShouldSubmitImplicitly(const Event& event) {
-  return (event.type() == event_type_names::kTextInput &&
-          event.HasInterface(event_interface_names::kTextEvent) &&
-          To<TextEvent>(event).data() == "\n") ||
-         InputTypeView::ShouldSubmitImplicitly(event);
+  if (const TextEvent* text_event = DynamicTo<TextEvent>(event)) {
+    if (!text_event->IsPaste() && !text_event->IsDrop() &&
+        text_event->data() == "\n") {
+      return true;
+    }
+  }
+  return InputTypeView::ShouldSubmitImplicitly(event);
 }
 
 void TextFieldInputType::CustomStyleForLayoutObject(ComputedStyle& style) {
diff --git a/third_party/blink/renderer/core/input/touch_event_manager_test.cc b/third_party/blink/renderer/core/input/touch_event_manager_test.cc
index 5266a0a..aa83914 100644
--- a/third_party/blink/renderer/core/input/touch_event_manager_test.cc
+++ b/third_party/blink/renderer/core/input/touch_event_manager_test.cc
@@ -98,6 +98,11 @@
       Vector<WebPointerEvent>(), Vector<WebPointerEvent>());
   GetEventHandler().DispatchBufferedTouchEvents();
 
+  GetEventHandler().HandlePointerEvent(
+      CreateTouchPointerEvent(WebInputEvent::Type::kPointerUp),
+      Vector<WebPointerEvent>(), Vector<WebPointerEvent>());
+  GetEventHandler().DispatchBufferedTouchEvents();
+
   auto* input =
       To<HTMLInputElement>(GetDocument().getElementById("slideElement"));
   // Allow off by 1 error because it may result in different value in some
diff --git a/third_party/blink/renderer/core/layout/layout_shift_tracker.cc b/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
index 16a75834..1ffdef23 100644
--- a/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
+++ b/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
@@ -477,7 +477,7 @@
 
 double LayoutShiftTracker::SubframeWeightingFactor() const {
   LocalFrame& frame = frame_view_->GetFrame();
-  if (frame.IsMainFrame())
+  if (frame.IsOutermostMainFrame())
     return 1;
 
   // Map the subframe view rect into the coordinate space of the local root.
diff --git a/third_party/blink/renderer/core/loader/cookie_jar.cc b/third_party/blink/renderer/core/loader/cookie_jar.cc
index b3644cb..9760e24 100644
--- a/third_party/blink/renderer/core/loader/cookie_jar.cc
+++ b/third_party/blink/renderer/core/loader/cookie_jar.cc
@@ -122,11 +122,10 @@
                              RuntimeEnabledFeatures::PartitionedCookiesEnabled(
                                  document_->GetExecutionContext()),
                              &value);
-  last_operation_was_set_ = false;
   LogCookieHistogram("Blink.CookiesTime.", requested, timer.Elapsed());
-
   UpdateCacheAfterGetRequest(cookie_url, value);
 
+  last_operation_was_set_ = false;
   return value;
 }
 
@@ -199,7 +198,7 @@
     }
   }
 
-  UMA_HISTOGRAM_ENUMERATION("Blink.Experimental.Cookies.CacheLookupResult",
+  UMA_HISTOGRAM_ENUMERATION("Blink.Experimental.Cookies.CacheLookupResult2",
                             result);
 
   last_cookies_hash_ = new_hash;
diff --git a/third_party/blink/renderer/modules/mediastream/browser_capture_media_stream_track.idl b/third_party/blink/renderer/modules/mediastream/browser_capture_media_stream_track.idl
index 5bda5d5..6a72080 100644
--- a/third_party/blink/renderer/modules/mediastream/browser_capture_media_stream_track.idl
+++ b/third_party/blink/renderer/modules/mediastream/browser_capture_media_stream_track.idl
@@ -7,7 +7,7 @@
     Exposed = Window,
     RuntimeEnabled = RegionCapture
 ]
-interface BrowserCaptureMediaStreamTrack : MediaStreamTrack {
+interface BrowserCaptureMediaStreamTrack : FocusableMediaStreamTrack {
   // 1. If |cropTarget| is a non-empty string, start cropping the track
   //    to the coordinates of the element represented by |cropTarget|.
   //    Return a Promise that resolves once cropping has been fully initiated
@@ -18,17 +18,4 @@
   //    propagated and subsequent frames are guaranteed to be uncropped.
   [CallWith = ScriptState, RaisesException, MeasureAs = RegionCapture]
   Promise<void> cropTo(CropTarget? crop_id);
-
-  // See FocusableMediaStreamTrack.focus() for more details of what this method
-  // does and how it behaves. It is here because:
-  // * BrowserCaptureMediaStreamTrack is for tab-capture, and is shipped.
-  // * FocusableMediaStreamTrack is for window-capture, and is in Origin Trial.
-  // Both tabs and windows are focusable, so both expose focus() if the
-  // ConditionalFocus OT is active.
-  [
-    CallWith = ExecutionContext,
-    RaisesException,
-    MeasureAs = ConditionalFocus,
-    RuntimeEnabled = ConditionalFocus
-  ] void focus(CaptureStartFocusBehavior focus_behavior);
 };
diff --git a/third_party/blink/renderer/modules/mediastream/focusable_media_stream_track.idl b/third_party/blink/renderer/modules/mediastream/focusable_media_stream_track.idl
index 321201c7..a1df9953 100644
--- a/third_party/blink/renderer/modules/mediastream/focusable_media_stream_track.idl
+++ b/third_party/blink/renderer/modules/mediastream/focusable_media_stream_track.idl
@@ -23,10 +23,6 @@
   // Promise<MediaStream> is resolved, or if the call comes too late due
   // to processing delays, the user agent assumes an implicit call with |focus|
   // set to a value decided by the user agent itself.
-  [
-    CallWith = ExecutionContext,
-    RaisesException,
-    MeasureAs = ConditionalFocus,
-    RuntimeEnabled = ConditionalFocus  // Gate exposure in sub-classes.
-  ] void focus(CaptureStartFocusBehavior focus_behavior);
+  [CallWith = ExecutionContext, RaisesException, MeasureAs = ConditionalFocus]
+  void focus(CaptureStartFocusBehavior focus_behavior);
 };
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_track_impl.cc b/third_party/blink/renderer/modules/mediastream/media_stream_track_impl.cc
index 0a7ebd28..07db88dc 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_track_impl.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_track_impl.cc
@@ -240,6 +240,12 @@
       (display_surface_type == media::mojom::DisplayCaptureSurfaceType::WINDOW);
 
   if (is_tab_capture && RuntimeEnabledFeatures::RegionCaptureEnabled(context)) {
+    // Note:
+    // * ConditionalFocus is `implied_by` RegionCapture.
+    // * BrowserCaptureMediaStreamTrack a subclass of FocusableMediaStreamTrack.
+    // Therefore, tab-capture with ConditionalFocus/RegionCapture active
+    // instantiates a track on which focus() is exposed - as intended.
+    DCHECK(RuntimeEnabledFeatures::ConditionalFocusEnabled(context));
     return MakeGarbageCollected<BrowserCaptureMediaStreamTrack>(
         context, component, std::move(callback), descriptor_id);
   } else if ((is_tab_capture || is_window_capture) &&
diff --git a/third_party/blink/renderer/modules/plugins/dom_plugin_array.cc b/third_party/blink/renderer/modules/plugins/dom_plugin_array.cc
index 2bb7e41..8f4d9db 100644
--- a/third_party/blink/renderer/modules/plugins/dom_plugin_array.cc
+++ b/third_party/blink/renderer/modules/plugins/dom_plugin_array.cc
@@ -170,7 +170,6 @@
 }
 
 bool DOMPluginArray::IsPdfViewerAvailable() {
-  DCHECK(should_return_fixed_plugin_data_);
   auto* data = GetPluginData();
   if (!data)
     return false;
diff --git a/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.cc b/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.cc
index a5d6501..fd6126c 100644
--- a/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.cc
+++ b/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.cc
@@ -177,6 +177,7 @@
     RasterInvalidationFunction function,
     const PaintChunkSubset& new_chunks,
     bool layer_offset_or_state_changed,
+    bool layer_effect_changed,
     Vector<PaintChunkInfo>& new_chunks_info) {
   ChunkToLayerMapper mapper(layer_state_, layer_offset_);
   Vector<bool> old_chunks_matched;
@@ -227,8 +228,14 @@
       auto& new_chunk_info = new_chunks_info.emplace_back(*this, mapper, it);
 
       if (reason == PaintInvalidationReason::kNone) {
-        reason = ChunkPropertiesChanged(new_chunk, old_chunk, new_chunk_info,
-                                        old_chunk_info, layer_state_);
+        if (layer_effect_changed) {
+          // Because of DecompositeEffect, the layer's effect may have changed
+          // even if the chunk's didn't.
+          reason = PaintInvalidationReason::kPaintProperty;
+        } else {
+          reason = ChunkPropertiesChanged(new_chunk, old_chunk, new_chunk_info,
+                                          old_chunk_info, layer_state_);
+        }
       }
 
       if (IsFullPaintInvalidationReason(reason)) {
@@ -331,6 +338,7 @@
 
   bool layer_offset_or_state_changed =
       layer_offset_ != layer_offset || layer_state_ != layer_state;
+  bool layer_effect_changed = &layer_state_.Effect() != &layer_state.Effect();
   bool layer_bounds_was_empty = layer_bounds_.IsEmpty();
   layer_offset_ = layer_offset;
   layer_bounds_ = layer_bounds;
@@ -359,7 +367,8 @@
     }
   } else {
     GenerateRasterInvalidations(raster_invalidation_function, new_chunks,
-                                layer_offset_or_state_changed, new_chunks_info);
+                                layer_offset_or_state_changed,
+                                layer_effect_changed, new_chunks_info);
   }
 
   old_paint_chunks_info_ = std::move(new_chunks_info);
diff --git a/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.h b/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.h
index cf369e8..92de1b9 100644
--- a/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.h
+++ b/third_party/blink/renderer/platform/graphics/paint/raster_invalidator.h
@@ -107,6 +107,7 @@
   void GenerateRasterInvalidations(RasterInvalidationFunction,
                                    const PaintChunkSubset&,
                                    bool layer_offset_or_state_changed,
+                                   bool layer_effect_changed,
                                    Vector<PaintChunkInfo>& new_chunks_info);
 
   ALWAYS_INLINE const PaintChunk& GetOldChunk(wtf_size_t index) const;
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 3d6e72c..be4929e 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -448,6 +448,7 @@
       name: "ConditionalFocus",
       origin_trial_feature_name: "ConditionalFocus",
       status: {"Android": "", "default": "experimental"},
+      implied_by: ["RegionCapture"],
     },
     {
       name: "ConsolidatedMovementXY",
@@ -669,8 +670,7 @@
     },
     {
       name: "CSSObjectViewBox",
-      status: "experimental",
-      implied_by: ["DocumentTransition"],
+      status: "stable",
     },
     {
       name: "CSSOffsetPathRay",
@@ -1951,7 +1951,7 @@
     {
       name: "RegionCapture",
       origin_trial_feature_name: "RegionCapture",
-      status: {"Android": "", "default": "stable"},
+      status: "experimental",
     },
     {
       name: "RemotePlayback",
diff --git a/third_party/blink/renderer/platform/text/segmented_string.h b/third_party/blink/renderer/platform/text/segmented_string.h
index fe4784a7..7bcf501 100644
--- a/third_party/blink/renderer/platform/text/segmented_string.h
+++ b/third_party/blink/renderer/platform/text/segmented_string.h
@@ -144,7 +144,6 @@
   union {
     const LChar* string8_ptr;
     const UChar* string16_ptr;
-    const void* void_ptr;
   } data_;
   const LChar* data_start_;
   // |data_last_char_| points to the last character (or nullptr). This is to
diff --git a/third_party/blink/tools/blinkpy/w3c/android_wpt_expectations_updater.py b/third_party/blink/tools/blinkpy/w3c/android_wpt_expectations_updater.py
index 9749778e3c..9dc929fb 100644
--- a/third_party/blink/tools/blinkpy/w3c/android_wpt_expectations_updater.py
+++ b/third_party/blink/tools/blinkpy/w3c/android_wpt_expectations_updater.py
@@ -52,22 +52,16 @@
                 host.filesystem.read_text_file(ANDROID_DISABLED_TESTS)})
         self._baseline_expectations = TestExpectations(self.port)
         assert(len(self.options.android_product) == 1)
-        self.product = self.options.android_product[0]
-        if self.product == ANDROID_WEBLAYER:
+        product = self.options.android_product[0]
+        if product == ANDROID_WEBLAYER:
             self.testid_prefix = "ninja://weblayer/shell/android:weblayer_shell_wpt/"
-        elif self.product == ANDROID_WEBVIEW:
+            self.test_suite = "weblayer_shell_wpt"
+        elif product == ANDROID_WEBVIEW:
             self.testid_prefix = "ninja://android_webview/test:system_webview_wpt/"
-        elif self.product == CHROME_ANDROID:
+            self.test_suite = "system_webview_wpt"
+        elif product == CHROME_ANDROID:
             self.testid_prefix = "ninja://chrome/android:chrome_public_wpt/"
-
-    def _test_suite(self, builder_name, flag_specific=None):
-        if self.product == ANDROID_WEBLAYER:
-            return 'weblayer_shell_wpt'
-        elif self.product == ANDROID_WEBVIEW:
-            return 'system_webview_wpt'
-        elif self.product == CHROME_ANDROID:
-            return 'chrome_public_wpt'
-        raise ValueError('unrecognized android product: %r' % self.product)
+            self.test_suite = "chrome_public_wpt"
 
     def expectations_files(self):
         # We need to put all the Android expectation files in
@@ -187,7 +181,7 @@
                 results_from_expectation = set([ResultType.Failure])
         return results_from_expectation
 
-    def write_to_test_expectations(self, test_to_results, flag_specific=None):
+    def write_to_test_expectations(self, test_to_results):
         """Each expectations file is browser specific, and currently only
         runs on pie. Therefore we do not need any configuration specifiers
         to anotate expectations for certain builds.
diff --git a/third_party/blink/tools/blinkpy/w3c/android_wpt_expectations_updater_unittest.py b/third_party/blink/tools/blinkpy/w3c/android_wpt_expectations_updater_unittest.py
index 4bb53c2c..653571b6 100644
--- a/third_party/blink/tools/blinkpy/w3c/android_wpt_expectations_updater_unittest.py
+++ b/third_party/blink/tools/blinkpy/w3c/android_wpt_expectations_updater_unittest.py
@@ -55,12 +55,9 @@
         host.builders = BuilderList({
             'MOCK Android Weblayer - Pie': {
                 'port_name': 'test-android-pie',
-                'specifiers':
-                ['Precise', 'Release', 'anDroid', 'android_Weblayer'],
+                'specifiers': ['Precise', 'Release',
+                               'anDroid', 'android_Weblayer'],
                 'is_try_builder': True,
-                'steps': {
-                    'weblayer_shell_wpt (with patch)': {},
-                },
             },
         })
 
diff --git a/third_party/blink/tools/blinkpy/w3c/test_importer.py b/third_party/blink/tools/blinkpy/w3c/test_importer.py
index 99c09f4..f15d5d8 100644
--- a/third_party/blink/tools/blinkpy/w3c/test_importer.py
+++ b/third_party/blink/tools/blinkpy/w3c/test_importer.py
@@ -255,7 +255,7 @@
         try_results = cl_status.try_job_results
 
         if try_results and self.git_cl.some_failed(try_results):
-            self.fetch_new_expectations_and_baselines(try_results)
+            self.fetch_new_expectations_and_baselines()
             self.fetch_wpt_override_expectations()
             if self.chromium_git.has_working_directory_changes():
                 # Skip slow and timeout tests so that presubmit check passes
@@ -667,7 +667,7 @@
             return ''
         return data['emails'][0]
 
-    def fetch_new_expectations_and_baselines(self, try_results):
+    def fetch_new_expectations_and_baselines(self):
         """Modifies expectation lines and baselines based on try job results.
 
         Assuming that there are some try job results available, this
@@ -676,27 +676,15 @@
 
         This is the same as invoking the `wpt-update-expectations` script.
         """
-        flag_specific_options = set()
-        for build, status in try_results.items():
-            if status.result != 'FAILURE':
-                continue
-            for step_name in self.host.builders.step_names_for_builder(
-                    build.builder_name):
-                option = self.host.builders.flag_specific_option(
-                    build.builder_name, step_name)
-                if option:
-                    flag_specific_options.add(option)
+        _log.info('Adding test expectations lines to TestExpectations.')
+        self.rebaselined_tests, self.new_test_expectations = (
+            self._expectations_updater.update_expectations())
 
-        # Update generic expectations first.
-        for option in [None] + list(flag_specific_options):
-            expectations_file = ('FlagExpectations/%s' %
-                                 option if option else 'TestExpectations')
-            _log.info('Adding test expectation lines for %s.',
-                      expectations_file)
-            rebaselined_tests, new_expectations = (
-                self._expectations_updater.update_expectations(option))
-            self.rebaselined_tests.update(rebaselined_tests)
-            self.new_test_expectations.update(new_expectations)
+        _log.info('Adding test expectations lines for disable-layout-ng')
+        self._expectations_updater.update_expectations_for_flag_specific('disable-layout-ng')
+
+        _log.info('Adding test expectations lines for disable-site-isolation-trials')
+        self._expectations_updater.update_expectations_for_flag_specific('disable-site-isolation-trials')
 
     def fetch_wpt_override_expectations(self):
         """Modifies WPT Override expectations based on try job results.
diff --git a/third_party/blink/tools/blinkpy/w3c/test_importer_unittest.py b/third_party/blink/tools/blinkpy/w3c/test_importer_unittest.py
index 11c26a2..4b22d88 100644
--- a/third_party/blink/tools/blinkpy/w3c/test_importer_unittest.py
+++ b/third_party/blink/tools/blinkpy/w3c/test_importer_unittest.py
@@ -114,7 +114,7 @@
             try_job_results={
                 Build('builder-a', 123): TryJobStatus('COMPLETED', 'FAILURE'),
             })
-        importer.fetch_new_expectations_and_baselines = lambda _: None
+        importer.fetch_new_expectations_and_baselines = lambda: None
         importer.fetch_wpt_override_expectations = lambda: None
         success = importer.update_expectations_for_cl()
         self.assertTrue(success)
@@ -176,7 +176,7 @@
                 Build('cq-builder-b', 200): TryJobStatus(
                     'COMPLETED', 'SUCCESS'),
             })
-        importer.fetch_new_expectations_and_baselines = lambda _: None
+        importer.fetch_new_expectations_and_baselines = lambda: None
         success = importer.run_commit_queue_for_cl()
         self.assertFalse(success)
         self.assertLog([
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater.py b/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater.py
index b5d979f..9a73ec7 100644
--- a/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater.py
+++ b/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater.py
@@ -75,6 +75,7 @@
         self._test_expectations = TestExpectations(
             self.port, expectations_dict=expectations_dict)
         self.testid_prefix = "ninja://:blink_web_tests/"
+        self.test_suite = "blink_web_tests"
 
     def expectations_files(self):
         """Returns list of expectations files.
@@ -156,13 +157,68 @@
                  'This command line argument can be used to mark tests '
                  'as flaky.')
 
-    def update_expectations(self, flag_specific=None):
+    def update_expectations_for_flag_specific(self, flag_specific):
         """Downloads new baselines and adds test expectations lines.
 
         Returns:
             A pair: A set of tests that are rebaselined, and a dictionary
             mapping tests that couldn't be rebaselined to lists of expectation
-            lines written to 'TestExpectations' or 'FlagSpecificExpectations/*'.
+            lines written to flag specific test expectations.
+        """
+        self.port.wpt_manifest.cache_clear()
+
+        issue_number = self.get_issue_number()
+        if issue_number == 'None':
+            raise ScriptError('No issue on current branch.')
+
+        if flag_specific == "disable-site-isolation-trials":
+            builder_names = ["linux-rel"]
+            test_suite = "not_site_per_process_blink_web_tests"
+        else:
+            builder_names = self.host.builders.all_flag_specific_try_builder_names(
+                flag_specific)
+            test_suite = "blink_web_tests"
+
+        build_to_status = self.git_cl.latest_try_jobs(
+            builder_names=builder_names,
+            patchset=self.patchset)
+        if not build_to_status:
+            raise ScriptError('No try job information was collected.')
+
+        # Here we build up a dict of failing test results for all platforms.
+        test_expectations = {}
+        for build, job_status in build_to_status.items():
+            if (job_status.result == 'SUCCESS' and
+                    not self.options.include_unexpected_pass):
+                continue
+            # Temporary logging for https://crbug.com/1154650
+            result_dicts = self.get_failing_results_dicts(build, test_suite)
+            _log.info('Merging failing results dicts for %s', build)
+            for result_dict in result_dicts:
+                test_expectations = self.merge_dicts(
+                    test_expectations, result_dict)
+
+        generic_expectations = TestExpectations(self.port)
+
+        # do not create baseline for flag-specific builders yet
+        # rebaselined_tests, test_expectations = self.download_text_baselines(
+        #    test_expectations, flag_specific)
+
+        # Do not create expectations for tests which should have baseline
+        _, test_expectations = self.get_tests_to_rebaseline(
+            test_expectations)
+        exp_lines_dict = self.write_to_test_expectations(test_expectations,
+                                                         flag_specific,
+                                                         generic_expectations)
+        return [], exp_lines_dict
+
+    def update_expectations(self):
+        """Downloads new baselines and adds test expectations lines.
+
+        Returns:
+            A pair: A set of tests that are rebaselined, and a dictionary
+            mapping tests that couldn't be rebaselined to lists of expectation
+            lines written to TestExpectations.
         """
         # The wpt_manifest function in Port is cached by default, but may be out
         # of date if this code is called during test import. An out of date
@@ -175,24 +231,20 @@
         if issue_number == 'None':
             raise ScriptError('No issue on current branch.')
 
-        build_to_status = self.get_latest_try_jobs(flag_specific)
+        build_to_status = self.get_latest_try_jobs(True)
+        _log.debug('Latest try jobs: %r', build_to_status)
         if not build_to_status:
             raise ScriptError('No try job information was collected.')
-        _log.debug('Latest try jobs:')
-        for build, status in build_to_status.items():
-            _log.debug('  %r: %r', build, status)
 
         # Here we build up a dict of failing test results for all platforms.
         test_expectations = {}
-        for build, job_status in sorted(build_to_status.items()):
+        for build, job_status in build_to_status.items():
             if (job_status.result == 'SUCCESS' and
                     not self.options.include_unexpected_pass):
                 continue
-            test_suite = self._test_suite(build.builder_name, flag_specific)
             # Temporary logging for https://crbug.com/1154650
-            result_dicts = self.get_failing_results_dicts(build, test_suite)
-            _log.info('Merging failing results dicts for %s build %d.',
-                      build.builder_name, build.build_number)
+            result_dicts = self.get_failing_results_dicts(build, self.test_suite)
+            _log.info('Merging failing results dicts for %s', build)
             for result_dict in result_dicts:
                 test_expectations = self.merge_dicts(
                     test_expectations, result_dict)
@@ -205,16 +257,14 @@
         #     }
         # }
 
-        # Each flag-specific suite is coupled to a single port, so the suite's
-        # expectations do not need platform tags.
-        if not flag_specific:
-            self.add_results_for_configs_without_results(
-                test_expectations, self.configs_with_no_results)
-            # Merge results for different platforms that had the same results.
-            test_expectations = {
-                test_name: self.merge_same_valued_keys(platform_result)
-                for test_name, platform_result in test_expectations.items()
-            }
+        self.add_results_for_configs_without_results(
+            test_expectations, self.configs_with_no_results)
+
+        # And then we merge results for different platforms that had the same results.
+        for test_name, platform_result in test_expectations.items():
+            # platform_result is a dict mapping platforms to results.
+            test_expectations[test_name] = self.merge_same_valued_keys(
+                platform_result)
 
         # At this point, test_expectations looks like: {
         #     'test-with-failing-result': {
@@ -224,30 +274,10 @@
         # }
 
         rebaselined_tests, test_expectations = self.download_text_baselines(
-            test_expectations, flag_specific)
-        exp_lines_dict = self.write_to_test_expectations(
-            test_expectations, flag_specific)
+            test_expectations)
+        exp_lines_dict = self.write_to_test_expectations(test_expectations)
         return rebaselined_tests, exp_lines_dict
 
-    def _test_suite(self, builder_name, flag_specific=None):
-        """Find which test suite on a builder runs with a flag."""
-        builders = self.host.builders
-        step_names = [
-            step for step in builders.step_names_for_builder(builder_name)
-            if flag_specific == builders.flag_specific_option(
-                builder_name, step)
-        ]
-        if len(step_names) > 1:
-            raise ValueError(
-                'builder %r has steps %s that run flag-specific suite '
-                '%r (builder list probably misconfigured)' %
-                (builder_name, ', '.join(step_names), flag_specific))
-        elif step_names:
-            # Remove a possible suffix in the step name like '(with patch,
-            # experimental)'.
-            return re.sub('\s*\(.*\)$', '', step_names[0])
-        return 'blink_web_tests'
-
     def add_results_for_configs_without_results(self, test_expectations,
                                                 configs_with_no_results):
         # Handle any platforms with missing results.
@@ -298,23 +328,13 @@
         """Returns current CL number. Can be replaced in unit tests."""
         return self.git_cl.get_issue_number()
 
-    def get_latest_try_jobs(self, flag_specific=None):
+    def get_latest_try_jobs(self, exclude_flag_specific):
         """Returns the latest finished try jobs as Build objects."""
-        builder_names = set(self._get_try_bots())
-        builders = self.host.builders
-        if flag_specific:
-            builder_names &= set(
-                self.host.builders.all_flag_specific_try_builder_names(
-                    flag_specific))
-        else:
-            flag_spec_only_builders = set()
-            for builder_name in builder_names:
-                step_names = builders.step_names_for_builder(builder_name)
-                if all(
-                        builders.flag_specific_option(builder_name, step_name)
-                        for step_name in step_names):
-                    flag_spec_only_builders.add(builder_name)
-            builder_names -= flag_spec_only_builders
+        builder_names = self._get_try_bots()
+        if exclude_flag_specific:
+            all_flag_specific = self.host.builders.all_flag_specific_try_builder_names("*")
+            builder_names = [b for b in builder_names if b not in all_flag_specific]
+
         return self.git_cl.latest_try_jobs(builder_names=builder_names,
                                            patchset=self.patchset)
 
@@ -374,8 +394,7 @@
 
         webdriver_test_results = filter(None, webdriver_test_results)
         if not test_results_list and not webdriver_test_results:
-            _log.warning('No results for %s build %d.', build.builder_name,
-                         build.build_number)
+            _log.warning('No results for build %s', build)
             self.configs_with_no_results.extend(self.get_builder_configs(build))
             return []
 
@@ -677,7 +696,57 @@
             system_remover.remove_os_versions(test, versions)
         system_remover.update_expectations()
 
-    def create_line_dict(self, merged_results, flag_specific=None):
+    def create_line_dict_for_flag_specific(self, merged_results, generic_expectations):
+        """Creates list of test expectations lines for flag specific builder.
+
+        Traverses through the given |merged_results| dictionary and parses the
+        value to create one test expectations line per key. If a test expectation
+        from generic expectations can be inherited, we will reuse that expectation
+        so that we can keep the file size small. Flag specific expectations
+        does not use platform tag, so we don't need handle conflicts either.
+
+        Test expectation lines have the following format:
+            ['BUG_URL TEST_NAME [EXPECTATION(S)]']
+
+        Args:
+            merged_results: A dictionary with the format:
+                {
+                    'test-with-failing-result': {
+                        (config1,): SimpleTestResult
+                    }
+                }
+
+        Returns:
+            line_dict: A dictionary from test names to a list of test
+                       expectation lines
+                       (each SimpleTestResult turns into a line).
+            configs_to_remove: An empty dictionary
+        """
+        line_dict = defaultdict(list)
+        for test_name, test_results in sorted(merged_results.items()):
+            if not self._is_wpt_test(test_name):
+                _log.warning(
+                    'Non-WPT test "%s" unexpectedly passed to create_line_dict.',
+                    test_name)
+                continue
+            expectation_line = generic_expectations.get_expectations(test_name)
+            expectations = expectation_line.results
+            for configs, result in sorted(test_results.items()):
+                new_expectations = self.get_expectations(result, test_name)
+                if 'Failure' in new_expectations:
+                    new_expectations.remove('Failure')
+                    new_expectations.add('FAIL')
+                if new_expectations != expectations:
+                    line_dict[test_name].extend(
+                        self._create_lines(test_name, [], result))
+                # for flag-specific builders, we always have one config for each
+                # test, so quit the loop here
+                break
+
+        return line_dict, {}
+
+
+    def create_line_dict(self, merged_results):
         """Creates list of test expectations lines.
 
         Traverses through the given |merged_results| dictionary and parses the
@@ -697,24 +766,20 @@
 
         Returns:
             line_dict: A dictionary from test names to a list of test
-                expectation lines (each SimpleTestResult turns into a line).
+                       expectation lines
+                       (each SimpleTestResult turns into a line).
             configs_to_remove: A dictionary from test names to a set
-                of OS specifiers.
+                               of os specifiers
         """
         line_dict = defaultdict(list)
         configs_to_remove = defaultdict(set)
-        generic_expectations = TestExpectations(self.port)
         for test_name, test_results in sorted(merged_results.items()):
             if not self._is_wpt_test(test_name):
                 _log.warning(
                     'Non-WPT test "%s" unexpectedly passed to create_line_dict.',
                     test_name)
                 continue
-            test_results = sorted(test_results.items())
-            if flag_specific:
-                test_results = self._truncate_results(generic_expectations,
-                                                      test_name, test_results)
-            for configs, result in test_results:
+            for configs, result in sorted(test_results.items()):
                 line_dict[test_name].extend(
                     self._create_lines(test_name, configs, result))
                 for config in configs:
@@ -724,26 +789,6 @@
 
         return line_dict, configs_to_remove
 
-    def _truncate_results(self, generic_expectations, test_name, test_results):
-        """Truncate a test's results to a single line, at most.
-
-        This filter may yield a line if the generic expectations do not already
-        encompass the flag-specific result.
-        """
-        expectations = generic_expectations.get_expectations(test_name).results
-        # For flag-specific builders, each test always has one config, so pick
-        # any.
-        if not test_results:
-            return
-        _, result = test_results[0]
-        new_expectations = self.get_expectations(result, test_name)
-        if 'Failure' in new_expectations:
-            new_expectations.remove('Failure')
-            new_expectations.add('FAIL')
-        new_expectations = {result.upper() for result in new_expectations}
-        if new_expectations != expectations:
-            yield [], result
-
     def _create_lines(self, test_name, configs, result):
         """Constructs test expectation line strings.
 
@@ -882,7 +927,8 @@
         return frozenset(all_platform_specifiers)
 
     def write_to_test_expectations(self, test_expectations,
-                                   flag_specific=None):
+                                   flag_specific=None,
+                                   generic_expectations=None):
         """Writes the given lines to the TestExpectations file.
 
         The place in the file where the new lines are inserted is after a marker
@@ -895,19 +941,19 @@
         Args:
             test_expectations: A dictionary mapping test names to a dictionary
             mapping platforms and test results.
-            flag_specific (Optional[str]): The flag-specific option name (ex:
-                'highdpi'), or `None` for generic 'blink_web_tests'.
-
         Returns:
             Dictionary mapping test names to lists of test expectation strings.
         """
-        line_dict, configs_to_remove = self.create_line_dict(
-            test_expectations, flag_specific)
+        if flag_specific:
+            line_dict, configs_to_remove = self.create_line_dict_for_flag_specific(
+                test_expectations, generic_expectations)
+        else:
+            line_dict, configs_to_remove = self.create_line_dict(test_expectations)
         if not line_dict:
-            expectations_file = ('FlagExpectations/%s' % flag_specific
-                                 if flag_specific else 'TestExpectations')
-            _log.info('No lines to write to %s, WebdriverExpectations'
-                      ' or NeverFixTests.' % expectations_file)
+            _log.info(
+                'No lines to write to %s, WebdriverExpectations'
+                ' or NeverFixTests.' % (flag_specific or 'TestExpectations')
+            )
             return {}
 
         if configs_to_remove:
@@ -940,9 +986,8 @@
             if not lines:
                 continue
 
-            _log.info('Lines to write to %s:', expectations_file_path)
-            for line in lines:
-                _log.info('  %s', line)
+            _log.info('Lines to write to %s:\n %s', expectations_file_path,
+                      '\n'.join(lines))
             # Writes to TestExpectations file.
             file_contents = self.host.filesystem.read_text_file(
                 expectations_file_path)
@@ -1248,10 +1293,9 @@
             command.append('--patchset=' + str(self.patchset))
         command += tests_to_rebaseline
         rebaseline_output = self.host.executive.run_command(command)
-        _log.info('Output of rebaseline-cl:')
-        for line in rebaseline_output.splitlines():
-            _log.info('  %s', line)
-        _log.info('-- end of rebaseline-cl output --')
+        _log.info(
+            "Output of rebaseline-cl:\n%s\n--end of rebaseline-cl output --" %
+            rebaseline_output)
         return tests_to_rebaseline, test_results
 
     def get_tests_to_rebaseline(self, test_results):
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater_unittest.py b/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater_unittest.py
index e51be0c..0e89ac6 100644
--- a/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater_unittest.py
+++ b/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater_unittest.py
@@ -4,9 +4,6 @@
 
 import copy
 import json
-import sys
-
-import six
 
 from blinkpy.common.host_mock import MockHost
 from blinkpy.common.net.git_cl import TryJobStatus
@@ -44,17 +41,11 @@
                 'port_name': 'test-mac-mac10.10',
                 'specifiers': ['Mac10.10', 'Release'],
                 'is_try_builder': True,
-                'steps': {
-                    'blink_web_tests (with patch)': {},
-                },
             },
             'MOCK Try Mac10.11': {
                 'port_name': 'test-mac-mac10.11',
                 'specifiers': ['Mac10.11', 'Release'],
                 'is_try_builder': True,
-                'steps': {
-                    'blink_web_tests (with patch)': {},
-                },
             },
             'MOCK Try Trusty': {
                 'port_name': 'test-linux-trusty',
@@ -62,43 +53,27 @@
                 'main': 'tryserver.blink',
                 'has_webdriver_tests': True,
                 'is_try_builder': True,
-                'steps': {
-                    'blink_web_tests (with patch)': {},
-                },
             },
             'MOCK Try Precise': {
                 'port_name': 'test-linux-precise',
                 'specifiers': ['Precise', 'Release'],
                 'is_try_builder': True,
-                'steps': {
-                    'blink_web_tests (with patch)': {},
-                },
             },
             'MOCK Try Win10': {
                 'port_name': 'test-win-win10',
                 'specifiers': ['Win10', 'Release'],
                 'is_try_builder': True,
-                'steps': {
-                    'blink_web_tests (with patch)': {},
-                },
             },
             'MOCK Try Win7': {
                 'port_name': 'test-win-win7',
                 'specifiers': ['Win7', 'Release'],
                 'is_try_builder': True,
-                'steps': {
-                    'blink_web_tests (with patch)': {},
-                },
             },
             'MOCK highdpi': {
                 'port_name': 'test-linux-trusty',
                 'specifiers': ['Trusty', 'Release'],
+                'flag_specific': 'highdpi',
                 'is_try_builder': True,
-                'steps': {
-                    'blink_web_tests (with patch)': {
-                        'flag_specific': 'highdpi',
-                    },
-                },
             },
         })
 
@@ -186,87 +161,14 @@
             [json.loads(result)] * 3)
 
         self.assertEqual(0, updater.run())
+
         self.assertEqual(
             host.filesystem.read_text_file(expectations_path),
             '# ====== New tests from wpt-importer added here ======\n'
             'crbug.com/626703 [ Mac10.10 ] external/wpt/test/path.html [ Timeout ]\n'
         )
 
-    def test_update_expectations_for_flag_specific(self):
-        host = self.mock_host()
-        updater = WPTExpectationsUpdater(host)
-        updater.git_cl = MockGitCL(updater.host, {
-            Build('MOCK highdpi', 123):
-            TryJobStatus('COMPLETED', 'FAILURE'),
-        })
-        flag_exp_path = updater.port.path_to_flag_specific_expectations_file(
-            'highdpi')
-        host.filesystem.write_text_file(
-            updater.port.path_to_generic_test_expectations_file(),
-            '# results: [ Timeout Crash Pass Failure Skip ]\n'
-            '# The importer should not create a redundant line in \n'
-            '# "FlagExpectations/highdpi" for this test.\n'
-            'crbug.com/123 external/wpt/test/crash1.html [ Crash ]\n')
-        host.filesystem.write_text_file(
-            flag_exp_path, '# results: [ Timeout Crash Pass Failure Skip ]\n')
-        host.results_fetcher.set_results_to_resultdb(
-            Build('MOCK highdpi', 123), [{
-                'testId':
-                'ninja://:blink_web_tests/external/wpt/test/crash1.html',
-                'variant': {
-                    'def': {
-                        'test_suite': 'blink_web_tests'
-                    },
-                },
-                'status': 'CRASH',
-            }, {
-                'testId':
-                'ninja://:blink_web_tests/external/wpt/test/crash2.html',
-                'variant': {
-                    'def': {
-                        'test_suite': 'blink_web_tests'
-                    },
-                },
-                'status': 'CRASH',
-            }, {
-                'testId':
-                'ninja://:blink_web_tests/external/wpt/test/fail.html',
-                'variant': {
-                    'def': {
-                        'test_suite': 'blink_web_tests'
-                    },
-                },
-                'status': 'FAIL',
-            }] * 3)
-
-        rebaselined_tests, exp_lines = updater.update_expectations('highdpi')
-        self.assertEqual(['external/wpt/test/fail.html'], rebaselined_tests)
-        self.assertEqual(
-            {
-                'external/wpt/test/crash2.html': [
-                    'crbug.com/626703 external/wpt/test/crash2.html [ Crash ]',
-                ],
-            }, dict(exp_lines))
-        self.assertEqual(
-            host.filesystem.read_text_file(flag_exp_path).splitlines(),
-            list(
-                map(six.ensure_text, [
-                    '# results: [ Timeout Crash Pass Failure Skip ]',
-                    '',
-                    '# ====== New tests from wpt-importer added here ======',
-                    'crbug.com/626703 external/wpt/test/crash2.html [ Crash ]',
-                ])))
-        self.assertIn([
-            sys.executable,
-            '/mock-checkout/third_party/blink/tools/blink_tool.py',
-            'rebaseline-cl',
-            '--no-trigger-jobs',
-            '--fill-missing',
-            '--flag-specific=highdpi',
-            'external/wpt/test/fail.html',
-        ], host.executive.calls)
-
-    def test_cmd_arg_include_unexpected_pass_raises_exception(self):
+    def test_cmd_arg_include_unexpected_pass_raieses_exception(self):
         host = self.mock_host()
         expectations_path = \
             host.port_factory.get().path_to_generic_test_expectations_file()
@@ -594,8 +496,7 @@
         # another one has non-match results, and the last one has no
         # corresponding line in generic test expectations.
         host = self.mock_host()
-        updater = WPTExpectationsUpdater(host)
-        port = updater.port
+        port = host.port_factory.get()
 
         # Fill in an initial value for TestExpectations
         expectations_path = port.path_to_generic_test_expectations_file()
@@ -605,6 +506,8 @@
             "external/wpt/test/path.html [ Failure ]\n")
         host.filesystem.write_text_file(expectations_path, content)
 
+        updater = WPTExpectationsUpdater(host)
+
         results = {
             'external/wpt/reftest.html': {
                 tuple([DesktopConfig(port_name='one')]):
@@ -622,8 +525,10 @@
                     expected='PASS', actual='CRASH', bug='crbug.com/test'),
             }
         }
-        line_dict, configs_to_remove = updater.create_line_dict(
-            results, 'highdpi')
+        generic_expectations = TestExpectations(port)
+        line_dict, configs_to_remove = updater.create_line_dict_for_flag_specific(
+            results,
+            generic_expectations)
         self.assertEqual(
             line_dict, {
                 'external/wpt/test/path.html': [
diff --git a/third_party/blink/tools/blinkpy/web_tests/builder_list.py b/third_party/blink/tools/blinkpy/web_tests/builder_list.py
index 1e528a4..0394cbf 100644
--- a/third_party/blink/tools/blinkpy/web_tests/builder_list.py
+++ b/third_party/blink/tools/blinkpy/web_tests/builder_list.py
@@ -50,11 +50,9 @@
                 by test-results.appspot.com API."
             "has_webdriver_tests": Whether webdriver_tests_suite runs on this builder.
 
-        Possible refactoring note:
-            Most of these methods have `builder_name` as the first arg to look
-            into the builder registry. It might make more sense for
-            `BuilderList` to vend `Builder` named tuples with `port_name`,
-            `specifiers`, and other properties that are more ergonomic to use.
+        Possible refactoring note: Potentially, it might make sense to use
+        blinkpy.common.net.results_fetcher.Builder and add port_name and
+        specifiers properties to that class.
         """
         self._builders = builders_dict
         for builder in builders_dict:
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 757c64b..0ddfcce 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1821,6 +1821,7 @@
 crbug.com/1179938 external/wpt/css/css-pseudo/highlight-painting-currentcolor-005.html [ Failure ]
 crbug.com/1024156 external/wpt/css/css-pseudo/highlight-pseudos-inheritance-computed-001.html [ Failure ]
 crbug.com/1024156 external/wpt/css/css-pseudo/highlight-pseudos-currentcolor-inheritance-computed-001.html [ Failure ]
+crbug.com/1024156 external/wpt/css/css-pseudo/highlight-pseudos-currentcolor-inheritance-computed-002.html [ Failure ]
 crbug.com/995106 external/wpt/css/css-pseudo/first-letter-exclude-inline-marker.html [ Failure ]
 crbug.com/995106 external/wpt/css/css-pseudo/first-letter-exclude-inline-child-marker.html [ Failure ]
 crbug.com/1172333 external/wpt/css/css-pseudo/first-letter-hi-001.html [ Failure ]
@@ -3155,6 +3156,7 @@
 crbug.com/1024156 virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/highlight-paired-cascade-003.html [ Pass ]
 crbug.com/1024156 virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/highlight-paired-cascade-006.html [ Pass ]
 crbug.com/1295264 virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/highlight-pseudos-currentcolor-inheritance-computed-001.html [ Pass ]
+crbug.com/1295264 virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/highlight-pseudos-currentcolor-inheritance-computed-002.html [ Pass ]
 crbug.com/1024156 virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/highlight-pseudos-currentcolor-visited-computed-001.html [ Failure ]
 crbug.com/1024156 virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/highlight-styling-002.html [ Pass ]
 crbug.com/1024156 virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/highlight-styling-004.html [ Pass ]
@@ -5311,7 +5313,6 @@
 crbug.com/678633 external/wpt/html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html [ Failure ]
 crbug.com/1317071 [ Mac ] virtual/no-auto-wpt-origin-isolation/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-port.sub.https.html [ Failure Timeout ]
 crbug.com/1323989 external/wpt/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/tentative/same-document-traversal-cross-document-traversal.html [ Pass Timeout ]
-crbug.com/1197633 [ Mac11 ] external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html [ Timeout ]
 
 # Sheriff 2020-03-06
 crbug.com/1059262 virtual/threaded/http/tests/worklet/webexposed/global-interface-listing-paint-worklet.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 523f97f..420d6b5 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -40,6 +40,7 @@
               "external/wpt/animation-worklet",
               "external/wpt/css/css-animations",
               "external/wpt/css/css-backgrounds",
+              "external/wpt/css/css-color/animation",
               "external/wpt/css/css-scroll-snap",
               "external/wpt/css/css-transforms/animation",
               "external/wpt/css/css-transforms/individual-transform/animation",
diff --git a/third_party/blink/web_tests/editing/pasteboard/paste-drop-linebreak-into-text-input.html b/third_party/blink/web_tests/editing/pasteboard/paste-drop-linebreak-into-text-input.html
new file mode 100644
index 0000000..ec2e88d
--- /dev/null
+++ b/third_party/blink/web_tests/editing/pasteboard/paste-drop-linebreak-into-text-input.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<title>Pasting or dropping a line break into text input should not submit the form</title>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/ahem.js"></script>
+
+<pre id="source" style="font: 20px/1 Ahem">foo
+bar</pre>
+
+<form id="form">
+  <input id="target" type="text" value="abc">
+</form>
+
+<script>
+let formSubmitted = false;
+form.onsubmit = event => {
+  event.preventDefault();
+  formSubmitted = true;
+}
+
+const sourceText = source.firstChild;
+
+promise_test(async test => {
+  test.add_cleanup(async () => formSubmitted = false);
+
+  // Select the line break
+  getSelection().setBaseAndExtent(sourceText, 3, sourceText, 4);
+
+  document.execCommand('copy');
+  target.focus();
+  document.execCommand('paste');
+
+  // Give non-conformant UA some time to asynchronously dispatch 'submit' event
+  await new Promise(resolve => test.step_timeout(resolve, 100));
+  assert_false(formSubmitted);
+}, 'Pasting line break into text input should not submit the form');
+
+promise_test(async test => {
+  assert_own_property(window, 'eventSender',
+                      'This test needs eventSender to emulate drag and drop');
+  test.add_cleanup(async () => formSubmitted = false);
+
+  await document.fonts.ready;
+
+  // Select the line break
+  getSelection().setBaseAndExtent(sourceText, 3, sourceText, 4);
+
+  // Drag from the selection highlight
+  const startX = source.offsetLeft + 65;
+  const startY = source.offsetTop + 5;
+  eventSender.mouseMoveTo(startX, startY);
+  eventSender.mouseDown();
+  eventSender.leapForward(100);
+
+  // Drop inside the text input
+  const endX = target.offsetLeft + target.offsetWidth / 2;
+  const endY = target.offsetTop + target.offsetHeight / 2;
+  eventSender.mouseMoveTo(endX, endY);
+  eventSender.mouseUp();
+
+  // Give non-conformant UA some time to asynchronously dispatch 'submit' event
+  await new Promise(resolve => test.step_timeout(resolve, 100));
+  assert_false(formSubmitted);
+}, 'Drag-and-dropping line break into text input should not submit the form');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/animation/opacity-animation-ending-correctly-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-color/animation/opacity-animation-ending-correctly-001-ref.html
new file mode 100644
index 0000000..ca55dc6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/animation/opacity-animation-ending-correctly-001-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<html>
+<title>CSS Test Reference (Color): ending of opacity animation</title>
+<link rel="author" title="L. David Baron" href="https://dbaron.org/">
+<link rel="author" title="Google" href="https://www.google.com/">
+
+<style>
+#test {
+  position: sticky;
+  top: 0;
+  height: 50px;
+  background: blue;
+  opacity: 0.2;
+}
+
+.tall {
+  height: 5000px;
+}
+</style>
+
+<div id="test">
+</div>
+<div class="tall">
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/animation/opacity-animation-ending-correctly-001.html b/third_party/blink/web_tests/external/wpt/css/css-color/animation/opacity-animation-ending-correctly-001.html
new file mode 100644
index 0000000..1fb36cd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/animation/opacity-animation-ending-correctly-001.html
@@ -0,0 +1,48 @@
+<!DOCTYPE HTML>
+<html class="reftest-wait">
+<title>CSS Test (Color): ending of opacity animation</title>
+<link rel="author" title="L. David Baron" href="https://dbaron.org/">
+<link rel="author" title="Google" href="https://www.google.com/">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1330438">
+<link rel="help" href="https://www.w3.org/TR/css-color-3/#transparency">
+<link rel="match" href="opacity-animation-ending-correctly-001-ref.html">
+
+<style>
+#test {
+  position: sticky;
+  top: 0;
+  height: 50px;
+  background: blue;
+  transition: opacity 50ms step-start;
+}
+
+#test.fade {
+  opacity: 0.2;
+}
+
+.tall {
+  height: 5000px;
+}
+</style>
+
+<div id="test">
+</div>
+<div class="tall">
+</div>
+
+<script>
+function flushStyleLayoutAndPrePaint() {
+  document.elementFromPoint(10, 10);
+}
+
+document.getElementById("test").addEventListener("transitionend", function(e) {
+  document.documentElement.classList.remove("reftest-wait");
+});
+requestAnimationFrame(function() {
+  flushStyleLayoutAndPrePaint();
+  requestAnimationFrame(function() {
+    document.getElementById("test").classList.add("fade");
+    flushStyleLayoutAndPrePaint();
+  });
+});
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/animation/opacity-animation-ending-correctly-002.html b/third_party/blink/web_tests/external/wpt/css/css-color/animation/opacity-animation-ending-correctly-002.html
new file mode 100644
index 0000000..7ba097f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/animation/opacity-animation-ending-correctly-002.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html class="reftest-wait">
+<title>CSS Test (Color): ending of opacity animation</title>
+<link rel="author" title="L. David Baron" href="https://dbaron.org/">
+<link rel="author" title="Google" href="https://www.google.com/">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1330438">
+<link rel="help" href="https://www.w3.org/TR/css-color-3/#transparency">
+<link rel="match" href="opacity-animation-ending-correctly-001-ref.html">
+
+<style>
+#test {
+  position: sticky;
+  top: 0;
+  height: 50px;
+  background: blue;
+  transform: translate(0);
+  filter: grayscale(0%);
+  transition: opacity 50ms step-start;
+}
+
+#test.fade {
+  opacity: 0.2;
+}
+
+.tall {
+  height: 5000px;
+}
+</style>
+
+<div id="test">
+</div>
+<div class="tall">
+</div>
+
+<script>
+function flushStyleLayoutAndPrePaint() {
+  document.elementFromPoint(10, 10);
+}
+
+document.getElementById("test").addEventListener("transitionend", function(e) {
+  document.documentElement.classList.remove("reftest-wait");
+});
+requestAnimationFrame(function() {
+  flushStyleLayoutAndPrePaint();
+  requestAnimationFrame(function() {
+    document.getElementById("test").classList.add("fade");
+    flushStyleLayoutAndPrePaint();
+  });
+});
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-pseudos-currentcolor-inheritance-computed-002.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-pseudos-currentcolor-inheritance-computed-002.html
new file mode 100644
index 0000000..0d0da9e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-pseudos-currentcolor-inheritance-computed-002.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Pseudo-Elements Test: highlight selectors getComputedStyle for currentcolor</title>
+<link rel="help" href="https://drafts.csswg.org/css-pseudo/#highlight-selectors">
+<link rel="match" href="reference/highlight-pseudos-currentcolor-inheritance-computed-002-ref.html">
+<p>Pass if text below is green on lime, and the text itself represents green, not initial (black).</p>
+<main>FAIL</main>
+<main>FAIL</main>
+<style>
+  main { color: green; }
+  :root::selection { background-color: lime; }
+  :root::highlight(foo) { background-color: lime;}
+</style>
+<script>
+  const [selection, highlight] = document.querySelectorAll("main");
+
+  let selectionRange = new Range();
+  selectionRange.selectNode(selection);
+  window.getSelection().addRange(selectionRange);
+  selection.textContent = getComputedStyle(selection, "::selection").color;
+
+  let highlightRange = new Range();
+  highlightRange.selectNode(highlight);
+  CSS.highlights.set("foo", new Highlight(highlightRange));
+  highlight.textContent = getComputedStyle(highlight, "::highlight(foo)").color;
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/reference/highlight-pseudos-currentcolor-inheritance-computed-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/reference/highlight-pseudos-currentcolor-inheritance-computed-002-ref.html
new file mode 100644
index 0000000..67ecb8df
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/reference/highlight-pseudos-currentcolor-inheritance-computed-002-ref.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Reftest Reference</title>
+<p>Pass if text below is green on lime, and the text itself represents green, not initial (black).</p>
+<main>rgb(0, 128, 0)</main>
+<main>rgb(0, 128, 0)</main>
+<style>
+  main { color: green; }
+  main::selection { background-color: lime; color: green; }
+  main::highlight(foo) { background-color: lime; color: green; }
+</style>
+<script>
+  const [selection, highlight] = document.querySelectorAll("main");
+
+  let selectionRange = new Range();
+  selectionRange.selectNode(selection);
+  window.getSelection().addRange(selectionRange);
+
+  let highlightRange = new Range();
+  highlightRange.selectNode(highlight);
+  CSS.highlights.set("foo", new Highlight(highlightRange));
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-html.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-html.html
new file mode 100644
index 0000000..08085383
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-html.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<link rel="help" href="http://crbug.com/1325192">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/test-only-api.js"></script>
+
+<script type="module">
+import * as common from "./resources/common.js";
+common.runBfcacheTestForEmbeds({"type": "text/html", "src": "/resources/blank.html"});
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-img.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-img.html
new file mode 100644
index 0000000..7e9d713c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-img.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<link rel="help" href="http://crbug.com/1325192">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/test-only-api.js"></script>
+
+<script type="module">
+import * as common from "./resources/common.js";
+common.runBfcacheTestForEmbeds({'type': 'image/png', 'src': '/images/blue.png'});
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-js.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-js.html
new file mode 100644
index 0000000..c3b0275
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-js.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<link rel="help" href="http://crbug.com/1325192">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/test-only-api.js"></script>
+
+<script type="module">
+import * as common from "./resources/common.js";
+common.runBfcacheTestForEmbeds(
+  {'type': 'application/javascript', 'src': '/resources/test-only-api.js'});
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-mp4.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-mp4.html
new file mode 100644
index 0000000..fde560e5b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-mp4.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<link rel="help" href="http://crbug.com/1325192">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/test-only-api.js"></script>
+
+<script type="module">
+import * as common from "./resources/common.js";
+common.runBfcacheTestForEmbeds({'src': '/media/white.mp4'});
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-not-found.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-not-found.html
new file mode 100644
index 0000000..0b56b5ea
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-not-found.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<link rel="help" href="http://crbug.com/1325192">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/test-only-api.js"></script>
+
+<script type="module">
+import * as common from "./resources/common.js";
+common.runBfcacheTestForEmbeds({'type': 'image/png', 'src': '/404.png'});
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-type-only.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-type-only.html
new file mode 100644
index 0000000..90c9d331
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/embeded-type-only.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<link rel="help" href="http://crbug.com/1325192">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/test-only-api.js"></script>
+
+<script type="module">
+import * as common from "./resources/common.js";
+common.runBfcacheTestForEmbeds({'type': 'text/html'});
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/resources/common.js b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/resources/common.js
new file mode 100644
index 0000000..9c852bb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/bfcache/resources/common.js
@@ -0,0 +1,40 @@
+'use strict';
+
+async function loadBfCacheTestHelperResources() {
+  await loadScript('/common/utils.js');
+  await loadScript('/common/dispatcher/dispatcher.js');
+  await loadScript(
+      '/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js');
+}
+await loadBfCacheTestHelperResources();
+
+// Runs BFCache tests for embed elements, specifically <embed> and <object>.
+// 1. Attaches the target element to first page.
+// 2. Navigates away, then back via bfcache if this case is supported by the
+//    browser.
+// @param {Object}  testCase - The target element's attributes to test with.
+export function runBfcacheTestForEmbeds(testCase) {
+  assert_implements(runBfcacheTest, '`runBfcacheTest()` is unavailable.');
+  assert_implements(originSameOrigin, '`originSameOrigin` is unavailable.');
+
+  const tags = [
+    {'name': 'embed', 'srcAttr': 'src'},
+    {'name': 'object', 'srcAttr': 'data'},
+  ];
+  for (const tag of tags) {
+    runBfcacheTest(
+        {
+          targetOrigin: originSameOrigin,
+          shouldBeCached: true,
+          funcBeforeNavigation: (tag, attrs) => {
+            let e = document.createElement(tag.name);
+            e.type = attrs.type;
+            e[tag.srcAttr] = attrs.src;
+            document.body.append(e);
+          },
+          argsBeforeNavigation: [tag, testCase]
+        },
+        `Page with <${tag.name} ` +
+            `type=${testCase.type} ${tag.srcAttr}=${testCase.src}>`);
+  }
+}
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-shadow-root-replacement.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-shadow-root-replacement.tentative.html
deleted file mode 100644
index b505e58e..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-shadow-root-replacement.tentative.html
+++ /dev/null
@@ -1,99 +0,0 @@
-<!DOCTYPE html>
-<title>HTMLSelectMenuElement Test: shadow root replacement</title>
-<link rel="author" title="Ionel Popescu" href="mailto:iopopesc@microsoft.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-actions.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-
-<selectmenu id="selectmenu"></selectmenu>
-
-<selectmenu id="selectmenu1">
-  <template shadowroot=open>
-    <button behavior="button">Custom button</button>
-    <div popup behavior="listbox">
-      <slot></slot>
-    </div>
-  </template>
-  <option>one</option>
-  <option id="selectmenu1-child2">two</option>
-</selectmenu>
-
-<script>
-  // See https://w3c.github.io/webdriver/#keyboard-actions
-  const KEY_CODE_MAP = {
-    'Enter':      '\uE007',
-    'Space':      '\uE00D',
-    'ArrowUp':    '\uE013',
-    'ArrowDown':  '\uE015'
-  };
-
-  function clickOn(element) {
-    const actions = new test_driver.Actions();
-    return actions.pointerMove(0, 0, {origin: element})
-      .pointerDown({button: actions.ButtonType.LEFT})
-      .pointerUp({button: actions.ButtonType.LEFT})
-      .send();
-  }
-
-  promise_test(async () => {
-    const selectMenu = document.getElementById("selectmenu");
-    assert_equals(selectMenu.shadowRoot, null, "The UA provided shadow root should not be exposed to the web");
-    let selectMenuShadow = selectMenu.attachShadow({mode: 'open', delegatesFocus: true});
-    assert_equals(selectMenuShadow.host, selectMenu);
-    assert_equals(selectMenu.shadowRoot, selectMenuShadow);
-    assert_equals(selectMenuShadow.mode, "open");
-    assert_equals(selectMenuShadow.delegatesFocus, true);
-
-    selectMenuShadow.innerHTML = `
-      <style>
-        :focus {
-          outline: 2px solid blue;
-        }
-        #value::before {
-          content: "Value selected: "
-        }
-
-      </style>
-      <button behavior="button">Open select!</button>
-      <div id="value" behavior="selected-value"></div>
-      <div popup behavior="listbox">
-        <input type="text" placeholder="Filter options">
-        <option>Thing 1</option>
-        <option>Thing 2</option>
-        <option id="option3">Thing 3</option>
-    </div>`;
-    assert_equals(selectMenu.shadowRoot.querySelectorAll("option").length, 3);
-    assert_equals(selectMenu.open, false);
-    await clickOn(selectMenu);
-    assert_equals(selectMenu.open, true, "Ensure that controller code has been provided");
-    assert_equals(selectMenu.value, "Thing 1", "value should start with the text of the first option part");
-    await test_driver.send_keys(selectMenu, KEY_CODE_MAP.ArrowDown);
-    assert_equals(selectMenu.value, "Thing 2", "Down arrow should go to next option");
-    await test_driver.send_keys(selectMenu, KEY_CODE_MAP.Enter); // Close the menu
-    assert_equals(selectMenu.open, false);
-  }, "Test that the UA provided shadow root can be replaced");
-
-  promise_test(async () => {
-    const selectMenu1 = document.getElementById("selectmenu1");
-    assert_equals(selectMenu1.open, false);
-    await clickOn(selectMenu1);
-    assert_equals(selectMenu1.open, true, "Ensure that controller code has been provided");
-    assert_equals(selectMenu1.value, "one", "value should start with the text of the first option part");
-    const selectMenu1Child2 = document.getElementById("selectmenu1-child2");
-    await clickOn(selectMenu1Child2);
-    assert_equals(selectMenu1.value, "two", "Clicking an <option> should change the value");
-    assert_equals(selectMenu1.open, false);
-  }, "Test that the UA provided shadow root can be replaced using declarative shadow DOM");
-
-  test(() => {
-    let customSelectMenu = document.createElement('selectmenu');
-    let customSelectMenuShadow = customSelectMenu.attachShadow({mode : 'closed'});
-    assert_equals(customSelectMenu.shadowRoot, null);
-    assert_equals(customSelectMenuShadow.mode, "closed");
-    assert_throws_dom('NotSupportedError', () => {
-      customSelectMenu.attachShadow({mode : 'closed'});
-    });
-  }, "Test that only the UA provided shadow root can be replaced");
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html
index a5401cd4..10317a8 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
 <meta charset="utf-8" />
 <title>Popup light dismiss behavior</title>
+<meta name="timeout" content="long">
 <link rel="author" href="mailto:masonf@chromium.org">
 <link rel=help href="https://open-ui.org/components/popup.research.explainer">
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/fast/events/touch/touch-slider-othogonal-movement.html b/third_party/blink/web_tests/fast/events/touch/touch-slider-othogonal-movement.html
new file mode 100644
index 0000000..d95c094
--- /dev/null
+++ b/third_party/blink/web_tests/fast/events/touch/touch-slider-othogonal-movement.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<title>Orthogonal touch movement should not change slider value</title>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<input id="slider" type="range" value="0" style="width:200px; height: 50px">
+<script>
+const w = slider.offsetWidth;
+const h = slider.offsetHeight;
+
+test(() => {
+  assert_own_property(window, 'eventSender', 'This test needs eventSender to emulate touch');
+
+  // Emulate a touch that starts inside slider and moves vertically.
+  const x = slider.offsetLeft + w / 2;
+  const startY = slider.offsetTop + h / 2;
+  const endY = startY + h;
+
+  eventSender.clearTouchPoints();
+  eventSender.addTouchPoint(x, startY);
+  eventSender.touchStart();
+
+  eventSender.updateTouchPoint(0, x, endY);
+  eventSender.touchMove();
+
+  eventSender.releaseTouchPoint(0);
+  eventSender.touchEnd();
+
+  assert_equals(slider.value, "0");
+}, 'Orthogonal touch movement should not change slider value');
+
+test(() => {
+  assert_own_property(window, 'eventSender', 'This test needs eventSender to emulate touch');
+
+  // Emulate a tap on the slider.
+  const x = slider.offsetLeft + w / 2;
+  const y = slider.offsetTop + h / 2;
+
+  eventSender.clearTouchPoints();
+  eventSender.addTouchPoint(x, y);
+  eventSender.touchStart();
+  eventSender.releaseTouchPoint(0);
+  eventSender.touchEnd();
+
+  assert_not_equals(slider.value, "0");
+}, 'Tapping should still change slider value');
+</script>
diff --git a/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar-rtl.html b/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar-rtl.html
new file mode 100644
index 0000000..3aa09f3
--- /dev/null
+++ b/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar-rtl.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<title>Tests mouse interactions on a non-custom composited div scrollbar.</title>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script src="../../../resources/gesture-util.js"></script>
+<script src="../../../resources/blink-coordinates-util.js"></script>
+<script src="../../../resources/scrollbar-util.js"></script>
+<script src="resources/mouse-scrolling-on-div-scrollbar.js"></script>
+<style>
+  .appearance {
+    width: 100px;
+    height: 100px;
+    overflow: scroll;
+    border: 1px solid black;
+  }
+
+  .standardLocation {
+    position: absolute;
+    top: 100px;
+    left: 100px;
+  }
+
+  .space {
+    height: 200px;
+    width: 200px;
+  }
+</style>
+
+<!-- Composited non-custom scroller -->
+<div id="standard" class="appearance standardLocation" style="direction: rtl;">
+  <div class="space"></div>
+</div>
+
+<script>
+  if (window.internals)
+    internals.settings.setScrollAnimatorEnabled(false);
+
+  const scroller = document.getElementById("standard");
+  const TRACK_WIDTH = calculateScrollbarThickness();
+
+  assert_equals(scroller.clientHeight, scroller.clientWidth,
+    "This test assumes that the height and width of 'scroller' are equivalent. If this changes please update SCROLL_AMOUNT to be X/Y specific");
+
+  const params = {
+    scroller: scroller,
+    TRACK_WIDTH: TRACK_WIDTH,
+    BUTTON_WIDTH: TRACK_WIDTH,
+    SCROLL_CORNER: TRACK_WIDTH,
+    SCROLL_AMOUNT: getScrollbarButtonScrollDelta(scroller).y
+  }
+
+  promise_test(async () => {
+    await testArrows(params);
+  }, "Test mouse click on non-custom composited div scrollbar arrows (RTL).");
+  promise_test(async () => {
+    await testTrackparts(params);
+  }, "Test mouse click on non-custom composited div scrollbar empty trackparts (RTL).");
+</script>
diff --git a/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar-thumb-rtl.html b/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar-thumb-rtl.html
new file mode 100644
index 0000000..27fbaf1
--- /dev/null
+++ b/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar-thumb-rtl.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<title>Tests mouse interactions on a non-custom composited div scrollbar thumb.</title>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script src="../../../resources/gesture-util.js"></script>
+<script src="../../../resources/scrollbar-util.js"></script>
+<script src="resources/mouse-scrolling-on-div-scrollbar-thumb.js"></script>
+<style>
+  .appearance {
+    width: 100px;
+    height: 100px;
+    overflow: scroll;
+    border: 1px solid black;
+  }
+
+  .standardLocation {
+    position: absolute;
+    top: 100px;
+    left: 100px;
+  }
+
+  .space {
+    height: 1000px;
+    width: 1000px;
+  }
+
+  #standard {
+    direction: rtl;
+  }
+</style>
+
+<!-- Composited non-custom scroller -->
+<div id="standard" class="appearance standardLocation" style="direction: rtl;">
+  <div class="space"></div>
+</div>
+
+<script>
+  if (window.internals)
+    internals.settings.setScrollAnimatorEnabled(false);
+
+  let platform = navigator.userAgent.includes("Linux") ? "linux" :
+    navigator.userAgent.includes("Windows") ? "win" :
+      navigator.userAgent.includes("Mac OS X") ? "mac" :
+        (() => { throw "Platform unsupported."; })();
+
+  const scroller = document.getElementById("standard");
+  const TRACK_WIDTH = calculateScrollbarThickness()
+  const params = {
+    scroller: scroller,
+    TRACK_WIDTH: TRACK_WIDTH,
+    BUTTON_WIDTH: TRACK_WIDTH,
+    SCROLL_CORNER: TRACK_WIDTH,
+    SCROLL_DELTA: 50,
+    platform: platform
+  }
+
+  promise_test(async () => {
+    await testScrollThumbNonScrolls(params);
+  }, "Test thumb drags beyond scrollbar track (RTL).");
+  promise_test(async () => {
+    await testThumbScrolls(params);
+  }, "Test mouse drags in intervals on non-custom composited div scrollbar thumb (RTL).");
+</script>
diff --git a/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar-thumb.html b/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar-thumb.html
index 0c9ad8e8..ad10320 100644
--- a/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar-thumb.html
+++ b/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar-thumb.html
@@ -4,105 +4,56 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../../resources/gesture-util.js"></script>
 <script src="../../../resources/scrollbar-util.js"></script>
+<script src="resources/mouse-scrolling-on-div-scrollbar-thumb.js"></script>
 <style>
-.appearance {
-  width: 100px;
-  height: 100px;
-  overflow: scroll;
-  border: 1px solid black;
-}
-.standardLocation {
-  position: absolute;
-  top: 100px;
-  left: 100px;
-}
-.space {
-  height: 1000px;
-  width: 1000px;
-}
+  .appearance {
+    width: 100px;
+    height: 100px;
+    overflow: scroll;
+    border: 1px solid black;
+  }
+
+  .standardLocation {
+    position: absolute;
+    top: 100px;
+    left: 100px;
+  }
+
+  .space {
+    height: 1000px;
+    width: 1000px;
+  }
 </style>
 
 <!-- Composited non-custom scroller -->
-<div id="standard" class="appearance standardLocation">
+<div id="standard" class="appearance standardLocation" style="direction: ltr;">
   <div class="space"></div>
 </div>
 
 <script>
-if (window.internals)
+  if (window.internals)
     internals.settings.setScrollAnimatorEnabled(false);
 
-let platform = navigator.userAgent.includes("Linux") ? "linux" :
-               navigator.userAgent.includes("Windows") ? "win" :
-               navigator.userAgent.includes("Mac OS X") ? "mac" :
-               (() => { throw "Platform unsupported. See crbug.com/953847"; })();
+  let platform = navigator.userAgent.includes("Linux") ? "linux" :
+    navigator.userAgent.includes("Windows") ? "win" :
+      navigator.userAgent.includes("Mac OS X") ? "mac" :
+        (() => { throw "Platform unsupported."; })();
 
-window.onload = () => {
-  const standardDivFast = document.getElementById("standard");
-  const standardRectFast = standardDivFast.getBoundingClientRect();
+  const scroller = document.getElementById("standard");
+  const TRACK_WIDTH = calculateScrollbarThickness()
+  const params = {
+    scroller: scroller,
+    TRACK_WIDTH: TRACK_WIDTH,
+    BUTTON_WIDTH: TRACK_WIDTH,
+    SCROLL_CORNER: TRACK_WIDTH,
+    SCROLL_DELTA: 50,
+    platform: platform
+  }
 
-  const TRACK_WIDTH = calculateScrollbarThickness();
-  const BUTTON_WIDTH = TRACK_WIDTH;
-  const SCROLL_CORNER = TRACK_WIDTH;
-  const SCROLL_DELTA = 50;
-
-  promise_test (async () => {
-    await waitForCompositorCommit();
-    resetScrollOffset(standardDivFast);
-
-    // Testing the vertical scrollbar thumb.
-    let x = standardRectFast.right - TRACK_WIDTH / 2;
-    let y = standardRectFast.top + (platform == "mac" ? 0 : BUTTON_WIDTH) + 2;
-
-    await mouseMoveTo(x, y);
-    await mouseDownAt(x, y);
-    assert_equals(standardDivFast.scrollTop, 0, "Mousedown on vertical scrollbar thumb is not expected to scroll.");
-
-    await mouseMoveTo(x, y-10, Buttons.LEFT);
-    assert_equals(standardDivFast.scrollTop, 0, "Vertical thumb drag beyond the track should not cause a scroll.");
-
-    await mouseMoveTo(x, y, Buttons.LEFT);
-    assert_equals(standardDivFast.scrollTop, 0, "Vertical thumb drag beyond the track and back should not cause a scroll.");
-
-    await mouseUpAt(x, y);
+  promise_test(async () => {
+    await testScrollThumbNonScrolls(params);
   }, "Test thumb drags beyond scrollbar track.");
-
-  promise_test (async () => {
-    await waitForCompositorCommit();
-    resetScrollOffset(standardDivFast);
-
-    // Testing the vertical scrollbar thumb.
-    let x = standardRectFast.right - TRACK_WIDTH / 2;
-    let y = standardRectFast.top + (platform == "mac" ? 0 : BUTTON_WIDTH) + 2;
-    let asc_increments = [15, 10, 7, 6, 2];
-    let asc_offsets = {linux: [549, 915, 915, 915, 915], win: [361, 601, 770, 915, 915], mac: [211, 351, 450, 534, 563]}[platform];
-    let desc_increments = [3, 2, 5, 9, 21];
-    let desc_offsets = {linux: [915, 915, 915, 768, 0], win: [890, 842, 722, 505, 0], mac: [520, 492, 422, 295, 0]}[platform];
-
-    await mouseMoveTo(x, y);
-    await mouseDownAt(x, y);
-
-    // Scroll down
-    for (var i = 0; i < 5; i++){
-      y += asc_increments[i];
-      await mouseMoveTo(x, y, Buttons.LEFT);
-      // TODO(crbug.com/1009892): Sometimes there is 1px difference in threaded scrollbar scrolling mode.
-      // Change assert_approx_equals(..., 1, ...) to assert_equals(...) when the bug is fixed.
-      assert_approx_equals(standardDivFast.scrollTop, asc_offsets[i], 1, "Vertical thumb drag downwards did not scroll as expected at "+asc_increments[i]+" - ");
-    };
-
-    // Scroll up
-    for (var i = 0; i < 5; i++){
-      y -= desc_increments[i];
-      await mouseMoveTo(x, y, Buttons.LEFT);
-      // TODO(crbug.com/1009892): Ditto.
-      assert_approx_equals(standardDivFast.scrollTop, desc_offsets[i], 1, "Vertical thumb drag upwards did not scroll as expected at "+desc_increments[i]+" - ");
-    };
-
-    await mouseUpAt(x, y);
-    assert_equals(standardDivFast.scrollTop, 0, "Mouseup on vertical scrollbar thumb is not expected to scroll.");
-
-    // Since the horizontal scrolling is essentially the same codepath as vertical,
-    // this need not be tested in the interest of making the test run faster.
+  promise_test(async () => {
+    await testThumbScrolls(params);
   }, "Test mouse drags in intervals on non-custom composited div scrollbar thumb.");
-}
 </script>
diff --git a/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar.html b/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar.html
index bb63248..ce55d2a9 100644
--- a/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar.html
+++ b/third_party/blink/web_tests/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar.html
@@ -5,113 +5,54 @@
 <script src="../../../resources/gesture-util.js"></script>
 <script src="../../../resources/blink-coordinates-util.js"></script>
 <script src="../../../resources/scrollbar-util.js"></script>
+<script src="resources/mouse-scrolling-on-div-scrollbar.js"></script>
 <style>
-.appearance {
-  width: 100px;
-  height: 100px;
-  overflow: scroll;
-  border: 1px solid black;
-}
-.standardLocation {
-  position: absolute;
-  top: 100px;
-  left: 100px;
-}
-.space {
-  height: 200px;
-  width: 200px;
-}
+  .appearance {
+    width: 100px;
+    height: 100px;
+    overflow: scroll;
+    border: 1px solid black;
+  }
+
+  .standardLocation {
+    position: absolute;
+    top: 100px;
+    left: 100px;
+  }
+
+  .space {
+    height: 200px;
+    width: 200px;
+  }
 </style>
 
 <!-- Composited non-custom scroller -->
-<div id="standard" class="appearance standardLocation">
+<div id="standard" class="appearance standardLocation" style="direction: ltr;">
   <div class="space"></div>
 </div>
 
 <script>
-if (window.internals)
+  if (window.internals)
     internals.settings.setScrollAnimatorEnabled(false);
 
-window.onload = () => {
-  const standardDivFast = document.getElementById("standard");
-  const standardRectFast = standardDivFast.getBoundingClientRect();
-
+  const scroller = document.getElementById("standard");
   const TRACK_WIDTH = calculateScrollbarThickness();
-  const BUTTON_WIDTH = TRACK_WIDTH;
-  const SCROLL_CORNER = TRACK_WIDTH;
-  assert_equals(standardDivFast.clientHeight, standardDivFast.clientWidth,
-      "This test assumes that the height and width of 'standardDivFast' are equivalent. If this changes please update SCROLL_AMOUNT to be X/Y specific");
-  const SCROLL_AMOUNT = getScrollbarButtonScrollDelta(standardDivFast).y;
 
-  promise_test (async () => {
-    // Scrollbars on Mac don't have arrows. This test is irrelevant.
-    if(navigator.userAgent.includes("Mac OS X"))
-      return;
+  assert_equals(scroller.clientHeight, scroller.clientWidth,
+    "This test assumes that the height and width of the scroller are equivalent. If this changes please update SCROLL_AMOUNT to be X/Y specific");
 
-    await waitForCompositorCommit();
-    resetScrollOffset(standardDivFast);
+  const params = {
+    scroller: scroller,
+    TRACK_WIDTH: TRACK_WIDTH,
+    BUTTON_WIDTH: TRACK_WIDTH,
+    SCROLL_CORNER: TRACK_WIDTH,
+    SCROLL_AMOUNT: getScrollbarButtonScrollDelta(scroller).y
+  }
 
-    // Click on the Down arrow for standardRectFast.
-    let x = standardRectFast.right - BUTTON_WIDTH / 2;
-    let y = standardRectFast.bottom - SCROLL_CORNER - BUTTON_WIDTH / 2;
-    await mouseClickOn(x, y);
-    await waitForAnimationEndTimeBased(() => {return standardDivFast.scrollTop;});
-    assert_equals(standardDivFast.scrollTop, SCROLL_AMOUNT, "Pressing the down arrow didn't scroll.");
-
-    // Click on the Up arrow for standardRectFast.
-    x = standardRectFast.right - BUTTON_WIDTH / 2;
-    y = standardRectFast.top + BUTTON_WIDTH / 2;
-    await mouseClickOn(x, y);
-    await waitForAnimationEndTimeBased(() => {return standardDivFast.scrollTop;});
-    assert_equals(standardDivFast.scrollTop, 0, "Pressing the up arrow didn't scroll.");
-
-    // Click on the Right arrow for standardRectFast.
-    x = standardRectFast.right - SCROLL_CORNER - BUTTON_WIDTH / 2;
-    y = standardRectFast.bottom - BUTTON_WIDTH / 2;
-    await mouseClickOn(x, y);
-    await waitForAnimationEndTimeBased(() => {return standardDivFast.scrollLeft;});
-    assert_equals(standardDivFast.scrollLeft, SCROLL_AMOUNT, "Pressing the right arrow didn't scroll.");
-
-    // Click on the Left arrow for standardRectFast.
-    x = standardRectFast.left + BUTTON_WIDTH / 2;
-    y = standardRectFast.bottom - BUTTON_WIDTH / 2;
-    await mouseClickOn(x, y);
-    await waitForAnimationEndTimeBased(() => {return standardDivFast.scrollLeft;});
-    assert_equals(standardDivFast.scrollLeft, 0, "Pressing the left arrow didn't scroll.");
+  promise_test(async () => {
+    await testArrows(params);
   }, "Test mouse click on non-custom composited div scrollbar arrows.");
-
-  promise_test (async () => {
-    await waitForCompositorCommit();
-    resetScrollOffset(standardDivFast);
-
-    // Click on the track part just above the down arrow.
-    assert_equals(standardDivFast.scrollTop, 0, "Div is not at 0 offset.");
-    let x = standardRectFast.right - BUTTON_WIDTH / 2;
-    let y = standardRectFast.bottom - SCROLL_CORNER - BUTTON_WIDTH - 2;
-    await mouseClickOn(x, y);
-    await waitForAnimationEndTimeBased(() => {return standardDivFast.scrollTop;});
-    assert_approx_equals(standardDivFast.scrollTop, 74, 1, "Pressing the down trackpart didn't scroll.");
-
-    // Click on the track part just below the up arrow.
-    x = standardRectFast.right - BUTTON_WIDTH / 2;
-    y = standardRectFast.top + BUTTON_WIDTH + 2;
-    await mouseClickOn(x, y);
-    await waitForAnimationEndTimeBased(() => {return standardDivFast.scrollTop;});
-    assert_equals(standardDivFast.scrollTop, 0, "Pressing the up trackpart didn't scroll.");
-
-    // Click on the track part just to the left of the right arrow.
-    x = standardRectFast.right - SCROLL_CORNER - BUTTON_WIDTH - 2;
-    y = standardRectFast.bottom - BUTTON_WIDTH / 2;
-    await mouseClickOn(x, y);
-    await waitForAnimationEndTimeBased(() => {return standardDivFast.scrollLeft;});
-    assert_approx_equals(standardDivFast.scrollLeft, 74, 1, "Pressing the right trackpart didn't scroll.");
-
-    // Click on the track part just to the right of the left arrow.
-    x = standardRectFast.left + BUTTON_WIDTH + 2;
-    y = standardRectFast.bottom - BUTTON_WIDTH / 2;
-    await mouseClickOn(x, y);
-    await waitForAnimationEndTimeBased(() => {return standardDivFast.scrollLeft;});
-    assert_equals(standardDivFast.scrollLeft, 0, "Pressing the left trackpart didn't scroll.");
+  promise_test(async () => {
+    await testTrackparts(params);
   }, "Test mouse click on non-custom composited div scrollbar empty trackparts.");
-}
 </script>
diff --git a/third_party/blink/web_tests/fast/scrolling/scrollbars/resources/mouse-scrolling-on-div-scrollbar-thumb.js b/third_party/blink/web_tests/fast/scrolling/scrollbars/resources/mouse-scrolling-on-div-scrollbar-thumb.js
new file mode 100644
index 0000000..0090382
--- /dev/null
+++ b/third_party/blink/web_tests/fast/scrolling/scrollbars/resources/mouse-scrolling-on-div-scrollbar-thumb.js
@@ -0,0 +1,69 @@
+async function testScrollThumbNonScrolls(params) {
+  await waitForCompositorCommit();
+  resetScrollOffset(params.scroller);
+
+  const scrollRect = scroller.getBoundingClientRect();
+
+  // Direction: rtl changes the x-wise position of the vertical scrollbar
+  const rtl = params.scroller.style.direction === "rtl";
+
+  // Testing the vertical scrollbar thumb.
+  const x = rtl ? scrollRect.left + params.TRACK_WIDTH / 2 : scrollRect.right - params.TRACK_WIDTH / 2;
+  const y = scrollRect.top + params.BUTTON_WIDTH + 2;
+
+  await mouseMoveTo(x, y);
+  await mouseDownAt(x, y);
+  assert_equals(params.scroller.scrollTop, 0, "Mousedown on vertical scrollbar thumb is not expected to scroll.");
+
+  await mouseMoveTo(x, y - 10, Buttons.LEFT);
+  assert_equals(params.scroller.scrollTop, 0, "Vertical thumb drag beyond the track should not cause a scroll.");
+
+  await mouseMoveTo(x, y, Buttons.LEFT);
+  assert_equals(params.scroller.scrollTop, 0, "Vertical thumb drag beyond the track and back should not cause a scroll.");
+
+  await mouseUpAt(x, y);
+}
+
+async function testThumbScrolls(params) {
+  await waitForCompositorCommit();
+  resetScrollOffset(params.scroller);
+
+  const scrollRect = scroller.getBoundingClientRect();
+
+  // Direction: rtl changes the x-wise position of the vertical scrollbar
+  const rtl = params.scroller.style.direction === "rtl";
+
+  // Testing the vertical scrollbar thumb.
+  let x = rtl ? scrollRect.left + params.TRACK_WIDTH / 2 : scrollRect.right - params.TRACK_WIDTH / 2;
+  let y = scrollRect.top + params.BUTTON_WIDTH + 2;
+  let asc_increments = [15, 10, 7, 6, 2];
+  let asc_offsets = { linux: [549, 915, 915, 915, 915], win: [361, 601, 770, 915, 915], mac: [211, 351, 450, 534, 563] }[params.platform];
+  let desc_increments = [3, 2, 5, 9, 21];
+  let desc_offsets = { linux: [915, 915, 915, 768, 0], win: [890, 842, 722, 505, 0], mac: [520, 492, 422, 295, 0] }[params.platform];
+
+  await mouseMoveTo(x, y);
+  await mouseDownAt(x, y);
+
+  // Scroll down
+  for (var i = 0; i < 5; i++) {
+    y += asc_increments[i];
+    await mouseMoveTo(x, y, Buttons.LEFT);
+    // TODO(crbug.com/1009892): Sometimes there is 1px difference in threaded scrollbar scrolling mode.
+    // Change assert_approx_equals(..., 1, ...) to assert_equals(...) when the bug is fixed.
+    assert_approx_equals(params.scroller.scrollTop, asc_offsets[i], 1, "Vertical thumb drag downwards did not scroll as expected at " + asc_increments[i] + " - ");
+  };
+
+  // Scroll up
+  for (var i = 0; i < 5; i++) {
+    y -= desc_increments[i];
+    await mouseMoveTo(x, y, Buttons.LEFT);
+    // TODO(crbug.com/1009892): Ditto.
+    assert_approx_equals(params.scroller.scrollTop, desc_offsets[i], 1, "Vertical thumb drag upwards did not scroll as expected at " + desc_increments[i] + " - ");
+  };
+
+  await mouseUpAt(x, y);
+  assert_equals(params.scroller.scrollTop, 0, "Mouseup on vertical scrollbar thumb is not expected to scroll.");
+
+  // Since the horizontal scrolling is essentially the same codepath as vertical,
+  // this need not be tested in the interest of making the test run faster.
+}
diff --git a/third_party/blink/web_tests/fast/scrolling/scrollbars/resources/mouse-scrolling-on-div-scrollbar.js b/third_party/blink/web_tests/fast/scrolling/scrollbars/resources/mouse-scrolling-on-div-scrollbar.js
new file mode 100644
index 0000000..7077188
--- /dev/null
+++ b/third_party/blink/web_tests/fast/scrolling/scrollbars/resources/mouse-scrolling-on-div-scrollbar.js
@@ -0,0 +1,109 @@
+async function testArrows(params) {
+  // Scrollbars on Mac don't have arrows. This test is irrelevant.
+  if (navigator.userAgent.includes("Mac OS X"))
+    return;
+
+  await waitForCompositorCommit();
+  resetScrollOffset(params.scroller);
+
+  const scrollRect = scroller.getBoundingClientRect();
+
+  // For testing on RTL divs, two things are different. The vertical scrollbar is on the opposite side,
+  // including the scroll corner. Horizontal scrolling on RTL starts at 0 for the rightmost position
+  // and counts downwards into the negatives.
+  const rtl = params.scroller.style.direction === "rtl";
+
+  // Click on the Down arrow
+  let x = rtl ? scrollRect.left + params.BUTTON_WIDTH / 2 : scrollRect.right - params.BUTTON_WIDTH / 2;
+  let y = scrollRect.bottom - params.SCROLL_CORNER - params.BUTTON_WIDTH / 2;
+  await mouseClickOn(x, y);
+  await waitForAnimationEndTimeBased(() => { return params.scroller.scrollTop; });
+  assert_equals(params.scroller.scrollTop, params.SCROLL_AMOUNT, "Pressing the down arrow didn't scroll.");
+
+  // Click on the Up arrow
+  x = rtl ? scrollRect.left + params.BUTTON_WIDTH / 2 : scrollRect.right - params.BUTTON_WIDTH / 2;
+  y = scrollRect.top + params.BUTTON_WIDTH / 2;
+  await mouseClickOn(x, y);
+  await waitForAnimationEndTimeBased(() => { return params.scroller.scrollTop; });
+  assert_equals(params.scroller.scrollTop, 0, "Pressing the up arrow didn't scroll.");
+
+  async function scrollRight() {
+    // Click on the Right arrow
+    x = rtl ? scrollRect.right - params.BUTTON_WIDTH / 2 : scrollRect.right - params.SCROLL_CORNER - params.BUTTON_WIDTH / 2;
+    y = scrollRect.bottom - params.BUTTON_WIDTH / 2;
+    await mouseClickOn(x, y);
+    await waitForAnimationEndTimeBased(() => { return params.scroller.scrollLeft; });
+    assert_equals(params.scroller.scrollLeft, rtl ? 0 : params.SCROLL_AMOUNT, "Pressing the right arrow didn't scroll.");
+  }
+
+  async function scrollLeft() {
+    // Click on the Left arrow
+    x = rtl ? scrollRect.left + params.SCROLL_CORNER + params.BUTTON_WIDTH / 2 : scrollRect.left + params.BUTTON_WIDTH / 2;
+    y = scrollRect.bottom - params.BUTTON_WIDTH / 2;
+    await mouseClickOn(x, y);
+    await waitForAnimationEndTimeBased(() => { return params.scroller.scrollLeft; });
+    assert_equals(params.scroller.scrollLeft, rtl ? -params.SCROLL_AMOUNT : 0, "Pressing the left arrow didn't scroll.");
+  }
+
+  //For RTL, horizontal scrollbar starts on the rightmost position, so we need to scroll left first;
+  if (rtl) {
+    await scrollLeft();
+    await scrollRight();
+  } else {
+    await scrollRight();
+    await scrollLeft();
+  }
+}
+
+async function testTrackparts(params) {
+  await waitForCompositorCommit();
+  resetScrollOffset(params.scroller);
+
+  const scrollRect = scroller.getBoundingClientRect();
+
+  // For testing on RTL divs, two things are different. The vertical scrollbar is on the opposite side,
+  // including the scroll corner. Horizontal scrolling on RTL starts at 0 for the rightmost position
+  // and counts downwards into the negatives.
+  const rtl = params.scroller.style.direction === "rtl";
+
+  // Click on the track part just above the down arrow.
+  assert_equals(params.scroller.scrollTop, 0, "Div is not at 0 offset.");
+  let x = rtl ? scrollRect.left + params.BUTTON_WIDTH / 2 : scrollRect.right - params.BUTTON_WIDTH / 2;
+  let y = scrollRect.bottom - params.SCROLL_CORNER - params.BUTTON_WIDTH - 2;
+  await mouseClickOn(x, y);
+  await waitForAnimationEndTimeBased(() => { return params.scroller.scrollTop; });
+  assert_approx_equals(params.scroller.scrollTop, 74, 1, "Pressing the down trackpart didn't scroll.");
+
+  // Click on the track part just below the up arrow.
+  x = rtl ? scrollRect.left + params.BUTTON_WIDTH / 2 : scrollRect.right - params.BUTTON_WIDTH / 2;
+  y = scrollRect.top + params.BUTTON_WIDTH + 2;
+  await mouseClickOn(x, y);
+  await waitForAnimationEndTimeBased(() => { return params.scroller.scrollTop; });
+  assert_equals(params.scroller.scrollTop, 0, "Pressing the up trackpart didn't scroll.");
+
+  async function scrollRight() {
+    // Click on the track part just to the left of the right arrow.
+    x = rtl ? scrollRect.right - params.BUTTON_WIDTH - 2 : scrollRect.right - params.SCROLL_CORNER - params.BUTTON_WIDTH - 2;
+    y = scrollRect.bottom - params.BUTTON_WIDTH / 2;
+    await mouseClickOn(x, y);
+    await waitForAnimationEndTimeBased(() => { return params.scroller.scrollLeft; });
+    assert_approx_equals(params.scroller.scrollLeft, rtl ? 0 : 74, 1, "Pressing the right trackpart didn't scroll.");
+  }
+
+  async function scrollLeft() {
+    // Click on the track part just to the right of the left arrow.
+    x = rtl ? scrollRect.left + params.SCROLL_CORNER + params.BUTTON_WIDTH + 2 : scrollRect.left + params.BUTTON_WIDTH + 2;
+    y = scrollRect.bottom - params.BUTTON_WIDTH / 2;
+    await mouseClickOn(x, y);
+    await waitForAnimationEndTimeBased(() => { return params.scroller.scrollLeft; });
+    assert_approx_equals(params.scroller.scrollLeft, rtl ? -74 : 0, 1, "Pressing the left trackpart didn't scroll.");
+  }
+
+  if (rtl) {
+    await scrollLeft();
+    await scrollRight();
+  } else {
+    await scrollRight();
+    await scrollLeft();
+  }
+}
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/css/selectors/invalidation/is-pseudo-containing-complex-in-has-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/css/selectors/invalidation/is-pseudo-containing-complex-in-has-expected.txt
deleted file mode 100644
index 686effd..0000000
--- a/third_party/blink/web_tests/platform/generic/external/wpt/css/selectors/invalidation/is-pseudo-containing-complex-in-has-expected.txt
+++ /dev/null
@@ -1,480 +0,0 @@
-This is a testharness.js-based test.
-Found 476 tests; 470 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #has_scope.classList.add('red') : check matches (false)
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #has_scope.classList.add('red') : check #has_scope color
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #parent.classList.add('a_has_scope') : check matches (true)
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #parent.classList.add('a_has_scope') : check #has_scope color
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #parent.classList.remove('a_has_scope') : check matches (false)
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #parent.classList.remove('a_has_scope') : check #has_scope color
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #has_scope.classList.add('a_has_scope') : check matches (true)
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #has_scope.classList.add('a_has_scope') : check #has_scope color
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #has_scope.classList.remove('a_has_scope') : check matches (false)
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #has_scope.classList.remove('a_has_scope') : check #has_scope color
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #child.classList.add('a_has_scope') : check matches (true)
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #child.classList.add('a_has_scope') : check #has_scope color
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #child.classList.remove('a_has_scope') : check matches (false)
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #child.classList.remove('a_has_scope') : check #has_scope color
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #has_scope.classList.remove('red') : check matches (false)
-PASS [ .red:has(#descendant:is(.a_has_scope .b)) ] #has_scope.classList.remove('red') : check #has_scope color
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #has_scope.classList.add('orangered') : check matches (false)
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #has_scope.classList.add('orangered') : check #descendant color
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #parent.classList.add('a_descendant') : check matches (true)
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #parent.classList.add('a_descendant') : check #descendant color
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #parent.classList.remove('a_descendant') : check matches (false)
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #parent.classList.remove('a_descendant') : check #descendant color
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #has_scope.classList.add('a_descendant') : check matches (true)
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #has_scope.classList.add('a_descendant') : check #descendant color
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #has_scope.classList.remove('a_descendant') : check matches (false)
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #has_scope.classList.remove('a_descendant') : check #descendant color
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #child.classList.add('a_descendant') : check matches (true)
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #child.classList.add('a_descendant') : check #descendant color
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #child.classList.remove('a_descendant') : check matches (false)
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #child.classList.remove('a_descendant') : check #descendant color
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #has_scope.classList.remove('orangered') : check matches (false)
-PASS [ .orangered:has(#descendant:is(.a_descendant .b)) #descendant ] #has_scope.classList.remove('orangered') : check #descendant color
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.add('darkred') : check matches (false)
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.add('darkred') : check #indirect_next color
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #parent.classList.add('a_indirect_next') : check matches (true)
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #parent.classList.add('a_indirect_next') : check #indirect_next color
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #parent.classList.remove('a_indirect_next') : check matches (false)
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #parent.classList.remove('a_indirect_next') : check #indirect_next color
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.add('a_indirect_next') : check matches (true)
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.add('a_indirect_next') : check #indirect_next color
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.remove('a_indirect_next') : check matches (false)
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.remove('a_indirect_next') : check #indirect_next color
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #child.classList.add('a_indirect_next') : check matches (true)
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #child.classList.add('a_indirect_next') : check #indirect_next color
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #child.classList.remove('a_indirect_next') : check matches (false)
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #child.classList.remove('a_indirect_next') : check #indirect_next color
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.remove('darkred') : check matches (false)
-PASS [ .darkred:has(#descendant:is(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.remove('darkred') : check #indirect_next color
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('pink') : check matches (false)
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('pink') : check #indirect_next_child color
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #parent.classList.add('a_indirect_next_child') : check matches (true)
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #parent.classList.add('a_indirect_next_child') : check #indirect_next_child color
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #parent.classList.remove('a_indirect_next_child') : check matches (false)
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #parent.classList.remove('a_indirect_next_child') : check #indirect_next_child color
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('a_indirect_next_child') : check matches (true)
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('a_indirect_next_child') : check #indirect_next_child color
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('a_indirect_next_child') : check matches (false)
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('a_indirect_next_child') : check #indirect_next_child color
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #child.classList.add('a_indirect_next_child') : check matches (true)
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #child.classList.add('a_indirect_next_child') : check #indirect_next_child color
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #child.classList.remove('a_indirect_next_child') : check matches (false)
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #child.classList.remove('a_indirect_next_child') : check #indirect_next_child color
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('pink') : check matches (false)
-PASS [ .pink:has(#descendant:is(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('pink') : check #indirect_next_child color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #has_scope.classList.add('green') : check matches (false)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #has_scope.classList.add('green') : check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #parent_previous.classList.add('c_has_scope') : check matches (true)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #parent_previous.classList.add('c_has_scope') : check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #parent_previous) : (insertion) check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #parent_previous) : (removal) check matches (true)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #parent_previous) : (removal) check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #parent_previous.classList.remove('c_has_scope') : check matches (false)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #parent_previous.classList.remove('c_has_scope') : check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #parent_previous) : (insertion) check matches (true)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #parent_previous) : (insertion) check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #parent_previous) : (removal) check matches (false)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #parent_previous) : (removal) check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #previous.classList.add('c_has_scope') : check matches (true)
-FAIL [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #previous.classList.add('c_has_scope') : check #has_scope color assert_equals: expected "rgb(0, 128, 0)" but got "rgb(128, 128, 128)"
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #previous) : (insertion) check matches (false)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #previous) : (insertion) check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #previous) : (removal) check matches (true)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #previous) : (removal) check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #previous.classList.remove('c_has_scope') : check matches (false)
-FAIL [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #previous.classList.remove('c_has_scope') : check #has_scope color assert_equals: expected "rgb(128, 128, 128)" but got "rgb(0, 128, 0)"
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #previous) : (insertion) check matches (true)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #previous) : (insertion) check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #previous) : (removal) check matches (false)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #previous) : (removal) check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #child_previous.classList.add('c_has_scope') : check matches (true)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #child_previous.classList.add('c_has_scope') : check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #child_previous) : (insertion) check matches (false)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #child_previous) : (insertion) check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #child_previous) : (removal) check matches (true)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #child_previous) : (removal) check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #child_previous.classList.remove('c_has_scope') : check matches (false)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #child_previous.classList.remove('c_has_scope') : check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #child_previous) : (insertion) check matches (true)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #child_previous) : (insertion) check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #child_previous) : (removal) check matches (false)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #child_previous) : (removal) check #has_scope color
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #has_scope.classList.remove('green') : check matches (false)
-PASS [ .green:has(#descendant:is(.p + .c_has_scope ~ .d .e)) ] #has_scope.classList.remove('green') : check #has_scope color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #has_scope.classList.add('lightgreen') : check matches (false)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #has_scope.classList.add('lightgreen') : check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #parent_previous.classList.add('c_descendant') : check matches (true)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #parent_previous.classList.add('c_descendant') : check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #parent_previous) : (insertion) check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #parent_previous) : (removal) check matches (true)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #parent_previous) : (removal) check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #parent_previous.classList.remove('c_descendant') : check matches (false)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #parent_previous.classList.remove('c_descendant') : check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #parent_previous) : (insertion) check matches (true)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #parent_previous) : (insertion) check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #parent_previous) : (removal) check matches (false)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #parent_previous) : (removal) check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #previous.classList.add('c_descendant') : check matches (true)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #previous.classList.add('c_descendant') : check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #previous) : (insertion) check matches (false)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #previous) : (insertion) check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #previous) : (removal) check matches (true)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #previous) : (removal) check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #previous.classList.remove('c_descendant') : check matches (false)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #previous.classList.remove('c_descendant') : check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #previous) : (insertion) check matches (true)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #previous) : (insertion) check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #previous) : (removal) check matches (false)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #previous) : (removal) check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #child_previous.classList.add('c_descendant') : check matches (true)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #child_previous.classList.add('c_descendant') : check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #child_previous) : (insertion) check matches (false)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #child_previous) : (insertion) check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #child_previous) : (removal) check matches (true)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #child_previous) : (removal) check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #child_previous.classList.remove('c_descendant') : check matches (false)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #child_previous.classList.remove('c_descendant') : check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #child_previous) : (insertion) check matches (true)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #child_previous) : (insertion) check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #child_previous) : (removal) check matches (false)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #child_previous) : (removal) check #descendant color
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #has_scope.classList.remove('lightgreen') : check matches (false)
-PASS [ .lightgreen:has(#descendant:is(.p + .c_descendant ~ .d .e)) #descendant ] #has_scope.classList.remove('lightgreen') : check #descendant color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #has_scope.classList.add('darkgreen') : check matches (false)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #has_scope.classList.add('darkgreen') : check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #parent_previous.classList.add('c_indirect_next') : check matches (true)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #parent_previous.classList.add('c_indirect_next') : check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (insertion) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (removal) check matches (true)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (removal) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #parent_previous.classList.remove('c_indirect_next') : check matches (false)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #parent_previous.classList.remove('c_indirect_next') : check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #parent_previous) : (insertion) check matches (true)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #parent_previous) : (insertion) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #parent_previous) : (removal) check matches (false)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #parent_previous) : (removal) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #previous.classList.add('c_indirect_next') : check matches (true)
-FAIL [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #previous.classList.add('c_indirect_next') : check #indirect_next color assert_equals: expected "rgb(0, 100, 0)" but got "rgb(128, 128, 128)"
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #previous) : (insertion) check matches (false)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #previous) : (insertion) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #previous) : (removal) check matches (true)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #previous) : (removal) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #previous.classList.remove('c_indirect_next') : check matches (false)
-FAIL [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #previous.classList.remove('c_indirect_next') : check #indirect_next color assert_equals: expected "rgb(128, 128, 128)" but got "rgb(0, 100, 0)"
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #previous) : (insertion) check matches (true)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #previous) : (insertion) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #previous) : (removal) check matches (false)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #previous) : (removal) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #child_previous.classList.add('c_indirect_next') : check matches (true)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #child_previous.classList.add('c_indirect_next') : check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #child_previous) : (insertion) check matches (false)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #child_previous) : (insertion) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #child_previous) : (removal) check matches (true)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #child_previous) : (removal) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #child_previous.classList.remove('c_indirect_next') : check matches (false)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #child_previous.classList.remove('c_indirect_next') : check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #child_previous) : (insertion) check matches (true)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #child_previous) : (insertion) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #child_previous) : (removal) check matches (false)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #child_previous) : (removal) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #has_scope.classList.remove('darkgreen') : check matches (false)
-PASS [ .darkgreen:has(#descendant:is(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #has_scope.classList.remove('darkgreen') : check #indirect_next color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('yellowgreen') : check matches (false)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('yellowgreen') : check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.add('c_indirect_next_child') : check matches (true)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.add('c_indirect_next_child') : check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (insertion) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (removal) check matches (true)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (removal) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.remove('c_indirect_next_child') : check matches (false)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.remove('c_indirect_next_child') : check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #parent_previous) : (insertion) check matches (true)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #parent_previous) : (insertion) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #parent_previous) : (removal) check matches (false)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #parent_previous) : (removal) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #previous.classList.add('c_indirect_next_child') : check matches (true)
-FAIL [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #previous.classList.add('c_indirect_next_child') : check #indirect_next_child color assert_equals: expected "rgb(154, 205, 50)" but got "rgb(128, 128, 128)"
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (insertion) check matches (false)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (insertion) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (removal) check matches (true)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (removal) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #previous.classList.remove('c_indirect_next_child') : check matches (false)
-FAIL [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #previous.classList.remove('c_indirect_next_child') : check #indirect_next_child color assert_equals: expected "rgb(128, 128, 128)" but got "rgb(154, 205, 50)"
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #previous) : (insertion) check matches (true)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #previous) : (insertion) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #previous) : (removal) check matches (false)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #previous) : (removal) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #child_previous.classList.add('c_indirect_next_child') : check matches (true)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #child_previous.classList.add('c_indirect_next_child') : check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #child_previous) : (insertion) check matches (false)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #child_previous) : (insertion) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #child_previous) : (removal) check matches (true)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #child_previous) : (removal) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #child_previous.classList.remove('c_indirect_next_child') : check matches (false)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #child_previous.classList.remove('c_indirect_next_child') : check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #child_previous) : (insertion) check matches (true)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #child_previous) : (insertion) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #child_previous) : (removal) check matches (false)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #child_previous) : (removal) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('yellowgreen') : check matches (false)
-PASS [ .yellowgreen:has(#descendant:is(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('yellowgreen') : check #indirect_next_child color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #has_scope.classList.add('blue') : check matches (false)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #has_scope.classList.add('blue') : check #has_scope color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #previous.classList.add('f_has_scope') : check matches (true)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #previous.classList.add('f_has_scope') : check #has_scope color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .invalid before #previous) : (insertion) check matches (false)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .invalid before #previous) : (insertion) check #has_scope color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .invalid before #previous) : (removal) check matches (true)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .invalid before #previous) : (removal) check #has_scope color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #previous.classList.remove('f_has_scope') : check matches (false)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #previous.classList.remove('f_has_scope') : check #has_scope color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #previous) : (insertion) check matches (true)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #previous) : (insertion) check #has_scope color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #previous) : (removal) check matches (false)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #previous) : (removal) check #has_scope color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #has_scope.classList.add('f_has_scope') : check matches (true)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #has_scope.classList.add('f_has_scope') : check #has_scope color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #has_scope.classList.remove('f_has_scope') : check matches (false)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #has_scope.classList.remove('f_has_scope') : check #has_scope color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #direct_next.classList.add('f_has_scope') : check matches (true)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #direct_next.classList.add('f_has_scope') : check #has_scope color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .invalid before #direct_next) : (insertion) check matches (false)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .invalid before #direct_next) : (insertion) check #has_scope color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .invalid before #direct_next) : (removal) check matches (true)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .invalid before #direct_next) : (removal) check #has_scope color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #direct_next.classList.remove('f_has_scope') : check matches (false)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #direct_next.classList.remove('f_has_scope') : check #has_scope color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #direct_next) : (insertion) check matches (true)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #direct_next) : (insertion) check #has_scope color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #direct_next) : (removal) check matches (false)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #direct_next) : (removal) check #has_scope color
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #has_scope.classList.remove('blue') : check matches (false)
-PASS [ .blue:has(~ #indirect_next:is(.p + .f_has_scope ~ .g)) ] #has_scope.classList.remove('blue') : check #has_scope color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.add('skyblue') : check matches (false)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.add('skyblue') : check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #previous.classList.add('f_descendant') : check matches (true)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #previous.classList.add('f_descendant') : check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .invalid before #previous) : (insertion) check matches (false)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .invalid before #previous) : (insertion) check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .invalid before #previous) : (removal) check matches (true)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .invalid before #previous) : (removal) check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #previous.classList.remove('f_descendant') : check matches (false)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #previous.classList.remove('f_descendant') : check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #previous) : (insertion) check matches (true)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #previous) : (insertion) check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #previous) : (removal) check matches (false)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #previous) : (removal) check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.add('f_descendant') : check matches (true)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.add('f_descendant') : check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.remove('f_descendant') : check matches (false)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.remove('f_descendant') : check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #direct_next.classList.add('f_descendant') : check matches (true)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #direct_next.classList.add('f_descendant') : check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .invalid before #direct_next) : (insertion) check matches (false)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .invalid before #direct_next) : (insertion) check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .invalid before #direct_next) : (removal) check matches (true)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .invalid before #direct_next) : (removal) check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #direct_next.classList.remove('f_descendant') : check matches (false)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #direct_next.classList.remove('f_descendant') : check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #direct_next) : (insertion) check matches (true)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #direct_next) : (insertion) check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #direct_next) : (removal) check matches (false)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #direct_next) : (removal) check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.remove('skyblue') : check matches (false)
-PASS [ .skyblue:has(~ #indirect_next:is(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.remove('skyblue') : check #descendant color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.add('lightblue') : check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.add('lightblue') : check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #previous.classList.add('f_indirect_next') : check matches (true)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #previous.classList.add('f_indirect_next') : check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #previous) : (insertion) check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #previous) : (insertion) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #previous) : (removal) check matches (true)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #previous) : (removal) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #previous.classList.remove('f_indirect_next') : check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #previous.classList.remove('f_indirect_next') : check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #previous) : (insertion) check matches (true)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #previous) : (insertion) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #previous) : (removal) check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #previous) : (removal) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.add('f_indirect_next') : check matches (true)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.add('f_indirect_next') : check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.remove('f_indirect_next') : check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.remove('f_indirect_next') : check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #direct_next.classList.add('f_indirect_next') : check matches (true)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #direct_next.classList.add('f_indirect_next') : check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #direct_next) : (insertion) check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #direct_next) : (insertion) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #direct_next) : (removal) check matches (true)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #direct_next) : (removal) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #direct_next.classList.remove('f_indirect_next') : check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #direct_next.classList.remove('f_indirect_next') : check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #direct_next) : (insertion) check matches (true)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #direct_next) : (insertion) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #direct_next) : (removal) check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #direct_next) : (removal) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.remove('lightblue') : check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:is(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.remove('lightblue') : check #indirect_next color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('darkblue') : check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('darkblue') : check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #previous.classList.add('f_indirect_next_child') : check matches (true)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #previous.classList.add('f_indirect_next_child') : check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (insertion) check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (insertion) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (removal) check matches (true)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (removal) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #previous.classList.remove('f_indirect_next_child') : check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #previous.classList.remove('f_indirect_next_child') : check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #previous) : (insertion) check matches (true)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #previous) : (insertion) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #previous) : (removal) check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #previous) : (removal) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('f_indirect_next_child') : check matches (true)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('f_indirect_next_child') : check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('f_indirect_next_child') : check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('f_indirect_next_child') : check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #direct_next.classList.add('f_indirect_next_child') : check matches (true)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #direct_next.classList.add('f_indirect_next_child') : check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #direct_next) : (insertion) check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #direct_next) : (insertion) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #direct_next) : (removal) check matches (true)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #direct_next) : (removal) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #direct_next.classList.remove('f_indirect_next_child') : check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #direct_next.classList.remove('f_indirect_next_child') : check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #direct_next) : (insertion) check matches (true)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #direct_next) : (insertion) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #direct_next) : (removal) check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #direct_next) : (removal) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('darkblue') : check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:is(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('darkblue') : check #indirect_next_child color
-PASS [ .yellow:has(~ #indirect_next:is(.h_has_scope .i)) ] #has_scope.classList.add('yellow') : check matches (false)
-PASS [ .yellow:has(~ #indirect_next:is(.h_has_scope .i)) ] #has_scope.classList.add('yellow') : check #has_scope color
-PASS [ .yellow:has(~ #indirect_next:is(.h_has_scope .i)) ] #parent.classList.add('h_has_scope') : check matches (true)
-PASS [ .yellow:has(~ #indirect_next:is(.h_has_scope .i)) ] #parent.classList.add('h_has_scope') : check #has_scope color
-PASS [ .yellow:has(~ #indirect_next:is(.h_has_scope .i)) ] #parent.classList.remove('h_has_scope') : check matches (false)
-PASS [ .yellow:has(~ #indirect_next:is(.h_has_scope .i)) ] #parent.classList.remove('h_has_scope') : check #has_scope color
-PASS [ .yellow:has(~ #indirect_next:is(.h_has_scope .i)) ] #has_scope.classList.remove('yellow') : check matches (false)
-PASS [ .yellow:has(~ #indirect_next:is(.h_has_scope .i)) ] #has_scope.classList.remove('yellow') : check #has_scope color
-PASS [ .ivory:has(~ #indirect_next:is(.h_descendant .i)) #descendant ] #has_scope.classList.add('ivory') : check matches (false)
-PASS [ .ivory:has(~ #indirect_next:is(.h_descendant .i)) #descendant ] #has_scope.classList.add('ivory') : check #descendant color
-PASS [ .ivory:has(~ #indirect_next:is(.h_descendant .i)) #descendant ] #parent.classList.add('h_descendant') : check matches (true)
-PASS [ .ivory:has(~ #indirect_next:is(.h_descendant .i)) #descendant ] #parent.classList.add('h_descendant') : check #descendant color
-PASS [ .ivory:has(~ #indirect_next:is(.h_descendant .i)) #descendant ] #parent.classList.remove('h_descendant') : check matches (false)
-PASS [ .ivory:has(~ #indirect_next:is(.h_descendant .i)) #descendant ] #parent.classList.remove('h_descendant') : check #descendant color
-PASS [ .ivory:has(~ #indirect_next:is(.h_descendant .i)) #descendant ] #has_scope.classList.remove('ivory') : check matches (false)
-PASS [ .ivory:has(~ #indirect_next:is(.h_descendant .i)) #descendant ] #has_scope.classList.remove('ivory') : check #descendant color
-PASS [ .greenyellow:has(~ #indirect_next:is(.h_indirect_next .i)) ~ #indirect_next ] #has_scope.classList.add('greenyellow') : check matches (false)
-PASS [ .greenyellow:has(~ #indirect_next:is(.h_indirect_next .i)) ~ #indirect_next ] #has_scope.classList.add('greenyellow') : check #indirect_next color
-PASS [ .greenyellow:has(~ #indirect_next:is(.h_indirect_next .i)) ~ #indirect_next ] #parent.classList.add('h_indirect_next') : check matches (true)
-PASS [ .greenyellow:has(~ #indirect_next:is(.h_indirect_next .i)) ~ #indirect_next ] #parent.classList.add('h_indirect_next') : check #indirect_next color
-PASS [ .greenyellow:has(~ #indirect_next:is(.h_indirect_next .i)) ~ #indirect_next ] #parent.classList.remove('h_indirect_next') : check matches (false)
-PASS [ .greenyellow:has(~ #indirect_next:is(.h_indirect_next .i)) ~ #indirect_next ] #parent.classList.remove('h_indirect_next') : check #indirect_next color
-PASS [ .greenyellow:has(~ #indirect_next:is(.h_indirect_next .i)) ~ #indirect_next ] #has_scope.classList.remove('greenyellow') : check matches (false)
-PASS [ .greenyellow:has(~ #indirect_next:is(.h_indirect_next .i)) ~ #indirect_next ] #has_scope.classList.remove('greenyellow') : check #indirect_next color
-PASS [ .khaki:has(~ #indirect_next:is(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('khaki') : check matches (false)
-PASS [ .khaki:has(~ #indirect_next:is(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('khaki') : check #indirect_next_child color
-PASS [ .khaki:has(~ #indirect_next:is(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #parent.classList.add('h_indirect_next_child') : check matches (true)
-PASS [ .khaki:has(~ #indirect_next:is(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #parent.classList.add('h_indirect_next_child') : check #indirect_next_child color
-PASS [ .khaki:has(~ #indirect_next:is(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #parent.classList.remove('h_indirect_next_child') : check matches (false)
-PASS [ .khaki:has(~ #indirect_next:is(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #parent.classList.remove('h_indirect_next_child') : check #indirect_next_child color
-PASS [ .khaki:has(~ #indirect_next:is(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('khaki') : check matches (false)
-PASS [ .khaki:has(~ #indirect_next:is(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('khaki') : check #indirect_next_child color
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] #has_scope.classList.add('purple') : check matches (false)
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] #has_scope.classList.add('purple') : check #has_scope color
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] #parent_previous.classList.add('j_has_scope') : check matches (true)
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] #parent_previous.classList.add('j_has_scope') : check #has_scope color
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] insert/remove .invalid before #parent_previous) : (insertion) check #has_scope color
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] insert/remove .invalid before #parent_previous) : (removal) check matches (true)
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] insert/remove .invalid before #parent_previous) : (removal) check #has_scope color
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] #parent_previous.classList.remove('j_has_scope') : check matches (false)
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] #parent_previous.classList.remove('j_has_scope') : check #has_scope color
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] insert/remove .j_has_scope before #parent_previous) : (insertion) check matches (true)
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] insert/remove .j_has_scope before #parent_previous) : (insertion) check #has_scope color
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] insert/remove .j_has_scope before #parent_previous) : (removal) check matches (false)
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] insert/remove .j_has_scope before #parent_previous) : (removal) check #has_scope color
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] #has_scope.classList.remove('purple') : check matches (false)
-PASS [ .purple:has(~ #indirect_next:is(.p + .j_has_scope ~ .k .l)) ] #has_scope.classList.remove('purple') : check #has_scope color
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] #has_scope.classList.add('violet') : check matches (false)
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] #has_scope.classList.add('violet') : check #descendant color
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] #parent_previous.classList.add('j_descendant') : check matches (true)
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] #parent_previous.classList.add('j_descendant') : check #descendant color
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .invalid before #parent_previous) : (insertion) check #descendant color
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .invalid before #parent_previous) : (removal) check matches (true)
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .invalid before #parent_previous) : (removal) check #descendant color
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] #parent_previous.classList.remove('j_descendant') : check matches (false)
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] #parent_previous.classList.remove('j_descendant') : check #descendant color
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .j_descendant before #parent_previous) : (insertion) check matches (true)
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .j_descendant before #parent_previous) : (insertion) check #descendant color
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .j_descendant before #parent_previous) : (removal) check matches (false)
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .j_descendant before #parent_previous) : (removal) check #descendant color
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] #has_scope.classList.remove('violet') : check matches (false)
-PASS [ .violet:has(~ #indirect_next:is(.p + .j_descendant ~ .k .l)) #descendant ] #has_scope.classList.remove('violet') : check #descendant color
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #has_scope.classList.add('orchid') : check matches (false)
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #has_scope.classList.add('orchid') : check #indirect_next color
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #parent_previous.classList.add('j_indirect_next') : check matches (true)
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #parent_previous.classList.add('j_indirect_next') : check #indirect_next color
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (insertion) check #indirect_next color
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (removal) check matches (true)
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (removal) check #indirect_next color
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #parent_previous.classList.remove('j_indirect_next') : check matches (false)
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #parent_previous.classList.remove('j_indirect_next') : check #indirect_next color
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .j_indirect_next before #parent_previous) : (insertion) check matches (true)
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .j_indirect_next before #parent_previous) : (insertion) check #indirect_next color
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .j_indirect_next before #parent_previous) : (removal) check matches (false)
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .j_indirect_next before #parent_previous) : (removal) check #indirect_next color
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #has_scope.classList.remove('orchid') : check matches (false)
-PASS [ .orchid:has(~ #indirect_next:is(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #has_scope.classList.remove('orchid') : check #indirect_next color
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('plum') : check matches (false)
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('plum') : check #indirect_next_child color
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.add('j_indirect_next_child') : check matches (true)
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.add('j_indirect_next_child') : check #indirect_next_child color
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (insertion) check matches (false)
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (insertion) check #indirect_next_child color
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (removal) check matches (true)
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (removal) check #indirect_next_child color
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.remove('j_indirect_next_child') : check matches (false)
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.remove('j_indirect_next_child') : check #indirect_next_child color
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .j_indirect_next_child before #parent_previous) : (insertion) check matches (true)
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .j_indirect_next_child before #parent_previous) : (insertion) check #indirect_next_child color
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .j_indirect_next_child before #parent_previous) : (removal) check matches (false)
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .j_indirect_next_child before #parent_previous) : (removal) check #indirect_next_child color
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('plum') : check matches (false)
-PASS [ .plum:has(~ #indirect_next:is(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('plum') : check #indirect_next_child color
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #has_scope.classList.add('orange') : check matches (false)
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #has_scope.classList.add('orange') : check #has_scope color
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #parent.classList.add('m') : check matches (true)
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #parent.classList.add('m') : check #has_scope color
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #parent.classList.remove('m') : check matches (false)
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #parent.classList.remove('m') : check #has_scope color
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #parent.classList.add('n') : check matches (true)
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #parent.classList.add('n') : check #has_scope color
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #parent.classList.remove('n') : check matches (false)
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #parent.classList.remove('n') : check #has_scope color
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #has_scope.classList.add('m') : check matches (true)
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #has_scope.classList.add('m') : check #has_scope color
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #has_scope.classList.remove('m') : check matches (false)
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #has_scope.classList.remove('m') : check #has_scope color
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #has_scope.classList.add('n') : check matches (true)
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #has_scope.classList.add('n') : check #has_scope color
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #has_scope.classList.remove('n') : check matches (false)
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #has_scope.classList.remove('n') : check #has_scope color
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #child.classList.add('m') : check matches (true)
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #child.classList.add('m') : check #has_scope color
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #child.classList.remove('m') : check matches (false)
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #child.classList.remove('m') : check #has_scope color
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #child.classList.add('n') : check matches (true)
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #child.classList.add('n') : check #has_scope color
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #child.classList.remove('n') : check matches (false)
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #child.classList.remove('n') : check #has_scope color
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #has_scope.classList.remove('orange') : check matches (false)
-PASS [ .orange:has(#descendant:is(:is(.m, .n) .o)) ] #has_scope.classList.remove('orange') : check #has_scope color
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/css/selectors/invalidation/not-pseudo-containing-complex-in-has-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/css/selectors/invalidation/not-pseudo-containing-complex-in-has-expected.txt
deleted file mode 100644
index b193bce..0000000
--- a/third_party/blink/web_tests/platform/generic/external/wpt/css/selectors/invalidation/not-pseudo-containing-complex-in-has-expected.txt
+++ /dev/null
@@ -1,464 +0,0 @@
-This is a testharness.js-based test.
-Found 460 tests; 454 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #has_scope.classList.add('red') : check matches (true)
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #has_scope.classList.add('red') : check #has_scope color
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #parent.classList.add('a_has_scope') : check matches (false)
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #parent.classList.add('a_has_scope') : check #has_scope color
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #parent.classList.remove('a_has_scope') : check matches (true)
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #parent.classList.remove('a_has_scope') : check #has_scope color
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #has_scope.classList.add('a_has_scope') : check matches (false)
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #has_scope.classList.add('a_has_scope') : check #has_scope color
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #has_scope.classList.remove('a_has_scope') : check matches (true)
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #has_scope.classList.remove('a_has_scope') : check #has_scope color
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #child.classList.add('a_has_scope') : check matches (false)
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #child.classList.add('a_has_scope') : check #has_scope color
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #child.classList.remove('a_has_scope') : check matches (true)
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #child.classList.remove('a_has_scope') : check #has_scope color
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #has_scope.classList.remove('red') : check matches (false)
-PASS [ .red:has(#descendant:not(.a_has_scope .b)) ] #has_scope.classList.remove('red') : check #has_scope color
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #has_scope.classList.add('orangered') : check matches (true)
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #has_scope.classList.add('orangered') : check #descendant color
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #parent.classList.add('a_descendant') : check matches (false)
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #parent.classList.add('a_descendant') : check #descendant color
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #parent.classList.remove('a_descendant') : check matches (true)
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #parent.classList.remove('a_descendant') : check #descendant color
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #has_scope.classList.add('a_descendant') : check matches (false)
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #has_scope.classList.add('a_descendant') : check #descendant color
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #has_scope.classList.remove('a_descendant') : check matches (true)
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #has_scope.classList.remove('a_descendant') : check #descendant color
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #child.classList.add('a_descendant') : check matches (false)
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #child.classList.add('a_descendant') : check #descendant color
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #child.classList.remove('a_descendant') : check matches (true)
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #child.classList.remove('a_descendant') : check #descendant color
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #has_scope.classList.remove('orangered') : check matches (false)
-PASS [ .orangered:has(#descendant:not(.a_descendant .b)) #descendant ] #has_scope.classList.remove('orangered') : check #descendant color
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.add('darkred') : check matches (true)
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.add('darkred') : check #indirect_next color
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #parent.classList.add('a_indirect_next') : check matches (false)
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #parent.classList.add('a_indirect_next') : check #indirect_next color
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #parent.classList.remove('a_indirect_next') : check matches (true)
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #parent.classList.remove('a_indirect_next') : check #indirect_next color
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.add('a_indirect_next') : check matches (false)
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.add('a_indirect_next') : check #indirect_next color
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.remove('a_indirect_next') : check matches (true)
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.remove('a_indirect_next') : check #indirect_next color
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #child.classList.add('a_indirect_next') : check matches (false)
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #child.classList.add('a_indirect_next') : check #indirect_next color
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #child.classList.remove('a_indirect_next') : check matches (true)
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #child.classList.remove('a_indirect_next') : check #indirect_next color
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.remove('darkred') : check matches (false)
-PASS [ .darkred:has(#descendant:not(.a_indirect_next .b)) ~ #indirect_next ] #has_scope.classList.remove('darkred') : check #indirect_next color
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('pink') : check matches (true)
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('pink') : check #indirect_next_child color
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #parent.classList.add('a_indirect_next_child') : check matches (false)
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #parent.classList.add('a_indirect_next_child') : check #indirect_next_child color
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #parent.classList.remove('a_indirect_next_child') : check matches (true)
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #parent.classList.remove('a_indirect_next_child') : check #indirect_next_child color
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('a_indirect_next_child') : check matches (false)
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('a_indirect_next_child') : check #indirect_next_child color
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('a_indirect_next_child') : check matches (true)
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('a_indirect_next_child') : check #indirect_next_child color
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #child.classList.add('a_indirect_next_child') : check matches (false)
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #child.classList.add('a_indirect_next_child') : check #indirect_next_child color
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #child.classList.remove('a_indirect_next_child') : check matches (true)
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #child.classList.remove('a_indirect_next_child') : check #indirect_next_child color
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('pink') : check matches (false)
-PASS [ .pink:has(#descendant:not(.a_indirect_next_child .b)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('pink') : check #indirect_next_child color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #has_scope.classList.add('green') : check matches (true)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #has_scope.classList.add('green') : check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #parent_previous.classList.add('c_has_scope') : check matches (false)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #parent_previous.classList.add('c_has_scope') : check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #parent_previous) : (insertion) check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #parent_previous) : (removal) check matches (false)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #parent_previous) : (removal) check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #parent_previous.classList.remove('c_has_scope') : check matches (true)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #parent_previous.classList.remove('c_has_scope') : check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #parent_previous) : (insertion) check matches (false)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #parent_previous) : (insertion) check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #parent_previous) : (removal) check matches (true)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #parent_previous) : (removal) check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #previous.classList.add('c_has_scope') : check matches (false)
-FAIL [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #previous.classList.add('c_has_scope') : check #has_scope color assert_equals: expected "rgb(128, 128, 128)" but got "rgb(0, 128, 0)"
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #previous) : (insertion) check matches (true)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #previous) : (insertion) check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #previous) : (removal) check matches (false)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #previous) : (removal) check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #previous.classList.remove('c_has_scope') : check matches (true)
-FAIL [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #previous.classList.remove('c_has_scope') : check #has_scope color assert_equals: expected "rgb(0, 128, 0)" but got "rgb(128, 128, 128)"
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #previous) : (insertion) check matches (false)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #previous) : (insertion) check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #previous) : (removal) check matches (true)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #previous) : (removal) check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #child_previous.classList.add('c_has_scope') : check matches (false)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #child_previous.classList.add('c_has_scope') : check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #child_previous) : (insertion) check matches (true)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #child_previous) : (insertion) check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #child_previous) : (removal) check matches (false)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .invalid before #child_previous) : (removal) check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #child_previous.classList.remove('c_has_scope') : check matches (true)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #child_previous.classList.remove('c_has_scope') : check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #child_previous) : (insertion) check matches (false)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #child_previous) : (insertion) check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #child_previous) : (removal) check matches (true)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] insert/remove .c_has_scope before #child_previous) : (removal) check #has_scope color
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #has_scope.classList.remove('green') : check matches (false)
-PASS [ .green:has(#descendant:not(.p + .c_has_scope ~ .d .e)) ] #has_scope.classList.remove('green') : check #has_scope color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #has_scope.classList.add('lightgreen') : check matches (true)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #has_scope.classList.add('lightgreen') : check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #parent_previous.classList.add('c_descendant') : check matches (false)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #parent_previous.classList.add('c_descendant') : check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #parent_previous) : (insertion) check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #parent_previous) : (removal) check matches (false)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #parent_previous) : (removal) check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #parent_previous.classList.remove('c_descendant') : check matches (true)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #parent_previous.classList.remove('c_descendant') : check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #parent_previous) : (insertion) check matches (false)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #parent_previous) : (insertion) check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #parent_previous) : (removal) check matches (true)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #parent_previous) : (removal) check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #previous.classList.add('c_descendant') : check matches (false)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #previous.classList.add('c_descendant') : check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #previous) : (insertion) check matches (true)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #previous) : (insertion) check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #previous) : (removal) check matches (false)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #previous) : (removal) check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #previous.classList.remove('c_descendant') : check matches (true)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #previous.classList.remove('c_descendant') : check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #previous) : (insertion) check matches (false)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #previous) : (insertion) check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #previous) : (removal) check matches (true)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #previous) : (removal) check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #child_previous.classList.add('c_descendant') : check matches (false)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #child_previous.classList.add('c_descendant') : check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #child_previous) : (insertion) check matches (true)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #child_previous) : (insertion) check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #child_previous) : (removal) check matches (false)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .invalid before #child_previous) : (removal) check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #child_previous.classList.remove('c_descendant') : check matches (true)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #child_previous.classList.remove('c_descendant') : check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #child_previous) : (insertion) check matches (false)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #child_previous) : (insertion) check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #child_previous) : (removal) check matches (true)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] insert/remove .c_descendant before #child_previous) : (removal) check #descendant color
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #has_scope.classList.remove('lightgreen') : check matches (false)
-PASS [ .lightgreen:has(#descendant:not(.p + .c_descendant ~ .d .e)) #descendant ] #has_scope.classList.remove('lightgreen') : check #descendant color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #has_scope.classList.add('darkgreen') : check matches (true)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #has_scope.classList.add('darkgreen') : check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #parent_previous.classList.add('c_indirect_next') : check matches (false)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #parent_previous.classList.add('c_indirect_next') : check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (insertion) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (removal) check matches (false)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (removal) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #parent_previous.classList.remove('c_indirect_next') : check matches (true)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #parent_previous.classList.remove('c_indirect_next') : check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #parent_previous) : (insertion) check matches (false)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #parent_previous) : (insertion) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #parent_previous) : (removal) check matches (true)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #parent_previous) : (removal) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #previous.classList.add('c_indirect_next') : check matches (false)
-FAIL [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #previous.classList.add('c_indirect_next') : check #indirect_next color assert_equals: expected "rgb(128, 128, 128)" but got "rgb(0, 100, 0)"
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #previous) : (insertion) check matches (true)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #previous) : (insertion) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #previous) : (removal) check matches (false)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #previous) : (removal) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #previous.classList.remove('c_indirect_next') : check matches (true)
-FAIL [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #previous.classList.remove('c_indirect_next') : check #indirect_next color assert_equals: expected "rgb(0, 100, 0)" but got "rgb(128, 128, 128)"
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #previous) : (insertion) check matches (false)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #previous) : (insertion) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #previous) : (removal) check matches (true)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #previous) : (removal) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #child_previous.classList.add('c_indirect_next') : check matches (false)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #child_previous.classList.add('c_indirect_next') : check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #child_previous) : (insertion) check matches (true)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #child_previous) : (insertion) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #child_previous) : (removal) check matches (false)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .invalid before #child_previous) : (removal) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #child_previous.classList.remove('c_indirect_next') : check matches (true)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #child_previous.classList.remove('c_indirect_next') : check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #child_previous) : (insertion) check matches (false)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #child_previous) : (insertion) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #child_previous) : (removal) check matches (true)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] insert/remove .c_indirect_next before #child_previous) : (removal) check #indirect_next color
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #has_scope.classList.remove('darkgreen') : check matches (false)
-PASS [ .darkgreen:has(#descendant:not(.p + .c_indirect_next ~ .d .e)) ~ #indirect_next ] #has_scope.classList.remove('darkgreen') : check #indirect_next color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('yellowgreen') : check matches (true)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('yellowgreen') : check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.add('c_indirect_next_child') : check matches (false)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.add('c_indirect_next_child') : check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (insertion) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (removal) check matches (false)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (removal) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.remove('c_indirect_next_child') : check matches (true)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.remove('c_indirect_next_child') : check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #parent_previous) : (insertion) check matches (false)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #parent_previous) : (insertion) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #parent_previous) : (removal) check matches (true)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #parent_previous) : (removal) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #previous.classList.add('c_indirect_next_child') : check matches (false)
-FAIL [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #previous.classList.add('c_indirect_next_child') : check #indirect_next_child color assert_equals: expected "rgb(128, 128, 128)" but got "rgb(154, 205, 50)"
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (insertion) check matches (true)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (insertion) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (removal) check matches (false)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (removal) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #previous.classList.remove('c_indirect_next_child') : check matches (true)
-FAIL [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #previous.classList.remove('c_indirect_next_child') : check #indirect_next_child color assert_equals: expected "rgb(154, 205, 50)" but got "rgb(128, 128, 128)"
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #previous) : (insertion) check matches (false)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #previous) : (insertion) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #previous) : (removal) check matches (true)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #previous) : (removal) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #child_previous.classList.add('c_indirect_next_child') : check matches (false)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #child_previous.classList.add('c_indirect_next_child') : check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #child_previous) : (insertion) check matches (true)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #child_previous) : (insertion) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #child_previous) : (removal) check matches (false)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #child_previous) : (removal) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #child_previous.classList.remove('c_indirect_next_child') : check matches (true)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #child_previous.classList.remove('c_indirect_next_child') : check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #child_previous) : (insertion) check matches (false)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #child_previous) : (insertion) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #child_previous) : (removal) check matches (true)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] insert/remove .c_indirect_next_child before #child_previous) : (removal) check #indirect_next_child color
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('yellowgreen') : check matches (false)
-PASS [ .yellowgreen:has(#descendant:not(.p + .c_indirect_next_child ~ .d .e)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('yellowgreen') : check #indirect_next_child color
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #has_scope.classList.add('blue') : check matches (true)
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #has_scope.classList.add('blue') : check #has_scope color
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #previous.classList.add('f_has_scope') : check matches (false)
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #previous.classList.add('f_has_scope') : check #has_scope color
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #previous.classList.remove('f_has_scope') : check matches (true)
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #previous.classList.remove('f_has_scope') : check #has_scope color
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #previous) : (insertion) check matches (false)
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #previous) : (insertion) check #has_scope color
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #previous) : (removal) check matches (true)
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #previous) : (removal) check #has_scope color
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #has_scope.classList.add('f_has_scope') : check matches (false)
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #has_scope.classList.add('f_has_scope') : check #has_scope color
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #has_scope.classList.remove('f_has_scope') : check matches (true)
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #has_scope.classList.remove('f_has_scope') : check #has_scope color
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #direct_next.classList.add('f_has_scope') : check matches (false)
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #direct_next.classList.add('f_has_scope') : check #has_scope color
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #direct_next.classList.remove('f_has_scope') : check matches (true)
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #direct_next.classList.remove('f_has_scope') : check #has_scope color
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #direct_next) : (insertion) check matches (false)
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #direct_next) : (insertion) check #has_scope color
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #direct_next) : (removal) check matches (true)
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] insert/remove .f_has_scope before #direct_next) : (removal) check #has_scope color
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #has_scope.classList.remove('blue') : check matches (false)
-PASS [ .blue:has(~ #indirect_next:not(.p + .f_has_scope ~ .g)) ] #has_scope.classList.remove('blue') : check #has_scope color
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.add('skyblue') : check matches (true)
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.add('skyblue') : check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #previous.classList.add('f_descendant') : check matches (false)
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #previous.classList.add('f_descendant') : check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #previous.classList.remove('f_descendant') : check matches (true)
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #previous.classList.remove('f_descendant') : check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #previous) : (insertion) check matches (false)
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #previous) : (insertion) check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #previous) : (removal) check matches (true)
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #previous) : (removal) check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.add('f_descendant') : check matches (false)
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.add('f_descendant') : check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.remove('f_descendant') : check matches (true)
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.remove('f_descendant') : check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #direct_next.classList.add('f_descendant') : check matches (false)
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #direct_next.classList.add('f_descendant') : check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #direct_next.classList.remove('f_descendant') : check matches (true)
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #direct_next.classList.remove('f_descendant') : check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #direct_next) : (insertion) check matches (false)
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #direct_next) : (insertion) check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #direct_next) : (removal) check matches (true)
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] insert/remove .f_descendant before #direct_next) : (removal) check #descendant color
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.remove('skyblue') : check matches (false)
-PASS [ .skyblue:has(~ #indirect_next:not(.p + .f_descendant ~ .g)) #descendant ] #has_scope.classList.remove('skyblue') : check #descendant color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.add('lightblue') : check matches (true)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.add('lightblue') : check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #previous.classList.add('f_indirect_next') : check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #previous.classList.add('f_indirect_next') : check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #previous) : (insertion) check matches (true)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #previous) : (insertion) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #previous) : (removal) check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #previous) : (removal) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #previous.classList.remove('f_indirect_next') : check matches (true)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #previous.classList.remove('f_indirect_next') : check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #previous) : (insertion) check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #previous) : (insertion) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #previous) : (removal) check matches (true)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #previous) : (removal) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.add('f_indirect_next') : check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.add('f_indirect_next') : check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.remove('f_indirect_next') : check matches (true)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.remove('f_indirect_next') : check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #direct_next.classList.add('f_indirect_next') : check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #direct_next.classList.add('f_indirect_next') : check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #direct_next) : (insertion) check matches (true)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #direct_next) : (insertion) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #direct_next) : (removal) check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .invalid before #direct_next) : (removal) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #direct_next.classList.remove('f_indirect_next') : check matches (true)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #direct_next.classList.remove('f_indirect_next') : check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #direct_next) : (insertion) check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #direct_next) : (insertion) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #direct_next) : (removal) check matches (true)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] insert/remove .f_indirect_next before #direct_next) : (removal) check #indirect_next color
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.remove('lightblue') : check matches (false)
-PASS [ .lightblue:has(~ #indirect_next:not(.p + .f_indirect_next ~ .g)) ~ #indirect_next ] #has_scope.classList.remove('lightblue') : check #indirect_next color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('darkblue') : check matches (true)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('darkblue') : check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #previous.classList.add('f_indirect_next_child') : check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #previous.classList.add('f_indirect_next_child') : check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (insertion) check matches (true)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (insertion) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (removal) check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #previous) : (removal) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #previous.classList.remove('f_indirect_next_child') : check matches (true)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #previous.classList.remove('f_indirect_next_child') : check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #previous) : (insertion) check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #previous) : (insertion) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #previous) : (removal) check matches (true)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #previous) : (removal) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('f_indirect_next_child') : check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('f_indirect_next_child') : check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('f_indirect_next_child') : check matches (true)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('f_indirect_next_child') : check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #direct_next.classList.add('f_indirect_next_child') : check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #direct_next.classList.add('f_indirect_next_child') : check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #direct_next) : (insertion) check matches (true)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #direct_next) : (insertion) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #direct_next) : (removal) check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #direct_next) : (removal) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #direct_next.classList.remove('f_indirect_next_child') : check matches (true)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #direct_next.classList.remove('f_indirect_next_child') : check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #direct_next) : (insertion) check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #direct_next) : (insertion) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #direct_next) : (removal) check matches (true)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] insert/remove .f_indirect_next_child before #direct_next) : (removal) check #indirect_next_child color
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('darkblue') : check matches (false)
-PASS [ .darkblue:has(~ #indirect_next:not(.p + .f_indirect_next_child ~ .g)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('darkblue') : check #indirect_next_child color
-PASS [ .yellow:has(~ #indirect_next:not(.h_has_scope .i)) ] #has_scope.classList.add('yellow') : check matches (true)
-PASS [ .yellow:has(~ #indirect_next:not(.h_has_scope .i)) ] #has_scope.classList.add('yellow') : check #has_scope color
-PASS [ .yellow:has(~ #indirect_next:not(.h_has_scope .i)) ] #parent.classList.add('h_has_scope') : check matches (false)
-PASS [ .yellow:has(~ #indirect_next:not(.h_has_scope .i)) ] #parent.classList.add('h_has_scope') : check #has_scope color
-PASS [ .yellow:has(~ #indirect_next:not(.h_has_scope .i)) ] #parent.classList.remove('h_has_scope') : check matches (true)
-PASS [ .yellow:has(~ #indirect_next:not(.h_has_scope .i)) ] #parent.classList.remove('h_has_scope') : check #has_scope color
-PASS [ .yellow:has(~ #indirect_next:not(.h_has_scope .i)) ] #has_scope.classList.remove('yellow') : check matches (false)
-PASS [ .yellow:has(~ #indirect_next:not(.h_has_scope .i)) ] #has_scope.classList.remove('yellow') : check #has_scope color
-PASS [ .ivory:has(~ #indirect_next:not(.h_descendant .i)) #descendant ] #has_scope.classList.add('ivory') : check matches (true)
-PASS [ .ivory:has(~ #indirect_next:not(.h_descendant .i)) #descendant ] #has_scope.classList.add('ivory') : check #descendant color
-PASS [ .ivory:has(~ #indirect_next:not(.h_descendant .i)) #descendant ] #parent.classList.add('h_descendant') : check matches (false)
-PASS [ .ivory:has(~ #indirect_next:not(.h_descendant .i)) #descendant ] #parent.classList.add('h_descendant') : check #descendant color
-PASS [ .ivory:has(~ #indirect_next:not(.h_descendant .i)) #descendant ] #parent.classList.remove('h_descendant') : check matches (true)
-PASS [ .ivory:has(~ #indirect_next:not(.h_descendant .i)) #descendant ] #parent.classList.remove('h_descendant') : check #descendant color
-PASS [ .ivory:has(~ #indirect_next:not(.h_descendant .i)) #descendant ] #has_scope.classList.remove('ivory') : check matches (false)
-PASS [ .ivory:has(~ #indirect_next:not(.h_descendant .i)) #descendant ] #has_scope.classList.remove('ivory') : check #descendant color
-PASS [ .greenyellow:has(~ #indirect_next:not(.h_indirect_next .i)) ~ #indirect_next ] #has_scope.classList.add('greenyellow') : check matches (true)
-PASS [ .greenyellow:has(~ #indirect_next:not(.h_indirect_next .i)) ~ #indirect_next ] #has_scope.classList.add('greenyellow') : check #indirect_next color
-PASS [ .greenyellow:has(~ #indirect_next:not(.h_indirect_next .i)) ~ #indirect_next ] #parent.classList.add('h_indirect_next') : check matches (false)
-PASS [ .greenyellow:has(~ #indirect_next:not(.h_indirect_next .i)) ~ #indirect_next ] #parent.classList.add('h_indirect_next') : check #indirect_next color
-PASS [ .greenyellow:has(~ #indirect_next:not(.h_indirect_next .i)) ~ #indirect_next ] #parent.classList.remove('h_indirect_next') : check matches (true)
-PASS [ .greenyellow:has(~ #indirect_next:not(.h_indirect_next .i)) ~ #indirect_next ] #parent.classList.remove('h_indirect_next') : check #indirect_next color
-PASS [ .greenyellow:has(~ #indirect_next:not(.h_indirect_next .i)) ~ #indirect_next ] #has_scope.classList.remove('greenyellow') : check matches (false)
-PASS [ .greenyellow:has(~ #indirect_next:not(.h_indirect_next .i)) ~ #indirect_next ] #has_scope.classList.remove('greenyellow') : check #indirect_next color
-PASS [ .khaki:has(~ #indirect_next:not(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('khaki') : check matches (true)
-PASS [ .khaki:has(~ #indirect_next:not(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('khaki') : check #indirect_next_child color
-PASS [ .khaki:has(~ #indirect_next:not(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #parent.classList.add('h_indirect_next_child') : check matches (false)
-PASS [ .khaki:has(~ #indirect_next:not(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #parent.classList.add('h_indirect_next_child') : check #indirect_next_child color
-PASS [ .khaki:has(~ #indirect_next:not(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #parent.classList.remove('h_indirect_next_child') : check matches (true)
-PASS [ .khaki:has(~ #indirect_next:not(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #parent.classList.remove('h_indirect_next_child') : check #indirect_next_child color
-PASS [ .khaki:has(~ #indirect_next:not(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('khaki') : check matches (false)
-PASS [ .khaki:has(~ #indirect_next:not(.h_indirect_next_child .i)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('khaki') : check #indirect_next_child color
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] #has_scope.classList.add('purple') : check matches (true)
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] #has_scope.classList.add('purple') : check #has_scope color
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] #parent_previous.classList.add('j_has_scope') : check matches (false)
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] #parent_previous.classList.add('j_has_scope') : check #has_scope color
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] insert/remove .invalid before #parent_previous) : (insertion) check #has_scope color
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] insert/remove .invalid before #parent_previous) : (removal) check matches (false)
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] insert/remove .invalid before #parent_previous) : (removal) check #has_scope color
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] #parent_previous.classList.remove('j_has_scope') : check matches (true)
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] #parent_previous.classList.remove('j_has_scope') : check #has_scope color
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] insert/remove .j_has_scope before #parent_previous) : (insertion) check matches (false)
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] insert/remove .j_has_scope before #parent_previous) : (insertion) check #has_scope color
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] insert/remove .j_has_scope before #parent_previous) : (removal) check matches (true)
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] insert/remove .j_has_scope before #parent_previous) : (removal) check #has_scope color
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] #has_scope.classList.remove('purple') : check matches (false)
-PASS [ .purple:has(~ #indirect_next:not(.p + .j_has_scope ~ .k .l)) ] #has_scope.classList.remove('purple') : check #has_scope color
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] #has_scope.classList.add('violet') : check matches (true)
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] #has_scope.classList.add('violet') : check #descendant color
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] #parent_previous.classList.add('j_descendant') : check matches (false)
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] #parent_previous.classList.add('j_descendant') : check #descendant color
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .invalid before #parent_previous) : (insertion) check #descendant color
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .invalid before #parent_previous) : (removal) check matches (false)
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .invalid before #parent_previous) : (removal) check #descendant color
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] #parent_previous.classList.remove('j_descendant') : check matches (true)
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] #parent_previous.classList.remove('j_descendant') : check #descendant color
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .j_descendant before #parent_previous) : (insertion) check matches (false)
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .j_descendant before #parent_previous) : (insertion) check #descendant color
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .j_descendant before #parent_previous) : (removal) check matches (true)
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] insert/remove .j_descendant before #parent_previous) : (removal) check #descendant color
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] #has_scope.classList.remove('violet') : check matches (false)
-PASS [ .violet:has(~ #indirect_next:not(.p + .j_descendant ~ .k .l)) #descendant ] #has_scope.classList.remove('violet') : check #descendant color
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #has_scope.classList.add('orchid') : check matches (true)
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #has_scope.classList.add('orchid') : check #indirect_next color
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #parent_previous.classList.add('j_indirect_next') : check matches (false)
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #parent_previous.classList.add('j_indirect_next') : check #indirect_next color
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (insertion) check #indirect_next color
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (removal) check matches (false)
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .invalid before #parent_previous) : (removal) check #indirect_next color
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #parent_previous.classList.remove('j_indirect_next') : check matches (true)
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #parent_previous.classList.remove('j_indirect_next') : check #indirect_next color
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .j_indirect_next before #parent_previous) : (insertion) check matches (false)
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .j_indirect_next before #parent_previous) : (insertion) check #indirect_next color
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .j_indirect_next before #parent_previous) : (removal) check matches (true)
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] insert/remove .j_indirect_next before #parent_previous) : (removal) check #indirect_next color
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #has_scope.classList.remove('orchid') : check matches (false)
-PASS [ .orchid:has(~ #indirect_next:not(.p + .j_indirect_next ~ .k .l)) ~ #indirect_next ] #has_scope.classList.remove('orchid') : check #indirect_next color
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('plum') : check matches (true)
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.add('plum') : check #indirect_next_child color
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.add('j_indirect_next_child') : check matches (false)
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.add('j_indirect_next_child') : check #indirect_next_child color
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (insertion) check matches (true)
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (insertion) check #indirect_next_child color
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (removal) check matches (false)
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .invalid before #parent_previous) : (removal) check #indirect_next_child color
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.remove('j_indirect_next_child') : check matches (true)
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #parent_previous.classList.remove('j_indirect_next_child') : check #indirect_next_child color
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .j_indirect_next_child before #parent_previous) : (insertion) check matches (false)
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .j_indirect_next_child before #parent_previous) : (insertion) check #indirect_next_child color
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .j_indirect_next_child before #parent_previous) : (removal) check matches (true)
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] insert/remove .j_indirect_next_child before #parent_previous) : (removal) check #indirect_next_child color
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('plum') : check matches (false)
-PASS [ .plum:has(~ #indirect_next:not(.p + .j_indirect_next_child ~ .k .l)) ~ #indirect_next #indirect_next_child ] #has_scope.classList.remove('plum') : check #indirect_next_child color
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #has_scope.classList.add('orange') : check matches (true)
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #has_scope.classList.add('orange') : check #has_scope color
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #parent.classList.add('m') : check matches (false)
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #parent.classList.add('m') : check #has_scope color
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #parent.classList.add('n') : check matches (true)
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #parent.classList.add('n') : check #has_scope color
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #parent.classList.remove('n') : check matches (false)
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #parent.classList.remove('n') : check #has_scope color
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #parent.classList.remove('m') : check matches (true)
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #parent.classList.remove('m') : check #has_scope color
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #has_scope.classList.add('m') : check matches (false)
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #has_scope.classList.add('m') : check #has_scope color
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #has_scope.classList.add('n') : check matches (true)
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #has_scope.classList.add('n') : check #has_scope color
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #has_scope.classList.remove('n') : check matches (false)
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #has_scope.classList.remove('n') : check #has_scope color
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #has_scope.classList.remove('m') : check matches (true)
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #has_scope.classList.remove('m') : check #has_scope color
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #child.classList.add('m') : check matches (false)
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #child.classList.add('m') : check #has_scope color
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #child.classList.add('n') : check matches (true)
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #child.classList.add('n') : check #has_scope color
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #child.classList.remove('n') : check matches (false)
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #child.classList.remove('n') : check #has_scope color
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #child.classList.remove('m') : check matches (true)
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #child.classList.remove('m') : check #has_scope color
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #has_scope.classList.remove('orange') : check matches (false)
-PASS [ .orange:has(#descendant:not(.m:not(.n) .o)) ] #has_scope.classList.remove('orange') : check #has_scope color
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-html-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-html-expected.txt
new file mode 100644
index 0000000..95a330a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-html-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+NOTRUN Page with <embed type=text/html src=/resources/blank.html> Should be BFCached but actually wasn't
+NOTRUN Page with <object type=text/html data=/resources/blank.html> Should be BFCached but actually wasn't
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-img-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-img-expected.txt
new file mode 100644
index 0000000..e66d9ee
--- /dev/null
+++ b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-img-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+NOTRUN Page with <embed type=image/png src=/images/blue.png> Should be BFCached but actually wasn't
+NOTRUN Page with <object type=image/png data=/images/blue.png> Should be BFCached but actually wasn't
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-js-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-js-expected.txt
new file mode 100644
index 0000000..c8fa78c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-js-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+NOTRUN Page with <embed type=application/javascript src=/resources/test-only-api.js> Should be BFCached but actually wasn't
+NOTRUN Page with <object type=application/javascript data=/resources/test-only-api.js> Should be BFCached but actually wasn't
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-mp4-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-mp4-expected.txt
new file mode 100644
index 0000000..177761f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-mp4-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+NOTRUN Page with <embed type=undefined src=/media/white.mp4> Should be BFCached but actually wasn't
+NOTRUN Page with <object type=undefined data=/media/white.mp4> Should be BFCached but actually wasn't
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-not-found-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-not-found-expected.txt
new file mode 100644
index 0000000..ee76b29
--- /dev/null
+++ b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-not-found-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+NOTRUN Page with <embed type=image/png src=/404.png> Should be BFCached but actually wasn't
+NOTRUN Page with <object type=image/png data=/404.png> Should be BFCached but actually wasn't
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-type-only-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-type-only-expected.txt
new file mode 100644
index 0000000..cc99785b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/bfcache/embeded-type-only-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+NOTRUN Page with <embed type=text/html src=undefined> Should be BFCached but actually wasn't
+NOTRUN Page with <object type=text/html data=undefined> Should be BFCached but actually wasn't
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/generic/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index e06208c..f6c7a061 100644
--- a/third_party/blink/web_tests/platform/generic/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -168,10 +168,6 @@
     getter highWaterMark
     getter size
     method constructor
-interface CropTarget
-    static method fromElement
-    attribute @@toStringTag
-    method constructor
 interface Crypto
     attribute @@toStringTag
     getter subtle
diff --git a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/css-properties-as-js-properties-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/css-properties-as-js-properties-expected.txt
index f0162ec9..bef63cd 100644
--- a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/css-properties-as-js-properties-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/css-properties-as-js-properties-expected.txt
@@ -270,6 +270,7 @@
 negative
 objectFit
 objectPosition
+objectViewBox
 offset
 offsetDistance
 offsetPath
diff --git a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/css-property-listing-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/css-property-listing-expected.txt
index 671aeb4..c34ccca 100644
--- a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/css-property-listing-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/css-property-listing-expected.txt
@@ -251,6 +251,7 @@
     mix-blend-mode
     object-fit
     object-position
+    object-view-box
     offset-distance
     offset-path
     offset-rotate
diff --git a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt
index 0f54e0c4..21a67974f 100644
--- a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -160,10 +160,6 @@
 [Worker]     getter highWaterMark
 [Worker]     getter size
 [Worker]     method constructor
-[Worker] interface CropTarget
-[Worker]     static method fromElement
-[Worker]     attribute @@toStringTag
-[Worker]     method constructor
 [Worker] interface Crypto
 [Worker]     attribute @@toStringTag
 [Worker]     getter subtle
diff --git a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-expected.txt
index 8dd54bc9..048d274b 100644
--- a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -413,10 +413,6 @@
     method postMessage
     setter onmessage
     setter onmessageerror
-interface BrowserCaptureMediaStreamTrack : MediaStreamTrack
-    attribute @@toStringTag
-    method constructor
-    method cropTo
 interface ByteLengthQueuingStrategy
     attribute @@toStringTag
     getter highWaterMark
@@ -1013,10 +1009,6 @@
     method get
     method preventSilentAccess
     method store
-interface CropTarget
-    static method fromElement
-    attribute @@toStringTag
-    method constructor
 interface Crypto
     attribute @@toStringTag
     getter subtle
diff --git a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt
index bc5f78316..41aab633 100644
--- a/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -125,10 +125,6 @@
 [Worker]     getter highWaterMark
 [Worker]     getter size
 [Worker]     method constructor
-[Worker] interface CropTarget
-[Worker]     static method fromElement
-[Worker]     attribute @@toStringTag
-[Worker]     method constructor
 [Worker] interface Crypto
 [Worker]     attribute @@toStringTag
 [Worker]     getter subtle
diff --git a/third_party/blink/web_tests/platform/generic/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/platform/generic/webexposed/global-interface-listing-expected.txt
index eeae9af..b18a501 100644
--- a/third_party/blink/web_tests/platform/generic/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/webexposed/global-interface-listing-expected.txt
@@ -608,11 +608,10 @@
     method postMessage
     setter onmessage
     setter onmessageerror
-interface BrowserCaptureMediaStreamTrack : MediaStreamTrack
+interface BrowserCaptureMediaStreamTrack : FocusableMediaStreamTrack
     attribute @@toStringTag
     method constructor
     method cropTo
-    method focus
 interface ByteLengthQueuingStrategy
     attribute @@toStringTag
     getter highWaterMark
diff --git a/third_party/blink/web_tests/shadow-dom/attach-shadow-safelist.html b/third_party/blink/web_tests/shadow-dom/attach-shadow-safelist.html
index 675133f..40281733 100644
--- a/third_party/blink/web_tests/shadow-dom/attach-shadow-safelist.html
+++ b/third_party/blink/web_tests/shadow-dom/attach-shadow-safelist.html
@@ -7,7 +7,7 @@
 const safelist = ['custom-element',
                   'article', 'aside', 'blockquote', 'body', 'div', 'footer',
                   'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
-                  'header', 'main', 'nav', 'p', 'section', 'selectmenu', 'span'];
+                  'header', 'main', 'nav', 'p', 'section', 'span'];
 
 test(() => {
   safelist.forEach((tag) => {
diff --git a/third_party/metrics_proto/README.chromium b/third_party/metrics_proto/README.chromium
index 74b67c4..662325b25 100644
--- a/third_party/metrics_proto/README.chromium
+++ b/third_party/metrics_proto/README.chromium
@@ -1,8 +1,8 @@
 Name: Metrics Protos
 Short Name: metrics_proto
 URL: This is the canonical public repository
-Version: 452791832
-Date: 2022/06/03 UTC
+Version: 453427486
+Date: 2022/06/07 UTC
 License: BSD
 Security Critical: Yes
 
diff --git a/third_party/metrics_proto/omnibox_event.proto b/third_party/metrics_proto/omnibox_event.proto
index a102f052..f47ebb4 100644
--- a/third_party/metrics_proto/omnibox_event.proto
+++ b/third_party/metrics_proto/omnibox_event.proto
@@ -180,6 +180,16 @@
     // Android's auxiliary search backend.
     ANDROID_AUXILIARY_SEARCH = 21;
 
+    // The user interacted with the search resumption module on the Android New
+    // Tab Page. This search resumption module offered suggestions based on a
+    // search results page that the user was on.
+    NTP_SEARCH_RESUMPTION_SEARCH_RESULT_PAGE = 22;
+
+    // The user interacted with the search resumption module on the Android New
+    // Tab Page. This search resumption module offered suggestions based on a
+    // non-search-results page that the user was on.
+    NTP_SEARCH_RESUMPTION_OTHER = 23;
+
     // When adding new classifications, please consider adding them in
     // chromium's chrome/browser/resources/omnibox/omnibox.html
     // so that these new options are displayed on about:omnibox.
diff --git a/tools/mac/power/benchmark.py b/tools/mac/power/benchmark.py
index bf9ebd5..73a2470a 100755
--- a/tools/mac/power/benchmark.py
+++ b/tools/mac/power/benchmark.py
@@ -39,9 +39,15 @@
                       dest='no_checks',
                       action='store_true',
                       help="Invalid environment doesn't throw")
+  mode_group = parser.add_mutually_exclusive_group()
+  mode_group.add_argument(
+      '--tracing_mode',
+      dest='tracing_mode',
+      action='store_true',
+      help="Grab a trace instead of a profile or benchmark.")
 
   # Profile related arguments
-  parser.add_argument(
+  mode_group.add_argument(
       '--profile_mode',
       dest='profile_mode',
       action='store',
@@ -98,13 +104,18 @@
     def BrowserFactory(browser_name, variation):
       return browsers.MakeBrowserDriver(browser_name,
                                         variation,
-                                        chrome_user_dir=args.chrome_user_dir)
+                                        chrome_user_dir=args.chrome_user_dir,
+                                        output_dir=output_dir,
+                                        tracing_mode=args.tracing_mode)
 
     for scenario in IterScenarios(args.scenarios,
                                   BrowserFactory,
                                   meet_meeting_id=args.meet_meeting_id):
 
-      if args.profile_mode:
+      if args.tracing_mode:
+        logging.info(f'Tracing scenario {scenario.name} ...')
+        driver.Trace(scenario)
+      elif args.profile_mode:
         logging.info(f'Profiling scenario {scenario.name} ...')
         driver.Profile(scenario, profile_mode=args.profile_mode)
       else:
diff --git a/tools/mac/power/browsers.py b/tools/mac/power/browsers.py
index 42ffc1b..b1cba0b0 100644
--- a/tools/mac/power/browsers.py
+++ b/tools/mac/power/browsers.py
@@ -163,8 +163,11 @@
 ]
 
 
-def MakeBrowserDriver(browser_name: str, variation: str,
-                      chrome_user_dir=None) -> BrowserDriver:
+def MakeBrowserDriver(browser_name: str,
+                      variation: str,
+                      chrome_user_dir=None,
+                      output_dir=None,
+                      tracing_mode=False) -> BrowserDriver:
   """Creates browser driver by name.
 
   Args:
@@ -182,6 +185,16 @@
       chrome_extra_arg = ["--guest"]
     if variation == 'AlignWakeUps':
       chrome_extra_arg += ['--enable-features=AlignWakeUps']
+
+    if tracing_mode:
+      chrome_extra_arg += [
+          '--enable-tracing=toplevel,toplevel.flow,mojom,navigation'
+      ]
+      trace_path = os.path.join(output_dir, "chrometrace.log")
+      chrome_extra_arg += [
+          f'--trace-startup-file={os.path.abspath(trace_path)}'
+      ]
+
     if browser_name == "chrome":
       return Chrome(variation, extra_args=chrome_extra_arg)
     if browser_name == "canary":
diff --git a/tools/mac/power/driver.py b/tools/mac/power/driver.py
index 2d13e3b..fc8f424 100644
--- a/tools/mac/power/driver.py
+++ b/tools/mac/power/driver.py
@@ -291,6 +291,15 @@
     logging.debug(f"Waiting for dtrace to exit")
     dtrace_process.wait(30)
 
+  def Trace(self, scenario_driver: scenarios.ScenarioOSADriver):
+    self.WriteScenarioSummary(scenario_driver)
+
+    try:
+      scenario_driver.Launch()
+      scenario_driver.Wait()
+    finally:
+      scenario_driver.TearDown()
+
   def WriteScenarioSummary(
       self, scenario_driver: scenarios.ScenarioWithBrowserOSADriver):
     """Outputs a json file describing `scenario_driver` arguments into the
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 3e89b1a..9b7d83e 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -26822,11 +26822,19 @@
 </enum>
 
 <enum name="Download.Shelf.DragEvent">
+  <obsolete>
+    Deprecated 2022-06-06
+  </obsolete>
   <int value="0" label="Started"/>
   <int value="1" label="Canceled"/>
   <int value="2" label="Dropped"/>
 </enum>
 
+<enum name="Download.Shelf.DragInfo">
+  <int value="0" label="DRAG_STARTED"/>
+  <int value="1" label="DOWNLOAD_COMPLETE"/>
+</enum>
+
 <enum name="DownloadableStrings.InstallStatus">
   <obsolete>
     Deprecated 2/2018
@@ -86980,7 +86988,9 @@
     The preference or policy controlling if signin is valid changed during the
     signin process.
   </int>
-  <int value="3" label="User clicked signout">User clicked to signout.</int>
+  <int value="3" label="User clicked signout from settings">
+    User clicked to signout from the settings screen.
+  </int>
   <int value="4" label="Signin aborted">
     The signin process was aborted, but signin had succeeded, so signout. This
     may be due to a server response, policy definition or user action.
@@ -87026,12 +87036,26 @@
     Sign-out forced because the account was removed from the device after a
     device restore. iOS only.
   </int>
-  <int value="16" label="User clicked Turn off sync">
+  <int value="16" label="User clicked turn off sync">
     User clicked the 'Turn off sync' option within settings. Android only.
   </int>
-  <int value="17" label="User Clicked Signout From Profile Menu">
+  <int value="17" label="User clicked signout From profile menu">
     User Clicked Signout in the profile menu.
   </int>
+  <int value="18" label="Retriggered from web signin">
+    User retriggered signin from the Android web sign-in bottomsheet.
+  </int>
+  <int value="19" label="User clicked signout from user policy notification">
+    User clicked on sign-out from the notification dialog for User Policy. The
+    notification informs the user that from now on user policies may be
+    effective on their browser if they Sync with their managed account. The user
+    has the option to sign out to avoid user policies.
+  </int>
+  <int value="20" label="Account email updated">
+    The email of the primary account on the device was renamed (from a non-gmail
+    to gmail address), triggering an automatic signout followed by signin.
+    Android only.
+  </int>
 </enum>
 
 <enum name="SigninSource">
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml
index 712f2e8..c822d2b 100644
--- a/tools/metrics/histograms/metadata/blink/histograms.xml
+++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -791,7 +791,7 @@
   </summary>
 </histogram>
 
-<histogram name="Blink.Experimental.Cookies.CacheLookupResult"
+<histogram name="Blink.Experimental.Cookies.CacheLookupResult2"
     enum="CookieCacheLookupResult" expires_after="2023-01-01">
   <owner>carlscab@google.com</owner>
   <owner>woa-performance@google</owner>
diff --git a/tools/metrics/histograms/metadata/chrome/histograms.xml b/tools/metrics/histograms/metadata/chrome/histograms.xml
index 80cf76a..1577576 100644
--- a/tools/metrics/histograms/metadata/chrome/histograms.xml
+++ b/tools/metrics/histograms/metadata/chrome/histograms.xml
@@ -34,22 +34,23 @@
 </histogram>
 
 <histogram name="Chrome.ProcessSingleton.NotifyResult" enum="NotifyResult"
-    expires_after="2022-07-03">
+    expires_after="2023-05-31">
   <owner>gab@chromium.org</owner>
+  <owner>etienneb@chromium.org</owner>
   <summary>
     The result of every rendez-vous reported once per browser process launch.
   </summary>
 </histogram>
 
 <histogram name="Chrome.ProcessSingleton.RemoteHungProcessTerminateReason"
-    enum="RemoteHungProcessTerminateReason" expires_after="2022-11-13">
+    enum="RemoteHungProcessTerminateReason" expires_after="2023-05-31">
   <owner>gab@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <summary>The reason of remote hang processes termination.</summary>
 </histogram>
 
 <histogram name="Chrome.ProcessSingleton.RemoteProcessInteractionResult"
-    enum="RemoteProcessInteractionResult" expires_after="2022-11-13">
+    enum="RemoteProcessInteractionResult" expires_after="2023-05-31">
   <owner>gab@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <summary>
@@ -59,7 +60,7 @@
 </histogram>
 
 <histogram name="Chrome.ProcessSingleton.TerminateProcessErrorCode.Posix"
-    enum="PopularOSErrno" expires_after="2022-07-03">
+    enum="PopularOSErrno" expires_after="2023-05-31">
   <owner>gab@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <summary>
@@ -69,7 +70,7 @@
 </histogram>
 
 <histogram name="Chrome.ProcessSingleton.TerminateProcessErrorCode.Windows"
-    enum="WinGetLastError" expires_after="2022-11-13">
+    enum="WinGetLastError" expires_after="2023-05-31">
   <owner>gab@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <summary>
@@ -79,7 +80,7 @@
 </histogram>
 
 <histogram name="Chrome.ProcessSingleton.TerminateProcessTime" units="ms"
-    expires_after="2022-11-13">
+    expires_after="2023-05-31">
   <owner>gab@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <summary>
@@ -89,7 +90,7 @@
 </histogram>
 
 <histogram name="Chrome.ProcessSingleton.TerminationWaitErrorCode.Windows"
-    enum="WinGetLastError" expires_after="2022-11-13">
+    enum="WinGetLastError" expires_after="2023-05-31">
   <owner>gab@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <summary>
@@ -98,7 +99,7 @@
 </histogram>
 
 <histogram name="Chrome.ProcessSingleton.TimeToCreate" units="ms"
-    expires_after="2022-11-13">
+    expires_after="2023-05-31">
   <owner>etienneb@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>
@@ -108,7 +109,7 @@
 </histogram>
 
 <histogram name="Chrome.ProcessSingleton.TimeToFailure" units="ms"
-    expires_after="2022-11-13">
+    expires_after="2023-05-31">
   <owner>etienneb@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>
@@ -119,7 +120,7 @@
 </histogram>
 
 <histogram name="Chrome.ProcessSingleton.TimeToNotify" units="ms"
-    expires_after="2022-11-13">
+    expires_after="2023-05-31">
   <owner>etienneb@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/content_creation/histograms.xml b/tools/metrics/histograms/metadata/content_creation/histograms.xml
index a105e8fb..1fb8ac8 100644
--- a/tools/metrics/histograms/metadata/content_creation/histograms.xml
+++ b/tools/metrics/histograms/metadata/content_creation/histograms.xml
@@ -529,7 +529,7 @@
 </histogram>
 
 <histogram name="TextFragmentAnchor.LinkOpenSource"
-    enum="TextFragmentLinkOpenSource" expires_after="2022-10-09">
+    enum="TextFragmentLinkOpenSource" expires_after="2023-06-30">
   <owner>gayane@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -549,7 +549,7 @@
 </histogram>
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.AmbiguousMatch"
-    enum="Boolean" expires_after="2022-06-30">
+    enum="Boolean" expires_after="2023-06-30">
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -648,7 +648,7 @@
 </histogram>
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.MatchRate" units="%"
-    expires_after="2022-06-30">
+    expires_after="2023-06-30">
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -781,7 +781,7 @@
 </histogram>
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.TimeToScrollIntoView"
-    units="ms" expires_after="2022-06-30">
+    units="ms" expires_after="2023-06-30">
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/download/histograms.xml b/tools/metrics/histograms/metadata/download/histograms.xml
index 7a8e039..82978a3 100644
--- a/tools/metrics/histograms/metadata/download/histograms.xml
+++ b/tools/metrics/histograms/metadata/download/histograms.xml
@@ -1103,6 +1103,9 @@
 
 <histogram name="Download.Shelf.DragEvent" enum="Download.Shelf.DragEvent"
     expires_after="M77">
+  <obsolete>
+    Removed 2022-06-06, though it had long expired (in M77).
+  </obsolete>
   <owner>sdy@chromium.org</owner>
   <summary>
     Events related to dragging a completed download from the shelf, which
@@ -1110,6 +1113,16 @@
   </summary>
 </histogram>
 
+<histogram name="Download.Shelf.DragInfo" enum="Download.Shelf.DragInfo"
+    expires_after="2022-12-06">
+  <owner>thefrog@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@chromium.org</owner>
+  <summary>
+    This tracks drag events on a complete download on the shelf, and also
+    general download completion on the shelf as a point of reference.
+  </summary>
+</histogram>
+
 <histogram name="Download.Shelf.VisibleTime" units="ms"
     expires_after="2022-10-10">
   <owner>xinghuilu@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/fingerprint/histograms.xml b/tools/metrics/histograms/metadata/fingerprint/histograms.xml
index 04c651f..e7fa0a6 100644
--- a/tools/metrics/histograms/metadata/fingerprint/histograms.xml
+++ b/tools/metrics/histograms/metadata/fingerprint/histograms.xml
@@ -78,7 +78,7 @@
 </histogram>
 
 <histogram name="Fingerprint.FingerprintPowerButtonRace" units="units"
-    expires_after="2022-06-01">
+    expires_after="2022-12-01">
   <owner>emaamari@google.com</owner>
   <owner>chromeos-commercial-identity@google.com</owner>
   <owner>chromeos-fingerprint@google.com</owner>
@@ -91,7 +91,7 @@
 </histogram>
 
 <histogram name="Fingerprint.FingerprintScanDone" units="units"
-    expires_after="2022-06-01">
+    expires_after="2022-12-01">
   <owner>emaamari@google.com</owner>
   <owner>chromeos-commercial-identity@google.com</owner>
   <owner>chromeos-fingerprint@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/navigation/histograms.xml b/tools/metrics/histograms/metadata/navigation/histograms.xml
index 18f40fb..b099ce3 100644
--- a/tools/metrics/histograms/metadata/navigation/histograms.xml
+++ b/tools/metrics/histograms/metadata/navigation/histograms.xml
@@ -760,6 +760,19 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Navigation.MainFrame.RendererInitiated.InitiatorFramePresentAtStart"
+    enum="BooleanPresent" expires_after="2023-05-26">
+  <owner>yaoxia@chromium.org</owner>
+  <owner>cammie@chromium.org</owner>
+  <summary>
+    Whether the initiator frame is present when a renderer-initiated primary
+    main frame navigation has started. Recorded for each renderer-initiated
+    primary main frame navigation when the navigation has started (i.e. during
+    WebContentsObserver::DidStartNavigation()).
+  </summary>
+</histogram>
+
 <histogram name="Navigation.MainFrame.SiteEngagementLevel"
     enum="SiteEngagementLevel" expires_after="2022-10-30">
   <owner>meacer@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index 2474c59..9d8cdaee 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -73,6 +73,11 @@
                enabled"/>
 </variants>
 
+<variants name="DIPSRedirectType">
+  <variant name="Client" summary="client-side"/>
+  <variant name="Server" summary="server-side"/>
+</variants>
+
 <variants name="GridTabSwitcherMessageTypes">
   <variant name="PriceAlertsMessageCard"
       summary="the promo message for price notifications"/>
diff --git a/tools/metrics/histograms/metadata/power/histograms.xml b/tools/metrics/histograms/metadata/power/histograms.xml
index 70840ff..257e04a7 100644
--- a/tools/metrics/histograms/metadata/power/histograms.xml
+++ b/tools/metrics/histograms/metadata/power/histograms.xml
@@ -899,7 +899,7 @@
 </histogram>
 
 <histogram name="Power.CpuTimeSecondsPerProcessType.{Visibility}"
-    enum="ProcessType2" expires_after="2022-07-18">
+    enum="ProcessType2" expires_after="2023-06-07">
   <owner>eseckler@chromium.org</owner>
   <owner>skyostil@chromium.org</owner>
   <owner>woa-performance@google.com</owner>
@@ -1687,7 +1687,7 @@
 </histogram>
 
 <histogram name="Power.PowerButtonPressed" units="units"
-    expires_after="2022-06-01">
+    expires_after="2022-12-01">
   <owner>emaamari@google.com</owner>
   <owner>chromeos-commercial-identity@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/privacy/histograms.xml b/tools/metrics/histograms/metadata/privacy/histograms.xml
index 6094951..aa51363 100644
--- a/tools/metrics/histograms/metadata/privacy/histograms.xml
+++ b/tools/metrics/histograms/metadata/privacy/histograms.xml
@@ -180,17 +180,18 @@
   </summary>
 </histogram>
 
-<histogram name="Privacy.DIPS.BounceCategory{DIPSCookieMode}"
-    enum="DIPSRedirectCategory" expires_after="2022-11-01">
+<histogram name="Privacy.DIPS.BounceCategory{DIPSRedirectType}{DIPSCookieMode}"
+    enum="DIPSRedirectCategory" expires_after="2022-12-01">
   <owner>bcl@chromium.org</owner>
   <owner>rtarpine@chromium.org</owner>
   <owner>src/chrome/browser/dips/OWNERS</owner>
   <summary>
-    Whether a redirect accessed cookies and whether its origin previously had
-    user engagement. Recorded when redirecting between different sites,
-    {DIPSCookieMode}.
+    Whether a {DIPSRedirectType} redirect accessed cookies and whether its
+    origin previously had user engagement. Recorded when redirecting between
+    different sites, {DIPSCookieMode}.
   </summary>
   <token key="DIPSCookieMode" variants="DIPSCookieMode"/>
+  <token key="DIPSRedirectType" variants="DIPSRedirectType"/>
 </histogram>
 
 <histogram name="Privacy.DIPS.TimeFromInteractionToStorage{DIPSCookieMode}"
@@ -207,6 +208,20 @@
   <token key="DIPSCookieMode" variants="DIPSCookieMode"/>
 </histogram>
 
+<histogram name="Privacy.DIPS.TimeFromNavigationCommitToClientRedirect"
+    units="ms" expires_after="2022-12-01">
+  <owner>bcl@chromium.org</owner>
+  <owner>jdh@chromium.org</owner>
+  <owner>rtarpine@chromium.org</owner>
+  <owner>src/chrome/browser/dips/OWNERS</owner>
+  <summary>
+    The amount of time after a navigation to a site commits until a renderer
+    initiated navigation (without user activation) is started to a different
+    site. Not recorded if the redirecting site does not access state (e.g.
+    cookies) or takes longer than 10 seconds to initiate the redirect.
+  </summary>
+</histogram>
+
 <histogram name="Privacy.DIPS.TimeFromStorageToInteraction{DIPSCookieMode}"
     units="ms" expires_after="2022-07-01">
   <owner>bcl@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 1b288fca..3df02346 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -21,8 +21,8 @@
             "full_remote_path": "perfetto-luci-artifacts/v25.0/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "ca3ee5e4a577e0de91bde20e6260dbfe60b89dd8",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/c05294a1704cc6992869ad438342328ca2b38b8d/trace_processor_shell"
+            "hash": "fdc0a1248f135b3ccb0dad14aa0b9aabae3d77ed",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/2e22f4e894ed9800027ff05dc0c7fe2217b033d6/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/ui/chromeos/translations/ui_chromeos_strings_am.xtb b/ui/chromeos/translations/ui_chromeos_strings_am.xtb
index b0734c2a..a16df2e 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_am.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_am.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">ዘውግ</translation>
 <translation id="1254593899333212300">ቀጥተኛ የበይነመረብ ግንኙነት</translation>
 <translation id="1272293450992660632">ፒን እሴቶች አይዛመዱም።</translation>
+<translation id="127650757582748357">የBZIP2 የታመቀ ማህደር</translation>
 <translation id="1280820357415527819">የተንቀሳቃሽ ስልክ አውታረ መረቦችን በመፈለግ ላይ</translation>
 <translation id="1291603679744561561">ሲም ተቆልፏል</translation>
 <translation id="1293556467332435079">ፋይሎች</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">ቺዝ</translation>
 <translation id="2781645665747935084">የቤልጂየም</translation>
 <translation id="2782104745158847185">የLinux መተግበሪያን መጫን ላይ ስህተት</translation>
+<translation id="2788520643285360081">የ7-Zip ማህደር</translation>
 <translation id="2803375539583399270">ፒን ያስገቡ</translation>
 <translation id="2820957248982571256">በመቃኘት ላይ...</translation>
+<translation id="2822595620066756134">የGZIP የታመቀ ማህደር</translation>
 <translation id="2830077785865012357">ቻይንኛ ዡዪን</translation>
 <translation id="2843806747483486897">ነባሪ ቀይር...</translation>
 <translation id="2850124913210091882">በምትኬ አስቀምጥ</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">ሊቱአኒያን</translation>
 <translation id="3587482841069643663">ሁሉም</translation>
 <translation id="3592251141500063301"><ph name="FILE_NAME" />ን ከመስመር ውጭ እንዲገኝ ማድረግ አልተቻለም</translation>
+<translation id="3593874215226880809">የLZIP የታመቀ ማህደር</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">የካናዳ ፈረንሳይኛ</translation>
 <translation id="3606220979431771195">የቱርክኛ-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" />ን ሰርዝ።</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="3691184985318546178">ሲንሃላኛ</translation>
+<translation id="3703620396751288986">የZIP ማህደር</translation>
 <translation id="3726463242007121105">የዚህ መሣሪያ ስርዓተ ፋይል ስለማይደገፍ ስላልሆነ ሊከፈት አይችልም።</translation>
 <translation id="3727148787322499904">ይህን ቅንብር መቀየር በሁሉም የተጋሩ አውታረ መረቦች ላይ ተጽዕኖ አለው</translation>
 <translation id="3737576078404241332">ከጎን አሞሌ አስወግድ</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">ቼክኛ በQwerty ቁልፍ ሰሌዳ</translation>
 <translation id="4656777537938206294">ፋይሎችን ከመስመር ውጭ እንዲገኙ ያድርጉ</translation>
 <translation id="4658782175094886150">በበረዶ ውስጥ ያለ ሰው</translation>
+<translation id="4661996069183330363">የTAR ማህደር</translation>
 <translation id="4669606053856530811">እነዚህ ንጥሎች ለእነሱ ካልተጋሩ በስተቀር የ«<ph name="SOURCE_NAME" />» አባላት መዳረሻ ያጣሉ።</translation>
 <translation id="467809019005607715">Google ስላይዶች</translation>
 <translation id="4690246192099372265">ስዊድንኛ</translation>
@@ -930,6 +936,7 @@
 <translation id="8903931173357132290">ትምህርት ይጨርሱ</translation>
 <translation id="8912078710089354287">ጅራቱን የሚቆላ ውሻ</translation>
 <translation id="8919081441417203123">ዴኒሽ</translation>
+<translation id="8965273390142984105">የLZOP የታመቀ ማህደር</translation>
 <translation id="8965697826696209160">በቂ ቦታ የለም።</translation>
 <translation id="8997962250644902079">የቻይንኛ (ተለምዷዊ) ፒንዪን</translation>
 <translation id="9003940392834790328">አውታረ መረብ <ph name="NETWORK_INDEX" /> ከ<ph name="NETWORK_COUNT" />፣ <ph name="NETWORK_NAME" />፣ <ph name="CONNECTION_STATUS" />፣ የሲግናል ጥንካሬ <ph name="SIGNAL_STRENGTH" />%፣ በአስተዳዳሪ የሚተዳደር፣ ዝርዝሮች</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
index ee2ae52..0a54697 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">النوع</translation>
 <translation id="1254593899333212300">اتصال مباشر بالإنترنت</translation>
 <translation id="1272293450992660632">لا تتطابق قيم أرقام التعريف الشخصية.</translation>
+<translation id="127650757582748357">‏أرشيف مضغوط ببرنامج BZIP2</translation>
 <translation id="1280820357415527819">جارٍ البحث عن شبكات الجوّال</translation>
 <translation id="1291603679744561561">‏تم قفل شريحة SIM.</translation>
 <translation id="1293556467332435079">ملفات</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">جبن</translation>
 <translation id="2781645665747935084">البلجيكية</translation>
 <translation id="2782104745158847185">‏حدث خطأ أثناء تثبيت تطبيق Linux</translation>
+<translation id="2788520643285360081">‏أرشيف مضغوط ببرنامج ‎7-Zip</translation>
 <translation id="2803375539583399270">أدخل رقم التعريف الشخصي</translation>
 <translation id="2820957248982571256">جارٍ الفحص...</translation>
+<translation id="2822595620066756134">‏أرشيف مضغوط ببرنامج GZIP</translation>
 <translation id="2830077785865012357">‏الصينية باستخدام لوحة مفاتيح Zhuyin</translation>
 <translation id="2843806747483486897">تغيير الإجراء التلقائي...</translation>
 <translation id="2850124913210091882">النسخ الاحتياطي</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">الليتوانية</translation>
 <translation id="3587482841069643663">الكل</translation>
 <translation id="3592251141500063301">تعذَّرت إتاحة الملف "<ph name="FILE_NAME" />" بلا اتصال بالإنترنت.</translation>
+<translation id="3593874215226880809">‏أرشيف مضغوط ببرنامج LZIP</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">الفرنسية الكندية</translation>
 <translation id="3606220979431771195">Turkish-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551">إلغاء <ph name="ACTIVITY_DESCRIPTION" /></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="3691184985318546178">السنهالية</translation>
+<translation id="3703620396751288986">‏أرشيف ZIP</translation>
 <translation id="3726463242007121105">لا يمكن فتح الجهاز لأن نظام الملفات غير متوافق.</translation>
 <translation id="3727148787322499904">سيؤثر تغيير هذا الإعداد في جميع الشبكات المشتركة</translation>
 <translation id="3737576078404241332">الإزالة من الشريط الجانبي</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">‏التشيكية باستخدام لوحة مفاتيح Qwerty</translation>
 <translation id="4656777537938206294">إتاحة الوصول إلى الملفات بلا اتصال بالإنترنت</translation>
 <translation id="4658782175094886150">شخص مغطّى بالثلج</translation>
+<translation id="4661996069183330363">‏أرشيف TAR</translation>
 <translation id="4669606053856530811">سيفقد أعضاء '<ph name="SOURCE_NAME" />' إمكانية الوصول ما لم تتم مشاركة هذه العناصر معهم.</translation>
 <translation id="467809019005607715">‏العروض التقديمية من Google</translation>
 <translation id="4690246192099372265">السويدية</translation>
@@ -931,6 +937,7 @@
 <translation id="8903931173357132290">خرّيج</translation>
 <translation id="8912078710089354287">كلب يهُز ذيله</translation>
 <translation id="8919081441417203123">الدانماركية</translation>
+<translation id="8965273390142984105">‏أرشيف مضغوط ببرنامج LZOP</translation>
 <translation id="8965697826696209160">ليست هناك مساحة كافية.</translation>
 <translation id="8997962250644902079">‏الصينية (التقليدية) باستخدام لوحة مفاتيح Pinyin</translation>
 <translation id="9003940392834790328">الشبكة <ph name="NETWORK_INDEX" /> من <ph name="NETWORK_COUNT" />، الشبكة <ph name="NETWORK_NAME" />، حالة الاتصال <ph name="CONNECTION_STATUS" />، قوة الإشارة <ph name="SIGNAL_STRENGTH" />%، يديرها المشرف، التفاصيل</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_as.xtb b/ui/chromeos/translations/ui_chromeos_strings_as.xtb
index a9aac8fe..b4b45c5 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_as.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_as.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">শৈলী</translation>
 <translation id="1254593899333212300">পোনপটীয়া ইণ্টাৰনেট সংযোগ</translation>
 <translation id="1272293450992660632">পিনৰ মানসমূহ মিলা নাই।</translation>
+<translation id="127650757582748357">BZIP2 কম্প্ৰেছ কৰা আৰ্কাইভ</translation>
 <translation id="1280820357415527819">ম’বাইল নেটৱৰ্ক বিচাৰি থকা হৈছে</translation>
 <translation id="1291603679744561561">ছিম লক কৰা হ'ল</translation>
 <translation id="1293556467332435079">Files</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">চ্চীজ</translation>
 <translation id="2781645665747935084">বেলজিয়ান</translation>
 <translation id="2782104745158847185">Linux এপ্লিকেশ্বন ইনষ্টল কৰোঁতে কিবা আসোঁৱাহ হ’ল</translation>
+<translation id="2788520643285360081">7-Zip আৰ্কাইভ</translation>
 <translation id="2803375539583399270">পিন দিয়ক</translation>
 <translation id="2820957248982571256">স্কেন কৰি থকা হৈছে...</translation>
+<translation id="2822595620066756134">Gzip কম্প্ৰেছ কৰা আৰ্কাইভ</translation>
 <translation id="2830077785865012357">চীনা জুয়িন</translation>
 <translation id="2843806747483486897">ডিফ’ল্ট কার্য সলনি কৰক...</translation>
 <translation id="2850124913210091882">বেকআপ লওক</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">লিথুৱানিয়ান</translation>
 <translation id="3587482841069643663">সকলো</translation>
 <translation id="3592251141500063301"><ph name="FILE_NAME" /> অফলাইনত উপলব্ধ কৰিব পৰা নগ’ল</translation>
+<translation id="3593874215226880809">LZIP কম্প্ৰেছ কৰা আৰ্কাইভ</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">কানাডিয়ান ফ্রেন্স</translation>
 <translation id="3606220979431771195">টুৰ্কিছ-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> বাতিল কৰক।</translation>
 <translation id="3690128548376345212"><ph name="NETWORK_COUNT" /> টাৰ ভিতৰত <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, সক্ৰিয় নকৰা, <ph name="CONNECTION_STATUS" />, ছিগনেলৰ ক্ষমতা <ph name="SIGNAL_STRENGTH" />%, সবিশেষ</translation>
 <translation id="3691184985318546178">সিংহলী</translation>
+<translation id="3703620396751288986">ZIP আৰ্কাইভ</translation>
 <translation id="3726463242007121105">এই ডিভাইচটোৰ ফাইলছিষ্টেম সমৰ্থিত নহয় বাবে এইটো খুলিব নোৱাৰি।</translation>
 <translation id="3727148787322499904">এই ছেটিংটো সলনি কৰিলে শ্বেয়াৰ কৰা সকলো নেটৱৰ্কত প্ৰভাৱ পৰিব</translation>
 <translation id="3737576078404241332">ছাইডবাৰৰ পৰা আঁতৰাওক</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Qwerty কীব’ৰ্ডৰ সৈতে চেক</translation>
 <translation id="4656777537938206294">ফাইলসমূহ অনলাইনত উপলব্ধ কৰক</translation>
 <translation id="4658782175094886150">বৰফৰ মাজত থকা ব্যক্তিৰ ছবি</translation>
+<translation id="4661996069183330363">TAR আৰ্কাইভ</translation>
 <translation id="4669606053856530811">’<ph name="SOURCE_NAME" />’ৰ সদস্যসকলে তেতিয়ালৈকে এক্সেছ নাপাব যেতিয়ালৈকে তেওঁলোকৰ সৈতে এই বস্তুবোৰ শ্বেয়াৰ কৰা নহয়।</translation>
 <translation id="467809019005607715">Google Slides</translation>
 <translation id="4690246192099372265">ছুইডিশ্ব</translation>
@@ -929,6 +935,7 @@
 <translation id="8903931173357132290">গ্ৰেজুৱেট</translation>
 <translation id="8912078710089354287">নেজ জোকাৰি থকা কুকুৰৰ ছবি</translation>
 <translation id="8919081441417203123">ডেনিশ্ব</translation>
+<translation id="8965273390142984105">LZOP কম্প্ৰেছ কৰা আৰ্কাইভ</translation>
 <translation id="8965697826696209160">পৰ্যাপ্ত খালী ঠাই নাই।</translation>
 <translation id="8997962250644902079">চীনা (পৰম্পৰাগত) পিনয়িন</translation>
 <translation id="9003940392834790328"><ph name="NETWORK_COUNT" />টা নেটৱৰ্কৰ <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ছিগনেলৰ ক্ষমতা <ph name="SIGNAL_STRENGTH" />%, আপোনাৰ প্ৰশাসকে পৰিচালনা কৰে, সবিশেষ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_az.xtb b/ui/chromeos/translations/ui_chromeos_strings_az.xtb
index 48a713b..6ca9b13 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_az.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_az.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">Janr</translation>
 <translation id="1254593899333212300">Birbaşa İnternet bağlantısı</translation>
 <translation id="1272293450992660632">PIN-lər eyni deyil.</translation>
+<translation id="127650757582748357">BZIP2 sıxılmış arxivi</translation>
 <translation id="1280820357415527819">Mobil şəbəkə axtarılır</translation>
 <translation id="1291603679744561561">SİM kilidlənib</translation>
 <translation id="1293556467332435079">Fayllar</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">Pendir</translation>
 <translation id="2781645665747935084">Belçikalı</translation>
 <translation id="2782104745158847185">Linux tətbiqini quraşdırarkən xəta baş verdi</translation>
+<translation id="2788520643285360081">7-Zip arxivi</translation>
 <translation id="2803375539583399270">PİN daxil edin</translation>
 <translation id="2820957248982571256">Skan edilir...</translation>
+<translation id="2822595620066756134">GZIP sıxılmış arxivi</translation>
 <translation id="2830077785865012357">Çin dili (Juyin)</translation>
 <translation id="2843806747483486897">Defoltu dəyişin...</translation>
 <translation id="2850124913210091882">Yedəkləyin</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">Litva</translation>
 <translation id="3587482841069643663">Hamısı</translation>
 <translation id="3592251141500063301"><ph name="FILE_NAME" /> faylını oflayn əlçatan etmək mümkün olmadı</translation>
+<translation id="3593874215226880809">LZIP sıxılmış arxivi</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">Kanada Fransızcası</translation>
 <translation id="3606220979431771195">Türk-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551">Ləğv edin: <ph name="ACTIVITY_DESCRIPTION" />.</translation>
 <translation id="3690128548376345212">Şəbəkə <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Deaktivdir, <ph name="CONNECTION_STATUS" />, Siqnal Gücü <ph name="SIGNAL_STRENGTH" />%, Detallar</translation>
 <translation id="3691184985318546178">Sinhala</translation>
+<translation id="3703620396751288986">ZIP arxivi</translation>
 <translation id="3726463242007121105">Bu fayl açıla bilməz, çünki onun fayl sistemi dəstəklənmir.</translation>
 <translation id="3727148787322499904">Bu ayarın dəyişdirilməsi bütün paylaşılan şəbəkələrə təsir edəcək</translation>
 <translation id="3737576078404241332">Yan paneldən silin</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Qwerty klaviaturası ilə Çex dili</translation>
 <translation id="4656777537938206294">Faylları oflayn əlçatan edin</translation>
 <translation id="4658782175094886150">Qarda adam</translation>
+<translation id="4661996069183330363">TAR arxivi</translation>
 <translation id="4669606053856530811">"<ph name="SOURCE_NAME" />" bu element onlarla paylaşılmadığı halda, daxil ola bilməyəcəklər.</translation>
 <translation id="467809019005607715">Google Slayd</translation>
 <translation id="4690246192099372265">İsveç</translation>
@@ -927,6 +933,7 @@
 <translation id="8903931173357132290">Məzun</translation>
 <translation id="8912078710089354287">Quyruğunu tərpədən it</translation>
 <translation id="8919081441417203123">Danimarka</translation>
+<translation id="8965273390142984105">LZOP sıxılmış arxivi</translation>
 <translation id="8965697826696209160">Yer çatmır.</translation>
 <translation id="8997962250644902079">Çin dili (Ənənəvi) Pinyin</translation>
 <translation id="9003940392834790328"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> şəbəkə, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Siqnal Gücü <ph name="SIGNAL_STRENGTH" />%, Administratorunuz tərəfindən idarə olunur, Detallar</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
index 5200683d..2bb7395 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">Gènere</translation>
 <translation id="1254593899333212300">Connexió directa a Internet</translation>
 <translation id="1272293450992660632">Els valors del PIN no coincideixen.</translation>
+<translation id="127650757582748357">Arxiu comprimit BZIP2</translation>
 <translation id="1280820357415527819">S'estan cercant xarxes mòbils</translation>
 <translation id="1291603679744561561">SIM bloquejada</translation>
 <translation id="1293556467332435079">Fitxers</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">Formatge</translation>
 <translation id="2781645665747935084">Belga</translation>
 <translation id="2782104745158847185">S'ha produït un error en instal·lar l'aplicació per a Linux</translation>
+<translation id="2788520643285360081">Arxiu 7-Zip</translation>
 <translation id="2803375539583399270">Introdueix el PIN</translation>
 <translation id="2820957248982571256">S'està cercant...</translation>
+<translation id="2822595620066756134">Arxiu comprimit GZIP</translation>
 <translation id="2830077785865012357">Xinès (zhuyin)</translation>
 <translation id="2843806747483486897">Canvia els valors predeterminats...</translation>
 <translation id="2850124913210091882">Còpia de seguretat</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">Lituà</translation>
 <translation id="3587482841069643663">Tots</translation>
 <translation id="3592251141500063301">No s'ha pogut fer que <ph name="FILE_NAME" /> estigui disponible sense connexió</translation>
+<translation id="3593874215226880809">Arxiu comprimit LZIP</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> (<ph name="CARRIER_NAME" />)</translation>
 <translation id="3603385196401704894">Francès canadenc</translation>
 <translation id="3606220979431771195">Turc-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551">Cancel·la <ph name="ACTIVITY_DESCRIPTION" />.</translation>
 <translation id="3690128548376345212">Xarxa <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, desactivada, <ph name="CONNECTION_STATUS" />, intensitat del senyal <ph name="SIGNAL_STRENGTH" />%, detalls</translation>
 <translation id="3691184985318546178">Singalès</translation>
+<translation id="3703620396751288986">Arxiu ZIP</translation>
 <translation id="3726463242007121105">Aquest dispositiu no es pot obrir perquè el seu sistema de fitxers no és compatible.</translation>
 <translation id="3727148787322499904">Els canvis en aquesta opció de configuració afectaran totes les xarxes compartides</translation>
 <translation id="3737576078404241332">Suprimeix de la barra lateral</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Txec amb teclat QWERTY</translation>
 <translation id="4656777537938206294">Fes que els fitxers estiguin disponibles sense connexió</translation>
 <translation id="4658782175094886150">Persona a la neu</translation>
+<translation id="4661996069183330363">Arxiu TAR</translation>
 <translation id="4669606053856530811">Els membres de l'equip <ph name="SOURCE_NAME" /> ja no podran accedir a aquests elements, tret que es comparteixin amb ells.</translation>
 <translation id="467809019005607715">Presentacions de Google</translation>
 <translation id="4690246192099372265">Suec</translation>
@@ -930,6 +936,7 @@
 <translation id="8903931173357132290">Graduat</translation>
 <translation id="8912078710089354287">Gos remenant la cua</translation>
 <translation id="8919081441417203123">Danès</translation>
+<translation id="8965273390142984105">Arxiu comprimit LZOP</translation>
 <translation id="8965697826696209160">No hi ha prou espai.</translation>
 <translation id="8997962250644902079">Xinès tradicional (pinyin)</translation>
 <translation id="9003940392834790328">Xarxa <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, <ph name="SIGNAL_STRENGTH" />% d'intensitat del senyal, gestionada per l'administrador, detalls</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_da.xtb b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
index 2571d42..ca8f1fe 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_da.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">Genre</translation>
 <translation id="1254593899333212300">Direkte internetforbindelse</translation>
 <translation id="1272293450992660632">Pinkodeværdierne stemmer ikke overens.</translation>
+<translation id="127650757582748357">BZIP2-komprimeret arkiv</translation>
 <translation id="1280820357415527819">Søger efter mobilnetværk</translation>
 <translation id="1291603679744561561">SIM-kort låst</translation>
 <translation id="1293556467332435079">Filer</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">Ost</translation>
 <translation id="2781645665747935084">Belgisk</translation>
 <translation id="2782104745158847185">Der opstod en fejl ved installation af Linux-appen</translation>
+<translation id="2788520643285360081">7-Zip-arkiv</translation>
 <translation id="2803375539583399270">Angiv pinkode</translation>
 <translation id="2820957248982571256">Scanner…</translation>
+<translation id="2822595620066756134">GZIP-komprimeret arkiv</translation>
 <translation id="2830077785865012357">Kinesisk zhuyin</translation>
 <translation id="2843806747483486897">Skift standardindstillinger...</translation>
 <translation id="2850124913210091882">Sikkerhedskopiér</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">Litauisk</translation>
 <translation id="3587482841069643663">Alle</translation>
 <translation id="3592251141500063301"><ph name="FILE_NAME" /> kunne ikke gøres tilgængelig offline</translation>
+<translation id="3593874215226880809">LZIP-komprimeret arkiv</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">Fransk (Canada)</translation>
 <translation id="3606220979431771195">Tyrkisk F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551">Annuller <ph name="ACTIVITY_DESCRIPTION" />.</translation>
 <translation id="3690128548376345212">Netværk <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, ikke aktiveret, <ph name="CONNECTION_STATUS" />, signalstyrke på <ph name="SIGNAL_STRENGTH" /> %, oplysninger</translation>
 <translation id="3691184985318546178">Singalesisk</translation>
+<translation id="3703620396751288986">ZIP-fil</translation>
 <translation id="3726463242007121105">Denne enhed kan ikke åbnes, fordi dens filsystem ikke understøttes.</translation>
 <translation id="3727148787322499904">Hvis denne indstilling ændres, påvirker det alle delte netværk</translation>
 <translation id="3737576078404241332">Fjern fra sidebjælke</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Tjekkisk med Qwerty-tastatur</translation>
 <translation id="4656777537938206294">Gør filer tilgængelige offline</translation>
 <translation id="4658782175094886150">Person i sne</translation>
+<translation id="4661996069183330363">TAR-arkiv</translation>
 <translation id="4669606053856530811">Medlemmer af "<ph name="SOURCE_NAME" />" mister adgang, medmindre disse elementer deles med dem.</translation>
 <translation id="467809019005607715">Google Slides</translation>
 <translation id="4690246192099372265">Svensk</translation>
@@ -930,6 +936,7 @@
 <translation id="8903931173357132290">Dimittend</translation>
 <translation id="8912078710089354287">Hund, der logrer med halen</translation>
 <translation id="8919081441417203123">Dansk</translation>
+<translation id="8965273390142984105">LZOP-komprimeret arkiv</translation>
 <translation id="8965697826696209160">Der er ikke nok plads.</translation>
 <translation id="8997962250644902079">Kinesisk (traditionelt) pinyin</translation>
 <translation id="9003940392834790328">Netværk <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, signalstyrke <ph name="SIGNAL_STRENGTH" /> %, administreret af din administrator, oplysninger</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
index 88b5f29..ead6d2b 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">ژانر</translation>
 <translation id="1254593899333212300">اتصال اینترنتی مستقیم</translation>
 <translation id="1272293450992660632">مقادیر پین مطابقت ندارند.</translation>
+<translation id="127650757582748357">‏فایل بایگانی فشرده BZIP2</translation>
 <translation id="1280820357415527819">درحال جستجوی شبکه‌های دستگاه همراه</translation>
 <translation id="1291603679744561561">سیم‌کارت قفل است</translation>
 <translation id="1293556467332435079">Files</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">پنیر</translation>
 <translation id="2781645665747935084">بلژیکی</translation>
 <translation id="2782104745158847185">‏خطا هنگام نصب برنامه Linux</translation>
+<translation id="2788520643285360081">‏فایل بایگانی ‎7-Zip</translation>
 <translation id="2803375539583399270">پین را وارد کنید</translation>
 <translation id="2820957248982571256">درحال اسکن کردن…</translation>
+<translation id="2822595620066756134">‏فایل بایگانی فشرده GZIP</translation>
 <translation id="2830077785865012357">چینی (ژوئین)</translation>
 <translation id="2843806747483486897">تغییر پیش‌فرض...</translation>
 <translation id="2850124913210091882">پشتیبان‌گیری</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">لیتوانیایی</translation>
 <translation id="3587482841069643663">همه</translation>
 <translation id="3592251141500063301">نمی‌توان <ph name="FILE_NAME" /> را به‌صورت آفلاین دردسترس قرار داد</translation>
+<translation id="3593874215226880809">‏فایل بایگانی فشرده LZIP</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">فرانسوی کانادا</translation>
 <translation id="3606220979431771195">‏ترکی F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551">لغو <ph name="ACTIVITY_DESCRIPTION" />.</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="3691184985318546178">سینهالی</translation>
+<translation id="3703620396751288986">‏فایل بایگانی ZIP</translation>
 <translation id="3726463242007121105">این دستگاه باز نمی‌شود زیرا سیستم فایل آن پشتیبانی نمی‌شود.</translation>
 <translation id="3727148787322499904">تغییر این تنظیم همه شبکه‌های به اشتراک‌گذاشته‌شده را تحت تأثیر قرار می‌دهد</translation>
 <translation id="3737576078404241332">حذف از نوار کناری</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">‏چکی با صفحه‌کلید Qwerty</translation>
 <translation id="4656777537938206294">تنظیم فایل برای دسترسی آفلاین</translation>
 <translation id="4658782175094886150">شخصی در برف</translation>
+<translation id="4661996069183330363">‏فایل بایگانی TAR</translation>
 <translation id="4669606053856530811">اگر این موارد با اعضای «<ph name="SOURCE_NAME" />» هم‌رسانی نشوند، دسترسی را از دست خواهند داد.</translation>
 <translation id="467809019005607715">‏اسلایدنگار Google</translation>
 <translation id="4690246192099372265">سوئدی</translation>
@@ -930,6 +936,7 @@
 <translation id="8903931173357132290">فارغ‌التحصیل</translation>
 <translation id="8912078710089354287">سگ درحال تکان دادن دم</translation>
 <translation id="8919081441417203123">دانمارکی</translation>
+<translation id="8965273390142984105">‏فایل بایگانی فشرده LZOP</translation>
 <translation id="8965697826696209160">فضای کافی وجود ندارد.</translation>
 <translation id="8997962250644902079">چینی پین‌یین (سنتی)</translation>
 <translation id="9003940392834790328">شبکه <ph name="NETWORK_INDEX" /> از <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، <ph name="CONNECTION_STATUS" />، قدرت سیگنال <ph name="SIGNAL_STRENGTH" />٪، تحت‌مدیریت سرپرست، جزئیات</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
index 220a27d..d8a5017 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">શૈલી</translation>
 <translation id="1254593899333212300">ડાયરેક્ટ ઇન્ટરનેટ કનેક્શન</translation>
 <translation id="1272293450992660632">પિન મૂલ્યો મેળ ખાતા નથી.</translation>
+<translation id="127650757582748357">BZIP2 દ્વારા નાનું કરવામાં આવેલું આર્કાઇવ</translation>
 <translation id="1280820357415527819">મોબાઇલ નેટવર્ક માટે શોધી રહ્યાં છીએ</translation>
 <translation id="1291603679744561561">સિમ કાર્ડ લૉક કરેલું છે</translation>
 <translation id="1293556467332435079">Files</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">ચીઝ</translation>
 <translation id="2781645665747935084">બેલ્જિયન</translation>
 <translation id="2782104745158847185">Linux ઍપ્લિકેશન ઇન્સ્ટૉલ કરવામાં ભૂલ</translation>
+<translation id="2788520643285360081">7-Zip આર્કાઇવ</translation>
 <translation id="2803375539583399270">PIN દાખલ કરો</translation>
 <translation id="2820957248982571256">સ્કૅન કરી રહ્યાં છીએ…</translation>
+<translation id="2822595620066756134">GZIP દ્વારા નાનું કરવામાં આવેલું આર્કાઇવ</translation>
 <translation id="2830077785865012357">ચાઇનીઝ ઝુયિન</translation>
 <translation id="2843806747483486897">ડિફૉલ્ટ બદલો...</translation>
 <translation id="2850124913210091882">બૅકઅપ લો</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">લિથુનિયન</translation>
 <translation id="3587482841069643663">બધા</translation>
 <translation id="3592251141500063301"><ph name="FILE_NAME" />ને ઑફલાઇન ઉપલબ્ધ કરાવી શકાતી નથી</translation>
+<translation id="3593874215226880809">LZIP દ્વારા નાનું કરવામાં આવેલું આર્કાઇવ</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">કેનેડિયન ફ્રેંચ</translation>
 <translation id="3606220979431771195">ટર્કિશ-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" />ને રદ કરો.</translation>
 <translation id="3690128548376345212"><ph name="NETWORK_COUNT" />માંથી <ph name="NETWORK_INDEX" /> નેટવર્ક, <ph name="NETWORK_NAME" />, સક્રિય કર્યા વિનાનું, <ph name="CONNECTION_STATUS" />, સિગ્નલની પ્રબળતા <ph name="SIGNAL_STRENGTH" />%, વિગતો</translation>
 <translation id="3691184985318546178">સિંહાલા</translation>
+<translation id="3703620396751288986">ઝિપ આર્કાઇવ</translation>
 <translation id="3726463242007121105">આ ઉપકરણ ખોલી શકાતું નથી કારણ કે તેની ફાઇલસિસ્ટમને સપોર્ટ નથી.</translation>
 <translation id="3727148787322499904">આ સેટિંગને બદલવું તમામ શેર કરેલ નેટવર્કને પ્રભાવિત કરશે</translation>
 <translation id="3737576078404241332">સાઇડબારમાંથી કાઢી નાખો</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">ચેક, Qwerty કીબોર્ડ સાથે</translation>
 <translation id="4656777537938206294">ફાઇલોને ઑફલાઇન ઉપલબ્ધ કરાવો</translation>
 <translation id="4658782175094886150">હિમવર્ષામાં ઉભેલી વ્યક્તિ</translation>
+<translation id="4661996069183330363">TAR આર્કાઇવ</translation>
 <translation id="4669606053856530811">'<ph name="SOURCE_NAME" />'ના સભ્યો ઍક્સેસ ગુમાવશે સિવાય કે આ આઇટમને તેમની સાથે શેર કરવામાં ન આવી હોય.</translation>
 <translation id="467809019005607715">Google Slides</translation>
 <translation id="4690246192099372265">સ્વીડિશ</translation>
@@ -928,6 +934,7 @@
 <translation id="8903931173357132290">સ્નાતક</translation>
 <translation id="8912078710089354287">પૂંછડી હલાવી રહેલો કૂતરો</translation>
 <translation id="8919081441417203123">ડેનિશ</translation>
+<translation id="8965273390142984105">LZOP દ્વારા નાનું કરવામાં આવેલું આર્કાઇવ</translation>
 <translation id="8965697826696209160">પર્યાપ્ત સ્થાન નથી.</translation>
 <translation id="8997962250644902079">ચાઇનીઝ (પરંપરાગત) પિનયિન</translation>
 <translation id="9003940392834790328"><ph name="NETWORK_COUNT" />માંથી નેટવર્ક <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, સિગ્નલની સશક્તતા <ph name="SIGNAL_STRENGTH" />%, તમારા વ્યવસ્થાપક દ્વારા મેનેજ કરવામાં આવે છે, વિગતો</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
index 53e914b..51eef08 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">Műfaj</translation>
 <translation id="1254593899333212300">Közvetlen internetkapcsolat</translation>
 <translation id="1272293450992660632">A PIN-kódok nem egyeznek.</translation>
+<translation id="127650757582748357">Tömörített BZIP2-archívum</translation>
 <translation id="1280820357415527819">Mobilhálózatok keresése…</translation>
 <translation id="1291603679744561561">SIM-kártya zárolva</translation>
 <translation id="1293556467332435079">Fájlok</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">Sajt</translation>
 <translation id="2781645665747935084">belga</translation>
 <translation id="2782104745158847185">Hiba történt a Linux-alkalmazás telepítése során</translation>
+<translation id="2788520643285360081">7-ZIP-archívum</translation>
 <translation id="2803375539583399270">PIN-kód megadása</translation>
 <translation id="2820957248982571256">Keresés…</translation>
+<translation id="2822595620066756134">Tömörített GZIP-archívum</translation>
 <translation id="2830077785865012357">kínai zujin</translation>
 <translation id="2843806747483486897">Alapértelmezés módosítása...</translation>
 <translation id="2850124913210091882">Biztonsági mentés</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">litván</translation>
 <translation id="3587482841069643663">Mind</translation>
 <translation id="3592251141500063301">Nem sikerült a(z) <ph name="FILE_NAME" /> fájlt offline állapotban elérhetővé tenni</translation>
+<translation id="3593874215226880809">Tömörített LZIP-archívum</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">kanadai francia</translation>
 <translation id="3606220979431771195">Török F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> megszakítása.</translation>
 <translation id="3690128548376345212"><ph name="NETWORK_COUNT" />/<ph name="NETWORK_INDEX" /> hálózat, <ph name="NETWORK_NAME" />, Inaktiválva, <ph name="CONNECTION_STATUS" />, Jelerősség <ph name="SIGNAL_STRENGTH" />%, Részletek</translation>
 <translation id="3691184985318546178">szingaléz</translation>
+<translation id="3703620396751288986">ZIP-archívum</translation>
 <translation id="3726463242007121105">Ezt az eszközt nem lehet megnyitni, mert a fájlrendszere nem támogatott.</translation>
 <translation id="3727148787322499904">A beállítás módosítása az összes megosztott hálózatot érinti</translation>
 <translation id="3737576078404241332">Eltávolítás az oldalsávról</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">cseh, Qwerty-billentyűzettel</translation>
 <translation id="4656777537938206294">Hozzáférés a fájlokhoz offline</translation>
 <translation id="4658782175094886150">Ember a hóban</translation>
+<translation id="4661996069183330363">TAR-archívum</translation>
 <translation id="4669606053856530811">A(z) „<ph name="SOURCE_NAME" />” tagjai elveszítik hozzáférésüket, kivéve, ha meg vannak osztva velük ezek az elemek.</translation>
 <translation id="467809019005607715">Google Diák</translation>
 <translation id="4690246192099372265">svéd</translation>
@@ -930,6 +936,7 @@
 <translation id="8903931173357132290">Diplomás</translation>
 <translation id="8912078710089354287">Kutya csóválja a farkát</translation>
 <translation id="8919081441417203123">dán</translation>
+<translation id="8965273390142984105">Tömörített LZOP-archívum</translation>
 <translation id="8965697826696209160">Nincs elég tárhely.</translation>
 <translation id="8997962250644902079">kínai (hagyományos) pinjin</translation>
 <translation id="9003940392834790328"><ph name="NETWORK_INDEX" />. hálózat (összesen <ph name="NETWORK_COUNT" />), <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, jelerősség: <ph name="SIGNAL_STRENGTH" />%, a rendszergazdája kezeli, részletek</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_id.xtb b/ui/chromeos/translations/ui_chromeos_strings_id.xtb
index 2db99e82..22a6563 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_id.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_id.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">Genre</translation>
 <translation id="1254593899333212300">Koneksi internet langsung</translation>
 <translation id="1272293450992660632">Nilai PIN tidak cocok.</translation>
+<translation id="127650757582748357">Arsip terkompresi BZIP2</translation>
 <translation id="1280820357415527819">Menelusuri jaringan seluler</translation>
 <translation id="1291603679744561561">SIM Dikunci</translation>
 <translation id="1293556467332435079">File</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">Keju</translation>
 <translation id="2781645665747935084">Belgia</translation>
 <translation id="2782104745158847185">Error saat menginstal aplikasi Linux</translation>
+<translation id="2788520643285360081">Arsip 7-Zip</translation>
 <translation id="2803375539583399270">Masukkan PIN</translation>
 <translation id="2820957248982571256">Memindai...</translation>
+<translation id="2822595620066756134">Arsip terkompresi GZIP</translation>
 <translation id="2830077785865012357">Zhuyin China</translation>
 <translation id="2843806747483486897">Ubah default...</translation>
 <translation id="2850124913210091882">Cadangkan</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">Lituania</translation>
 <translation id="3587482841069643663">Semua</translation>
 <translation id="3592251141500063301">Tidak dapat membuat <ph name="FILE_NAME" /> tersedia offline</translation>
+<translation id="3593874215226880809">Arsip terkompresi LZIP</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">Prancis Kanada</translation>
 <translation id="3606220979431771195">Turki-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551">Batalkan <ph name="ACTIVITY_DESCRIPTION" />.</translation>
 <translation id="3690128548376345212">Jaringan <ph name="NETWORK_INDEX" /> dari <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Tidak Diaktifkan, <ph name="CONNECTION_STATUS" />, Kekuatan Sinyal <ph name="SIGNAL_STRENGTH" />%, Detail</translation>
 <translation id="3691184985318546178">Sinhala</translation>
+<translation id="3703620396751288986">File ZIP</translation>
 <translation id="3726463242007121105">Perangkat ini tidak dapat dibuka karena sistem berkasnya tidak didukung.</translation>
 <translation id="3727148787322499904">Perubahan pada setelan ini akan berpengaruh pada semua jaringan bersama</translation>
 <translation id="3737576078404241332">Hapus dari sidebar</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Ceko dengan keyboard Qwerty</translation>
 <translation id="4656777537938206294">Buat file tersedia offline</translation>
 <translation id="4658782175094886150">Orang di salju</translation>
+<translation id="4661996069183330363">Arsip TAR</translation>
 <translation id="4669606053856530811">Anggota '<ph name="SOURCE_NAME" />' akan kehilangan akses kecuali jika item berikut dibagikan dengan mereka.</translation>
 <translation id="467809019005607715">Google Slide</translation>
 <translation id="4690246192099372265">Swensk</translation>
@@ -930,6 +936,7 @@
 <translation id="8903931173357132290">Wisudawan</translation>
 <translation id="8912078710089354287">Anjing mengibaskan ekor</translation>
 <translation id="8919081441417203123">Denmark</translation>
+<translation id="8965273390142984105">Arsip terkompresi LZOP</translation>
 <translation id="8965697826696209160">Ruang tidak cukup.</translation>
 <translation id="8997962250644902079">Pinyin (Aksara Tradisional) China</translation>
 <translation id="9003940392834790328">Jaringan <ph name="NETWORK_INDEX" /> dari <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Kekuatan Sinyal <ph name="SIGNAL_STRENGTH" />%, Dikelola oleh Administrator Anda, Detail</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_is.xtb b/ui/chromeos/translations/ui_chromeos_strings_is.xtb
index b876f0af..34ca6f2d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_is.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_is.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">Stefna</translation>
 <translation id="1254593899333212300">Beintenging við internetið</translation>
 <translation id="1272293450992660632">PIN-númer stemma ekki.</translation>
+<translation id="127650757582748357">BZIP2-þjöppuð geymsla</translation>
 <translation id="1280820357415527819">Leitar að farsímakerfum</translation>
 <translation id="1291603679744561561">SIM-kort er læst</translation>
 <translation id="1293556467332435079">Skrár</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">Ostur</translation>
 <translation id="2781645665747935084">Belgískt</translation>
 <translation id="2782104745158847185">Villa við uppsetningu Linux-forrits</translation>
+<translation id="2788520643285360081">7-ZIP-geymsla</translation>
 <translation id="2803375539583399270">Sláðu inn PIN-númer</translation>
 <translation id="2820957248982571256">Leitar...</translation>
+<translation id="2822595620066756134">GZIP-þjöppuð geymsla</translation>
 <translation id="2830077785865012357">Kínverska Zhuyin</translation>
 <translation id="2843806747483486897">Breyta sjálfgefinni aðgerð...</translation>
 <translation id="2850124913210091882">Taka afrit</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">Litháískt</translation>
 <translation id="3587482841069643663">Allar</translation>
 <translation id="3592251141500063301">Ekki var hægt að gera <ph name="FILE_NAME" /> tiltækt án nettengingar</translation>
+<translation id="3593874215226880809">LZIP-þjöppuð geymsla</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">Kanadískt franskt</translation>
 <translation id="3606220979431771195">Tyrkneskt F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551">Hætta við að <ph name="ACTIVITY_DESCRIPTION" />.</translation>
 <translation id="3690128548376345212">Netkerfi <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, óvirkt, <ph name="CONNECTION_STATUS" />, sendistyrkur <ph name="SIGNAL_STRENGTH" />%, upplýsingar</translation>
 <translation id="3691184985318546178">Sinhala</translation>
+<translation id="3703620396751288986">ZIP-geymsla</translation>
 <translation id="3726463242007121105">Ekki er hægt að opna þetta tæki vegna þess að ekki er stuðningur við skráakerfi þess.</translation>
 <translation id="3727148787322499904">Ef þessari stillingu er breytt hefur það áhrif á öll samnýtt netkerfi</translation>
 <translation id="3737576078404241332">Fjarlægja af hliðarstiku</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Tékkneska með Qwerty-lyklaborði</translation>
 <translation id="4656777537938206294">Gera skrár aðgengilegar án nettengingar</translation>
 <translation id="4658782175094886150">Einstaklingur í snjó</translation>
+<translation id="4661996069183330363">TAR-geymsla</translation>
 <translation id="4669606053856530811">Meðlimir „<ph name="SOURCE_NAME" />“ munu missa aðgang nema þessum atriðum sé deilt með þeim.</translation>
 <translation id="467809019005607715">Google skyggnur</translation>
 <translation id="4690246192099372265">Sænskt</translation>
@@ -929,6 +935,7 @@
 <translation id="8903931173357132290">Útskrifaður nemandi</translation>
 <translation id="8912078710089354287">Hundur sem dillar skottinu</translation>
 <translation id="8919081441417203123">Danskt</translation>
+<translation id="8965273390142984105">LZOP-þjöppuð geymsla</translation>
 <translation id="8965697826696209160">Ekki er nægilegt pláss.</translation>
 <translation id="8997962250644902079">Kínverska (hefðbundin) Pinyin</translation>
 <translation id="9003940392834790328">Netkerfi <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, <ph name="SIGNAL_STRENGTH" />% sendistyrkur, stjórnað af kerfisstjóra, upplýsingar</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
index ed6d704..0148539 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">ジャンル</translation>
 <translation id="1254593899333212300">インターネットへの直接接続</translation>
 <translation id="1272293450992660632">PIN の値が一致しません。</translation>
+<translation id="127650757582748357">Bzip2 で圧縮されたアーカイブ</translation>
 <translation id="1280820357415527819">モバイル ネットワークを検索しています</translation>
 <translation id="1291603679744561561">SIM がロックされています</translation>
 <translation id="1293556467332435079">ファイル</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">チーズ</translation>
 <translation id="2781645665747935084">ベルギー語</translation>
 <translation id="2782104745158847185">Linux アプリケーションのインストール中にエラーが発生しました</translation>
+<translation id="2788520643285360081">7-Zip アーカイブ</translation>
 <translation id="2803375539583399270">PIN を入力</translation>
 <translation id="2820957248982571256">スキャンしています…</translation>
+<translation id="2822595620066756134">Gzip で圧縮されたアーカイブ</translation>
 <translation id="2830077785865012357">中国語(注音)</translation>
 <translation id="2843806747483486897">デフォルトを変更...</translation>
 <translation id="2850124913210091882">バックアップ</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">リトアニア語</translation>
 <translation id="3587482841069643663">すべて</translation>
 <translation id="3592251141500063301"><ph name="FILE_NAME" /> をオフラインで使用するよう設定できませんでした</translation>
+<translation id="3593874215226880809">LZIP で圧縮されたアーカイブ</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">フランス語(カナダ)</translation>
 <translation id="3606220979431771195">トルコ語-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> をキャンセルします。</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="3691184985318546178">シンハラ語</translation>
+<translation id="3703620396751288986">ZIP アーカイブ</translation>
 <translation id="3726463242007121105">ファイルシステムがサポートされていないため、このデバイスを開くことはできません。</translation>
 <translation id="3727148787322499904">この設定を変更すると、共有しているすべてのネットワークに影響します</translation>
 <translation id="3737576078404241332">サイドバーから削除</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">チェコ語(QWERTY)キーボード</translation>
 <translation id="4656777537938206294">ファイルへのオフライン アクセスの有効化</translation>
 <translation id="4658782175094886150">雪の中の人</translation>
+<translation id="4661996069183330363">tar アーカイブ</translation>
 <translation id="4669606053856530811">「<ph name="SOURCE_NAME" />」のメンバーはこれらのアイテムにアクセスできなくなります(ただし個別に共有されている場合はアクセス可能です)。</translation>
 <translation id="467809019005607715">Google スライド</translation>
 <translation id="4690246192099372265">スウェーデン語</translation>
@@ -930,6 +936,7 @@
 <translation id="8903931173357132290">卒業</translation>
 <translation id="8912078710089354287">尻尾を振る犬</translation>
 <translation id="8919081441417203123">デンマーク語</translation>
+<translation id="8965273390142984105">LZOP で圧縮されたアーカイブ</translation>
 <translation id="8965697826696209160">空き容量が不足しています。</translation>
 <translation id="8997962250644902079">中国語(繁体)(ピンイン)</translation>
 <translation id="9003940392834790328"><ph name="NETWORK_INDEX" /> 番目のネットワーク(全 <ph name="NETWORK_COUNT" /> 件)、<ph name="NETWORK_NAME" />、<ph name="CONNECTION_STATUS" />、信号強度 <ph name="SIGNAL_STRENGTH" />%、管理者によって管理、詳細</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
index 4f80892..283eb028 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
@@ -31,6 +31,7 @@
 <translation id="1249250836236328755">ಪ್ರಕಾರ</translation>
 <translation id="1254593899333212300">ನೇರ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ</translation>
 <translation id="1272293450992660632">ಪಿನ್ ಮೌಲ್ಯಗಳು ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತಿಲ್ಲ.</translation>
+<translation id="127650757582748357">BZIP2 ಕುಗ್ಗಿಸಲಾದ ಆರ್ಕೈವ್</translation>
 <translation id="1280820357415527819">ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳಿಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ</translation>
 <translation id="1291603679744561561">ಸಿಮ್ ಲಾಕ್ ಆಗಿದೆ</translation>
 <translation id="1293556467332435079">Files</translation>
@@ -203,8 +204,10 @@
 <translation id="2771816809568414714">ಚೀಸ್</translation>
 <translation id="2781645665747935084">ಬೆಲ್ಜಿಯನ್</translation>
 <translation id="2782104745158847185">Linux ಅಪ್ಲಿಕೇಶನ್‌ ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡುವಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ</translation>
+<translation id="2788520643285360081">7-Zip ಆರ್ಕೈವ್</translation>
 <translation id="2803375539583399270">ಪಿನ್ ನಮೂದಿಸಿ</translation>
 <translation id="2820957248982571256">ಸ್ಕ್ಯಾನ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ…</translation>
+<translation id="2822595620066756134">GZIP ಕುಗ್ಗಿಸಲಾದ ಆರ್ಕೈವ್</translation>
 <translation id="2830077785865012357">ಚೈನೀಸ್ ಜುಯೆನ್</translation>
 <translation id="2843806747483486897">ಡಿಫಾಲ್ಟ್‌ ಅನ್ನು ಬದಲಾಯಿಸಿ...</translation>
 <translation id="2850124913210091882">ಬ್ಯಾಕಪ್‌ ಮಾಡು</translation>
@@ -296,6 +299,7 @@
 <translation id="357479282490346887">ಲಿಥುವಾನಿಯನ್</translation>
 <translation id="3587482841069643663">ಎಲ್ಲ</translation>
 <translation id="3592251141500063301"><ph name="FILE_NAME" /> ಅನ್ನು ಆಫ್‌ಲೈನ್‌ನಲ್ಲಿ ಲಭ್ಯವಾಗುವಂತೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</translation>
+<translation id="3593874215226880809">LZIP ಕುಗ್ಗಿಸಲಾದ ಆರ್ಕೈವ್</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">ಕೆನೆಡಿಯನ್ ಫ್ರೆಂಚ್</translation>
 <translation id="3606220979431771195">ಟರ್ಕಿಶ್‌-F</translation>
@@ -308,6 +312,7 @@
 <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> ಅನ್ನು ರದ್ದುಮಾಡಿ.</translation>
 <translation id="3690128548376345212">ನೆಟ್‌ವರ್ಕ್ <ph name="NETWORK_COUNT" /> ರಲ್ಲಿ <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ, <ph name="CONNECTION_STATUS" />, ಸಿಗ್ನಲ್ ಸಾಮರ್ಥ್ಯ <ph name="SIGNAL_STRENGTH" />%, ವಿವರಗಳು</translation>
 <translation id="3691184985318546178">ಸಿಂಹಳ</translation>
+<translation id="3703620396751288986">ZIP ಆರ್ಕೈವ್</translation>
 <translation id="3726463242007121105">ಇದರ ಫೈಲ್‌ಸಿಸ್ಟಂ ಅನ್ನು ಬೆಂಬಲಿಸದ ಕಾರಣ ಈ ಸಾಧನವನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.</translation>
 <translation id="3727148787322499904">ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸುವುದರಿಂದ ಎಲ್ಲಾ ಹಂಚಿತ ನೆಟ್‌ವರ್ಕ್‌ಗಳಿಗೆ ಪರಿಣಾಮ ಬೀರುತ್ತದೆ</translation>
 <translation id="3737576078404241332">ಸೈಡ್‌ಬಾರ್‌ನಿಂದ ತೆಗೆದುಹಾಕಿ</translation>
@@ -409,6 +414,7 @@
 <translation id="4646813851450205600">Qwerty ಕೀಬೋರ್ಡ್‌ನಲ್ಲಿ ಝೆಕ್</translation>
 <translation id="4656777537938206294">ಫೈಲ್‌ಗಳನ್ನು ಆಫ್‌ಲೈನ್‌ನಲ್ಲಿ ಲಭ್ಯವಾಗುವಂತೆ ಮಾಡಿ</translation>
 <translation id="4658782175094886150">ಹಿಮದಲ್ಲಿರುವ ವ್ಯಕ್ತಿ</translation>
+<translation id="4661996069183330363">TAR ಆರ್ಕೈವ್</translation>
 <translation id="4669606053856530811"><ph name="SOURCE_NAME" /> ನ ಸದಸ್ಯರೊಂದಿಗೆ ಈ ಐಟಂಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳದ ಹೊರತು ಅವರು ಪ್ರವೇಶವನ್ನು ಕಳೆದುಕೊಳ್ಳುತ್ತಾರೆ.</translation>
 <translation id="467809019005607715">Google Slides</translation>
 <translation id="4690246192099372265">ಸ್ವೀಡಿಶ್</translation>
@@ -918,6 +924,7 @@
 <translation id="8903931173357132290">ಪದವೀಧರ</translation>
 <translation id="8912078710089354287">ಬಾಲ ಅಲ್ಲಾಡಿಸುತ್ತಿರುವ ನಾಯಿ</translation>
 <translation id="8919081441417203123">ಡ್ಯಾನಿಶ್</translation>
+<translation id="8965273390142984105">LZOP ಕುಗ್ಗಿಸಲಾದ ಆರ್ಕೈವ್</translation>
 <translation id="8965697826696209160">ಸಾಕಷ್ಟು ಸ್ಥಳಾವಕಾಶವಿಲ್ಲ.</translation>
 <translation id="8997962250644902079">ಚೈನೀಸ್ (ಸಾಂಪ್ರದಾಯಿಕ) ಪಿನ್‌ಯಿನ್</translation>
 <translation id="9003940392834790328"><ph name="NETWORK_COUNT" /> ರಲ್ಲಿ <ph name="NETWORK_INDEX" /> ನೆಟ್‌ವರ್ಕ್, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ಸಿಗ್ನಲ್ ಸಾಮರ್ಥ್ಯ <ph name="SIGNAL_STRENGTH" />%, ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿರ್ವಹಿಸಿದ್ದಾರೆ, ವಿವರಗಳು</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
index 467d7168..e7d517b 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">장르</translation>
 <translation id="1254593899333212300">인터넷에 바로 연결</translation>
 <translation id="1272293450992660632">PIN 값이 일치하지 않습니다.</translation>
+<translation id="127650757582748357">BZIP2 압축 파일</translation>
 <translation id="1280820357415527819">모바일 네트워크 검색 중</translation>
 <translation id="1291603679744561561">SIM 잠김</translation>
 <translation id="1293556467332435079">파일</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">치즈</translation>
 <translation id="2781645665747935084">벨기에어</translation>
 <translation id="2782104745158847185">Linux 애플리케이션 설치 중 오류 발생</translation>
+<translation id="2788520643285360081">7-ZIP 파일</translation>
 <translation id="2803375539583399270">PIN 입력</translation>
 <translation id="2820957248982571256">검색 중...</translation>
+<translation id="2822595620066756134">GZIP 압축 파일</translation>
 <translation id="2830077785865012357">중국어(주음부호)</translation>
 <translation id="2843806747483486897">기본값 변경...</translation>
 <translation id="2850124913210091882">백업</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">리투아니아어</translation>
 <translation id="3587482841069643663">전체</translation>
 <translation id="3592251141500063301"><ph name="FILE_NAME" /> 파일을 오프라인에서 사용하도록 설정할 수 없습니다.</translation>
+<translation id="3593874215226880809">LZIP 압축 파일</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" />, <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">프랑스어(캐나다)</translation>
 <translation id="3606220979431771195">터키어-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> 작업을 취소합니다.</translation>
 <translation id="3690128548376345212"><ph name="NETWORK_COUNT" />개 중 <ph name="NETWORK_INDEX" />번째 네트워크, <ph name="NETWORK_NAME" />, 비활성화됨, <ph name="CONNECTION_STATUS" />, 신호 강도 <ph name="SIGNAL_STRENGTH" />%, 세부정보</translation>
 <translation id="3691184985318546178">싱할라어</translation>
+<translation id="3703620396751288986">ZIP 파일</translation>
 <translation id="3726463242007121105">파일 시스템이 지원되지 않아 이 기기를 열 수 없습니다.</translation>
 <translation id="3727148787322499904">이 설정을 변경하면 모든 공유 네트워크에 영향을 줍니다.</translation>
 <translation id="3737576078404241332">사이드바에서 삭제</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">체코어(쿼티 키보드)</translation>
 <translation id="4656777537938206294">파일을 오프라인에서 사용할 수 있도록 설정</translation>
 <translation id="4658782175094886150">눈 맞는 사람</translation>
+<translation id="4661996069183330363">TAR 압축 파일</translation>
 <translation id="4669606053856530811">이 항목을 '<ph name="SOURCE_NAME" />'의 멤버와 공유하지 않으면 이 팀의 멤버가 항목에 더 이상 액세스할 수 없게 됩니다.</translation>
 <translation id="467809019005607715">Google Slides</translation>
 <translation id="4690246192099372265">스웨덴어</translation>
@@ -930,6 +936,7 @@
 <translation id="8903931173357132290">졸업생</translation>
 <translation id="8912078710089354287">꼬리를 흔드는 개</translation>
 <translation id="8919081441417203123">덴마크어</translation>
+<translation id="8965273390142984105">LZOP 압축 파일</translation>
 <translation id="8965697826696209160">저장 공간이 부족합니다.</translation>
 <translation id="8997962250644902079">중국어(번체, 병음)</translation>
 <translation id="9003940392834790328">네트워크 <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, 신호 강도 <ph name="SIGNAL_STRENGTH" />%, 관리자가 관리함, 세부정보</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ky.xtb b/ui/chromeos/translations/ui_chromeos_strings_ky.xtb
index cbc880b..f04a49a7 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ky.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ky.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">Жанр</translation>
 <translation id="1254593899333212300">Интернетке түз туташуу</translation>
 <translation id="1272293450992660632">PIN коддор дал келген жок.</translation>
+<translation id="127650757582748357">BZIP2 менен кысылган архив</translation>
 <translation id="1280820357415527819">Мобилдик тармактар изделүүдө</translation>
 <translation id="1291603679744561561">SIM карта кулпуланды</translation>
 <translation id="1293556467332435079">Файлдар</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">Сыр</translation>
 <translation id="2781645665747935084">Белгийче</translation>
 <translation id="2782104745158847185">Linux колдонмосун орнотууда ката кетти</translation>
+<translation id="2788520643285360081">7-Zip архиви</translation>
 <translation id="2803375539583399270">PIN кодду киргизиңиз</translation>
 <translation id="2820957248982571256">Скандалууда…</translation>
+<translation id="2822595620066756134">GZIP менен кысылган архив</translation>
 <translation id="2830077785865012357">Кытайча (чжуинь)</translation>
 <translation id="2843806747483486897">Демейкини өзгөртүү…</translation>
 <translation id="2850124913210091882">Камдык көчүрмө сактоо</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">Литвача</translation>
 <translation id="3587482841069643663">Баары</translation>
 <translation id="3592251141500063301"><ph name="FILE_NAME" /> оффлайн режиминде жеткиликсиз</translation>
+<translation id="3593874215226880809">LZIP менен кысылган архив</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">Французча (Канада)</translation>
 <translation id="3606220979431771195">Түркчө-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> аракети жокко чыгарылат.</translation>
 <translation id="3690128548376345212">Тармак (<ph name="NETWORK_COUNT" /> ичинен <ph name="NETWORK_INDEX" />), <ph name="NETWORK_NAME" />, жандырылган эмес, <ph name="CONNECTION_STATUS" />, сигналдын күчү <ph name="SIGNAL_STRENGTH" />%, чоо-жайы</translation>
 <translation id="3691184985318546178">Сингалча</translation>
+<translation id="3703620396751288986">ZIP архиви</translation>
 <translation id="3726463242007121105">Бул түзмөктүн файл тутуму колдоого алынбагандыктан, ал ачылбайт.</translation>
 <translation id="3727148787322499904">Бул жөндөө өзгөтүлсө, бөлүшүлгөн тармактардын баарына таасирин тийгизет</translation>
 <translation id="3737576078404241332">Капталдагы тактадан өчүрүү</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Чехче жана Qwerty баскычтобу</translation>
 <translation id="4656777537938206294">Файлдарды оффлайнда колдонуңуз</translation>
 <translation id="4658782175094886150">Кардагы адам</translation>
+<translation id="4661996069183330363">TAR архиви</translation>
 <translation id="4669606053856530811">Файлдар бөлүшүлмөйүнчө "<ph name="SOURCE_NAME" />" жалпы дискинин колдонуучулары аларды колдоно албай калышат.</translation>
 <translation id="467809019005607715">Google Slides</translation>
 <translation id="4690246192099372265">Шведче</translation>
@@ -929,6 +935,7 @@
 <translation id="8903931173357132290">Бүтүрүүчү</translation>
 <translation id="8912078710089354287">Куйругун шыйпаңдаткан ит</translation>
 <translation id="8919081441417203123">Датча</translation>
+<translation id="8965273390142984105">LZOP менен кысылган архив</translation>
 <translation id="8965697826696209160">Бош орун жетишсиз.</translation>
 <translation id="8997962250644902079">Кытайча пиньинь (салттуу)</translation>
 <translation id="9003940392834790328"><ph name="NETWORK_COUNT" /> ичинен <ph name="NETWORK_INDEX" />-тармак, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Сигналдын күчү <ph name="SIGNAL_STRENGTH" />%, Администраторуңуз башкарат, Чоо-жайы</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lo.xtb b/ui/chromeos/translations/ui_chromeos_strings_lo.xtb
index 1ccde058..76164ef 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_lo.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_lo.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">ປະເພດ</translation>
 <translation id="1254593899333212300">ການເຊື່ອມຕໍ່ອິນເຕີເນັດໂດຍກົງ</translation>
 <translation id="1272293450992660632">ຄ່າ PIN ບໍ່ກົງກັນ.</translation>
+<translation id="127650757582748357">ແຟ້ມຈັດເກັບ BZIP2 ທີ່ບີບອັດໄວ້</translation>
 <translation id="1280820357415527819">ກຳລັງຊອກຫາເຄືອຂ່າຍມືຖື</translation>
 <translation id="1291603679744561561">ຊິມຖືກລັອກ</translation>
 <translation id="1293556467332435079">ໄຟລ໌</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">ເນີຍແຂງ</translation>
 <translation id="2781645665747935084">ພາສາແບນຊິກ</translation>
 <translation id="2782104745158847185">ເກີດຜິດພາດໃນການຕິດຕັ້ງແອັບພລິເຄຊັນ Linux</translation>
+<translation id="2788520643285360081">ແຟ້ມຈັດເກັບ 7-Zip</translation>
 <translation id="2803375539583399270">ປ້ອນ PIN</translation>
 <translation id="2820957248982571256">ກຳລັງສະແກນ…</translation>
+<translation id="2822595620066756134">ແຟ້ມຈັດເກັບ GZIP ທີ່ບີບອັດໄວ້</translation>
 <translation id="2830077785865012357">ພາສາຈີນຊູອິນ</translation>
 <translation id="2843806747483486897">ປ່ຽນມາດຕະຖານ...</translation>
 <translation id="2850124913210091882">ສຳ​ຮອງ</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">ພາສາລິດທົວນີ</translation>
 <translation id="3587482841069643663">ທັງໝົດ</translation>
 <translation id="3592251141500063301">ບໍ່ສາມາດເຮັດໃຫ້ <ph name="FILE_NAME" /> ມີໃຫ້ນຳໃຊ້ແບບອອບລາຍໄດ້</translation>
+<translation id="3593874215226880809">ແຟ້ມຈັດເກັບ LZIP ທີ່ບີບອັດໄວ້</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">ພາສາຝຣັ່ງການາດາ</translation>
 <translation id="3606220979431771195">ພາ​ສາ​ຕວກ​ກີ-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551">ຍົກເລີກ <ph name="ACTIVITY_DESCRIPTION" />.</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="3691184985318546178">ພາສາຊິນຮາລາ</translation>
+<translation id="3703620396751288986">ແຟ້ມຈັດເກັບ ZIP</translation>
 <translation id="3726463242007121105">ບໍ່ສາມາດເປີດອຸປະກອນນີ້ໄດ້ ເພາະວ່າລະບົບໄຟລ໌ຂອງມັນບໍ່ຮອງຮັບ.</translation>
 <translation id="3727148787322499904">ການປ່ຽນການຕັ້ງຄ່ານີ້ຈະມີຜົນຕໍ່ກັບທຸກເຄືອຂ່າຍທີ່ໃຊ້ຮ່ວມກັນ</translation>
 <translation id="3737576078404241332">ລຶບອອກຈາກແຖບດ້ານຂ້າງ</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">ພາສາເຊັກທີ່ໃຊ້ແປ້ນພິມ Qwerty</translation>
 <translation id="4656777537938206294">ເຮັດໃຫ້ໄຟລ໌ສາມາດໃຊ້ໄດ້ອອບລາຍ</translation>
 <translation id="4658782175094886150">ຄົນໃນຫິມະ</translation>
+<translation id="4661996069183330363">ແຟ້ມຈັດເກັບ TAR</translation>
 <translation id="4669606053856530811">ສະມາຊິກ '<ph name="SOURCE_NAME" />' ຈະສູນເສຍການເຂົ້າເຖິງ ເວັ້ນເສຍແຕ່ວ່າມີການແບ່ງປັນລາຍການເຫຼົ່ານີ້ກັບເຂົາເຈົ້າ.</translation>
 <translation id="467809019005607715">Google Slides</translation>
 <translation id="4690246192099372265">ພາສາຊູແອດ</translation>
@@ -929,6 +935,7 @@
 <translation id="8903931173357132290">ຈົບ​ການ​ສຶກ​ສາ</translation>
 <translation id="8912078710089354287">ໝາກະດິກຫາງ</translation>
 <translation id="8919081441417203123">ພາສາເດັນມາກ</translation>
+<translation id="8965273390142984105">ແຟ້ມຈັດເກັບ LZOP ທີ່ບີບອັດໄວ້</translation>
 <translation id="8965697826696209160">ບໍ່ມີເນື້ອທີ່ພຽງພໍ.</translation>
 <translation id="8997962250644902079">ພາສາຈີນ (ຕົວຫຍໍ້) ພິນອິນ</translation>
 <translation id="9003940392834790328">ເຄືອຂ່າຍທີ <ph name="NETWORK_INDEX" /> ຈາກທັງໝົດ <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ຄວາມແຮງສັນຍານ <ph name="SIGNAL_STRENGTH" />%, ຈັດການໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ, ລາຍລະອຽດ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
index 0ebab10..fd9a6e3 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">Žanras</translation>
 <translation id="1254593899333212300">Tiesioginis interneto ryšys</translation>
 <translation id="1272293450992660632">PIN kodai nesutampa.</translation>
+<translation id="127650757582748357">BZIP2 suglaudintas archyvas</translation>
 <translation id="1280820357415527819">Ieškoma mobiliojo ryšio tinklų</translation>
 <translation id="1291603679744561561">SIM kortelė užrakinta</translation>
 <translation id="1293556467332435079">Failai</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">Sūris</translation>
 <translation id="2781645665747935084">Belgų</translation>
 <translation id="2782104745158847185">Įdiegiant „Linux“ programą įvyko klaida</translation>
+<translation id="2788520643285360081">„7-Zip“ archyvas</translation>
 <translation id="2803375539583399270">Įveskite PIN kodą</translation>
 <translation id="2820957248982571256">Nuskaitoma...</translation>
+<translation id="2822595620066756134">GZIP suglaudintas archyvas</translation>
 <translation id="2830077785865012357">Kinų k. „Zhuyin“</translation>
 <translation id="2843806747483486897">Keisti numatytąjį...</translation>
 <translation id="2850124913210091882">Kurti atsarginę kopiją</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">Lietuvių</translation>
 <translation id="3587482841069643663">Visi</translation>
 <translation id="3592251141500063301">Nepavyko nustatyti, kad failas <ph name="FILE_NAME" /> būtų pasiekiamas neprisijungus</translation>
+<translation id="3593874215226880809">LZIP suglaudintas archyvas</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">Kanados prancūzų</translation>
 <translation id="3606220979431771195">Turkiška</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551">Atšaukti <ph name="ACTIVITY_DESCRIPTION" />.</translation>
 <translation id="3690128548376345212"><ph name="NETWORK_INDEX" /> tinklas iš <ph name="NETWORK_COUNT" />, „<ph name="NETWORK_NAME" />“, nesuaktyvintas, <ph name="CONNECTION_STATUS" />, signalo stiprumas <ph name="SIGNAL_STRENGTH" /> proc., išsami informacija</translation>
 <translation id="3691184985318546178">Sinhalų k.</translation>
+<translation id="3703620396751288986">ZIP archyvas</translation>
 <translation id="3726463242007121105">Įrenginio negalima atidaryti, nes nepalaikoma jo failų išdėstymo sistema.</translation>
 <translation id="3727148787322499904">Šio nustatymo pakeitimas turės įtakos visiems bendrinamiems tinklams</translation>
 <translation id="3737576078404241332">Pašalinti iš šoninės juostos</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Čekų k. su „Qwerty“ klaviatūra</translation>
 <translation id="4656777537938206294">Leidimas pasiekti failus neprisijungus</translation>
 <translation id="4658782175094886150">Žmogus sniege</translation>
+<translation id="4661996069183330363">TAR archyvas</translation>
 <translation id="4669606053856530811">„<ph name="SOURCE_NAME" />“ nariai praras prieigą, nebent šie elementai bus bendrinami su jais.</translation>
 <translation id="467809019005607715">„Google“ skaidrės</translation>
 <translation id="4690246192099372265">Švedų</translation>
@@ -930,6 +936,7 @@
 <translation id="8903931173357132290">Absolventas</translation>
 <translation id="8912078710089354287">Uodegą vizginantis šuo</translation>
 <translation id="8919081441417203123">Danų</translation>
+<translation id="8965273390142984105">LZOP suglaudintas archyvas</translation>
 <translation id="8965697826696209160">Nepakanka vietos.</translation>
 <translation id="8997962250644902079">Kinų k. (tradicinė) „Pinyin“</translation>
 <translation id="9003940392834790328"><ph name="NETWORK_INDEX" /> tinklas iš <ph name="NETWORK_COUNT" />, „<ph name="NETWORK_NAME" />“, <ph name="CONNECTION_STATUS" />, signalo stiprumas <ph name="SIGNAL_STRENGTH" /> %, tvarko administratorius, išsami informacija</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb
index c3a4edd..5804836 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">Žanrs</translation>
 <translation id="1254593899333212300">Tiešais interneta savienojums</translation>
 <translation id="1272293450992660632">PIN vērtības nav vienādas.</translation>
+<translation id="127650757582748357">Saspiests BZIP2 arhīvs</translation>
 <translation id="1280820357415527819">Notiek mobilo tīklu meklēšana</translation>
 <translation id="1291603679744561561">SIM karte bloķēta</translation>
 <translation id="1293556467332435079">Faili</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">Siers</translation>
 <translation id="2781645665747935084">Beļģu</translation>
 <translation id="2782104745158847185">Instalējot Linux lietojumprogrammu, radās kļūda</translation>
+<translation id="2788520643285360081">7-Zip arhīvs</translation>
 <translation id="2803375539583399270">Ievadiet PIN</translation>
 <translation id="2820957248982571256">Notiek meklēšana...</translation>
+<translation id="2822595620066756134">Saspiests GZIP arhīvs</translation>
 <translation id="2830077785865012357">Ķīniešu, Zhuyin</translation>
 <translation id="2843806747483486897">Mainīt noklusējumu...</translation>
 <translation id="2850124913210091882">Dublēt</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">Lietuviešu valoda</translation>
 <translation id="3587482841069643663">Visi</translation>
 <translation id="3592251141500063301">Nevarēja padarīt failu “<ph name="FILE_NAME" />” pieejamu bezsaistē.</translation>
+<translation id="3593874215226880809">Saspiests LZIP arhīvs</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">Kanādas franču</translation>
 <translation id="3606220979431771195">Turku-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551">Atcelt: <ph name="ACTIVITY_DESCRIPTION" />.</translation>
 <translation id="3690128548376345212">Tīkls numur <ph name="NETWORK_INDEX" /> no <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, nav aktivizēts, <ph name="CONNECTION_STATUS" />, signāla stiprums procentos ir <ph name="SIGNAL_STRENGTH" />, detalizēta informācija</translation>
 <translation id="3691184985318546178">Singāļu</translation>
+<translation id="3703620396751288986">ZIP arhīvs</translation>
 <translation id="3726463242007121105">Šo ierīci nevar atvērt, jo tās failu sistēma netiek atbalstīta.</translation>
 <translation id="3727148787322499904">Nomainot šo iestatījumu, tiks ietekmēti visi koplietotie tīkli.</translation>
 <translation id="3737576078404241332">Noņemt no sānjoslas</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Čehu, ar Qwerty tastatūru</translation>
 <translation id="4656777537938206294">Padariet failus pieejamus bezsaistē</translation>
 <translation id="4658782175094886150">Persona sniegā</translation>
+<translation id="4661996069183330363">TAR arhīvs</translation>
 <translation id="4669606053856530811">“<ph name="SOURCE_NAME" />” dalībnieki zaudēs piekļuvi šiem vienumiem, ja tie netiks kopīgoti ar viņiem.</translation>
 <translation id="467809019005607715">Google prezentācijas</translation>
 <translation id="4690246192099372265">Zviedru valoda</translation>
@@ -930,6 +936,7 @@
 <translation id="8903931173357132290">Absolvents</translation>
 <translation id="8912078710089354287">Suns luncina asti</translation>
 <translation id="8919081441417203123">Dāņu valoda</translation>
+<translation id="8965273390142984105">Saspiests LZOP arhīvs</translation>
 <translation id="8965697826696209160">Nepietiek vietas.</translation>
 <translation id="8997962250644902079">Ķīniešu (tradicionālā), piņjiņs</translation>
 <translation id="9003940392834790328"><ph name="NETWORK_INDEX" />. tīkls no <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, signāla stiprums: <ph name="SIGNAL_STRENGTH" />%, pārvalda jūsu administrators, informācija</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
index 0564eae8..cabfce9 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">Genre</translation>
 <translation id="1254593899333212300">Rechtstreekse internetverbinding</translation>
 <translation id="1272293450992660632">Pincodewaarden komen niet overeen.</translation>
+<translation id="127650757582748357">Archief gecomprimeerd met BZIP2</translation>
 <translation id="1280820357415527819">Mobiele netwerken zoeken</translation>
 <translation id="1291603679744561561">Simkaart vergrendeld</translation>
 <translation id="1293556467332435079">Bestanden</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">Kaas</translation>
 <translation id="2781645665747935084">Belgisch</translation>
 <translation id="2782104745158847185">Fout bij het installeren van de Linux-app</translation>
+<translation id="2788520643285360081">7-Zip-archief</translation>
 <translation id="2803375539583399270">Pincode opgeven</translation>
 <translation id="2820957248982571256">Scannen…</translation>
+<translation id="2822595620066756134">Archief gecomprimeerd met GZIP</translation>
 <translation id="2830077785865012357">Chinees (Zhuyin)</translation>
 <translation id="2843806747483486897">Standaardactie wijzigen...</translation>
 <translation id="2850124913210091882">Back-up maken</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">Litouws</translation>
 <translation id="3587482841069643663">Alles</translation>
 <translation id="3592251141500063301">Kan <ph name="FILE_NAME" /> niet offline beschikbaar maken</translation>
+<translation id="3593874215226880809">Archief gecomprimeerd met LZIP</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">Canadees Frans</translation>
 <translation id="3606220979431771195">Turks-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> annuleren.</translation>
 <translation id="3690128548376345212">Netwerk <ph name="NETWORK_INDEX" /> van <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, niet geactiveerd, <ph name="CONNECTION_STATUS" />, signaalsterkte <ph name="SIGNAL_STRENGTH" />%, details</translation>
 <translation id="3691184985318546178">Singalees</translation>
+<translation id="3703620396751288986">ZIP-archief</translation>
 <translation id="3726463242007121105">Dit apparaat kan niet worden geopend omdat het bijbehorende bestandssysteem niet wordt ondersteund.</translation>
 <translation id="3727148787322499904">Het wijzigen van deze instelling is van invloed op alle gedeelde netwerken</translation>
 <translation id="3737576078404241332">Verwijderen uit zijbalk</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Tsjechisch met Qwerty-toetsenbord</translation>
 <translation id="4656777537938206294">Bestanden offline beschikbaar maken</translation>
 <translation id="4658782175094886150">Persoon in de sneeuw</translation>
+<translation id="4661996069183330363">TAR-archief</translation>
 <translation id="4669606053856530811">Leden van '<ph name="SOURCE_NAME" />' hebben geen toegang meer, tenzij deze items met ze zijn gedeeld.</translation>
 <translation id="467809019005607715">Google Presentaties</translation>
 <translation id="4690246192099372265">Zweeds</translation>
@@ -931,6 +937,7 @@
 <translation id="8903931173357132290">Afgestudeerde</translation>
 <translation id="8912078710089354287">Hond die kwispelt</translation>
 <translation id="8919081441417203123">Deens</translation>
+<translation id="8965273390142984105">Archief gecomprimeerd met LZOP</translation>
 <translation id="8965697826696209160">Er is onvoldoende ruimte.</translation>
 <translation id="8997962250644902079">Chinees (traditioneel, Pinyin)</translation>
 <translation id="9003940392834790328">Netwerk <ph name="NETWORK_INDEX" /> van <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, signaalsterkte <ph name="SIGNAL_STRENGTH" />%, beheerd door je beheerder, details</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_or.xtb b/ui/chromeos/translations/ui_chromeos_strings_or.xtb
index fac251e..6fd7a74c 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_or.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_or.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">ଶୈଳୀ</translation>
 <translation id="1254593899333212300">ସିଧାସଳଖ ଇଣ୍ଟର୍ନେ‍ଟ୍ ସଂଯୋଗ</translation>
 <translation id="1272293450992660632">PIN ମୂଲ୍ୟଗୁଡ଼ିକ ମେଳ ହେଉନାହିଁ।</translation>
+<translation id="127650757582748357">BZIP2ରେ କମ୍ପ୍ରେସ କରାଯାଇଥିବା ଆର୍କାଇଭ ଫାଇଲ</translation>
 <translation id="1280820357415527819">ମୋବାଇଲ୍ ନେଟୱାର୍କଗୁଡିକୁ ଖୋଜୁଛି</translation>
 <translation id="1291603679744561561">SIM ଲକ୍ କରାଯାଇଛି</translation>
 <translation id="1293556467332435079">Files</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">ଚିଜ୍</translation>
 <translation id="2781645665747935084">ବେଲ୍‍ଜିଆନ୍</translation>
 <translation id="2782104745158847185">Linux ଆପ୍ଲିକେସନ୍ ଇନ୍‌ଷ୍ଟଲ୍‌ କରିବାରେ ତ୍ରୁଟି</translation>
+<translation id="2788520643285360081">7-ZIP ଆର୍କାଇଭ</translation>
 <translation id="2803375539583399270">PIN ଲେଖନ୍ତୁ</translation>
 <translation id="2820957248982571256">ସ୍କାନ୍‌ କରୁଛି...</translation>
+<translation id="2822595620066756134">GZIPରେ କମ୍ପ୍ରେସ କରାଯାଇଥିବା ଆର୍କାଇଭ ଫାଇଲ</translation>
 <translation id="2830077785865012357">ଚାଇନିଜ୍ ଝୁୟିନ୍</translation>
 <translation id="2843806747483486897">ଡିଫଲ୍ଟ ପରିବର୍ତ୍ତନ କରନ୍ତୁ...</translation>
 <translation id="2850124913210091882">ବ୍ୟାକ୍‌ଅପ୍‌ ନିଅନ୍ତୁ</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">ଲିଥୁଆନିଆନ୍</translation>
 <translation id="3587482841069643663">ସମସ୍ତ</translation>
 <translation id="3592251141500063301"><ph name="FILE_NAME" />କୁ ଅଫଲାଇନରେ ଉପଲବ୍ଧ କରାଯାଇପାରିଲା ନାହିଁ</translation>
+<translation id="3593874215226880809">LZIPରେ କମ୍ପ୍ରେସ କରାଯାଇଥିବା ଆର୍କାଇଭ ଫାଇଲ</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">କାନାଡିଆନ୍ ଫ୍ରେଞ୍ଚ୍</translation>
 <translation id="3606220979431771195">ତୁର୍କୀସ୍-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> ବାତିଲ୍ କରନ୍ତୁ।</translation>
 <translation id="3690128548376345212"><ph name="NETWORK_NAME" />ର <ph name="NETWORK_COUNT" />ଟିରୁ <ph name="NETWORK_INDEX" /> ନମ୍ବର ନେଟୱାର୍କକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି, <ph name="CONNECTION_STATUS" />, ସିଗନାଲର କ୍ଷମତା <ph name="SIGNAL_STRENGTH" />%, ବିବରଣୀ</translation>
 <translation id="3691184985318546178">ସିଂହଳ</translation>
+<translation id="3703620396751288986">ZIP ଆର୍କାଇଭ</translation>
 <translation id="3726463242007121105">ଏହି ଡିଭାଇସ୍‌ ଖୋଲାଯାଇପାରିବ ନାହିଁ କାରଣ ଏହାର ଫାଇଲ୍‌ସିଷ୍ଟମ୍‌ ସମର୍ଥିତ ନୁହେଁ।</translation>
 <translation id="3727148787322499904">ଏହି ସେଟିଂସ୍‍‍ରେ ପରିବର୍ତ୍ତନ କରିବା ଦ୍ୱାରା ସମସ୍ତ ସେୟାର୍‍ କରାଯାଇଥିବା ନେଟ୍‍ୱର୍କ ପ୍ରଭାବିତ ହେବ</translation>
 <translation id="3737576078404241332">ସାଇଡବାରରୁ କାଢ଼ି ଦିଅନ୍ତୁ</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Qwerty କୀବୋର୍ଡ ସହ ଚେକ୍</translation>
 <translation id="4656777537938206294">ଫାଇଲଗୁଡ଼ିକୁ ଅଫଲାଇନରେ ଉପଲବ୍ଧ କରାନ୍ତୁ</translation>
 <translation id="4658782175094886150">ବରଫରେ ଥିବା ବ୍ୟକ୍ତି</translation>
+<translation id="4661996069183330363">TAR ଆର୍କାଇଭ</translation>
 <translation id="4669606053856530811"><ph name="SOURCE_NAME" />ର ସଦସ୍ୟମାନେ ସେପର୍ଯ୍ୟନ୍ତ ଆକ୍ସେସ୍ ହରାଇବେ ଯେପର୍ଯ୍ୟନ୍ତ ଏହି ଆଇଟମ୍‍ଗୁଡ଼ିକୁ ସେମାନଙ୍କ ସହିତ ସେୟାର୍‌ କରାଯାଇ ନାହିଁ।</translation>
 <translation id="467809019005607715">Google Slides</translation>
 <translation id="4690246192099372265">ସ୍ୱିଡିଶ୍</translation>
@@ -924,6 +930,7 @@
 <translation id="8903931173357132290">ଗ୍ରାଜୁଏଟ୍</translation>
 <translation id="8912078710089354287">ଲାଞ୍ଜ ହଲାଉଥିବା କୁକୁର</translation>
 <translation id="8919081441417203123">ଡାନିଶ୍</translation>
+<translation id="8965273390142984105">LZOPରେ କମ୍ପ୍ରେସ କରାଯାଇଥିବା ଆର୍କାଇଭ ଫାଇଲ</translation>
 <translation id="8965697826696209160">ଯଥେଷ୍ଟ ସ୍ଥାନ ଉପଲବ୍ଧ ନାହିଁ।</translation>
 <translation id="8997962250644902079">ଚାଇନିଜ୍ (ପାରମ୍ପାରିକ) ପିନୟିନ୍</translation>
 <translation id="9003940392834790328"><ph name="NETWORK_COUNT" />ଟିର <ph name="NETWORK_INDEX" /> ନେଟ୍‌ୱାର୍କ, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ସିଗ୍‍ନାଲ୍‍ର କ୍ଷମତା <ph name="SIGNAL_STRENGTH" />%, ଆପଣଙ୍କର ଆଡ୍‍ମିନିଷ୍ଟ୍ରେଟର୍‍ଙ୍କ ଦ୍ୱାରା ପରିଚାଳିତ, ବିବରଣୀ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
index 588c253..ad403e8 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">Gatunek</translation>
 <translation id="1254593899333212300">Bezpośrednie połączenie internetowe</translation>
 <translation id="1272293450992660632">Kody PIN nie są zgodne.</translation>
+<translation id="127650757582748357">Skompresowane archiwum BZIP2</translation>
 <translation id="1280820357415527819">Szukam sieci komórkowych</translation>
 <translation id="1291603679744561561">Karta SIM zablokowana</translation>
 <translation id="1293556467332435079">Pliki</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">Ser</translation>
 <translation id="2781645665747935084">belgijska klawiatura</translation>
 <translation id="2782104745158847185">Błąd podczas instalowania aplikacji na Linuksa</translation>
+<translation id="2788520643285360081">Archiwum 7-Zip</translation>
 <translation id="2803375539583399270">Wpisz kod PIN</translation>
 <translation id="2820957248982571256">Skanuję…</translation>
+<translation id="2822595620066756134">Skompresowane archiwum GZIP</translation>
 <translation id="2830077785865012357">Chiński zhuyin</translation>
 <translation id="2843806747483486897">Zmień ustawienie domyślne...</translation>
 <translation id="2850124913210091882">Utwórz kopię zapasową</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">Litewski</translation>
 <translation id="3587482841069643663">Wszystkie</translation>
 <translation id="3592251141500063301">Pliku <ph name="FILE_NAME" /> nie udało się udostępnić offline</translation>
+<translation id="3593874215226880809">Skompresowane archiwum LZIP</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">kanadyjski francuski</translation>
 <translation id="3606220979431771195">Turecki (wersja F)</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551">Anuluj <ph name="ACTIVITY_DESCRIPTION" />.</translation>
 <translation id="3690128548376345212">Sieć <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, nieaktywowana, <ph name="CONNECTION_STATUS" />, siła sygnału <ph name="SIGNAL_STRENGTH" />%, szczegóły</translation>
 <translation id="3691184985318546178">Syngaleski</translation>
+<translation id="3703620396751288986">Plik ZIP</translation>
 <translation id="3726463242007121105">Nie można otworzyć urządzenia, ponieważ jego system plików nie jest obsługiwany.</translation>
 <translation id="3727148787322499904">Zmiana tego ustawienia wpłynie na wszystkie sieci współdzielone</translation>
 <translation id="3737576078404241332">Usuń z paska bocznego</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Czeski z klawiaturą QWERTY</translation>
 <translation id="4656777537938206294">Udostępnij pliki offline</translation>
 <translation id="4658782175094886150">Osoba w śniegu</translation>
+<translation id="4661996069183330363">Archiwum TAR</translation>
 <translation id="4669606053856530811">Osoby z uprawnieniami do: „<ph name="SOURCE_NAME" />” utracą dostęp do tych elementów, chyba że zostaną one im udostępnione.</translation>
 <translation id="467809019005607715">Prezentacje Google</translation>
 <translation id="4690246192099372265">Szwedzki</translation>
@@ -930,6 +936,7 @@
 <translation id="8903931173357132290">Absolwent</translation>
 <translation id="8912078710089354287">Pies merdający ogonem</translation>
 <translation id="8919081441417203123">Duński</translation>
+<translation id="8965273390142984105">Skompresowane archiwum LZOP</translation>
 <translation id="8965697826696209160">Nie ma wystarczającej ilości miejsca.</translation>
 <translation id="8997962250644902079">Chiński (tradycyjny) pinyin</translation>
 <translation id="9003940392834790328">Sieć <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, siła sygnału: <ph name="SIGNAL_STRENGTH" />%, zarządzana przez administratora, szczegóły</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
index 2fa9d76..b61bcbe 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">Gen</translation>
 <translation id="1254593899333212300">Conexiune directă la internet</translation>
 <translation id="1272293450992660632">Valorile PIN nu se potrivesc.</translation>
+<translation id="127650757582748357">Arhivă comprimată BZIP2</translation>
 <translation id="1280820357415527819">Se caută rețele mobile</translation>
 <translation id="1291603679744561561">Card SIM blocat</translation>
 <translation id="1293556467332435079">Fișiere</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">Brânză</translation>
 <translation id="2781645665747935084">Belgiană</translation>
 <translation id="2782104745158847185">Eroare la instalarea aplicației Linux</translation>
+<translation id="2788520643285360081">Arhivă 7-ZIP</translation>
 <translation id="2803375539583399270">Introdu codul PIN</translation>
 <translation id="2820957248982571256">Se scanează...</translation>
+<translation id="2822595620066756134">Arhivă comprimată GZIP</translation>
 <translation id="2830077785865012357">Chineză Zhuyin</translation>
 <translation id="2843806747483486897">Schimbați valoarea prestabilită...</translation>
 <translation id="2850124913210091882">Fă backup</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">Lituaniană</translation>
 <translation id="3587482841069643663">Toate</translation>
 <translation id="3592251141500063301"><ph name="FILE_NAME" /> nu a devenit disponibil offline</translation>
+<translation id="3593874215226880809">Arhivă comprimată LZIP</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">Franceză canadiană</translation>
 <translation id="3606220979431771195">Turcă-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551">Anulează <ph name="ACTIVITY_DESCRIPTION" />.</translation>
 <translation id="3690128548376345212">Rețeaua <ph name="NETWORK_INDEX" /> din <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, inactivă, <ph name="CONNECTION_STATUS" />, puterea semnalului: <ph name="SIGNAL_STRENGTH" /> %, detalii</translation>
 <translation id="3691184985318546178">Singaleză</translation>
+<translation id="3703620396751288986">Arhivă ZIP</translation>
 <translation id="3726463242007121105">Acest dispozitiv nu poate fi deschis, deoarece sistemul său de fișiere nu este acceptat.</translation>
 <translation id="3727148787322499904">Modificarea acestei setări se va aplica tuturor rețelelor folosite în comun</translation>
 <translation id="3737576078404241332">Elimină din bara laterală</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Cehă cu tastatură QWERTY</translation>
 <translation id="4656777537938206294">Fă fișierele disponibile offline</translation>
 <translation id="4658782175094886150">Persoană înconjurată de zăpadă</translation>
+<translation id="4661996069183330363">Arhivă TAR</translation>
 <translation id="4669606053856530811">Membrii „<ph name="SOURCE_NAME" />” vor pierde accesul, exceptând cazul în care li se permite accesul la aceste articole.</translation>
 <translation id="467809019005607715">Prezentări Google</translation>
 <translation id="4690246192099372265">Suedeză</translation>
@@ -930,6 +936,7 @@
 <translation id="8903931173357132290">Absolvent</translation>
 <translation id="8912078710089354287">Câine care dă din coadă</translation>
 <translation id="8919081441417203123">Daneză</translation>
+<translation id="8965273390142984105">Arhivă comprimată LZOP</translation>
 <translation id="8965697826696209160">Nu există spațiu suficient.</translation>
 <translation id="8997962250644902079">Chineză (tradițională) Pinyin</translation>
 <translation id="9003940392834790328">Rețeaua <ph name="NETWORK_INDEX" /> din <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, puterea semnalului: <ph name="SIGNAL_STRENGTH" /> %, gestionată de administratorul tău, detalii</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
index bdfb2b0..b4830324 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">Жанр</translation>
 <translation id="1254593899333212300">Прямое подключение к Интернету</translation>
 <translation id="1272293450992660632">PIN-коды не совпадают.</translation>
+<translation id="127650757582748357">Сжатый архив BZIP2</translation>
 <translation id="1280820357415527819">Поиск мобильных сетей...</translation>
 <translation id="1291603679744561561">SIM-карта заблокирована</translation>
 <translation id="1293556467332435079">Файлы</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">Сыр</translation>
 <translation id="2781645665747935084">Бельгийская</translation>
 <translation id="2782104745158847185">Не удалось установить приложение для Linux</translation>
+<translation id="2788520643285360081">Архив 7-Zip</translation>
 <translation id="2803375539583399270">Введите PIN-код</translation>
 <translation id="2820957248982571256">Поиск…</translation>
+<translation id="2822595620066756134">Сжатый архив GZIP</translation>
 <translation id="2830077785865012357">Китайский, чжуинь</translation>
 <translation id="2843806747483486897">Изменить настройки по умолчанию…</translation>
 <translation id="2850124913210091882">Резервное копирование</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">Литовский</translation>
 <translation id="3587482841069643663">Все</translation>
 <translation id="3592251141500063301">Не удается скачать файл "<ph name="FILE_NAME" />" для офлайн-доступа.</translation>
+<translation id="3593874215226880809">Сжатый архив LZIP</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">Канадская (французская)</translation>
 <translation id="3606220979431771195">Турецкая раскладка</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551">Отменить <ph name="ACTIVITY_DESCRIPTION" />.</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="3691184985318546178">Сингальский</translation>
+<translation id="3703620396751288986">ZIP-архив</translation>
 <translation id="3726463242007121105">Невозможно получить доступ к устройству, так как его файловая система не поддерживается.</translation>
 <translation id="3727148787322499904">Изменение этого параметра повлияет на все общие сети</translation>
 <translation id="3737576078404241332">Удалить с боковой панели</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Чешский, раскладка QWERTY</translation>
 <translation id="4656777537938206294">Доступ к файлам в офлайн-режиме</translation>
 <translation id="4658782175094886150">Человек в снегу</translation>
+<translation id="4661996069183330363">Архив TAR</translation>
 <translation id="4669606053856530811">Пользователи общего диска "<ph name="SOURCE_NAME" />" больше не смогут использовать эти объекты, если к ним не будет включен общий доступ.</translation>
 <translation id="467809019005607715">Google Презентации</translation>
 <translation id="4690246192099372265">Шведский</translation>
@@ -930,6 +936,7 @@
 <translation id="8903931173357132290">Выпускник</translation>
 <translation id="8912078710089354287">Собака виляет хвостом</translation>
 <translation id="8919081441417203123">Датский</translation>
+<translation id="8965273390142984105">Сжатый архив LZOP</translation>
 <translation id="8965697826696209160">Недостаточно свободного места.</translation>
 <translation id="8997962250644902079">Китайский (традиционный), пиньинь</translation>
 <translation id="9003940392834790328">Сеть <ph name="NETWORK_INDEX" /> из <ph name="NETWORK_COUNT" />, название – "<ph name="NETWORK_NAME" />", статус подключения – "<ph name="CONNECTION_STATUS" />", уровень сигнала – <ph name="SIGNAL_STRENGTH" /> %, под управлением администратора, подробная информация</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_si.xtb b/ui/chromeos/translations/ui_chromeos_strings_si.xtb
index a536dd4..846bced 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_si.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_si.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">ප්‍රහේදය</translation>
 <translation id="1254593899333212300">සෘජු අන්තර්ජාල සබැඳුම</translation>
 <translation id="1272293450992660632">රහස් අංක අගයවල් නොගැළපෙති.</translation>
+<translation id="127650757582748357">BZIP2 සම්පීඩිත සංරක්ෂිතය</translation>
 <translation id="1280820357415527819">ජංගම ජාල සඳහා සොයමින්</translation>
 <translation id="1291603679744561561">SIM අගුලු දමන ලදි</translation>
 <translation id="1293556467332435079">ගොනු</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">චීස්</translation>
 <translation id="2781645665747935084">බෙල්ජියම</translation>
 <translation id="2782104745158847185">Linux යෙදුම් ස්ථාපනය කිරීමේ දෝෂයකි</translation>
+<translation id="2788520643285360081">7-Zip සංරක්ෂිතය</translation>
 <translation id="2803375539583399270">PIN අංකය ඇතුළත් කරන්න</translation>
 <translation id="2820957248982571256">ස්කෑන් කරමින්...</translation>
+<translation id="2822595620066756134">Gzip සම්පීඩිත සංරක්ෂිතය</translation>
 <translation id="2830077785865012357">චීන ෂුයින්</translation>
 <translation id="2843806747483486897">පෙරනිමිය වෙනස් කරන්න...</translation>
 <translation id="2850124913210091882">උපස්ථය</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">ලිතුවේනියානු</translation>
 <translation id="3587482841069643663">සියළු</translation>
 <translation id="3592251141500063301"><ph name="FILE_NAME" /> නොබැඳිව ලබා ගත හැකි බවට පත් කළ නොහැකි විය</translation>
+<translation id="3593874215226880809">LZIP සම්පීඩිත සංරක්ෂිතය</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">කැනේඩියානු ප්‍රංශ</translation>
 <translation id="3606220979431771195">තුර්කි-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> අවලංගු කරන්න.</translation>
 <translation id="3690128548376345212">ජාල <ph name="NETWORK_COUNT" />කින් <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, සක්‍රිය නොකළ, <ph name="CONNECTION_STATUS" /> සංඥා ප්‍රබලතාව <ph name="SIGNAL_STRENGTH" />%, විස්තර</translation>
 <translation id="3691184985318546178">සිංහල</translation>
+<translation id="3703620396751288986">ZIP සංරක්ෂිතය</translation>
 <translation id="3726463242007121105">ගොනුවේ ගොනුරටාව ආධාරක නොවන බැවින් උපාංගය විවෘත කළ නොහැක.</translation>
 <translation id="3727148787322499904">මෙම සැකසීම වෙනස් කිරීම සියලු බෙදා ගත් ජාලවලට බලපානු ඇත</translation>
 <translation id="3737576078404241332">පැති තීරුව වෙතින් ඉවත් කරන්න</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Qwerty යතුරු පුවරුව සමග චෙක්</translation>
 <translation id="4656777537938206294">ගොනු නොබැඳිව ලබා ගත හැකි බවට පත් කරන්න</translation>
 <translation id="4658782175094886150">හිමේ සිටින පුද්ගලයා</translation>
+<translation id="4661996069183330363">TAR සංරක්ෂිතය</translation>
 <translation id="4669606053856530811">'<ph name="SOURCE_NAME" />' හි සාමාජිකයන්ට මෙම අයිතම ඔවුන් සමග බෙදා ගන්නේ නම් මිස ප්‍රවේශය අහිමි වනු ඇත.</translation>
 <translation id="467809019005607715">Google Slides</translation>
 <translation id="4690246192099372265">ස්වීඩන</translation>
@@ -929,6 +935,7 @@
 <translation id="8903931173357132290">ළමා විය ඉක්මවූ</translation>
 <translation id="8912078710089354287">වලිගය වනන සුනඛයා</translation>
 <translation id="8919081441417203123">ඩෙන්මාර්ක</translation>
+<translation id="8965273390142984105">LZOP සම්පීඩිත සංරක්ෂිතය</translation>
 <translation id="8965697826696209160">ප්‍රමාණවත් මතකයක් නැත.</translation>
 <translation id="8997962250644902079">චීන (සාම්ප්‍රදායික) පින්යින්</translation>
 <translation id="9003940392834790328"><ph name="NETWORK_COUNT" />න් <ph name="NETWORK_INDEX" /> වැනි ජාලය, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, සංඥා ප්‍රබලතාව <ph name="SIGNAL_STRENGTH" />%, ඔබේ පරිපාලකයා විසින් කළමනාකරණය කරයි, විස්තර</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
index 3aec9f68..7c20bb3 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">Zvrst</translation>
 <translation id="1254593899333212300">Neposredna internetna povezava</translation>
 <translation id="1272293450992660632">Vrednosti PIN se ne ujemajo.</translation>
+<translation id="127650757582748357">Stisnjeni arhiv BZIP2</translation>
 <translation id="1280820357415527819">Iskanje mobilnih omrežij</translation>
 <translation id="1291603679744561561">Kartica SIM je zaklenjena.</translation>
 <translation id="1293556467332435079">Datoteke</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">Sir</translation>
 <translation id="2781645665747935084">belgijska</translation>
 <translation id="2782104745158847185">Napaka pri nameščanju aplikacije za Linux</translation>
+<translation id="2788520643285360081">Arhiv 7-ZIP</translation>
 <translation id="2803375539583399270">Vnesite kodo PIN</translation>
 <translation id="2820957248982571256">Iskanje ...</translation>
+<translation id="2822595620066756134">Stisnjeni arhiv GZIP</translation>
 <translation id="2830077785865012357">kitajščina (žujin)</translation>
 <translation id="2843806747483486897">Spremeni privzeto dejanje ...</translation>
 <translation id="2850124913210091882">Varnostno kopiranje</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">litovščina</translation>
 <translation id="3587482841069643663">Vse</translation>
 <translation id="3592251141500063301">Datoteke <ph name="FILE_NAME" /> ni bilo mogoče omogočiti za dostop brez povezave.</translation>
+<translation id="3593874215226880809">Stisnjeni arhiv LZIP</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" />, <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">kanadska francoščina</translation>
 <translation id="3606220979431771195">Turška tipkovnica F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551">Prekliči: <ph name="ACTIVITY_DESCRIPTION" />.</translation>
 <translation id="3690128548376345212"><ph name="NETWORK_INDEX" />. omrežje od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, neaktivirano, <ph name="CONNECTION_STATUS" />, moč signala <ph name="SIGNAL_STRENGTH" /> %, podrobnosti</translation>
 <translation id="3691184985318546178">singalščina</translation>
+<translation id="3703620396751288986">Arhiv ZIP</translation>
 <translation id="3726463242007121105">Naprave ni mogoče odpreti, ker njen datotečni sistem ni podprt.</translation>
 <translation id="3727148787322499904">Sprememba te nastavitve vpliva na vsa omrežja v skupni rabi</translation>
 <translation id="3737576078404241332">Odstrani iz stranske vrstice</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">češčina s tipkovnico Qwerty</translation>
 <translation id="4656777537938206294">Omogočite datoteke za dostop brez povezave</translation>
 <translation id="4658782175094886150">Oseba na snegu</translation>
+<translation id="4661996069183330363">Arhiv TAR</translation>
 <translation id="4669606053856530811">Člani skupine »<ph name="SOURCE_NAME" />« bodo izgubili dostop, razen če te elemente delite z njimi.</translation>
 <translation id="467809019005607715">Google Predstavitve</translation>
 <translation id="4690246192099372265">švedščina</translation>
@@ -930,6 +936,7 @@
 <translation id="8903931173357132290">Prehod na običajen račun Google</translation>
 <translation id="8912078710089354287">Kuža, ki maha z repom</translation>
 <translation id="8919081441417203123">danščina</translation>
+<translation id="8965273390142984105">Stisnjeni arhiv LZOP</translation>
 <translation id="8965697826696209160">Na voljo ni dovolj prostora.</translation>
 <translation id="8997962250644902079">kitajščina (tradicionalna), pinjin</translation>
 <translation id="9003940392834790328">Omrežje <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, moč signala je <ph name="SIGNAL_STRENGTH" /> %, upravlja ga vaš skrbnik, podrobnosti</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
index 19eb541..97787671 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">ஆடியோ வகை</translation>
 <translation id="1254593899333212300">நேரடி இணைய இணைப்பு</translation>
 <translation id="1272293450992660632">'பின்' பொருந்தவில்லை.</translation>
+<translation id="127650757582748357">BZIP2 சுருக்கப்பட்ட காப்பகம்</translation>
 <translation id="1280820357415527819">மொபைல் நெட்வொர்க்குகளைத் தேடுகிறது</translation>
 <translation id="1291603679744561561">சிம் பூட்டப்பட்டுள்ளது</translation>
 <translation id="1293556467332435079">Files</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">பாலாடைக் கட்டி</translation>
 <translation id="2781645665747935084">பெல்ஜியன்</translation>
 <translation id="2782104745158847185">ஒரு Linux ஆப்ஸை நிறுவும்போது பிழை நேர்ந்தது</translation>
+<translation id="2788520643285360081">7-ஜிப் காப்பகம்</translation>
 <translation id="2803375539583399270">பின்னை உள்ளிடவும்</translation>
 <translation id="2820957248982571256">ஸ்கேன் செய்கிறது...</translation>
+<translation id="2822595620066756134">GZIP சுருக்கப்பட்ட காப்பகம்</translation>
 <translation id="2830077785865012357">சீனம் (சூயின்)</translation>
 <translation id="2843806747483486897">இயல்புநிலைக்கு மாற்று...</translation>
 <translation id="2850124913210091882">காப்புப் பிரதியெடு</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">லிதுவேனியன்</translation>
 <translation id="3587482841069643663">அனைத்தும்</translation>
 <translation id="3592251141500063301">ஆஃப்லைனில் அணுகும் வகையில் <ph name="FILE_NAME" /> ஃபைலை அமைக்க முடியவில்லை</translation>
+<translation id="3593874215226880809">LZIP சுருக்கப்பட்ட காப்பகம்</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">கனடியன் ஃபிரெஞ்சு</translation>
 <translation id="3606220979431771195">டர்கிஷ்-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> ரத்துசெய்யப்படும்.</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="3691184985318546178">சிங்களம்</translation>
+<translation id="3703620396751288986">ஜிப் காப்பகம்</translation>
 <translation id="3726463242007121105">இந்த சாதனத்தின் கோப்புமுறைமை ஆதரிக்கப்படாததால், இந்த சாதனத்தை திறக்க முடியவில்லை.</translation>
 <translation id="3727148787322499904">இந்த அமைப்பை மாற்றினால், பகிர்ந்த எல்லா நெட்வொர்க்குகளும் பாதிக்கப்படும்</translation>
 <translation id="3737576078404241332">பக்கப்பட்டியில் இருந்து அகற்று</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">செக் - Qwerty கீபோர்டு</translation>
 <translation id="4656777537938206294">ஃபைல்களை ஆஃப்லைனில் பயன்படுத்தலாம்</translation>
 <translation id="4658782175094886150">பனியில் இருக்கும் நபர்</translation>
+<translation id="4661996069183330363">TAR காப்பகம்</translation>
 <translation id="4669606053856530811">இந்த ஃபைல்களை '<ph name="SOURCE_NAME" />' இன் உறுப்பினர்களுடன் பகிரவில்லை எனில், அவர்கள் அவற்றுக்கான அணுகலை இழப்பார்கள்.</translation>
 <translation id="467809019005607715">Google Slides</translation>
 <translation id="4690246192099372265">ஸ்வீடிஷ்</translation>
@@ -930,6 +936,7 @@
 <translation id="8903931173357132290">பட்டப் படிப்பு</translation>
 <translation id="8912078710089354287">வாலாட்டும் நாய்</translation>
 <translation id="8919081441417203123">டேனிஷ்</translation>
+<translation id="8965273390142984105">LZOP சுருக்கப்பட்ட காப்பகம்</translation>
 <translation id="8965697826696209160">போதிய இடம் இல்லை.</translation>
 <translation id="8997962250644902079">சீனம் (பாரம்பரியம்) பின்யின்</translation>
 <translation id="9003940392834790328">நெட்வொர்க்: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, சிக்னல் வலிமை: <ph name="SIGNAL_STRENGTH" />%, உங்கள் நிர்வாகி நிர்வகிக்கிறார், விவரங்கள்</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb
index bf5e1e9..fef4388d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">نوع</translation>
 <translation id="1254593899333212300">براہ راست انٹرنیٹ کنکشن</translation>
 <translation id="1272293450992660632">‏PIN کی اقدار مماثل نہیں ہیں۔</translation>
+<translation id="127650757582748357">‏BZIP2 کمپریسڈ آرکائیو</translation>
 <translation id="1280820357415527819">موبائل نیٹ ورکس کو تلاش کیا جا رہا ہے</translation>
 <translation id="1291603679744561561">‏SIM مقفل ہو گیا</translation>
 <translation id="1293556467332435079">فائلیں</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">پنیر</translation>
 <translation id="2781645665747935084">بیلجین</translation>
 <translation id="2782104745158847185">‏Linux ایپلیکیشن انسٹال کرنے میں خرابی</translation>
+<translation id="2788520643285360081">‏7-Zip آرکائیو</translation>
 <translation id="2803375539583399270">‏PIN درج کریں</translation>
 <translation id="2820957248982571256">اسکین ہو رہا ہے…</translation>
+<translation id="2822595620066756134">‏GZIP کمپریسڈ آرکائیو</translation>
 <translation id="2830077785865012357">‏چینی Zhuyin</translation>
 <translation id="2843806747483486897">ڈیفالٹ کو تبدیل کریں…</translation>
 <translation id="2850124913210091882">بیک اپ لیں</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">لتھُواینین</translation>
 <translation id="3587482841069643663">سبھی</translation>
 <translation id="3592251141500063301"><ph name="FILE_NAME" /> کو آف لائن دستیاب نہیں بنایا جا سکا</translation>
+<translation id="3593874215226880809">‏LZIP کمپریسڈ آرکائیو</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">کینیڈین فرانسیسی</translation>
 <translation id="3606220979431771195">‏ترکی F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551"><ph name="ACTIVITY_DESCRIPTION" /> منسوخ کریں۔</translation>
 <translation id="3690128548376345212"><ph name="NETWORK_COUNT" /> <ph name="NETWORK_NAME" /> کا نیٹ ورک <ph name="NETWORK_INDEX" /> غیر فعال ہے، <ph name="CONNECTION_STATUS" />، <ph name="SIGNAL_STRENGTH" />% سگنل کی مضبوطی کی تفصیلات</translation>
 <translation id="3691184985318546178">سنہالا</translation>
+<translation id="3703620396751288986">‏ZIP آرکائیو</translation>
 <translation id="3726463242007121105">اس آلے کو نہیں کھولا جا سکتا کیونکہ اس کا فائل سسٹم تعاون یافتہ نہیں ہے۔</translation>
 <translation id="3727148787322499904">اس ترتیب کو تبدیل کرنے سے سبھی اشتراک کردہ نیٹ ورکس پر اثر پڑے گا</translation>
 <translation id="3737576078404241332">سائیڈ بار سے ہٹائیں</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">‏Qwerty کی بورڈ کے ساتھ چیک زبان</translation>
 <translation id="4656777537938206294">فائلز کو آف لائن دستیاب کرائیں</translation>
 <translation id="4658782175094886150">برف سے ڈھکا ہوا شخص</translation>
+<translation id="4661996069183330363">‏TAR آرکائیو</translation>
 <translation id="4669606053856530811">جب تک ان آئٹمز کا ان کے ساتھ اشتراک نہیں کیا جاتا ہے، <ph name="SOURCE_NAME" /> کے اراکین کی رسائی منقطع ہو جائے گي۔</translation>
 <translation id="467809019005607715">Google Slides</translation>
 <translation id="4690246192099372265">سويڈش</translation>
@@ -929,6 +935,7 @@
 <translation id="8903931173357132290">گریجویٹ</translation>
 <translation id="8912078710089354287">دُم ہلاتا ہوا کتا</translation>
 <translation id="8919081441417203123">ڈينش</translation>
+<translation id="8965273390142984105">‏LZOP کمپریسڈ آرکائیو</translation>
 <translation id="8965697826696209160">اس میں کافی جگہ نہیں ہے۔</translation>
 <translation id="8997962250644902079">‏چینی (روایتی) Pinyin</translation>
 <translation id="9003940392834790328"><ph name="NETWORK_COUNT" /> میں سے <ph name="NETWORK_INDEX" /> نیٹ ورک، <ph name="NETWORK_NAME" />، <ph name="CONNECTION_STATUS" />، سگنل کی مضبوطی <ph name="SIGNAL_STRENGTH" />%، آپ کے منتظم کے زیر انتظام ہے، تفصیلات</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb
index f332d521..9e29dd2 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb
@@ -35,7 +35,7 @@
 <translation id="1249250836236328755">類型</translation>
 <translation id="1254593899333212300">直接連線到互聯網</translation>
 <translation id="1272293450992660632">PIN 值不相符。</translation>
-<translation id="127650757582748357">BZIP2 壓縮檔</translation>
+<translation id="127650757582748357">BZIP2 壓縮封存檔案</translation>
 <translation id="1280820357415527819">正在搜尋流動網絡</translation>
 <translation id="1291603679744561561">SIM 卡已鎖定</translation>
 <translation id="1293556467332435079">檔案</translation>
@@ -208,10 +208,10 @@
 <translation id="2771816809568414714">芝士</translation>
 <translation id="2781645665747935084">比利時文</translation>
 <translation id="2782104745158847185">安裝 Linux 應用程式時發生錯誤</translation>
-<translation id="2788520643285360081">7-Zip 封存檔</translation>
+<translation id="2788520643285360081">7-Zip 封存檔案</translation>
 <translation id="2803375539583399270">請輸入 PIN</translation>
 <translation id="2820957248982571256">正在掃瞄…</translation>
-<translation id="2822595620066756134">GZIP 壓縮檔</translation>
+<translation id="2822595620066756134">GZIP 壓縮封存檔案</translation>
 <translation id="2830077785865012357">中文 (注音)</translation>
 <translation id="2843806747483486897">變更預設值…</translation>
 <translation id="2850124913210091882">備份</translation>
@@ -303,7 +303,7 @@
 <translation id="357479282490346887">立陶宛文</translation>
 <translation id="3587482841069643663">全部</translation>
 <translation id="3592251141500063301">無法將 <ph name="FILE_NAME" /> 設定為可離線使用</translation>
-<translation id="3593874215226880809">LZIP 壓縮檔</translation>
+<translation id="3593874215226880809">LZIP 壓縮封存檔案</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">加拿大法語</translation>
 <translation id="3606220979431771195">土耳其文 F 型</translation>
@@ -316,7 +316,7 @@
 <translation id="3689865792480713551">取消 <ph name="ACTIVITY_DESCRIPTION" />。</translation>
 <translation id="3690128548376345212"><ph name="NETWORK_COUNT" /> 個網絡之中嘅第 <ph name="NETWORK_INDEX" /> 個網絡,<ph name="NETWORK_NAME" />,未啟用,<ph name="CONNECTION_STATUS" />,訊號強度係 <ph name="SIGNAL_STRENGTH" />%,詳細資料</translation>
 <translation id="3691184985318546178">錫蘭文</translation>
-<translation id="3703620396751288986">ZIP 封存檔</translation>
+<translation id="3703620396751288986">ZIP 封存檔案</translation>
 <translation id="3726463242007121105">這部裝置所用的檔案系統不受支援,因此系統無法開啟這部裝置。</translation>
 <translation id="3727148787322499904">變更此設定將會影響所有共用網絡</translation>
 <translation id="3737576078404241332">從側欄中移除</translation>
@@ -388,7 +388,7 @@
 <translation id="4380245540200674032">第 <ph name="NETWORK_INDEX" /> 個網絡,一共有 <ph name="NETWORK_COUNT" /> 個網絡,<ph name="NETWORK_NAME" />,<ph name="NETWORK_PROVIDER_NAME" />,<ph name="CONNECTION_STATUS" />,訊號強度係 <ph name="SIGNAL_STRENGTH" />%,由管理員管理,詳情</translation>
 <translation id="4387004326333427325">遠端已拒絕驗證憑證</translation>
 <translation id="4394214039309501350">外部連結</translation>
-<translation id="4401287888955153199">擷取全部</translation>
+<translation id="4401287888955153199">解壓縮全部</translation>
 <translation id="4410695710508688828">擷取操作失敗:<ph name="ERROR_MESSAGE" /></translation>
 <translation id="4418686080762064601">為檔案建立捷徑</translation>
 <translation id="4425149324548788773">我的雲端硬碟</translation>
@@ -418,7 +418,7 @@
 <translation id="4646813851450205600">捷克文,QWERTY 鍵盤</translation>
 <translation id="4656777537938206294">將檔案設定為可離線使用</translation>
 <translation id="4658782175094886150">雪中的人</translation>
-<translation id="4661996069183330363">TAR 封存檔</translation>
+<translation id="4661996069183330363">TAR 封存檔案</translation>
 <translation id="4669606053856530811">除非有人與「<ph name="SOURCE_NAME" />」的成員共用這些項目,否則他們將失去存取權。</translation>
 <translation id="467809019005607715">Google 簡報</translation>
 <translation id="4690246192099372265">瑞典文</translation>
@@ -936,7 +936,7 @@
 <translation id="8903931173357132290">畢業生</translation>
 <translation id="8912078710089354287">搖尾巴的狗</translation>
 <translation id="8919081441417203123">丹麥文</translation>
-<translation id="8965273390142984105">LZOP 壓縮檔</translation>
+<translation id="8965273390142984105">LZOP 壓縮封存檔案</translation>
 <translation id="8965697826696209160">空間不足。</translation>
 <translation id="8997962250644902079">繁體中文 (拼音)</translation>
 <translation id="9003940392834790328">第 <ph name="NETWORK_INDEX" /> 個網絡,一共有 <ph name="NETWORK_COUNT" /> 個網絡,<ph name="NETWORK_NAME" />,<ph name="CONNECTION_STATUS" />,訊號強度係 <ph name="SIGNAL_STRENGTH" />%,由管理員管理,詳情</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zu.xtb b/ui/chromeos/translations/ui_chromeos_strings_zu.xtb
index d980f57..43a584dc 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_zu.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_zu.xtb
@@ -35,6 +35,7 @@
 <translation id="1249250836236328755">Uhlobo</translation>
 <translation id="1254593899333212300">Qondisa ukuxhumeka kwe-inthanethi</translation>
 <translation id="1272293450992660632">Amavelu ephinikhodi awafani.</translation>
+<translation id="127650757582748357">Ingobo yomlando eminyanisiwe ye-BZIP2</translation>
 <translation id="1280820357415527819">Isesha amanethiwekhi eselula</translation>
 <translation id="1291603679744561561">I-SIM Ikhiyiwe</translation>
 <translation id="1293556467332435079">Amafayela</translation>
@@ -207,8 +208,10 @@
 <translation id="2771816809568414714">Ushizi</translation>
 <translation id="2781645665747935084">Isi-Belgian</translation>
 <translation id="2782104745158847185">Iphutha ukufaka uhlelo lokusebenza le-Linux</translation>
+<translation id="2788520643285360081">Ingobo yomlando ye-7-ZIP</translation>
 <translation id="2803375539583399270">Faka iphinikhodi</translation>
 <translation id="2820957248982571256">Iyaskena...</translation>
+<translation id="2822595620066756134">Ingobo yomlando eminyanisiwe ye-GZIP</translation>
 <translation id="2830077785865012357">I-Chinese Zhuyin</translation>
 <translation id="2843806747483486897">Shintsha okuzenzakalelayo...</translation>
 <translation id="2850124913210091882">Yenza isipele</translation>
@@ -300,6 +303,7 @@
 <translation id="357479282490346887">Isi-Lithuanian</translation>
 <translation id="3587482841069643663">Konke</translation>
 <translation id="3592251141500063301">Ayikwazanga ukwenza i-<ph name="FILE_NAME" /> itholakale ngokungaxhunyiwe kwi-inthanethi</translation>
+<translation id="3593874215226880809">Ingobo yomlando eminyanisiwe ye-LZIP</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="3603385196401704894">Isi-Canadian French</translation>
 <translation id="3606220979431771195">I-Turkish-F</translation>
@@ -312,6 +316,7 @@
 <translation id="3689865792480713551">Khansela i-<ph name="ACTIVITY_DESCRIPTION" />.</translation>
 <translation id="3690128548376345212">Inethiwekhi engu-<ph name="NETWORK_INDEX" /> kwezingu-<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Akusetshenzisiwe <ph name="CONNECTION_STATUS" />, Amandla Wesignali <ph name="SIGNAL_STRENGTH" />%, Imininingwane</translation>
 <translation id="3691184985318546178">Isi-Sinhala</translation>
+<translation id="3703620396751288986">Ingobo yomlando ye-ZIP</translation>
 <translation id="3726463242007121105">Le divayisi ayikwazi ukuvulwa ngoba isistimu yefayela layo ayisekelwe.</translation>
 <translation id="3727148787322499904">Ukushintsha lesi silungiselelo kuzothinta onke amanethiwekhi abiwe</translation>
 <translation id="3737576078404241332">Susa kwibha eseceleni</translation>
@@ -413,6 +418,7 @@
 <translation id="4646813851450205600">Isi-Czech esinekhibhodi ye-Qwerty</translation>
 <translation id="4656777537938206294">Yenza amafayela atholakala ngokungaxhunyiwe kwi-inthanethi</translation>
 <translation id="4658782175094886150">Umuntu okwisthwathwa</translation>
+<translation id="4661996069183330363">Ingobo yomlando ye-TAR</translation>
 <translation id="4669606053856530811">Amalungu e-'<ph name="SOURCE_NAME" />' azolahlekelwa ukufinyelela ngaphandle kokuthi lezi zinto zabiwe nabo.</translation>
 <translation id="467809019005607715">Google Amaslayidi</translation>
 <translation id="4690246192099372265">Isi-Swedish</translation>
@@ -929,6 +935,7 @@
 <translation id="8903931173357132290">Thola iziqu</translation>
 <translation id="8912078710089354287">Inja enyakazisa umsila</translation>
 <translation id="8919081441417203123">Isi-Danish</translation>
+<translation id="8965273390142984105">Ingobo yomlando eminyanisiwe ye-LZOP</translation>
 <translation id="8965697826696209160">Asikho isikhala esanele.</translation>
 <translation id="8997962250644902079">Isi-Chinese (Traditional) Pinyin</translation>
 <translation id="9003940392834790328">Inethiwekhi <ph name="NETWORK_INDEX" /> ye-<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, amandla esignali <ph name="SIGNAL_STRENGTH" />%, kuphethwe umlawuli wakho, imininingwane</translation>
diff --git a/ui/ozone/platform/wayland/host/wayland_surface.cc b/ui/ozone/platform/wayland/host/wayland_surface.cc
index 59a4d10..8d3139f7 100644
--- a/ui/ozone/platform/wayland/host/wayland_surface.cc
+++ b/ui/ozone/platform/wayland/host/wayland_surface.cc
@@ -732,6 +732,13 @@
   auto* const surface = static_cast<WaylandSurface*>(data);
   DCHECK(surface);
 
+  // The compositor can send a null output.
+  // crbug.com/1332540
+  if (!output) {
+    LOG(ERROR) << "NULL output received, cannot enter it!";
+    return;
+  }
+
   auto* wayland_output =
       static_cast<WaylandOutput*>(wl_output_get_user_data(output));
 
@@ -752,6 +759,13 @@
   auto* const surface = static_cast<WaylandSurface*>(data);
   DCHECK(surface);
 
+  // The compositor can send a null output.
+  // crbug.com/1332540
+  if (!output) {
+    LOG(ERROR) << "NULL output received, cannot leave it!";
+    return;
+  }
+
   auto* wayland_output =
       static_cast<WaylandOutput*>(wl_output_get_user_data(output));
   surface->RemoveEnteredOutput(wayland_output->output_id());
diff --git a/weblayer/browser/bluetooth/weblayer_bluetooth_delegate_impl_client.cc b/weblayer/browser/bluetooth/weblayer_bluetooth_delegate_impl_client.cc
index b31d554..9b31379 100644
--- a/weblayer/browser/bluetooth/weblayer_bluetooth_delegate_impl_client.cc
+++ b/weblayer/browser/bluetooth/weblayer_bluetooth_delegate_impl_client.cc
@@ -71,4 +71,13 @@
   NOTREACHED();
 }
 
+void WebLayerBluetoothDelegateImplClient::ShowBluetoothDevicePairConfirmDialog(
+    content::RenderFrameHost* frame,
+    const std::u16string& device_identifier,
+    content::BluetoothDelegate::PairConfirmCallback callback) {
+  // Web Bluetooth is not supported for desktop in WebLayer and Android already
+  // bonds on demand, so this should not be called on any platform.
+  NOTREACHED();
+}
+
 }  // namespace weblayer
diff --git a/weblayer/browser/bluetooth/weblayer_bluetooth_delegate_impl_client.h b/weblayer/browser/bluetooth/weblayer_bluetooth_delegate_impl_client.h
index 5352e43..9eb8028 100644
--- a/weblayer/browser/bluetooth/weblayer_bluetooth_delegate_impl_client.h
+++ b/weblayer/browser/bluetooth/weblayer_bluetooth_delegate_impl_client.h
@@ -47,6 +47,10 @@
       content::RenderFrameHost* frame,
       const std::u16string& device_identifier,
       content::BluetoothDelegate::CredentialsCallback callback) override;
+  void ShowBluetoothDevicePairConfirmDialog(
+      content::RenderFrameHost* frame,
+      const std::u16string& device_identifier,
+      content::BluetoothDelegate::PairConfirmCallback callback) override;
 };
 
 }  // namespace weblayer