diff --git a/DEPS b/DEPS
index 3a90d62..53c356e 100644
--- a/DEPS
+++ b/DEPS
@@ -305,19 +305,19 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'src_internal_revision': 'c80b0733c6854cd663752371313ce29be0eba0d8',
+  'src_internal_revision': 'ff394b1bf8f89083a017c3c4ca3cc01d5b9675fe',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '2465eda3f62ad18a562cc34cdf431396511b0af5',
+  'skia_revision': 'a78bee58f354c41997d86844df79cd91b859f28a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '690a3636521bf575064d1bc06f50151cda708cfe',
+  'v8_revision': '254cf97a6ad2660647784e5faf9e70a34d2cd054',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '875b7400b543fcec116388e587b1197cf95524e7',
+  'angle_revision': '9f62c102a8dfabe5e32cdce50ee414d1973edf9e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -377,7 +377,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
-  'crossbench_revision': '3ad7c2eb738d81b7e8ea2e969b1d6edc37cbceb5',
+  'crossbench_revision': 'cef36a9dc0bed6520f6189ef4d3f09c6e8a6d6f8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -397,7 +397,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': '1078b4549e245586e70f90ee347980fbfef7054a',
+  'devtools_frontend_revision': 'ec221ff5e18d06f8db6cadd7d233439efacdbd25',
   # 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.
@@ -421,7 +421,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '37c5c1c45b3e5b8118fc680e38ed92d44bd55c44',
+  'dawn_revision': '0567736dfb04b0dfb51d764201800724aa8df8d2',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -445,7 +445,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling jetstream-main
   # and whatever else without interference from each other.
-  'jetstream_main_revision': '4c0b48a3c380689bf41409207794e71d4d44a188',
+  'jetstream_main_revision': 'ba180b5cec3c9e4053669dc0e3265c2ab1e40669',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling jetstream-v2.2
   # and whatever else without interference from each other.
@@ -525,11 +525,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling llvm-libc
   # and whatever else without interference from each other.
-  'llvm_libc_revision':    '03855c3d7eeef29b35cc8fb8c486167da6aaade1',
+  'llvm_libc_revision':    '91a16614cd8b9f6715907d2c3e45eb55436cdef0',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling llvm-libc
   # and whatever else without interference from each other.
-  'compiler_rt_revision': 'a3af83ed8e5d578ae8322b8b7fa43f1cfea3663a',
+  'compiler_rt_revision': 'ea7aaf02e41e13ac174f2d0e4c5eeeac75d11f71',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling clusterfuzz-data
   # and whatever else without interference from each other.
@@ -1201,7 +1201,7 @@
       'packages': [
           {
               'package': 'chromium/chrome/android/orderfiles/arm',
-              'version': '78pSs68rtDxNo3kh8qzDIZisgZtA55weRYz-RyXL4rIC',
+              'version': 'tesrwSE1te_8hQnn-3CDx0HTmtmOROgGqiKyRvQQ40YC',
           },
       ],
       'condition': 'checkout_android',
@@ -1212,7 +1212,7 @@
       'packages': [
           {
               'package': 'chromium/chrome/android/orderfiles/arm64',
-              'version': 'KYGgZ4pXCWUcU3pz3bKhw9RNfQBySlwHzIRZxjGC60cC',
+              'version': 'vYr0NJmWzD0eZWCShkbzRx8vH6RMo_lu3Suflcz0iR8C',
           },
       ],
       'condition': 'checkout_android',
@@ -1602,7 +1602,7 @@
     'packages': [
       {
         'package': 'chromium/chrome/test/data/variations/cipd',
-        'version': 'VZFgCZuAwmte7A6tNCmzLYqX7WX1KKtjT3BZ4qibjlgC',
+        'version': 'HF03bErYgV8nY9LvAKJnW7DN8pse5lFfVe_ZycsMqRgC',
       },
     ],
     'dep_type': 'cipd',
@@ -1613,7 +1613,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '2c481644d275a5491cf032736fc8d3c25354192d',
+    '8f1bd2721f53dac094bed898dc5a426c0e522749',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1763,7 +1763,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'CcB-WuYHGtGWIfeXmfyf40zsLP5-VkbzFfkeVJc5Eg0C',
+          'version': 'u5m6UpIUPRwlbKfacwnvH5wr-JNG3w7YSC5NyqoENj0C',
       },
     ],
     'condition': 'checkout_android and non_git_source',
@@ -2641,7 +2641,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '4f78c4ad8ce6ee3a476fe2397b2f42d58ecdaaf2',
+    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + 'c4883939f306a5046cb251340523adabdddd2d3c',
 
   'src/base/tracing/test/data': {
     'bucket': 'perfetto',
@@ -2818,7 +2818,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/r8',
-              'version': 'nvFK5h1qU6auImeboro5vB72VxCbNz29K9X4kQ94q44C',
+              'version': 'C-Lh9MUw2u0T-AebErIMyUKj44d7Hs7PdKMzM01r35EC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -2960,10 +2960,10 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@1dd8333d656b309c77345de7cb6b87047c1eb833',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@8415cc875465a6fd098cf369fb1025d5a8814797',
   'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@3289b1d61b69a6c66c4b7cd2c6d3ab2a6df031e5',
   'src/third_party/spirv-cross/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3',
-  'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@402d0b3f024f8b1e2fbe297e16fc52023df164df',
+  'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@54ae32bce772b29a253b18583b86ab813ed1887c',
   'src/third_party/spirv-tools/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Tools@44cf554790020ee44355dde75f0aff79141cab3c',
   'src/third_party/vulkan-headers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Headers@d1cd37e925510a167d4abef39340dbdea47d8989',
   'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@3af548220a6a256fdb7e03443ce92d26b2fc3b84',
@@ -3012,7 +3012,7 @@
     Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'),
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'a9fbc3c6ef95cff58f1c1dd392f63bfa7d597837',
+    Var('webrtc_git') + '/src.git' + '@' + 'ae9031c67165219fd3a4b3390fe5c43f60b231aa',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -3134,7 +3134,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/boca_receiver_app/app',
-        'version': '-EuuHhI_s68MfbddNsoh2xO7z6J-SJD29XfkiS47wGkC',
+        'version': '5iCU-3k3BcatmAxMDmLfUM7b_EMUH4AowoumQqS7A8EC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3793,7 +3793,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        '89732666c0f8dbda36eef150dfa4e0902a7750f2',
+        '0f3ad28696ed0444f3465d1a90b977b04b692fd7',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index 3cd79842..f340aa3 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -61,7 +61,7 @@
 <translation id="1183863904939664422">لست مهتمًا بهذا الاقتراح.</translation>
 <translation id="1184126796192815024">لا تتوافق هذه الشبكة مع تطبيقات البثّ على هاتفك. جرِّب استخدام نقطة الاتصال على هاتفك. <ph name="LEARN_MORE" /></translation>
 <translation id="118437560755358292">أدخِل كلمة المرور أو رقم التعريف الشخصي لزيادة مستوى الأمان</translation>
-<translation id="118532027333893379">انقر في أي مكان لالتقاط صورة في وضع ملء الشاشة.</translation>
+<translation id="118532027333893379">يرجى النقر في أي مكان لالتقاط صورة في وضع ملء الشاشة.</translation>
 <translation id="1190609913194133056">مركز الإشعارات</translation>
 <translation id="1195412055398077112">الخروج عن إطار الشاشة</translation>
 <translation id="1195667586424773550">اسحب الرابط إلى شريط عناوين علامة التبويب</translation>
@@ -328,7 +328,7 @@
 <translation id="2065098273523946419">رابط "مزيد من المعلومات": ستتم إعادة التوجيه إلى المتصفِّح عند التفعيل</translation>
 <translation id="2067220651560163985">عرض درجة الحرارة بالدرجة المئوية</translation>
 <translation id="2067602449040652523">سطوع لوحة المفاتيح</translation>
-<translation id="2075520525463668108">انقر لتفعيل/إيقاف "<ph name="CAPTURE_MEDIUM" />". "<ph name="CAPTURE_MEDIUM" />" - <ph name="CAPTURE_STATE" /></translation>
+<translation id="2075520525463668108">تبديل <ph name="CAPTURE_MEDIUM" />. <ph name="CAPTURE_MEDIUM" /> - <ph name="CAPTURE_STATE" /></translation>
 <translation id="2079545284768500474">تراجع</translation>
 <translation id="2083190527011054446">ليلة سعيدة <ph name="GIVEN_NAME" />،</translation>
 <translation id="2086334242442703436">فتح "أداة اختيار رموز الإيموجي"</translation>
@@ -494,7 +494,7 @@
 <translation id="2645435784669275700">ChromeOS</translation>
 <translation id="2653019840645008922">لقطة نافذة</translation>
 <translation id="2653659639078652383">إرسال</translation>
-<translation id="2658778018866295321">انقر واسحب</translation>
+<translation id="2658778018866295321">النقر والسحب</translation>
 <translation id="2665788051462227163">التطبيقان <ph name="UNAVAILABLE_APPS_ONE" /> و<ph name="UNAVAILABLE_APPS_TWO" /> غير مثبَّتين على هذا الجهاز.</translation>
 <translation id="2670350619068134931">الحد من الصور المتحركة</translation>
 <translation id="2673968385134502798">الألعاب</translation>
@@ -607,7 +607,7 @@
 <translation id="3033912566804961911">دمج مع <ph name="DESK_NAME" /></translation>
 <translation id="3039939407102840004">مستوى شحن بطارية قلم الشاشة <ph name="PERCENTAGE" /> في المئة.</translation>
 <translation id="304097922505898963">فتح تطبيق "اختصارات لوحة المفاتيح"</translation>
-<translation id="304417730895741346">تطبيقاتك المثبَّتة والمفتوحة معروضة هنا على الرف. لتثبيت تطبيق في الرف، انقر بزر الماوس الأيمن عليه أو انقر بإصبعين على لوحة اللمس.</translation>
+<translation id="304417730895741346">تطبيقاتك المثبَّتة والمفتوحة معروضة هنا على الرف. لتثبيت تطبيق في الرف، يرجى النقر بزر الماوس الأيمن عليه أو النقر بإصبعين على لوحة اللمس.</translation>
 <translation id="3045488863354895414">مساء الخير،</translation>
 <translation id="3045670165536837541">تم تحديد المقبض في أعلى اليسار، ويمكن استخدام مفاتيح الأسهم لتحريكه</translation>
 <translation id="3047761520276763270">يُرجى المحاولة بقول:</translation>
@@ -692,7 +692,7 @@
 <translation id="3340978935015468852">الإعدادات</translation>
 <translation id="3341303451326249809">تم أخذ لقطة الشاشة.</translation>
 <translation id="334252345105450327">التقاط لقطة شاشة</translation>
-<translation id="3346728094401457853">‏أدخِل كلمة مرور الجهاز الخاصة بالحساب ‎<ph name="EMAIL" />.</translation>
+<translation id="3346728094401457853">‏يرجى إدخال كلمة مرور الجهاز الخاصة بالحساب ‎<ph name="EMAIL" />.</translation>
 <translation id="334927402682780278">اختيار النص من موضع المؤشر إلى نهاية السطر</translation>
 <translation id="3349345708646875009">فتح "إدارة المهام"</translation>
 <translation id="3364721542077212959">أدوات قلم الشاشة</translation>
@@ -771,7 +771,7 @@
 <translation id="3585296979871889131">عرض الصور والوسائط والإشعارات والتطبيقات الحديثة في هاتفك</translation>
 <translation id="358832729276157756">ExpressKey 1</translation>
 <translation id="3590441166907930941">الزر الجانبي</translation>
-<translation id="3593039967545720377">‏يمكنك الوصول إلى سجلّ الحافظة عن طريق الضغط على المفتاح <ph name="SHORTCUT_KEY_NAME" /> + V لعرض الحافظة. ابدأ الآن بنسخ أحد العناصر للبدء.</translation>
+<translation id="3593039967545720377">‏يمكنك الوصول إلى سجلّ الحافظة عن طريق الضغط على المفتاح <ph name="SHORTCUT_KEY_NAME" /> + V لعرض الحافظة. يرجى نسخ أحد العناصر للبدء.</translation>
 <translation id="3593646411856133110">يُرجى التمرير السريع إلى الأعلى للاطّلاع على التطبيقات المفتوحة.</translation>
 <translation id="3595596368722241419">البطارية ممتلئة</translation>
 <translation id="3596012367874587041">إعدادات التطبيق</translation>
@@ -1586,7 +1586,7 @@
 <translation id="6119972796024789243">تصحيح الألوان</translation>
 <translation id="6121838516699723042">تأكيد تنزيل <ph name="FILENAME" /></translation>
 <translation id="612734058257491180">‏لا يتوفر "مساعد Google" في جلسة ضيف.</translation>
-<translation id="6127395413317891856">جهازك غير متصل بالإنترنت. يُرجى التحقّق من الاتصال والمحاولة مجددًا.</translation>
+<translation id="6127395413317891856">جهازك غير متصل بالإنترنت. يُرجى التحقّق من اتصال جهازك بالشبكة وإعادة المحاولة.</translation>
 <translation id="6129953537138746214">مسافة</translation>
 <translation id="6137566720514957455">فتح مربع الحوار لإزالة الحساب <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6141205840878048728">ما المطلوب التركيز عليه؟</translation>
@@ -1824,7 +1824,7 @@
 <translation id="6883768636838842873">اختصارات لوحة المفاتيح ونصائح حول استخدام الجهاز والمزيد</translation>
 <translation id="6884665277231944629">العودة إلى تاريخ اليوم</translation>
 <translation id="6886172995547742638">‏قد يواجه جهاز <ph name="DEVICE_TYPE" /> انخفاضًا في الأداء. يمكنك استخدام محوِّل طاقة متوافق بقدرة <ph name="PREFERRED_MINIMUM_POWER" /> واط أو محوِّل طاقة USB-C بقدرة أعلى.</translation>
-<translation id="688631446150864480">اضغط على مفتاح السهم المتّجه للأسفل للتبديل بين النوافذ.</translation>
+<translation id="688631446150864480">يرجى الضغط على مفتاح السهم المتّجه للأسفل للتبديل بين النوافذ.</translation>
 <translation id="6896758677409633944">نسخ</translation>
 <translation id="6912841030378044227">التركيز على شريط العناوين</translation>
 <translation id="6912901278692845878">جولة سريعة</translation>
@@ -2026,7 +2026,7 @@
 <translation id="7600875258240007829">الاطّلاع على جميع الإشعارات</translation>
 <translation id="7601417191446344542">تفعيل تذكير تلقائي ينبّهك إلى أن الصوت مكتوم؟</translation>
 <translation id="7602187221150705972">‏البحث عن رموز الإيموجي وصور GIF وغير ذلك</translation>
-<translation id="7607002721634913082">تعليق التحميل</translation>
+<translation id="7607002721634913082">متوقف مؤقتًا</translation>
 <translation id="7609951632080598826">عرض التقويم، <ph name="DATE" />، <ph name="TIME" /></translation>
 <translation id="7611213136657090146">تمت إعادة توصيل الكاميرا.</translation>
 <translation id="7613620083300976559">تفعيل عناصر التحكّم في اللعبة</translation>
@@ -2053,7 +2053,7 @@
 <translation id="7672095158465655885">تم الاتصال بـ "<ph name="NAME" />"، <ph name="SUBTEXT" /></translation>
 <translation id="7682351277038250258">لصق المحتوى من الحافظة كنص عادي</translation>
 <translation id="7684531502177797067">تم ضبط إعدادات الكاميرا على <ph name="CAMERA_NAME" />.</translation>
-<translation id="7687172143976244806">فتحتَه</translation>
+<translation id="7687172143976244806">فتحته</translation>
 <translation id="7689817529363080918">يتيح هذا الإجراء وصول "<ph name="APP1_NAME" />" و"<ph name="APP2_NAME" />" وجميع التطبيقات والمواقع الإلكترونية إلى الميكروفون من خلال منحها إذن استخدام الميكروفون.</translation>
 <translation id="7704000866383261579">إعادة آخر إجراء</translation>
 <translation id="7705524343798198388">VPN</translation>
@@ -2083,7 +2083,7 @@
 <translation id="7780094051999721182">الاختصارات</translation>
 <translation id="7780159184141939021">تدوير الشاشة</translation>
 <translation id="7781829728241885113">أمس</translation>
-<translation id="7787212146956232129">تم ضبط أجهزة الإدخال والإخراج. انتقِل إلى "الإعدادات" لتغيير ذلك.</translation>
+<translation id="7787212146956232129">تم ضبط أجهزة الإدخال والإخراج. يُرجى الانتقال إلى "الإعدادات" لتغيير ذلك.</translation>
 <translation id="7792590255364786396">مرئي</translation>
 <translation id="7796735576426975947">تم إخفاء إشعار جديد</translation>
 <translation id="7798302898096527229">‏اضغط على مفتاح البحث أو المفتاح Shift للإلغاء.</translation>
@@ -2527,7 +2527,7 @@
 <translation id="945383118875625837">اسحب الرابط إلى شريط الإشارات</translation>
 <translation id="945522503751344254">إرسال ملاحظات</translation>
 <translation id="951991426597076286">رفض</translation>
-<translation id="953431725143473984">هل تريد إطفاء الجهاز؟</translation>
+<translation id="953431725143473984">هل المطلوب إطفاء الجهاز؟</translation>
 <translation id="954052413789300507">لا تتوفّر مساحة كافية لتنزيل الملف <ph name="FILENAME" />. عليك إخلاء بعض المساحة.</translation>
 <translation id="954520015070501466">30 دقيقة</translation>
 <translation id="956452277966142925">إعدادات "لوحة بيانات الألعاب"</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index 3bad4435..9c3e6db0 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -345,7 +345,7 @@
 <translation id="2152796271648108398">מזג האוויר הנוכחי</translation>
 <translation id="2152895518047545149">נראה שכלום לא חסר. כל הכבוד!</translation>
 <translation id="2159568970844941445">אין תמונות באפליקציית 'קבצים'</translation>
-<translation id="2161132820593978283">אפשר להפעיל את הפריים האוטומטי במצלמה כדי למקם את עצמך במרכז המסך בשיחות וידאו. ניתן להפעיל אותו בהגדרות המהירות.</translation>
+<translation id="2161132820593978283">אפשר להפעיל את הפריים האוטומטי במצלמה כדי למקם את עצמך במרכז המסך בשיחות וידאו. כדי לנסות, צריך להיכנס להגדרות המהירות.</translation>
 <translation id="216955976692983107">Tiled resize window toward the right</translation>
 <translation id="2185166372312820725">מעבר לכרטיסייה הקודמת</translation>
 <translation id="2185444992308415167">מקשי קיצור למעבר בין כרטיסיות 1 עד 8</translation>
@@ -1050,7 +1050,7 @@
 <translation id="4445159312344259901">היכנסו כדי לבטל את הנעילה</translation>
 <translation id="4449692009715125625">{NUM_NOTIFICATIONS,plural, =1{התראה חשובה אחת}one{# התראות חשובות}two{# התראות חשובות}other{# התראות חשובות}}</translation>
 <translation id="4450893287417543264">אין להציג שוב</translation>
-<translation id="4451374464530248585">‏מקשי הקיצור Alt + חץ למטה הוחלפו. כדי לדמות את הפעולה של המקש Page Down, יש להקיש על <ph name="LAUNCHER_KEY_NAME" /> + החץ למטה.</translation>
+<translation id="4451374464530248585">‏מקשי הקיצור Alt + חץ למטה הוחלפו. כדי לדמות את הפעולה של המקש Page Down, צריך ללחוץ על <ph name="LAUNCHER_KEY_NAME" /> + החץ למטה.</translation>
 <translation id="4453876312474547652">‏הלוח מוצג כשלוחצים לחיצה ארוכה על Ctrl + V. אם רוצים להשבית את מקש הקיצור הזה, משביתים את התכונה הניסיונית ‎#clipboard-history-longpress בכתובת chrome://flags (ב-Lacros, בכתובת os://flags).</translation>
 <translation id="445765352722456792">שינוי ההעדפות להצעות</translation>
 <translation id="445864333228800152">ערב טוב,</translation>
@@ -1411,7 +1411,7 @@
 <translation id="5572632238877308040">האפליקציות שחייבים להכיר</translation>
 <translation id="557563299383177668">הפסקה הבאה</translation>
 <translation id="5577082622442191756">‏הפעלה או השבתה של Bluetooth. <ph name="STATE_TEXT" />.</translation>
-<translation id="5577281275355252094">‏יש לבדוק שה-Bluetooth פועל בטלפון כדי להשתמש ב-Phone Hub</translation>
+<translation id="5577281275355252094">‏רוצה להשתמש ב-Phone Hub? צריך לבדוק שה-Bluetooth פועל בטלפון</translation>
 <translation id="5578188167649348993">זיכרון</translation>
 <translation id="5580000943347215299">ספרייה</translation>
 <translation id="5586388332127302891">התכונה 'זכוכית מגדלת במצב מעוגן' מופעלת. אפשר להקיש שוב על <ph name="ACCELERATOR" /> כדי להשבית אותה.</translation>
@@ -1910,7 +1910,7 @@
 <translation id="7189412385142492784">מה המרחק בין כדור הארץ לנוגה</translation>
 <translation id="7198435252016571249">המצלמה מוצמדת לפינה השמאלית התחתונה. התנגשות עם תצוגת המערכת.</translation>
 <translation id="7219573373513695352">אין מכשירים מחוברים</translation>
-<translation id="7228968829656641943">‏בחירה כדי לחפש במסך שלי. כדי לנווט באמצעות המקלדת, מקישים על מקש Tab ואז על מקש הרווח.</translation>
+<translation id="7228968829656641943">‏כדי לחפש, צריך לסמן אזור במסך. כדי לנווט באמצעות המקלדת, צריך ללחוץ על מקש Tab ואז על מקש הרווח.</translation>
 <translation id="7229029500464092426">זיכרון פנוי: <ph name="AVAILABLE_MEMORY" /> | סה"כ: <ph name="TOTAL_MEMORY" /></translation>
 <translation id="7239814253344511868">שני כפתורי העכבר</translation>
 <translation id="7240636904654154599">‏נוצר גיליון אלקטרוני ב-Google Sheets</translation>
@@ -2213,7 +2213,7 @@
 <translation id="8149413265954228307">‏צפייה בהגדרות Bluetooth‏. <ph name="STATE_TEXT" />.</translation>
 <translation id="8152092012181020186">‏כדי לסגור, יש להקיש על Ctrl +‏ W.</translation>
 <translation id="8152264887680882389"><ph name="TEXT" />, השלמה אוטומטית</translation>
-<translation id="8155007568264258537"><ph name="FEATURE_NAME" /> ההגדרה הזו מנוהלת על-ידי מנהל המערכת שלך.</translation>
+<translation id="8155007568264258537"><ph name="FEATURE_NAME" /> ההגדרה הזו מנוהלת על ידי האדמין שלך.</translation>
 <translation id="8155628902202578800">פתיחת תיבת דו-שיח עם מידע על <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="8167567890448493835">המיקום הנוכחי הוא<ph name="LOCALE_NAME" /></translation>
 <translation id="8168435359814927499">תוכן</translation>
@@ -2512,7 +2512,7 @@
 <translation id="9195990613383871904">מחר</translation>
 <translation id="9198992156681343238">הרזולוציה של <ph name="DISPLAY_NAME" /> שונתה ל-<ph name="RESOLUTION" />. לשמירת השינויים, יש ללחוץ על 'אישור'. ההגדרות הקודמות ישוחזרו בעוד <ph name="TIMEOUT_SECONDS" />.</translation>
 <translation id="9201044636667689546">‏יש לחבר את <ph name="NAME" /> ל-Chromebook הזה</translation>
-<translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, הרשת מנוהלת על ידי מנהל המערכת שלך</translation>
+<translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, הרשת מנוהלת על ידי האדמין שלך</translation>
 <translation id="9207682216934703221">‏כך <ph name="APP_NAME" />,‏ <ph name="APP2_NAME" /> וכל האפליקציות והאתרים עם הרשאת המיקום ו-ChromeOS יוכלו להשתמש במיקום ב-Wi-Fi וברשתות סלולריות.</translation>
 <translation id="9210037371811586452">‏יציאה ממצב Unified Desktop</translation>
 <translation id="9211490828691860325">כל שולחנות העבודה הווירטואליים</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb
index 6d9797c..0fac89c 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb
@@ -41,7 +41,7 @@
 <translation id="2501853267655415902">تم إيقاف التسجيل</translation>
 <translation id="2517472476991765520">فحص</translation>
 <translation id="2549985041256363841">بدء التسجيل</translation>
-<translation id="2577915835281444458">سيتوقف التسجيل قريبًا. انتقِل إلى إعدادات مساحة التخزين في الجهاز لإخلاء بعض المساحة.</translation>
+<translation id="2577915835281444458">سيتوقف التسجيل قريبًا. يمكنك الانتقال إلى إعدادات مساحة التخزين في الجهاز لإخلاء بعض المساحة.</translation>
 <translation id="2599796128805996109">الكاميرا الخلفية</translation>
 <translation id="2654491636277477479">نسخ النص الذي تم رصده</translation>
 <translation id="2759905922487820242"><ph name="CURRENT" /> / <ph name="MAXIMAL" /> ثانية</translation>
@@ -142,7 +142,7 @@
 <translation id="7488619942230388918">‏تسجيل فيديو بتنسيق GIF</translation>
 <translation id="7527714402753141485">يتم عرض النص وزر للنسخ</translation>
 <translation id="7557677699350329807">التبديل إلى الكاميرا التالية</translation>
-<translation id="7607002721634913082">تعليق التحميل</translation>
+<translation id="7607002721634913082">متوقف مؤقتًا</translation>
 <translation id="7608223098072244877">4 × 4</translation>
 <translation id="761421184377987513">جارٍ نقل زاوية المستند في اتجاه أسفل اليسار</translation>
 <translation id="7649070708921625228">مساعدة</translation>
diff --git a/build/modules/android-arm/BUILD.gn b/build/modules/android-arm/BUILD.gn
index e568ee6..e60e0b2 100644
--- a/build/modules/android-arm/BUILD.gn
+++ b/build/modules/android-arm/BUILD.gn
@@ -7,8 +7,9 @@
 
 import("//buildtools/third_party/libc++/modules.gni")
 
-modulemap_config("sysroot_modulemap") {
-  source = "module.modulemap"
+sysroot_modulemap("sysroot_modulemap") {
+  source = "module.modulemap.in"
+  out = "${target_gen_dir}/module.modulemap"
 }
 
 builtin_module("_Builtin_float") {
diff --git a/build/modules/android-arm/module.modulemap b/build/modules/android-arm/module.modulemap
deleted file mode 100644
index 7b22a089e..0000000
--- a/build/modules/android-arm/module.modulemap
+++ /dev/null
@@ -1,365 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// AUTOGENERATED FILE. DO NOT EDIT.
-// To regenerate, see instructions at build/modules/modularize/README.md
-
-
-module sys_stage1 [system] [extern_c] {
-  module sysroot_alloca_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/alloca.h"
-    export *
-  }
-  module sysroot_android_api_level_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/api-level.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/cdefs.h"
-    export *
-  }
-  module sysroot_android_ndk_version_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/ndk-version.h"
-    export *
-  }
-  module sysroot_android_versioning_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/versioning.h"
-    export *
-  }
-  module sysroot_asm_generic_bitsperlong_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/bitsperlong.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_base_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/errno-base.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/errno.h"
-    export *
-  }
-  module sysroot_asm_generic_int_ll64_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/int-ll64.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/ioctl.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctls_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/ioctls.h"
-    export *
-  }
-  module sysroot_asm_generic_posix_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/posix_types.h"
-    export *
-  }
-  module sysroot_asm_generic_siginfo_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/siginfo.h"
-    export *
-  }
-  module sysroot_asm_generic_signal_defs_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/signal-defs.h"
-    export *
-  }
-  module sysroot_asm_generic_termbits_common_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/termbits-common.h"
-    export *
-  }
-  module sysroot_asm_generic_termbits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/termbits.h"
-    export *
-  }
-  module sysroot_asm_generic_termios_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/termios.h"
-    export *
-  }
-  module sysroot_asm_bitsperlong_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi/asm/bitsperlong.h"
-    export *
-  }
-  module sysroot_asm_errno_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi/asm/errno.h"
-    export *
-  }
-  module sysroot_asm_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi/asm/ioctl.h"
-    export *
-  }
-  module sysroot_asm_ioctls_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi/asm/ioctls.h"
-    export *
-  }
-  module sysroot_asm_posix_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi/asm/posix_types.h"
-    export *
-  }
-  module sysroot_asm_sigcontext_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi/asm/sigcontext.h"
-    export *
-  }
-  module sysroot_asm_siginfo_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi/asm/siginfo.h"
-    export *
-  }
-  module sysroot_asm_signal_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi/asm/signal.h"
-    export *
-  }
-  module sysroot_asm_termbits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi/asm/termbits.h"
-    export *
-  }
-  module sysroot_asm_termios_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi/asm/termios.h"
-    export *
-  }
-  module sysroot_asm_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi/asm/types.h"
-    export *
-  }
-  module sysroot_bits_bionic_multibyte_result_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/bionic_multibyte_result.h"
-    export *
-  }
-  module sysroot_bits_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/fcntl.h"
-    export *
-  }
-  module sysroot_bits_flock64_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/flock64.h"
-    export *
-  }
-  module sysroot_bits_getopt_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/getopt.h"
-    export *
-  }
-  module sysroot_bits_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/ioctl.h"
-    export *
-  }
-  module sysroot_bits_mbstate_t_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/mbstate_t.h"
-    export *
-  }
-  module sysroot_bits_page_size_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/page_size.h"
-    export *
-  }
-  module sysroot_bits_seek_constants_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/seek_constants.h"
-    export *
-  }
-  module sysroot_bits_wait_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/wait.h"
-    export *
-  }
-  module sysroot_bits_wchar_limits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/wchar_limits.h"
-    export *
-  }
-  module sysroot_features_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/features.h"
-    export *
-  }
-  module sysroot_getopt_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/getopt.h"
-    export *
-  }
-  module sysroot_linux_compiler_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/compiler.h"
-    export *
-  }
-  module sysroot_linux_compiler_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/compiler_types.h"
-    export *
-  }
-  module sysroot_linux_errno_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/errno.h"
-    export *
-  }
-  module sysroot_linux_fadvise_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/fadvise.h"
-    export *
-  }
-  module sysroot_linux_falloc_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/falloc.h"
-    export *
-  }
-  module sysroot_linux_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/ioctl.h"
-    export *
-  }
-  module sysroot_linux_limits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/limits.h"
-    export *
-  }
-  module sysroot_linux_openat2_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/openat2.h"
-    export *
-  }
-  module sysroot_linux_posix_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/posix_types.h"
-    export *
-  }
-  module sysroot_linux_sched_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/sched.h"
-    export *
-  }
-  module sysroot_linux_signal_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/signal.h"
-    export *
-  }
-  module sysroot_linux_stat_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/stat.h"
-    export *
-  }
-  module sysroot_linux_stddef_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/stddef.h"
-    export *
-  }
-  module sysroot_linux_termios_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/termios.h"
-    export *
-  }
-  module sysroot_linux_tty_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/tty.h"
-    export *
-  }
-  module sysroot_linux_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/types.h"
-    export *
-  }
-  module sysroot_linux_uio_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/uio.h"
-    export *
-  }
-  module sysroot_linux_wait_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/wait.h"
-    export *
-  }
-  module sysroot_locale_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/locale.h"
-    export *
-  }
-  module sysroot_setjmp_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/setjmp.h"
-    export *
-  }
-  module sysroot_sys_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/ioctl.h"
-    export *
-  }
-  module sysroot_xlocale_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/xlocale.h"
-    export *
-  }
-}
-
-module sys_stage2 [system] [extern_c] {
-  module sysroot_asm_generic_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/fcntl.h"
-    export *
-  }
-  module sysroot_asm_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi/asm/fcntl.h"
-    export *
-  }
-  module sysroot_bits_fenv_arm_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/fenv_arm.h"
-    export *
-  }
-  module sysroot_bits_flock_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/flock.h"
-    export *
-  }
-  module sysroot_bits_lockf_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/lockf.h"
-    export *
-  }
-  module sysroot_bits_pthread_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/pthread_types.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/types.h"
-    export *
-  }
-  module sysroot_bits_signal_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/signal_types.h"
-    export *
-  }
-  module sysroot_bits_strcasecmp_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/strcasecmp.h"
-    export *
-  }
-  module sysroot_bits_timespec_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/timespec.h"
-    export *
-  }
-  module sysroot_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/fcntl.h"
-    export *
-  }
-  module sysroot_linux_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/fcntl.h"
-    export *
-  }
-  module sysroot_linux_time_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/time.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/time_types.h"
-    export *
-  }
-  module sysroot_malloc_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/malloc.h"
-    export *
-  }
-  module sysroot_pthread_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/pthread.h"
-    export *
-  }
-  module sysroot_sched_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sched.h"
-    export *
-  }
-  module sysroot_signal_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/signal.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/ucontext.h"
-    export *
-  }
-  module sysroot_stdio_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/stdio.h"
-    export *
-  }
-  module sysroot_stdlib_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/stdlib.h"
-    export *
-  }
-  module sysroot_strings_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/strings.h"
-    export *
-  }
-  module sysroot_sys_select_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/select.h"
-    export *
-  }
-  module sysroot_sys_time_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/time.h"
-    export *
-  }
-  module sysroot_sys_user_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/user.h"
-    export *
-  }
-  module sysroot_threads_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/threads.h"
-    export *
-  }
-  module sysroot_time_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/time.h"
-    export *
-  }
-  module sysroot_unistd_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/unistd.h"
-    export *
-  }
-  module sysroot_wchar_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/wchar.h"
-    export *
-  }
-}
diff --git a/build/modules/android-arm/module.modulemap.in b/build/modules/android-arm/module.modulemap.in
new file mode 100644
index 0000000..0b4a1e2
--- /dev/null
+++ b/build/modules/android-arm/module.modulemap.in
@@ -0,0 +1,365 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// AUTOGENERATED FILE. DO NOT EDIT.
+// To regenerate, see instructions at build/modules/modularize/README.md
+
+
+module sys_stage1 [system] [extern_c] {
+  module sysroot_alloca_h {
+    header "$sysroot/alloca.h"
+    export *
+  }
+  module sysroot_android_api_level_h {
+    header "$sysroot/android/api-level.h"
+    header "$sysroot/sys/cdefs.h"
+    export *
+  }
+  module sysroot_android_ndk_version_h {
+    header "$sysroot/android/ndk-version.h"
+    export *
+  }
+  module sysroot_android_versioning_h {
+    header "$sysroot/android/versioning.h"
+    export *
+  }
+  module sysroot_asm_generic_bitsperlong_h {
+    header "$sysroot/asm-generic/bitsperlong.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_base_h {
+    header "$sysroot/asm-generic/errno-base.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_h {
+    header "$sysroot/asm-generic/errno.h"
+    export *
+  }
+  module sysroot_asm_generic_int_ll64_h {
+    header "$sysroot/asm-generic/int-ll64.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctl_h {
+    header "$sysroot/asm-generic/ioctl.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctls_h {
+    header "$sysroot/asm-generic/ioctls.h"
+    export *
+  }
+  module sysroot_asm_generic_posix_types_h {
+    header "$sysroot/asm-generic/posix_types.h"
+    export *
+  }
+  module sysroot_asm_generic_siginfo_h {
+    header "$sysroot/asm-generic/siginfo.h"
+    export *
+  }
+  module sysroot_asm_generic_signal_defs_h {
+    header "$sysroot/asm-generic/signal-defs.h"
+    export *
+  }
+  module sysroot_asm_generic_termbits_common_h {
+    header "$sysroot/asm-generic/termbits-common.h"
+    export *
+  }
+  module sysroot_asm_generic_termbits_h {
+    header "$sysroot/asm-generic/termbits.h"
+    export *
+  }
+  module sysroot_asm_generic_termios_h {
+    header "$sysroot/asm-generic/termios.h"
+    export *
+  }
+  module sysroot_asm_bitsperlong_h {
+    header "$sysroot/arm-linux-androideabi/asm/bitsperlong.h"
+    export *
+  }
+  module sysroot_asm_errno_h {
+    header "$sysroot/arm-linux-androideabi/asm/errno.h"
+    export *
+  }
+  module sysroot_asm_ioctl_h {
+    header "$sysroot/arm-linux-androideabi/asm/ioctl.h"
+    export *
+  }
+  module sysroot_asm_ioctls_h {
+    header "$sysroot/arm-linux-androideabi/asm/ioctls.h"
+    export *
+  }
+  module sysroot_asm_posix_types_h {
+    header "$sysroot/arm-linux-androideabi/asm/posix_types.h"
+    export *
+  }
+  module sysroot_asm_sigcontext_h {
+    header "$sysroot/arm-linux-androideabi/asm/sigcontext.h"
+    export *
+  }
+  module sysroot_asm_siginfo_h {
+    header "$sysroot/arm-linux-androideabi/asm/siginfo.h"
+    export *
+  }
+  module sysroot_asm_signal_h {
+    header "$sysroot/arm-linux-androideabi/asm/signal.h"
+    export *
+  }
+  module sysroot_asm_termbits_h {
+    header "$sysroot/arm-linux-androideabi/asm/termbits.h"
+    export *
+  }
+  module sysroot_asm_termios_h {
+    header "$sysroot/arm-linux-androideabi/asm/termios.h"
+    export *
+  }
+  module sysroot_asm_types_h {
+    header "$sysroot/arm-linux-androideabi/asm/types.h"
+    export *
+  }
+  module sysroot_bits_bionic_multibyte_result_h {
+    header "$sysroot/bits/bionic_multibyte_result.h"
+    export *
+  }
+  module sysroot_bits_fcntl_h {
+    header "$sysroot/bits/fcntl.h"
+    export *
+  }
+  module sysroot_bits_flock64_h {
+    header "$sysroot/bits/flock64.h"
+    export *
+  }
+  module sysroot_bits_getopt_h {
+    header "$sysroot/bits/getopt.h"
+    export *
+  }
+  module sysroot_bits_ioctl_h {
+    header "$sysroot/bits/ioctl.h"
+    export *
+  }
+  module sysroot_bits_mbstate_t_h {
+    header "$sysroot/bits/mbstate_t.h"
+    export *
+  }
+  module sysroot_bits_page_size_h {
+    header "$sysroot/bits/page_size.h"
+    export *
+  }
+  module sysroot_bits_seek_constants_h {
+    header "$sysroot/bits/seek_constants.h"
+    export *
+  }
+  module sysroot_bits_wait_h {
+    header "$sysroot/bits/wait.h"
+    export *
+  }
+  module sysroot_bits_wchar_limits_h {
+    header "$sysroot/bits/wchar_limits.h"
+    export *
+  }
+  module sysroot_features_h {
+    header "$sysroot/features.h"
+    export *
+  }
+  module sysroot_getopt_h {
+    header "$sysroot/getopt.h"
+    export *
+  }
+  module sysroot_linux_compiler_h {
+    header "$sysroot/linux/compiler.h"
+    export *
+  }
+  module sysroot_linux_compiler_types_h {
+    header "$sysroot/linux/compiler_types.h"
+    export *
+  }
+  module sysroot_linux_errno_h {
+    header "$sysroot/linux/errno.h"
+    export *
+  }
+  module sysroot_linux_fadvise_h {
+    header "$sysroot/linux/fadvise.h"
+    export *
+  }
+  module sysroot_linux_falloc_h {
+    header "$sysroot/linux/falloc.h"
+    export *
+  }
+  module sysroot_linux_ioctl_h {
+    header "$sysroot/linux/ioctl.h"
+    export *
+  }
+  module sysroot_linux_limits_h {
+    header "$sysroot/linux/limits.h"
+    export *
+  }
+  module sysroot_linux_openat2_h {
+    header "$sysroot/linux/openat2.h"
+    export *
+  }
+  module sysroot_linux_posix_types_h {
+    header "$sysroot/linux/posix_types.h"
+    export *
+  }
+  module sysroot_linux_sched_h {
+    header "$sysroot/linux/sched.h"
+    export *
+  }
+  module sysroot_linux_signal_h {
+    header "$sysroot/linux/signal.h"
+    export *
+  }
+  module sysroot_linux_stat_h {
+    header "$sysroot/linux/stat.h"
+    export *
+  }
+  module sysroot_linux_stddef_h {
+    header "$sysroot/linux/stddef.h"
+    export *
+  }
+  module sysroot_linux_termios_h {
+    header "$sysroot/linux/termios.h"
+    export *
+  }
+  module sysroot_linux_tty_h {
+    header "$sysroot/linux/tty.h"
+    export *
+  }
+  module sysroot_linux_types_h {
+    header "$sysroot/linux/types.h"
+    export *
+  }
+  module sysroot_linux_uio_h {
+    header "$sysroot/linux/uio.h"
+    export *
+  }
+  module sysroot_linux_wait_h {
+    header "$sysroot/linux/wait.h"
+    export *
+  }
+  module sysroot_locale_h {
+    header "$sysroot/locale.h"
+    export *
+  }
+  module sysroot_setjmp_h {
+    header "$sysroot/setjmp.h"
+    export *
+  }
+  module sysroot_sys_ioctl_h {
+    header "$sysroot/sys/ioctl.h"
+    export *
+  }
+  module sysroot_xlocale_h {
+    header "$sysroot/xlocale.h"
+    export *
+  }
+}
+
+module sys_stage2 [system] [extern_c] {
+  module sysroot_asm_generic_fcntl_h {
+    header "$sysroot/asm-generic/fcntl.h"
+    export *
+  }
+  module sysroot_asm_fcntl_h {
+    header "$sysroot/arm-linux-androideabi/asm/fcntl.h"
+    export *
+  }
+  module sysroot_bits_fenv_arm_h {
+    header "$sysroot/bits/fenv_arm.h"
+    export *
+  }
+  module sysroot_bits_flock_h {
+    header "$sysroot/bits/flock.h"
+    export *
+  }
+  module sysroot_bits_lockf_h {
+    header "$sysroot/bits/lockf.h"
+    export *
+  }
+  module sysroot_bits_pthread_types_h {
+    header "$sysroot/bits/pthread_types.h"
+    header "$sysroot/sys/types.h"
+    export *
+  }
+  module sysroot_bits_signal_types_h {
+    header "$sysroot/bits/signal_types.h"
+    export *
+  }
+  module sysroot_bits_strcasecmp_h {
+    header "$sysroot/bits/strcasecmp.h"
+    export *
+  }
+  module sysroot_bits_timespec_h {
+    header "$sysroot/bits/timespec.h"
+    export *
+  }
+  module sysroot_fcntl_h {
+    header "$sysroot/fcntl.h"
+    export *
+  }
+  module sysroot_linux_fcntl_h {
+    header "$sysroot/linux/fcntl.h"
+    export *
+  }
+  module sysroot_linux_time_h {
+    header "$sysroot/linux/time.h"
+    header "$sysroot/linux/time_types.h"
+    export *
+  }
+  module sysroot_malloc_h {
+    header "$sysroot/malloc.h"
+    export *
+  }
+  module sysroot_pthread_h {
+    header "$sysroot/pthread.h"
+    export *
+  }
+  module sysroot_sched_h {
+    header "$sysroot/sched.h"
+    export *
+  }
+  module sysroot_signal_h {
+    header "$sysroot/signal.h"
+    header "$sysroot/sys/ucontext.h"
+    export *
+  }
+  module sysroot_stdio_h {
+    header "$sysroot/stdio.h"
+    export *
+  }
+  module sysroot_stdlib_h {
+    header "$sysroot/stdlib.h"
+    export *
+  }
+  module sysroot_strings_h {
+    header "$sysroot/strings.h"
+    export *
+  }
+  module sysroot_sys_select_h {
+    header "$sysroot/sys/select.h"
+    export *
+  }
+  module sysroot_sys_time_h {
+    header "$sysroot/sys/time.h"
+    export *
+  }
+  module sysroot_sys_user_h {
+    header "$sysroot/sys/user.h"
+    export *
+  }
+  module sysroot_threads_h {
+    header "$sysroot/threads.h"
+    export *
+  }
+  module sysroot_time_h {
+    header "$sysroot/time.h"
+    export *
+  }
+  module sysroot_unistd_h {
+    header "$sysroot/unistd.h"
+    export *
+  }
+  module sysroot_wchar_h {
+    header "$sysroot/wchar.h"
+    export *
+  }
+}
diff --git a/build/modules/android-arm64/BUILD.gn b/build/modules/android-arm64/BUILD.gn
index e568ee6..e60e0b2 100644
--- a/build/modules/android-arm64/BUILD.gn
+++ b/build/modules/android-arm64/BUILD.gn
@@ -7,8 +7,9 @@
 
 import("//buildtools/third_party/libc++/modules.gni")
 
-modulemap_config("sysroot_modulemap") {
-  source = "module.modulemap"
+sysroot_modulemap("sysroot_modulemap") {
+  source = "module.modulemap.in"
+  out = "${target_gen_dir}/module.modulemap"
 }
 
 builtin_module("_Builtin_float") {
diff --git a/build/modules/android-arm64/module.modulemap b/build/modules/android-arm64/module.modulemap
deleted file mode 100644
index 338e235..0000000
--- a/build/modules/android-arm64/module.modulemap
+++ /dev/null
@@ -1,377 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// AUTOGENERATED FILE. DO NOT EDIT.
-// To regenerate, see instructions at build/modules/modularize/README.md
-
-
-module sys_stage1 [system] [extern_c] {
-  module sysroot_alloca_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/alloca.h"
-    export *
-  }
-  module sysroot_android_api_level_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/api-level.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/cdefs.h"
-    export *
-  }
-  module sysroot_android_ndk_version_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/ndk-version.h"
-    export *
-  }
-  module sysroot_android_versioning_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/versioning.h"
-    export *
-  }
-  module sysroot_asm_generic_bitsperlong_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/bitsperlong.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_base_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/errno-base.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/errno.h"
-    export *
-  }
-  module sysroot_asm_generic_int_ll64_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/int-ll64.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/ioctl.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctls_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/ioctls.h"
-    export *
-  }
-  module sysroot_asm_generic_posix_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/posix_types.h"
-    export *
-  }
-  module sysroot_asm_generic_siginfo_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/siginfo.h"
-    export *
-  }
-  module sysroot_asm_generic_signal_defs_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/signal-defs.h"
-    export *
-  }
-  module sysroot_asm_generic_signal_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/signal.h"
-    export *
-  }
-  module sysroot_asm_generic_termbits_common_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/termbits-common.h"
-    export *
-  }
-  module sysroot_asm_generic_termbits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/termbits.h"
-    export *
-  }
-  module sysroot_asm_generic_termios_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/termios.h"
-    export *
-  }
-  module sysroot_asm_generic_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/types.h"
-    export *
-  }
-  module sysroot_asm_bitsperlong_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android/asm/bitsperlong.h"
-    export *
-  }
-  module sysroot_asm_errno_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android/asm/errno.h"
-    export *
-  }
-  module sysroot_asm_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android/asm/ioctl.h"
-    export *
-  }
-  module sysroot_asm_ioctls_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android/asm/ioctls.h"
-    export *
-  }
-  module sysroot_asm_posix_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android/asm/posix_types.h"
-    export *
-  }
-  module sysroot_asm_sigcontext_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android/asm/sigcontext.h"
-    export *
-  }
-  module sysroot_asm_siginfo_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android/asm/siginfo.h"
-    export *
-  }
-  module sysroot_asm_signal_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android/asm/signal.h"
-    export *
-  }
-  module sysroot_asm_sve_context_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android/asm/sve_context.h"
-    export *
-  }
-  module sysroot_asm_termbits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android/asm/termbits.h"
-    export *
-  }
-  module sysroot_asm_termios_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android/asm/termios.h"
-    export *
-  }
-  module sysroot_asm_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android/asm/types.h"
-    export *
-  }
-  module sysroot_bits_bionic_multibyte_result_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/bionic_multibyte_result.h"
-    export *
-  }
-  module sysroot_bits_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/fcntl.h"
-    export *
-  }
-  module sysroot_bits_flock64_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/flock64.h"
-    export *
-  }
-  module sysroot_bits_getopt_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/getopt.h"
-    export *
-  }
-  module sysroot_bits_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/ioctl.h"
-    export *
-  }
-  module sysroot_bits_mbstate_t_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/mbstate_t.h"
-    export *
-  }
-  module sysroot_bits_page_size_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/page_size.h"
-    export *
-  }
-  module sysroot_bits_seek_constants_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/seek_constants.h"
-    export *
-  }
-  module sysroot_bits_wait_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/wait.h"
-    export *
-  }
-  module sysroot_bits_wchar_limits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/wchar_limits.h"
-    export *
-  }
-  module sysroot_features_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/features.h"
-    export *
-  }
-  module sysroot_getopt_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/getopt.h"
-    export *
-  }
-  module sysroot_linux_compiler_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/compiler.h"
-    export *
-  }
-  module sysroot_linux_compiler_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/compiler_types.h"
-    export *
-  }
-  module sysroot_linux_errno_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/errno.h"
-    export *
-  }
-  module sysroot_linux_fadvise_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/fadvise.h"
-    export *
-  }
-  module sysroot_linux_falloc_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/falloc.h"
-    export *
-  }
-  module sysroot_linux_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/ioctl.h"
-    export *
-  }
-  module sysroot_linux_limits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/limits.h"
-    export *
-  }
-  module sysroot_linux_openat2_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/openat2.h"
-    export *
-  }
-  module sysroot_linux_posix_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/posix_types.h"
-    export *
-  }
-  module sysroot_linux_sched_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/sched.h"
-    export *
-  }
-  module sysroot_linux_signal_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/signal.h"
-    export *
-  }
-  module sysroot_linux_stat_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/stat.h"
-    export *
-  }
-  module sysroot_linux_stddef_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/stddef.h"
-    export *
-  }
-  module sysroot_linux_termios_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/termios.h"
-    export *
-  }
-  module sysroot_linux_tty_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/tty.h"
-    export *
-  }
-  module sysroot_linux_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/types.h"
-    export *
-  }
-  module sysroot_linux_uio_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/uio.h"
-    export *
-  }
-  module sysroot_linux_wait_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/wait.h"
-    export *
-  }
-  module sysroot_locale_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/locale.h"
-    export *
-  }
-  module sysroot_setjmp_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/setjmp.h"
-    export *
-  }
-  module sysroot_sys_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/ioctl.h"
-    export *
-  }
-  module sysroot_xlocale_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/xlocale.h"
-    export *
-  }
-}
-
-module sys_stage2 [system] [extern_c] {
-  module sysroot_asm_generic_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/fcntl.h"
-    export *
-  }
-  module sysroot_asm_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android/asm/fcntl.h"
-    export *
-  }
-  module sysroot_bits_fenv_arm_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/fenv_arm.h"
-    export *
-  }
-  module sysroot_bits_flock_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/flock.h"
-    export *
-  }
-  module sysroot_bits_lockf_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/lockf.h"
-    export *
-  }
-  module sysroot_bits_pthread_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/pthread_types.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/types.h"
-    export *
-  }
-  module sysroot_bits_signal_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/signal_types.h"
-    export *
-  }
-  module sysroot_bits_strcasecmp_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/strcasecmp.h"
-    export *
-  }
-  module sysroot_bits_timespec_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/timespec.h"
-    export *
-  }
-  module sysroot_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/fcntl.h"
-    export *
-  }
-  module sysroot_linux_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/fcntl.h"
-    export *
-  }
-  module sysroot_linux_time_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/time.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/time_types.h"
-    export *
-  }
-  module sysroot_malloc_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/malloc.h"
-    export *
-  }
-  module sysroot_pthread_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/pthread.h"
-    export *
-  }
-  module sysroot_sched_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sched.h"
-    export *
-  }
-  module sysroot_signal_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/signal.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/ucontext.h"
-    export *
-  }
-  module sysroot_stdio_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/stdio.h"
-    export *
-  }
-  module sysroot_stdlib_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/stdlib.h"
-    export *
-  }
-  module sysroot_strings_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/strings.h"
-    export *
-  }
-  module sysroot_sys_select_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/select.h"
-    export *
-  }
-  module sysroot_sys_time_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/time.h"
-    export *
-  }
-  module sysroot_sys_user_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/user.h"
-    export *
-  }
-  module sysroot_threads_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/threads.h"
-    export *
-  }
-  module sysroot_time_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/time.h"
-    export *
-  }
-  module sysroot_unistd_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/unistd.h"
-    export *
-  }
-  module sysroot_wchar_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/wchar.h"
-    export *
-  }
-}
diff --git a/build/modules/android-arm64/module.modulemap.in b/build/modules/android-arm64/module.modulemap.in
new file mode 100644
index 0000000..0e37588
--- /dev/null
+++ b/build/modules/android-arm64/module.modulemap.in
@@ -0,0 +1,377 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// AUTOGENERATED FILE. DO NOT EDIT.
+// To regenerate, see instructions at build/modules/modularize/README.md
+
+
+module sys_stage1 [system] [extern_c] {
+  module sysroot_alloca_h {
+    header "$sysroot/alloca.h"
+    export *
+  }
+  module sysroot_android_api_level_h {
+    header "$sysroot/android/api-level.h"
+    header "$sysroot/sys/cdefs.h"
+    export *
+  }
+  module sysroot_android_ndk_version_h {
+    header "$sysroot/android/ndk-version.h"
+    export *
+  }
+  module sysroot_android_versioning_h {
+    header "$sysroot/android/versioning.h"
+    export *
+  }
+  module sysroot_asm_generic_bitsperlong_h {
+    header "$sysroot/asm-generic/bitsperlong.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_base_h {
+    header "$sysroot/asm-generic/errno-base.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_h {
+    header "$sysroot/asm-generic/errno.h"
+    export *
+  }
+  module sysroot_asm_generic_int_ll64_h {
+    header "$sysroot/asm-generic/int-ll64.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctl_h {
+    header "$sysroot/asm-generic/ioctl.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctls_h {
+    header "$sysroot/asm-generic/ioctls.h"
+    export *
+  }
+  module sysroot_asm_generic_posix_types_h {
+    header "$sysroot/asm-generic/posix_types.h"
+    export *
+  }
+  module sysroot_asm_generic_siginfo_h {
+    header "$sysroot/asm-generic/siginfo.h"
+    export *
+  }
+  module sysroot_asm_generic_signal_defs_h {
+    header "$sysroot/asm-generic/signal-defs.h"
+    export *
+  }
+  module sysroot_asm_generic_signal_h {
+    header "$sysroot/asm-generic/signal.h"
+    export *
+  }
+  module sysroot_asm_generic_termbits_common_h {
+    header "$sysroot/asm-generic/termbits-common.h"
+    export *
+  }
+  module sysroot_asm_generic_termbits_h {
+    header "$sysroot/asm-generic/termbits.h"
+    export *
+  }
+  module sysroot_asm_generic_termios_h {
+    header "$sysroot/asm-generic/termios.h"
+    export *
+  }
+  module sysroot_asm_generic_types_h {
+    header "$sysroot/asm-generic/types.h"
+    export *
+  }
+  module sysroot_asm_bitsperlong_h {
+    header "$sysroot/aarch64-linux-android/asm/bitsperlong.h"
+    export *
+  }
+  module sysroot_asm_errno_h {
+    header "$sysroot/aarch64-linux-android/asm/errno.h"
+    export *
+  }
+  module sysroot_asm_ioctl_h {
+    header "$sysroot/aarch64-linux-android/asm/ioctl.h"
+    export *
+  }
+  module sysroot_asm_ioctls_h {
+    header "$sysroot/aarch64-linux-android/asm/ioctls.h"
+    export *
+  }
+  module sysroot_asm_posix_types_h {
+    header "$sysroot/aarch64-linux-android/asm/posix_types.h"
+    export *
+  }
+  module sysroot_asm_sigcontext_h {
+    header "$sysroot/aarch64-linux-android/asm/sigcontext.h"
+    export *
+  }
+  module sysroot_asm_siginfo_h {
+    header "$sysroot/aarch64-linux-android/asm/siginfo.h"
+    export *
+  }
+  module sysroot_asm_signal_h {
+    header "$sysroot/aarch64-linux-android/asm/signal.h"
+    export *
+  }
+  module sysroot_asm_sve_context_h {
+    header "$sysroot/aarch64-linux-android/asm/sve_context.h"
+    export *
+  }
+  module sysroot_asm_termbits_h {
+    header "$sysroot/aarch64-linux-android/asm/termbits.h"
+    export *
+  }
+  module sysroot_asm_termios_h {
+    header "$sysroot/aarch64-linux-android/asm/termios.h"
+    export *
+  }
+  module sysroot_asm_types_h {
+    header "$sysroot/aarch64-linux-android/asm/types.h"
+    export *
+  }
+  module sysroot_bits_bionic_multibyte_result_h {
+    header "$sysroot/bits/bionic_multibyte_result.h"
+    export *
+  }
+  module sysroot_bits_fcntl_h {
+    header "$sysroot/bits/fcntl.h"
+    export *
+  }
+  module sysroot_bits_flock64_h {
+    header "$sysroot/bits/flock64.h"
+    export *
+  }
+  module sysroot_bits_getopt_h {
+    header "$sysroot/bits/getopt.h"
+    export *
+  }
+  module sysroot_bits_ioctl_h {
+    header "$sysroot/bits/ioctl.h"
+    export *
+  }
+  module sysroot_bits_mbstate_t_h {
+    header "$sysroot/bits/mbstate_t.h"
+    export *
+  }
+  module sysroot_bits_page_size_h {
+    header "$sysroot/bits/page_size.h"
+    export *
+  }
+  module sysroot_bits_seek_constants_h {
+    header "$sysroot/bits/seek_constants.h"
+    export *
+  }
+  module sysroot_bits_wait_h {
+    header "$sysroot/bits/wait.h"
+    export *
+  }
+  module sysroot_bits_wchar_limits_h {
+    header "$sysroot/bits/wchar_limits.h"
+    export *
+  }
+  module sysroot_features_h {
+    header "$sysroot/features.h"
+    export *
+  }
+  module sysroot_getopt_h {
+    header "$sysroot/getopt.h"
+    export *
+  }
+  module sysroot_linux_compiler_h {
+    header "$sysroot/linux/compiler.h"
+    export *
+  }
+  module sysroot_linux_compiler_types_h {
+    header "$sysroot/linux/compiler_types.h"
+    export *
+  }
+  module sysroot_linux_errno_h {
+    header "$sysroot/linux/errno.h"
+    export *
+  }
+  module sysroot_linux_fadvise_h {
+    header "$sysroot/linux/fadvise.h"
+    export *
+  }
+  module sysroot_linux_falloc_h {
+    header "$sysroot/linux/falloc.h"
+    export *
+  }
+  module sysroot_linux_ioctl_h {
+    header "$sysroot/linux/ioctl.h"
+    export *
+  }
+  module sysroot_linux_limits_h {
+    header "$sysroot/linux/limits.h"
+    export *
+  }
+  module sysroot_linux_openat2_h {
+    header "$sysroot/linux/openat2.h"
+    export *
+  }
+  module sysroot_linux_posix_types_h {
+    header "$sysroot/linux/posix_types.h"
+    export *
+  }
+  module sysroot_linux_sched_h {
+    header "$sysroot/linux/sched.h"
+    export *
+  }
+  module sysroot_linux_signal_h {
+    header "$sysroot/linux/signal.h"
+    export *
+  }
+  module sysroot_linux_stat_h {
+    header "$sysroot/linux/stat.h"
+    export *
+  }
+  module sysroot_linux_stddef_h {
+    header "$sysroot/linux/stddef.h"
+    export *
+  }
+  module sysroot_linux_termios_h {
+    header "$sysroot/linux/termios.h"
+    export *
+  }
+  module sysroot_linux_tty_h {
+    header "$sysroot/linux/tty.h"
+    export *
+  }
+  module sysroot_linux_types_h {
+    header "$sysroot/linux/types.h"
+    export *
+  }
+  module sysroot_linux_uio_h {
+    header "$sysroot/linux/uio.h"
+    export *
+  }
+  module sysroot_linux_wait_h {
+    header "$sysroot/linux/wait.h"
+    export *
+  }
+  module sysroot_locale_h {
+    header "$sysroot/locale.h"
+    export *
+  }
+  module sysroot_setjmp_h {
+    header "$sysroot/setjmp.h"
+    export *
+  }
+  module sysroot_sys_ioctl_h {
+    header "$sysroot/sys/ioctl.h"
+    export *
+  }
+  module sysroot_xlocale_h {
+    header "$sysroot/xlocale.h"
+    export *
+  }
+}
+
+module sys_stage2 [system] [extern_c] {
+  module sysroot_asm_generic_fcntl_h {
+    header "$sysroot/asm-generic/fcntl.h"
+    export *
+  }
+  module sysroot_asm_fcntl_h {
+    header "$sysroot/aarch64-linux-android/asm/fcntl.h"
+    export *
+  }
+  module sysroot_bits_fenv_arm_h {
+    header "$sysroot/bits/fenv_arm.h"
+    export *
+  }
+  module sysroot_bits_flock_h {
+    header "$sysroot/bits/flock.h"
+    export *
+  }
+  module sysroot_bits_lockf_h {
+    header "$sysroot/bits/lockf.h"
+    export *
+  }
+  module sysroot_bits_pthread_types_h {
+    header "$sysroot/bits/pthread_types.h"
+    header "$sysroot/sys/types.h"
+    export *
+  }
+  module sysroot_bits_signal_types_h {
+    header "$sysroot/bits/signal_types.h"
+    export *
+  }
+  module sysroot_bits_strcasecmp_h {
+    header "$sysroot/bits/strcasecmp.h"
+    export *
+  }
+  module sysroot_bits_timespec_h {
+    header "$sysroot/bits/timespec.h"
+    export *
+  }
+  module sysroot_fcntl_h {
+    header "$sysroot/fcntl.h"
+    export *
+  }
+  module sysroot_linux_fcntl_h {
+    header "$sysroot/linux/fcntl.h"
+    export *
+  }
+  module sysroot_linux_time_h {
+    header "$sysroot/linux/time.h"
+    header "$sysroot/linux/time_types.h"
+    export *
+  }
+  module sysroot_malloc_h {
+    header "$sysroot/malloc.h"
+    export *
+  }
+  module sysroot_pthread_h {
+    header "$sysroot/pthread.h"
+    export *
+  }
+  module sysroot_sched_h {
+    header "$sysroot/sched.h"
+    export *
+  }
+  module sysroot_signal_h {
+    header "$sysroot/signal.h"
+    header "$sysroot/sys/ucontext.h"
+    export *
+  }
+  module sysroot_stdio_h {
+    header "$sysroot/stdio.h"
+    export *
+  }
+  module sysroot_stdlib_h {
+    header "$sysroot/stdlib.h"
+    export *
+  }
+  module sysroot_strings_h {
+    header "$sysroot/strings.h"
+    export *
+  }
+  module sysroot_sys_select_h {
+    header "$sysroot/sys/select.h"
+    export *
+  }
+  module sysroot_sys_time_h {
+    header "$sysroot/sys/time.h"
+    export *
+  }
+  module sysroot_sys_user_h {
+    header "$sysroot/sys/user.h"
+    export *
+  }
+  module sysroot_threads_h {
+    header "$sysroot/threads.h"
+    export *
+  }
+  module sysroot_time_h {
+    header "$sysroot/time.h"
+    export *
+  }
+  module sysroot_unistd_h {
+    header "$sysroot/unistd.h"
+    export *
+  }
+  module sysroot_wchar_h {
+    header "$sysroot/wchar.h"
+    export *
+  }
+}
diff --git a/build/modules/android-x64/BUILD.gn b/build/modules/android-x64/BUILD.gn
index e568ee6..e60e0b2 100644
--- a/build/modules/android-x64/BUILD.gn
+++ b/build/modules/android-x64/BUILD.gn
@@ -7,8 +7,9 @@
 
 import("//buildtools/third_party/libc++/modules.gni")
 
-modulemap_config("sysroot_modulemap") {
-  source = "module.modulemap"
+sysroot_modulemap("sysroot_modulemap") {
+  source = "module.modulemap.in"
+  out = "${target_gen_dir}/module.modulemap"
 }
 
 builtin_module("_Builtin_float") {
diff --git a/build/modules/android-x64/module.modulemap b/build/modules/android-x64/module.modulemap
deleted file mode 100644
index b671540..0000000
--- a/build/modules/android-x64/module.modulemap
+++ /dev/null
@@ -1,373 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// AUTOGENERATED FILE. DO NOT EDIT.
-// To regenerate, see instructions at build/modules/modularize/README.md
-
-
-module sys_stage1 [system] [extern_c] {
-  module sysroot_alloca_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/alloca.h"
-    export *
-  }
-  module sysroot_android_api_level_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/api-level.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/cdefs.h"
-    export *
-  }
-  module sysroot_android_ndk_version_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/ndk-version.h"
-    export *
-  }
-  module sysroot_android_versioning_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/versioning.h"
-    export *
-  }
-  module sysroot_asm_generic_bitsperlong_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/bitsperlong.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_base_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/errno-base.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/errno.h"
-    export *
-  }
-  module sysroot_asm_generic_int_ll64_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/int-ll64.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/ioctl.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctls_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/ioctls.h"
-    export *
-  }
-  module sysroot_asm_generic_posix_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/posix_types.h"
-    export *
-  }
-  module sysroot_asm_generic_siginfo_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/siginfo.h"
-    export *
-  }
-  module sysroot_asm_generic_signal_defs_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/signal-defs.h"
-    export *
-  }
-  module sysroot_asm_generic_termbits_common_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/termbits-common.h"
-    export *
-  }
-  module sysroot_asm_generic_termbits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/termbits.h"
-    export *
-  }
-  module sysroot_asm_generic_termios_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/termios.h"
-    export *
-  }
-  module sysroot_asm_generic_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/types.h"
-    export *
-  }
-  module sysroot_asm_bitsperlong_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android/asm/bitsperlong.h"
-    export *
-  }
-  module sysroot_asm_errno_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android/asm/errno.h"
-    export *
-  }
-  module sysroot_asm_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android/asm/ioctl.h"
-    export *
-  }
-  module sysroot_asm_ioctls_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android/asm/ioctls.h"
-    export *
-  }
-  module sysroot_asm_posix_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android/asm/posix_types.h"
-    export *
-  }
-  module sysroot_asm_posix_types_64_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android/asm/posix_types_64.h"
-    export *
-  }
-  module sysroot_asm_sigcontext_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android/asm/sigcontext.h"
-    export *
-  }
-  module sysroot_asm_siginfo_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android/asm/siginfo.h"
-    export *
-  }
-  module sysroot_asm_signal_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android/asm/signal.h"
-    export *
-  }
-  module sysroot_asm_termbits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android/asm/termbits.h"
-    export *
-  }
-  module sysroot_asm_termios_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android/asm/termios.h"
-    export *
-  }
-  module sysroot_asm_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android/asm/types.h"
-    export *
-  }
-  module sysroot_bits_bionic_multibyte_result_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/bionic_multibyte_result.h"
-    export *
-  }
-  module sysroot_bits_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/fcntl.h"
-    export *
-  }
-  module sysroot_bits_flock64_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/flock64.h"
-    export *
-  }
-  module sysroot_bits_getopt_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/getopt.h"
-    export *
-  }
-  module sysroot_bits_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/ioctl.h"
-    export *
-  }
-  module sysroot_bits_mbstate_t_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/mbstate_t.h"
-    export *
-  }
-  module sysroot_bits_page_size_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/page_size.h"
-    export *
-  }
-  module sysroot_bits_seek_constants_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/seek_constants.h"
-    export *
-  }
-  module sysroot_bits_wait_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/wait.h"
-    export *
-  }
-  module sysroot_bits_wchar_limits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/wchar_limits.h"
-    export *
-  }
-  module sysroot_features_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/features.h"
-    export *
-  }
-  module sysroot_getopt_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/getopt.h"
-    export *
-  }
-  module sysroot_linux_compiler_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/compiler.h"
-    export *
-  }
-  module sysroot_linux_compiler_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/compiler_types.h"
-    export *
-  }
-  module sysroot_linux_errno_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/errno.h"
-    export *
-  }
-  module sysroot_linux_fadvise_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/fadvise.h"
-    export *
-  }
-  module sysroot_linux_falloc_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/falloc.h"
-    export *
-  }
-  module sysroot_linux_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/ioctl.h"
-    export *
-  }
-  module sysroot_linux_limits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/limits.h"
-    export *
-  }
-  module sysroot_linux_openat2_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/openat2.h"
-    export *
-  }
-  module sysroot_linux_posix_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/posix_types.h"
-    export *
-  }
-  module sysroot_linux_sched_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/sched.h"
-    export *
-  }
-  module sysroot_linux_signal_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/signal.h"
-    export *
-  }
-  module sysroot_linux_stat_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/stat.h"
-    export *
-  }
-  module sysroot_linux_stddef_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/stddef.h"
-    export *
-  }
-  module sysroot_linux_termios_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/termios.h"
-    export *
-  }
-  module sysroot_linux_tty_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/tty.h"
-    export *
-  }
-  module sysroot_linux_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/types.h"
-    export *
-  }
-  module sysroot_linux_uio_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/uio.h"
-    export *
-  }
-  module sysroot_linux_wait_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/wait.h"
-    export *
-  }
-  module sysroot_locale_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/locale.h"
-    export *
-  }
-  module sysroot_setjmp_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/setjmp.h"
-    export *
-  }
-  module sysroot_sys_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/ioctl.h"
-    export *
-  }
-  module sysroot_xlocale_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/xlocale.h"
-    export *
-  }
-}
-
-module sys_stage2 [system] [extern_c] {
-  module sysroot_asm_generic_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/fcntl.h"
-    export *
-  }
-  module sysroot_asm_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android/asm/fcntl.h"
-    export *
-  }
-  module sysroot_bits_fenv_x86_64_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/fenv_x86_64.h"
-    export *
-  }
-  module sysroot_bits_flock_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/flock.h"
-    export *
-  }
-  module sysroot_bits_lockf_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/lockf.h"
-    export *
-  }
-  module sysroot_bits_pthread_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/pthread_types.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/types.h"
-    export *
-  }
-  module sysroot_bits_signal_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/signal_types.h"
-    export *
-  }
-  module sysroot_bits_strcasecmp_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/strcasecmp.h"
-    export *
-  }
-  module sysroot_bits_timespec_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/timespec.h"
-    export *
-  }
-  module sysroot_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/fcntl.h"
-    export *
-  }
-  module sysroot_linux_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/fcntl.h"
-    export *
-  }
-  module sysroot_linux_time_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/time.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/time_types.h"
-    export *
-  }
-  module sysroot_malloc_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/malloc.h"
-    export *
-  }
-  module sysroot_pthread_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/pthread.h"
-    export *
-  }
-  module sysroot_sched_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sched.h"
-    export *
-  }
-  module sysroot_signal_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/signal.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/ucontext.h"
-    export *
-  }
-  module sysroot_stdio_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/stdio.h"
-    export *
-  }
-  module sysroot_stdlib_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/stdlib.h"
-    export *
-  }
-  module sysroot_strings_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/strings.h"
-    export *
-  }
-  module sysroot_sys_select_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/select.h"
-    export *
-  }
-  module sysroot_sys_time_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/time.h"
-    export *
-  }
-  module sysroot_sys_user_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/user.h"
-    export *
-  }
-  module sysroot_threads_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/threads.h"
-    export *
-  }
-  module sysroot_time_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/time.h"
-    export *
-  }
-  module sysroot_unistd_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/unistd.h"
-    export *
-  }
-  module sysroot_wchar_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/wchar.h"
-    export *
-  }
-}
diff --git a/build/modules/android-x64/module.modulemap.in b/build/modules/android-x64/module.modulemap.in
new file mode 100644
index 0000000..195c88a
--- /dev/null
+++ b/build/modules/android-x64/module.modulemap.in
@@ -0,0 +1,373 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// AUTOGENERATED FILE. DO NOT EDIT.
+// To regenerate, see instructions at build/modules/modularize/README.md
+
+
+module sys_stage1 [system] [extern_c] {
+  module sysroot_alloca_h {
+    header "$sysroot/alloca.h"
+    export *
+  }
+  module sysroot_android_api_level_h {
+    header "$sysroot/android/api-level.h"
+    header "$sysroot/sys/cdefs.h"
+    export *
+  }
+  module sysroot_android_ndk_version_h {
+    header "$sysroot/android/ndk-version.h"
+    export *
+  }
+  module sysroot_android_versioning_h {
+    header "$sysroot/android/versioning.h"
+    export *
+  }
+  module sysroot_asm_generic_bitsperlong_h {
+    header "$sysroot/asm-generic/bitsperlong.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_base_h {
+    header "$sysroot/asm-generic/errno-base.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_h {
+    header "$sysroot/asm-generic/errno.h"
+    export *
+  }
+  module sysroot_asm_generic_int_ll64_h {
+    header "$sysroot/asm-generic/int-ll64.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctl_h {
+    header "$sysroot/asm-generic/ioctl.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctls_h {
+    header "$sysroot/asm-generic/ioctls.h"
+    export *
+  }
+  module sysroot_asm_generic_posix_types_h {
+    header "$sysroot/asm-generic/posix_types.h"
+    export *
+  }
+  module sysroot_asm_generic_siginfo_h {
+    header "$sysroot/asm-generic/siginfo.h"
+    export *
+  }
+  module sysroot_asm_generic_signal_defs_h {
+    header "$sysroot/asm-generic/signal-defs.h"
+    export *
+  }
+  module sysroot_asm_generic_termbits_common_h {
+    header "$sysroot/asm-generic/termbits-common.h"
+    export *
+  }
+  module sysroot_asm_generic_termbits_h {
+    header "$sysroot/asm-generic/termbits.h"
+    export *
+  }
+  module sysroot_asm_generic_termios_h {
+    header "$sysroot/asm-generic/termios.h"
+    export *
+  }
+  module sysroot_asm_generic_types_h {
+    header "$sysroot/asm-generic/types.h"
+    export *
+  }
+  module sysroot_asm_bitsperlong_h {
+    header "$sysroot/x86_64-linux-android/asm/bitsperlong.h"
+    export *
+  }
+  module sysroot_asm_errno_h {
+    header "$sysroot/x86_64-linux-android/asm/errno.h"
+    export *
+  }
+  module sysroot_asm_ioctl_h {
+    header "$sysroot/x86_64-linux-android/asm/ioctl.h"
+    export *
+  }
+  module sysroot_asm_ioctls_h {
+    header "$sysroot/x86_64-linux-android/asm/ioctls.h"
+    export *
+  }
+  module sysroot_asm_posix_types_h {
+    header "$sysroot/x86_64-linux-android/asm/posix_types.h"
+    export *
+  }
+  module sysroot_asm_posix_types_64_h {
+    header "$sysroot/x86_64-linux-android/asm/posix_types_64.h"
+    export *
+  }
+  module sysroot_asm_sigcontext_h {
+    header "$sysroot/x86_64-linux-android/asm/sigcontext.h"
+    export *
+  }
+  module sysroot_asm_siginfo_h {
+    header "$sysroot/x86_64-linux-android/asm/siginfo.h"
+    export *
+  }
+  module sysroot_asm_signal_h {
+    header "$sysroot/x86_64-linux-android/asm/signal.h"
+    export *
+  }
+  module sysroot_asm_termbits_h {
+    header "$sysroot/x86_64-linux-android/asm/termbits.h"
+    export *
+  }
+  module sysroot_asm_termios_h {
+    header "$sysroot/x86_64-linux-android/asm/termios.h"
+    export *
+  }
+  module sysroot_asm_types_h {
+    header "$sysroot/x86_64-linux-android/asm/types.h"
+    export *
+  }
+  module sysroot_bits_bionic_multibyte_result_h {
+    header "$sysroot/bits/bionic_multibyte_result.h"
+    export *
+  }
+  module sysroot_bits_fcntl_h {
+    header "$sysroot/bits/fcntl.h"
+    export *
+  }
+  module sysroot_bits_flock64_h {
+    header "$sysroot/bits/flock64.h"
+    export *
+  }
+  module sysroot_bits_getopt_h {
+    header "$sysroot/bits/getopt.h"
+    export *
+  }
+  module sysroot_bits_ioctl_h {
+    header "$sysroot/bits/ioctl.h"
+    export *
+  }
+  module sysroot_bits_mbstate_t_h {
+    header "$sysroot/bits/mbstate_t.h"
+    export *
+  }
+  module sysroot_bits_page_size_h {
+    header "$sysroot/bits/page_size.h"
+    export *
+  }
+  module sysroot_bits_seek_constants_h {
+    header "$sysroot/bits/seek_constants.h"
+    export *
+  }
+  module sysroot_bits_wait_h {
+    header "$sysroot/bits/wait.h"
+    export *
+  }
+  module sysroot_bits_wchar_limits_h {
+    header "$sysroot/bits/wchar_limits.h"
+    export *
+  }
+  module sysroot_features_h {
+    header "$sysroot/features.h"
+    export *
+  }
+  module sysroot_getopt_h {
+    header "$sysroot/getopt.h"
+    export *
+  }
+  module sysroot_linux_compiler_h {
+    header "$sysroot/linux/compiler.h"
+    export *
+  }
+  module sysroot_linux_compiler_types_h {
+    header "$sysroot/linux/compiler_types.h"
+    export *
+  }
+  module sysroot_linux_errno_h {
+    header "$sysroot/linux/errno.h"
+    export *
+  }
+  module sysroot_linux_fadvise_h {
+    header "$sysroot/linux/fadvise.h"
+    export *
+  }
+  module sysroot_linux_falloc_h {
+    header "$sysroot/linux/falloc.h"
+    export *
+  }
+  module sysroot_linux_ioctl_h {
+    header "$sysroot/linux/ioctl.h"
+    export *
+  }
+  module sysroot_linux_limits_h {
+    header "$sysroot/linux/limits.h"
+    export *
+  }
+  module sysroot_linux_openat2_h {
+    header "$sysroot/linux/openat2.h"
+    export *
+  }
+  module sysroot_linux_posix_types_h {
+    header "$sysroot/linux/posix_types.h"
+    export *
+  }
+  module sysroot_linux_sched_h {
+    header "$sysroot/linux/sched.h"
+    export *
+  }
+  module sysroot_linux_signal_h {
+    header "$sysroot/linux/signal.h"
+    export *
+  }
+  module sysroot_linux_stat_h {
+    header "$sysroot/linux/stat.h"
+    export *
+  }
+  module sysroot_linux_stddef_h {
+    header "$sysroot/linux/stddef.h"
+    export *
+  }
+  module sysroot_linux_termios_h {
+    header "$sysroot/linux/termios.h"
+    export *
+  }
+  module sysroot_linux_tty_h {
+    header "$sysroot/linux/tty.h"
+    export *
+  }
+  module sysroot_linux_types_h {
+    header "$sysroot/linux/types.h"
+    export *
+  }
+  module sysroot_linux_uio_h {
+    header "$sysroot/linux/uio.h"
+    export *
+  }
+  module sysroot_linux_wait_h {
+    header "$sysroot/linux/wait.h"
+    export *
+  }
+  module sysroot_locale_h {
+    header "$sysroot/locale.h"
+    export *
+  }
+  module sysroot_setjmp_h {
+    header "$sysroot/setjmp.h"
+    export *
+  }
+  module sysroot_sys_ioctl_h {
+    header "$sysroot/sys/ioctl.h"
+    export *
+  }
+  module sysroot_xlocale_h {
+    header "$sysroot/xlocale.h"
+    export *
+  }
+}
+
+module sys_stage2 [system] [extern_c] {
+  module sysroot_asm_generic_fcntl_h {
+    header "$sysroot/asm-generic/fcntl.h"
+    export *
+  }
+  module sysroot_asm_fcntl_h {
+    header "$sysroot/x86_64-linux-android/asm/fcntl.h"
+    export *
+  }
+  module sysroot_bits_fenv_x86_64_h {
+    header "$sysroot/bits/fenv_x86_64.h"
+    export *
+  }
+  module sysroot_bits_flock_h {
+    header "$sysroot/bits/flock.h"
+    export *
+  }
+  module sysroot_bits_lockf_h {
+    header "$sysroot/bits/lockf.h"
+    export *
+  }
+  module sysroot_bits_pthread_types_h {
+    header "$sysroot/bits/pthread_types.h"
+    header "$sysroot/sys/types.h"
+    export *
+  }
+  module sysroot_bits_signal_types_h {
+    header "$sysroot/bits/signal_types.h"
+    export *
+  }
+  module sysroot_bits_strcasecmp_h {
+    header "$sysroot/bits/strcasecmp.h"
+    export *
+  }
+  module sysroot_bits_timespec_h {
+    header "$sysroot/bits/timespec.h"
+    export *
+  }
+  module sysroot_fcntl_h {
+    header "$sysroot/fcntl.h"
+    export *
+  }
+  module sysroot_linux_fcntl_h {
+    header "$sysroot/linux/fcntl.h"
+    export *
+  }
+  module sysroot_linux_time_h {
+    header "$sysroot/linux/time.h"
+    header "$sysroot/linux/time_types.h"
+    export *
+  }
+  module sysroot_malloc_h {
+    header "$sysroot/malloc.h"
+    export *
+  }
+  module sysroot_pthread_h {
+    header "$sysroot/pthread.h"
+    export *
+  }
+  module sysroot_sched_h {
+    header "$sysroot/sched.h"
+    export *
+  }
+  module sysroot_signal_h {
+    header "$sysroot/signal.h"
+    header "$sysroot/sys/ucontext.h"
+    export *
+  }
+  module sysroot_stdio_h {
+    header "$sysroot/stdio.h"
+    export *
+  }
+  module sysroot_stdlib_h {
+    header "$sysroot/stdlib.h"
+    export *
+  }
+  module sysroot_strings_h {
+    header "$sysroot/strings.h"
+    export *
+  }
+  module sysroot_sys_select_h {
+    header "$sysroot/sys/select.h"
+    export *
+  }
+  module sysroot_sys_time_h {
+    header "$sysroot/sys/time.h"
+    export *
+  }
+  module sysroot_sys_user_h {
+    header "$sysroot/sys/user.h"
+    export *
+  }
+  module sysroot_threads_h {
+    header "$sysroot/threads.h"
+    export *
+  }
+  module sysroot_time_h {
+    header "$sysroot/time.h"
+    export *
+  }
+  module sysroot_unistd_h {
+    header "$sysroot/unistd.h"
+    export *
+  }
+  module sysroot_wchar_h {
+    header "$sysroot/wchar.h"
+    export *
+  }
+}
diff --git a/build/modules/android-x86/BUILD.gn b/build/modules/android-x86/BUILD.gn
index e568ee6..e60e0b2 100644
--- a/build/modules/android-x86/BUILD.gn
+++ b/build/modules/android-x86/BUILD.gn
@@ -7,8 +7,9 @@
 
 import("//buildtools/third_party/libc++/modules.gni")
 
-modulemap_config("sysroot_modulemap") {
-  source = "module.modulemap"
+sysroot_modulemap("sysroot_modulemap") {
+  source = "module.modulemap.in"
+  out = "${target_gen_dir}/module.modulemap"
 }
 
 builtin_module("_Builtin_float") {
diff --git a/build/modules/android-x86/module.modulemap b/build/modules/android-x86/module.modulemap
deleted file mode 100644
index b108264..0000000
--- a/build/modules/android-x86/module.modulemap
+++ /dev/null
@@ -1,373 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// AUTOGENERATED FILE. DO NOT EDIT.
-// To regenerate, see instructions at build/modules/modularize/README.md
-
-
-module sys_stage1 [system] [extern_c] {
-  module sysroot_alloca_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/alloca.h"
-    export *
-  }
-  module sysroot_android_api_level_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/api-level.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/cdefs.h"
-    export *
-  }
-  module sysroot_android_ndk_version_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/ndk-version.h"
-    export *
-  }
-  module sysroot_android_versioning_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/android/versioning.h"
-    export *
-  }
-  module sysroot_asm_generic_bitsperlong_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/bitsperlong.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_base_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/errno-base.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/errno.h"
-    export *
-  }
-  module sysroot_asm_generic_int_ll64_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/int-ll64.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/ioctl.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctls_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/ioctls.h"
-    export *
-  }
-  module sysroot_asm_generic_posix_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/posix_types.h"
-    export *
-  }
-  module sysroot_asm_generic_siginfo_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/siginfo.h"
-    export *
-  }
-  module sysroot_asm_generic_signal_defs_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/signal-defs.h"
-    export *
-  }
-  module sysroot_asm_generic_termbits_common_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/termbits-common.h"
-    export *
-  }
-  module sysroot_asm_generic_termbits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/termbits.h"
-    export *
-  }
-  module sysroot_asm_generic_termios_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/termios.h"
-    export *
-  }
-  module sysroot_asm_generic_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/types.h"
-    export *
-  }
-  module sysroot_asm_bitsperlong_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/i686-linux-android/asm/bitsperlong.h"
-    export *
-  }
-  module sysroot_asm_errno_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/i686-linux-android/asm/errno.h"
-    export *
-  }
-  module sysroot_asm_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/i686-linux-android/asm/ioctl.h"
-    export *
-  }
-  module sysroot_asm_ioctls_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/i686-linux-android/asm/ioctls.h"
-    export *
-  }
-  module sysroot_asm_posix_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/i686-linux-android/asm/posix_types.h"
-    export *
-  }
-  module sysroot_asm_posix_types_32_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/i686-linux-android/asm/posix_types_32.h"
-    export *
-  }
-  module sysroot_asm_sigcontext_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/i686-linux-android/asm/sigcontext.h"
-    export *
-  }
-  module sysroot_asm_siginfo_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/i686-linux-android/asm/siginfo.h"
-    export *
-  }
-  module sysroot_asm_signal_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/i686-linux-android/asm/signal.h"
-    export *
-  }
-  module sysroot_asm_termbits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/i686-linux-android/asm/termbits.h"
-    export *
-  }
-  module sysroot_asm_termios_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/i686-linux-android/asm/termios.h"
-    export *
-  }
-  module sysroot_asm_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/i686-linux-android/asm/types.h"
-    export *
-  }
-  module sysroot_bits_bionic_multibyte_result_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/bionic_multibyte_result.h"
-    export *
-  }
-  module sysroot_bits_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/fcntl.h"
-    export *
-  }
-  module sysroot_bits_flock64_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/flock64.h"
-    export *
-  }
-  module sysroot_bits_getopt_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/getopt.h"
-    export *
-  }
-  module sysroot_bits_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/ioctl.h"
-    export *
-  }
-  module sysroot_bits_mbstate_t_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/mbstate_t.h"
-    export *
-  }
-  module sysroot_bits_page_size_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/page_size.h"
-    export *
-  }
-  module sysroot_bits_seek_constants_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/seek_constants.h"
-    export *
-  }
-  module sysroot_bits_wait_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/wait.h"
-    export *
-  }
-  module sysroot_bits_wchar_limits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/wchar_limits.h"
-    export *
-  }
-  module sysroot_features_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/features.h"
-    export *
-  }
-  module sysroot_getopt_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/getopt.h"
-    export *
-  }
-  module sysroot_linux_compiler_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/compiler.h"
-    export *
-  }
-  module sysroot_linux_compiler_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/compiler_types.h"
-    export *
-  }
-  module sysroot_linux_errno_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/errno.h"
-    export *
-  }
-  module sysroot_linux_fadvise_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/fadvise.h"
-    export *
-  }
-  module sysroot_linux_falloc_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/falloc.h"
-    export *
-  }
-  module sysroot_linux_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/ioctl.h"
-    export *
-  }
-  module sysroot_linux_limits_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/limits.h"
-    export *
-  }
-  module sysroot_linux_openat2_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/openat2.h"
-    export *
-  }
-  module sysroot_linux_posix_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/posix_types.h"
-    export *
-  }
-  module sysroot_linux_sched_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/sched.h"
-    export *
-  }
-  module sysroot_linux_signal_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/signal.h"
-    export *
-  }
-  module sysroot_linux_stat_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/stat.h"
-    export *
-  }
-  module sysroot_linux_stddef_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/stddef.h"
-    export *
-  }
-  module sysroot_linux_termios_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/termios.h"
-    export *
-  }
-  module sysroot_linux_tty_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/tty.h"
-    export *
-  }
-  module sysroot_linux_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/types.h"
-    export *
-  }
-  module sysroot_linux_uio_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/uio.h"
-    export *
-  }
-  module sysroot_linux_wait_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/wait.h"
-    export *
-  }
-  module sysroot_locale_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/locale.h"
-    export *
-  }
-  module sysroot_setjmp_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/setjmp.h"
-    export *
-  }
-  module sysroot_sys_ioctl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/ioctl.h"
-    export *
-  }
-  module sysroot_xlocale_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/xlocale.h"
-    export *
-  }
-}
-
-module sys_stage2 [system] [extern_c] {
-  module sysroot_asm_generic_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/asm-generic/fcntl.h"
-    export *
-  }
-  module sysroot_asm_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/i686-linux-android/asm/fcntl.h"
-    export *
-  }
-  module sysroot_bits_fenv_x86_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/fenv_x86.h"
-    export *
-  }
-  module sysroot_bits_flock_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/flock.h"
-    export *
-  }
-  module sysroot_bits_lockf_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/lockf.h"
-    export *
-  }
-  module sysroot_bits_pthread_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/pthread_types.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/types.h"
-    export *
-  }
-  module sysroot_bits_signal_types_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/signal_types.h"
-    export *
-  }
-  module sysroot_bits_strcasecmp_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/strcasecmp.h"
-    export *
-  }
-  module sysroot_bits_timespec_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/bits/timespec.h"
-    export *
-  }
-  module sysroot_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/fcntl.h"
-    export *
-  }
-  module sysroot_linux_fcntl_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/fcntl.h"
-    export *
-  }
-  module sysroot_linux_time_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/time.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/linux/time_types.h"
-    export *
-  }
-  module sysroot_malloc_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/malloc.h"
-    export *
-  }
-  module sysroot_pthread_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/pthread.h"
-    export *
-  }
-  module sysroot_sched_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sched.h"
-    export *
-  }
-  module sysroot_signal_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/signal.h"
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/ucontext.h"
-    export *
-  }
-  module sysroot_stdio_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/stdio.h"
-    export *
-  }
-  module sysroot_stdlib_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/stdlib.h"
-    export *
-  }
-  module sysroot_strings_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/strings.h"
-    export *
-  }
-  module sysroot_sys_select_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/select.h"
-    export *
-  }
-  module sysroot_sys_time_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/time.h"
-    export *
-  }
-  module sysroot_sys_user_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/sys/user.h"
-    export *
-  }
-  module sysroot_threads_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/threads.h"
-    export *
-  }
-  module sysroot_time_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/time.h"
-    export *
-  }
-  module sysroot_unistd_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/unistd.h"
-    export *
-  }
-  module sysroot_wchar_h {
-    header "../../../third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/wchar.h"
-    export *
-  }
-}
diff --git a/build/modules/android-x86/module.modulemap.in b/build/modules/android-x86/module.modulemap.in
new file mode 100644
index 0000000..d1749e2
--- /dev/null
+++ b/build/modules/android-x86/module.modulemap.in
@@ -0,0 +1,373 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// AUTOGENERATED FILE. DO NOT EDIT.
+// To regenerate, see instructions at build/modules/modularize/README.md
+
+
+module sys_stage1 [system] [extern_c] {
+  module sysroot_alloca_h {
+    header "$sysroot/alloca.h"
+    export *
+  }
+  module sysroot_android_api_level_h {
+    header "$sysroot/android/api-level.h"
+    header "$sysroot/sys/cdefs.h"
+    export *
+  }
+  module sysroot_android_ndk_version_h {
+    header "$sysroot/android/ndk-version.h"
+    export *
+  }
+  module sysroot_android_versioning_h {
+    header "$sysroot/android/versioning.h"
+    export *
+  }
+  module sysroot_asm_generic_bitsperlong_h {
+    header "$sysroot/asm-generic/bitsperlong.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_base_h {
+    header "$sysroot/asm-generic/errno-base.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_h {
+    header "$sysroot/asm-generic/errno.h"
+    export *
+  }
+  module sysroot_asm_generic_int_ll64_h {
+    header "$sysroot/asm-generic/int-ll64.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctl_h {
+    header "$sysroot/asm-generic/ioctl.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctls_h {
+    header "$sysroot/asm-generic/ioctls.h"
+    export *
+  }
+  module sysroot_asm_generic_posix_types_h {
+    header "$sysroot/asm-generic/posix_types.h"
+    export *
+  }
+  module sysroot_asm_generic_siginfo_h {
+    header "$sysroot/asm-generic/siginfo.h"
+    export *
+  }
+  module sysroot_asm_generic_signal_defs_h {
+    header "$sysroot/asm-generic/signal-defs.h"
+    export *
+  }
+  module sysroot_asm_generic_termbits_common_h {
+    header "$sysroot/asm-generic/termbits-common.h"
+    export *
+  }
+  module sysroot_asm_generic_termbits_h {
+    header "$sysroot/asm-generic/termbits.h"
+    export *
+  }
+  module sysroot_asm_generic_termios_h {
+    header "$sysroot/asm-generic/termios.h"
+    export *
+  }
+  module sysroot_asm_generic_types_h {
+    header "$sysroot/asm-generic/types.h"
+    export *
+  }
+  module sysroot_asm_bitsperlong_h {
+    header "$sysroot/i686-linux-android/asm/bitsperlong.h"
+    export *
+  }
+  module sysroot_asm_errno_h {
+    header "$sysroot/i686-linux-android/asm/errno.h"
+    export *
+  }
+  module sysroot_asm_ioctl_h {
+    header "$sysroot/i686-linux-android/asm/ioctl.h"
+    export *
+  }
+  module sysroot_asm_ioctls_h {
+    header "$sysroot/i686-linux-android/asm/ioctls.h"
+    export *
+  }
+  module sysroot_asm_posix_types_h {
+    header "$sysroot/i686-linux-android/asm/posix_types.h"
+    export *
+  }
+  module sysroot_asm_posix_types_32_h {
+    header "$sysroot/i686-linux-android/asm/posix_types_32.h"
+    export *
+  }
+  module sysroot_asm_sigcontext_h {
+    header "$sysroot/i686-linux-android/asm/sigcontext.h"
+    export *
+  }
+  module sysroot_asm_siginfo_h {
+    header "$sysroot/i686-linux-android/asm/siginfo.h"
+    export *
+  }
+  module sysroot_asm_signal_h {
+    header "$sysroot/i686-linux-android/asm/signal.h"
+    export *
+  }
+  module sysroot_asm_termbits_h {
+    header "$sysroot/i686-linux-android/asm/termbits.h"
+    export *
+  }
+  module sysroot_asm_termios_h {
+    header "$sysroot/i686-linux-android/asm/termios.h"
+    export *
+  }
+  module sysroot_asm_types_h {
+    header "$sysroot/i686-linux-android/asm/types.h"
+    export *
+  }
+  module sysroot_bits_bionic_multibyte_result_h {
+    header "$sysroot/bits/bionic_multibyte_result.h"
+    export *
+  }
+  module sysroot_bits_fcntl_h {
+    header "$sysroot/bits/fcntl.h"
+    export *
+  }
+  module sysroot_bits_flock64_h {
+    header "$sysroot/bits/flock64.h"
+    export *
+  }
+  module sysroot_bits_getopt_h {
+    header "$sysroot/bits/getopt.h"
+    export *
+  }
+  module sysroot_bits_ioctl_h {
+    header "$sysroot/bits/ioctl.h"
+    export *
+  }
+  module sysroot_bits_mbstate_t_h {
+    header "$sysroot/bits/mbstate_t.h"
+    export *
+  }
+  module sysroot_bits_page_size_h {
+    header "$sysroot/bits/page_size.h"
+    export *
+  }
+  module sysroot_bits_seek_constants_h {
+    header "$sysroot/bits/seek_constants.h"
+    export *
+  }
+  module sysroot_bits_wait_h {
+    header "$sysroot/bits/wait.h"
+    export *
+  }
+  module sysroot_bits_wchar_limits_h {
+    header "$sysroot/bits/wchar_limits.h"
+    export *
+  }
+  module sysroot_features_h {
+    header "$sysroot/features.h"
+    export *
+  }
+  module sysroot_getopt_h {
+    header "$sysroot/getopt.h"
+    export *
+  }
+  module sysroot_linux_compiler_h {
+    header "$sysroot/linux/compiler.h"
+    export *
+  }
+  module sysroot_linux_compiler_types_h {
+    header "$sysroot/linux/compiler_types.h"
+    export *
+  }
+  module sysroot_linux_errno_h {
+    header "$sysroot/linux/errno.h"
+    export *
+  }
+  module sysroot_linux_fadvise_h {
+    header "$sysroot/linux/fadvise.h"
+    export *
+  }
+  module sysroot_linux_falloc_h {
+    header "$sysroot/linux/falloc.h"
+    export *
+  }
+  module sysroot_linux_ioctl_h {
+    header "$sysroot/linux/ioctl.h"
+    export *
+  }
+  module sysroot_linux_limits_h {
+    header "$sysroot/linux/limits.h"
+    export *
+  }
+  module sysroot_linux_openat2_h {
+    header "$sysroot/linux/openat2.h"
+    export *
+  }
+  module sysroot_linux_posix_types_h {
+    header "$sysroot/linux/posix_types.h"
+    export *
+  }
+  module sysroot_linux_sched_h {
+    header "$sysroot/linux/sched.h"
+    export *
+  }
+  module sysroot_linux_signal_h {
+    header "$sysroot/linux/signal.h"
+    export *
+  }
+  module sysroot_linux_stat_h {
+    header "$sysroot/linux/stat.h"
+    export *
+  }
+  module sysroot_linux_stddef_h {
+    header "$sysroot/linux/stddef.h"
+    export *
+  }
+  module sysroot_linux_termios_h {
+    header "$sysroot/linux/termios.h"
+    export *
+  }
+  module sysroot_linux_tty_h {
+    header "$sysroot/linux/tty.h"
+    export *
+  }
+  module sysroot_linux_types_h {
+    header "$sysroot/linux/types.h"
+    export *
+  }
+  module sysroot_linux_uio_h {
+    header "$sysroot/linux/uio.h"
+    export *
+  }
+  module sysroot_linux_wait_h {
+    header "$sysroot/linux/wait.h"
+    export *
+  }
+  module sysroot_locale_h {
+    header "$sysroot/locale.h"
+    export *
+  }
+  module sysroot_setjmp_h {
+    header "$sysroot/setjmp.h"
+    export *
+  }
+  module sysroot_sys_ioctl_h {
+    header "$sysroot/sys/ioctl.h"
+    export *
+  }
+  module sysroot_xlocale_h {
+    header "$sysroot/xlocale.h"
+    export *
+  }
+}
+
+module sys_stage2 [system] [extern_c] {
+  module sysroot_asm_generic_fcntl_h {
+    header "$sysroot/asm-generic/fcntl.h"
+    export *
+  }
+  module sysroot_asm_fcntl_h {
+    header "$sysroot/i686-linux-android/asm/fcntl.h"
+    export *
+  }
+  module sysroot_bits_fenv_x86_h {
+    header "$sysroot/bits/fenv_x86.h"
+    export *
+  }
+  module sysroot_bits_flock_h {
+    header "$sysroot/bits/flock.h"
+    export *
+  }
+  module sysroot_bits_lockf_h {
+    header "$sysroot/bits/lockf.h"
+    export *
+  }
+  module sysroot_bits_pthread_types_h {
+    header "$sysroot/bits/pthread_types.h"
+    header "$sysroot/sys/types.h"
+    export *
+  }
+  module sysroot_bits_signal_types_h {
+    header "$sysroot/bits/signal_types.h"
+    export *
+  }
+  module sysroot_bits_strcasecmp_h {
+    header "$sysroot/bits/strcasecmp.h"
+    export *
+  }
+  module sysroot_bits_timespec_h {
+    header "$sysroot/bits/timespec.h"
+    export *
+  }
+  module sysroot_fcntl_h {
+    header "$sysroot/fcntl.h"
+    export *
+  }
+  module sysroot_linux_fcntl_h {
+    header "$sysroot/linux/fcntl.h"
+    export *
+  }
+  module sysroot_linux_time_h {
+    header "$sysroot/linux/time.h"
+    header "$sysroot/linux/time_types.h"
+    export *
+  }
+  module sysroot_malloc_h {
+    header "$sysroot/malloc.h"
+    export *
+  }
+  module sysroot_pthread_h {
+    header "$sysroot/pthread.h"
+    export *
+  }
+  module sysroot_sched_h {
+    header "$sysroot/sched.h"
+    export *
+  }
+  module sysroot_signal_h {
+    header "$sysroot/signal.h"
+    header "$sysroot/sys/ucontext.h"
+    export *
+  }
+  module sysroot_stdio_h {
+    header "$sysroot/stdio.h"
+    export *
+  }
+  module sysroot_stdlib_h {
+    header "$sysroot/stdlib.h"
+    export *
+  }
+  module sysroot_strings_h {
+    header "$sysroot/strings.h"
+    export *
+  }
+  module sysroot_sys_select_h {
+    header "$sysroot/sys/select.h"
+    export *
+  }
+  module sysroot_sys_time_h {
+    header "$sysroot/sys/time.h"
+    export *
+  }
+  module sysroot_sys_user_h {
+    header "$sysroot/sys/user.h"
+    export *
+  }
+  module sysroot_threads_h {
+    header "$sysroot/threads.h"
+    export *
+  }
+  module sysroot_time_h {
+    header "$sysroot/time.h"
+    export *
+  }
+  module sysroot_unistd_h {
+    header "$sysroot/unistd.h"
+    export *
+  }
+  module sysroot_wchar_h {
+    header "$sysroot/wchar.h"
+    export *
+  }
+}
diff --git a/build/modules/fuchsia-arm64/BUILD.gn b/build/modules/fuchsia-arm64/BUILD.gn
index b5fa74f..636f78a 100644
--- a/build/modules/fuchsia-arm64/BUILD.gn
+++ b/build/modules/fuchsia-arm64/BUILD.gn
@@ -7,8 +7,9 @@
 
 import("//buildtools/third_party/libc++/modules.gni")
 
-modulemap_config("sysroot_modulemap") {
-  source = "module.modulemap"
+sysroot_modulemap("sysroot_modulemap") {
+  source = "module.modulemap.in"
+  out = "${target_gen_dir}/module.modulemap"
 }
 
 builtin_module("_Builtin_float") {
diff --git a/build/modules/fuchsia-arm64/module.modulemap b/build/modules/fuchsia-arm64/module.modulemap
deleted file mode 100644
index 7f012c3..0000000
--- a/build/modules/fuchsia-arm64/module.modulemap
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// AUTOGENERATED FILE. DO NOT EDIT.
-// To regenerate, see instructions at build/modules/modularize/README.md
-
-
-module sys_stage1 [system] [extern_c] {
-  module sysroot___llvm_libc_common_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/__llvm-libc-common.h"
-    export *
-  }
-  module sysroot_alloca_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/alloca.h"
-    export *
-  }
-  module sysroot_fcntl_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/fcntl.h"
-    export *
-  }
-  module sysroot_features_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/features.h"
-    export *
-  }
-  module sysroot_getopt_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/getopt.h"
-    export *
-  }
-  module sysroot_llvm_libc_macros_fenv_macros_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/llvm-libc-macros/fenv-macros.h"
-    export *
-  }
-  module sysroot_llvm_libc_types_fenv_t_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/llvm-libc-types/fenv_t.h"
-    export *
-  }
-  module sysroot_llvm_libc_types_fexcept_t_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/llvm-libc-types/fexcept_t.h"
-    export *
-  }
-  module sysroot_locale_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/locale.h"
-    export *
-  }
-  module sysroot_pthread_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/pthread.h"
-    export *
-  }
-  module sysroot_sched_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/sched.h"
-    export *
-  }
-  module sysroot_setjmp_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/setjmp.h"
-    export *
-  }
-  module sysroot_signal_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/signal.h"
-    export *
-  }
-  module sysroot_stdio_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/stdio.h"
-    export *
-  }
-  module sysroot_stdlib_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/stdlib.h"
-    export *
-  }
-  module sysroot_strings_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/strings.h"
-    export *
-  }
-  module sysroot_sys_ioctl_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/sys/ioctl.h"
-    export *
-  }
-  module sysroot_threads_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/threads.h"
-    export *
-  }
-  module sysroot_time_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/time.h"
-    export *
-  }
-  module sysroot_unistd_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/unistd.h"
-    export *
-  }
-  module sysroot_wchar_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/arm64-api-28/sysroot/include/wchar.h"
-    export *
-  }
-}
diff --git a/build/modules/fuchsia-arm64/module.modulemap.in b/build/modules/fuchsia-arm64/module.modulemap.in
new file mode 100644
index 0000000..c4383a2
--- /dev/null
+++ b/build/modules/fuchsia-arm64/module.modulemap.in
@@ -0,0 +1,94 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// AUTOGENERATED FILE. DO NOT EDIT.
+// To regenerate, see instructions at build/modules/modularize/README.md
+
+
+module sys_stage1 [system] [extern_c] {
+  module sysroot___llvm_libc_common_h {
+    header "$sysroot/__llvm-libc-common.h"
+    export *
+  }
+  module sysroot_alloca_h {
+    header "$sysroot/alloca.h"
+    export *
+  }
+  module sysroot_fcntl_h {
+    header "$sysroot/fcntl.h"
+    export *
+  }
+  module sysroot_features_h {
+    header "$sysroot/features.h"
+    export *
+  }
+  module sysroot_getopt_h {
+    header "$sysroot/getopt.h"
+    export *
+  }
+  module sysroot_llvm_libc_macros_fenv_macros_h {
+    header "$sysroot/llvm-libc-macros/fenv-macros.h"
+    export *
+  }
+  module sysroot_llvm_libc_types_fenv_t_h {
+    header "$sysroot/llvm-libc-types/fenv_t.h"
+    export *
+  }
+  module sysroot_llvm_libc_types_fexcept_t_h {
+    header "$sysroot/llvm-libc-types/fexcept_t.h"
+    export *
+  }
+  module sysroot_locale_h {
+    header "$sysroot/locale.h"
+    export *
+  }
+  module sysroot_pthread_h {
+    header "$sysroot/pthread.h"
+    export *
+  }
+  module sysroot_sched_h {
+    header "$sysroot/sched.h"
+    export *
+  }
+  module sysroot_setjmp_h {
+    header "$sysroot/setjmp.h"
+    export *
+  }
+  module sysroot_signal_h {
+    header "$sysroot/signal.h"
+    export *
+  }
+  module sysroot_stdio_h {
+    header "$sysroot/stdio.h"
+    export *
+  }
+  module sysroot_stdlib_h {
+    header "$sysroot/stdlib.h"
+    export *
+  }
+  module sysroot_strings_h {
+    header "$sysroot/strings.h"
+    export *
+  }
+  module sysroot_sys_ioctl_h {
+    header "$sysroot/sys/ioctl.h"
+    export *
+  }
+  module sysroot_threads_h {
+    header "$sysroot/threads.h"
+    export *
+  }
+  module sysroot_time_h {
+    header "$sysroot/time.h"
+    export *
+  }
+  module sysroot_unistd_h {
+    header "$sysroot/unistd.h"
+    export *
+  }
+  module sysroot_wchar_h {
+    header "$sysroot/wchar.h"
+    export *
+  }
+}
diff --git a/build/modules/fuchsia-x64/BUILD.gn b/build/modules/fuchsia-x64/BUILD.gn
index b5fa74f..636f78a 100644
--- a/build/modules/fuchsia-x64/BUILD.gn
+++ b/build/modules/fuchsia-x64/BUILD.gn
@@ -7,8 +7,9 @@
 
 import("//buildtools/third_party/libc++/modules.gni")
 
-modulemap_config("sysroot_modulemap") {
-  source = "module.modulemap"
+sysroot_modulemap("sysroot_modulemap") {
+  source = "module.modulemap.in"
+  out = "${target_gen_dir}/module.modulemap"
 }
 
 builtin_module("_Builtin_float") {
diff --git a/build/modules/fuchsia-x64/module.modulemap b/build/modules/fuchsia-x64/module.modulemap
deleted file mode 100644
index 6e5a355..0000000
--- a/build/modules/fuchsia-x64/module.modulemap
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// AUTOGENERATED FILE. DO NOT EDIT.
-// To regenerate, see instructions at build/modules/modularize/README.md
-
-
-module sys_stage1 [system] [extern_c] {
-  module sysroot___llvm_libc_common_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/__llvm-libc-common.h"
-    export *
-  }
-  module sysroot_alloca_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/alloca.h"
-    export *
-  }
-  module sysroot_fcntl_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/fcntl.h"
-    export *
-  }
-  module sysroot_features_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/features.h"
-    export *
-  }
-  module sysroot_getopt_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/getopt.h"
-    export *
-  }
-  module sysroot_llvm_libc_macros_fenv_macros_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/llvm-libc-macros/fenv-macros.h"
-    export *
-  }
-  module sysroot_llvm_libc_types_fenv_t_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/llvm-libc-types/fenv_t.h"
-    export *
-  }
-  module sysroot_llvm_libc_types_fexcept_t_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/llvm-libc-types/fexcept_t.h"
-    export *
-  }
-  module sysroot_locale_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/locale.h"
-    export *
-  }
-  module sysroot_pthread_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/pthread.h"
-    export *
-  }
-  module sysroot_sched_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/sched.h"
-    export *
-  }
-  module sysroot_setjmp_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/setjmp.h"
-    export *
-  }
-  module sysroot_signal_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/signal.h"
-    export *
-  }
-  module sysroot_stdio_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/stdio.h"
-    export *
-  }
-  module sysroot_stdlib_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/stdlib.h"
-    export *
-  }
-  module sysroot_strings_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/strings.h"
-    export *
-  }
-  module sysroot_sys_ioctl_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/sys/ioctl.h"
-    export *
-  }
-  module sysroot_threads_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/threads.h"
-    export *
-  }
-  module sysroot_time_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/time.h"
-    export *
-  }
-  module sysroot_unistd_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/unistd.h"
-    export *
-  }
-  module sysroot_wchar_h {
-    header "../../../third_party/fuchsia-sdk/sdk/obj/x64-api-28/sysroot/include/wchar.h"
-    export *
-  }
-}
diff --git a/build/modules/fuchsia-x64/module.modulemap.in b/build/modules/fuchsia-x64/module.modulemap.in
new file mode 100644
index 0000000..c4383a2
--- /dev/null
+++ b/build/modules/fuchsia-x64/module.modulemap.in
@@ -0,0 +1,94 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// AUTOGENERATED FILE. DO NOT EDIT.
+// To regenerate, see instructions at build/modules/modularize/README.md
+
+
+module sys_stage1 [system] [extern_c] {
+  module sysroot___llvm_libc_common_h {
+    header "$sysroot/__llvm-libc-common.h"
+    export *
+  }
+  module sysroot_alloca_h {
+    header "$sysroot/alloca.h"
+    export *
+  }
+  module sysroot_fcntl_h {
+    header "$sysroot/fcntl.h"
+    export *
+  }
+  module sysroot_features_h {
+    header "$sysroot/features.h"
+    export *
+  }
+  module sysroot_getopt_h {
+    header "$sysroot/getopt.h"
+    export *
+  }
+  module sysroot_llvm_libc_macros_fenv_macros_h {
+    header "$sysroot/llvm-libc-macros/fenv-macros.h"
+    export *
+  }
+  module sysroot_llvm_libc_types_fenv_t_h {
+    header "$sysroot/llvm-libc-types/fenv_t.h"
+    export *
+  }
+  module sysroot_llvm_libc_types_fexcept_t_h {
+    header "$sysroot/llvm-libc-types/fexcept_t.h"
+    export *
+  }
+  module sysroot_locale_h {
+    header "$sysroot/locale.h"
+    export *
+  }
+  module sysroot_pthread_h {
+    header "$sysroot/pthread.h"
+    export *
+  }
+  module sysroot_sched_h {
+    header "$sysroot/sched.h"
+    export *
+  }
+  module sysroot_setjmp_h {
+    header "$sysroot/setjmp.h"
+    export *
+  }
+  module sysroot_signal_h {
+    header "$sysroot/signal.h"
+    export *
+  }
+  module sysroot_stdio_h {
+    header "$sysroot/stdio.h"
+    export *
+  }
+  module sysroot_stdlib_h {
+    header "$sysroot/stdlib.h"
+    export *
+  }
+  module sysroot_strings_h {
+    header "$sysroot/strings.h"
+    export *
+  }
+  module sysroot_sys_ioctl_h {
+    header "$sysroot/sys/ioctl.h"
+    export *
+  }
+  module sysroot_threads_h {
+    header "$sysroot/threads.h"
+    export *
+  }
+  module sysroot_time_h {
+    header "$sysroot/time.h"
+    export *
+  }
+  module sysroot_unistd_h {
+    header "$sysroot/unistd.h"
+    export *
+  }
+  module sysroot_wchar_h {
+    header "$sysroot/wchar.h"
+    export *
+  }
+}
diff --git a/build/modules/linux-arm/BUILD.gn b/build/modules/linux-arm/BUILD.gn
index 8899069..d516d84 100644
--- a/build/modules/linux-arm/BUILD.gn
+++ b/build/modules/linux-arm/BUILD.gn
@@ -7,8 +7,9 @@
 
 import("//buildtools/third_party/libc++/modules.gni")
 
-modulemap_config("sysroot_modulemap") {
-  source = "module.modulemap"
+sysroot_modulemap("sysroot_modulemap") {
+  source = "module.modulemap.in"
+  out = "${target_gen_dir}/module.modulemap"
 }
 
 builtin_module("_Builtin_float") {
diff --git a/build/modules/linux-arm/module.modulemap b/build/modules/linux-arm/module.modulemap
deleted file mode 100644
index 5809d11f6..0000000
--- a/build/modules/linux-arm/module.modulemap
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// AUTOGENERATED FILE. DO NOT EDIT.
-// To regenerate, see instructions at build/modules/modularize/README.md
-
-
-module sys_stage1 [system] [extern_c] {
-  module sysroot_alloca_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/alloca.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_base_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/asm-generic/errno-base.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/asm-generic/errno.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctl_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/asm-generic/ioctl.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctls_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/asm-generic/ioctls.h"
-    export *
-  }
-  module sysroot_asm_errno_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/arm-linux-gnueabihf/asm/errno.h"
-    export *
-  }
-  module sysroot_asm_ioctl_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/arm-linux-gnueabihf/asm/ioctl.h"
-    export *
-  }
-  module sysroot_asm_ioctls_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/arm-linux-gnueabihf/asm/ioctls.h"
-    export *
-  }
-  module sysroot_asm_sigcontext_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/arm-linux-gnueabihf/asm/sigcontext.h"
-    export *
-  }
-  module sysroot_endian_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/endian.h"
-    export *
-  }
-  module sysroot_fcntl_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/fcntl.h"
-    export *
-  }
-  module sysroot_features_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/features.h"
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/arm-linux-gnueabihf/sys/cdefs.h"
-    export *
-  }
-  module sysroot_getopt_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/getopt.h"
-    export *
-  }
-  module sysroot_gnu_stubs_hard_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/arm-linux-gnueabihf/gnu/stubs-hard.h"
-    export *
-  }
-  module sysroot_gnu_stubs_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/arm-linux-gnueabihf/gnu/stubs.h"
-    export *
-  }
-  module sysroot_linux_errno_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/linux/errno.h"
-    export *
-  }
-  module sysroot_linux_falloc_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/linux/falloc.h"
-    export *
-  }
-  module sysroot_linux_ioctl_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/linux/ioctl.h"
-    export *
-  }
-  module sysroot_locale_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/locale.h"
-    export *
-  }
-  module sysroot_nl_types_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/nl_types.h"
-    export *
-  }
-  module sysroot_pthread_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/pthread.h"
-    export *
-  }
-  module sysroot_sched_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/sched.h"
-    export *
-  }
-  module sysroot_setjmp_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/setjmp.h"
-    export *
-  }
-  module sysroot_signal_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/signal.h"
-    export *
-  }
-  module sysroot_stdc_predef_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/stdc-predef.h"
-    export *
-  }
-  module sysroot_stdio_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/stdio.h"
-    export *
-  }
-  module sysroot_strings_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/strings.h"
-    export *
-  }
-  module sysroot_sys_ioctl_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/arm-linux-gnueabihf/sys/ioctl.h"
-    export *
-  }
-  module sysroot_sys_select_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/arm-linux-gnueabihf/sys/select.h"
-    export *
-  }
-  module sysroot_sys_ttydefaults_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/arm-linux-gnueabihf/sys/ttydefaults.h"
-    export *
-  }
-  module sysroot_sys_types_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/arm-linux-gnueabihf/sys/types.h"
-    export *
-  }
-  module sysroot_sys_ucontext_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/arm-linux-gnueabihf/sys/ucontext.h"
-    export *
-  }
-  module sysroot_threads_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/threads.h"
-    export *
-  }
-  module sysroot_time_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/time.h"
-    export *
-  }
-  module sysroot_unistd_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/unistd.h"
-    export *
-  }
-  module sysroot_wchar_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/wchar.h"
-    export *
-  }
-}
-
-module sys_stage2 [system] [extern_c] {
-  module sysroot_stdlib_h {
-    header "../../linux/debian_bullseye_armhf-sysroot/usr/include/stdlib.h"
-    export *
-  }
-}
diff --git a/build/modules/linux-arm/module.modulemap.in b/build/modules/linux-arm/module.modulemap.in
new file mode 100644
index 0000000..d7b8aaf
--- /dev/null
+++ b/build/modules/linux-arm/module.modulemap.in
@@ -0,0 +1,162 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// AUTOGENERATED FILE. DO NOT EDIT.
+// To regenerate, see instructions at build/modules/modularize/README.md
+
+
+module sys_stage1 [system] [extern_c] {
+  module sysroot_alloca_h {
+    header "$sysroot/alloca.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_base_h {
+    header "$sysroot/asm-generic/errno-base.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_h {
+    header "$sysroot/asm-generic/errno.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctl_h {
+    header "$sysroot/asm-generic/ioctl.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctls_h {
+    header "$sysroot/asm-generic/ioctls.h"
+    export *
+  }
+  module sysroot_asm_errno_h {
+    header "$sysroot/arm-linux-gnueabihf/asm/errno.h"
+    export *
+  }
+  module sysroot_asm_ioctl_h {
+    header "$sysroot/arm-linux-gnueabihf/asm/ioctl.h"
+    export *
+  }
+  module sysroot_asm_ioctls_h {
+    header "$sysroot/arm-linux-gnueabihf/asm/ioctls.h"
+    export *
+  }
+  module sysroot_asm_sigcontext_h {
+    header "$sysroot/arm-linux-gnueabihf/asm/sigcontext.h"
+    export *
+  }
+  module sysroot_endian_h {
+    header "$sysroot/endian.h"
+    export *
+  }
+  module sysroot_fcntl_h {
+    header "$sysroot/fcntl.h"
+    export *
+  }
+  module sysroot_features_h {
+    header "$sysroot/features.h"
+    header "$sysroot/arm-linux-gnueabihf/sys/cdefs.h"
+    export *
+  }
+  module sysroot_getopt_h {
+    header "$sysroot/getopt.h"
+    export *
+  }
+  module sysroot_gnu_stubs_hard_h {
+    header "$sysroot/arm-linux-gnueabihf/gnu/stubs-hard.h"
+    export *
+  }
+  module sysroot_gnu_stubs_h {
+    header "$sysroot/arm-linux-gnueabihf/gnu/stubs.h"
+    export *
+  }
+  module sysroot_linux_errno_h {
+    header "$sysroot/linux/errno.h"
+    export *
+  }
+  module sysroot_linux_falloc_h {
+    header "$sysroot/linux/falloc.h"
+    export *
+  }
+  module sysroot_linux_ioctl_h {
+    header "$sysroot/linux/ioctl.h"
+    export *
+  }
+  module sysroot_locale_h {
+    header "$sysroot/locale.h"
+    export *
+  }
+  module sysroot_nl_types_h {
+    header "$sysroot/nl_types.h"
+    export *
+  }
+  module sysroot_pthread_h {
+    header "$sysroot/pthread.h"
+    export *
+  }
+  module sysroot_sched_h {
+    header "$sysroot/sched.h"
+    export *
+  }
+  module sysroot_setjmp_h {
+    header "$sysroot/setjmp.h"
+    export *
+  }
+  module sysroot_signal_h {
+    header "$sysroot/signal.h"
+    export *
+  }
+  module sysroot_stdc_predef_h {
+    header "$sysroot/stdc-predef.h"
+    export *
+  }
+  module sysroot_stdio_h {
+    header "$sysroot/stdio.h"
+    export *
+  }
+  module sysroot_strings_h {
+    header "$sysroot/strings.h"
+    export *
+  }
+  module sysroot_sys_ioctl_h {
+    header "$sysroot/arm-linux-gnueabihf/sys/ioctl.h"
+    export *
+  }
+  module sysroot_sys_select_h {
+    header "$sysroot/arm-linux-gnueabihf/sys/select.h"
+    export *
+  }
+  module sysroot_sys_ttydefaults_h {
+    header "$sysroot/arm-linux-gnueabihf/sys/ttydefaults.h"
+    export *
+  }
+  module sysroot_sys_types_h {
+    header "$sysroot/arm-linux-gnueabihf/sys/types.h"
+    export *
+  }
+  module sysroot_sys_ucontext_h {
+    header "$sysroot/arm-linux-gnueabihf/sys/ucontext.h"
+    export *
+  }
+  module sysroot_threads_h {
+    header "$sysroot/threads.h"
+    export *
+  }
+  module sysroot_time_h {
+    header "$sysroot/time.h"
+    export *
+  }
+  module sysroot_unistd_h {
+    header "$sysroot/unistd.h"
+    export *
+  }
+  module sysroot_wchar_h {
+    header "$sysroot/wchar.h"
+    export *
+  }
+}
+
+module sys_stage2 [system] [extern_c] {
+  module sysroot_stdlib_h {
+    header "$sysroot/stdlib.h"
+    export *
+  }
+}
diff --git a/build/modules/linux-arm64/BUILD.gn b/build/modules/linux-arm64/BUILD.gn
index 8899069..d516d84 100644
--- a/build/modules/linux-arm64/BUILD.gn
+++ b/build/modules/linux-arm64/BUILD.gn
@@ -7,8 +7,9 @@
 
 import("//buildtools/third_party/libc++/modules.gni")
 
-modulemap_config("sysroot_modulemap") {
-  source = "module.modulemap"
+sysroot_modulemap("sysroot_modulemap") {
+  source = "module.modulemap.in"
+  out = "${target_gen_dir}/module.modulemap"
 }
 
 builtin_module("_Builtin_float") {
diff --git a/build/modules/linux-arm64/module.modulemap b/build/modules/linux-arm64/module.modulemap
deleted file mode 100644
index 959e041..0000000
--- a/build/modules/linux-arm64/module.modulemap
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// AUTOGENERATED FILE. DO NOT EDIT.
-// To regenerate, see instructions at build/modules/modularize/README.md
-
-
-module sys_stage1 [system] [extern_c] {
-  module sysroot_alloca_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/alloca.h"
-    export *
-  }
-  module sysroot_asm_generic_bitsperlong_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/asm-generic/bitsperlong.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_base_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/asm-generic/errno-base.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/asm-generic/errno.h"
-    export *
-  }
-  module sysroot_asm_generic_int_ll64_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/asm-generic/int-ll64.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctl_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/asm-generic/ioctl.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctls_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/asm-generic/ioctls.h"
-    export *
-  }
-  module sysroot_asm_generic_posix_types_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/asm-generic/posix_types.h"
-    export *
-  }
-  module sysroot_asm_generic_types_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/asm-generic/types.h"
-    export *
-  }
-  module sysroot_asm_bitsperlong_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/asm/bitsperlong.h"
-    export *
-  }
-  module sysroot_asm_errno_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/asm/errno.h"
-    export *
-  }
-  module sysroot_asm_ioctl_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/asm/ioctl.h"
-    export *
-  }
-  module sysroot_asm_ioctls_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/asm/ioctls.h"
-    export *
-  }
-  module sysroot_asm_posix_types_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/asm/posix_types.h"
-    export *
-  }
-  module sysroot_asm_sigcontext_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/asm/sigcontext.h"
-    export *
-  }
-  module sysroot_asm_sve_context_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/asm/sve_context.h"
-    export *
-  }
-  module sysroot_asm_types_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/asm/types.h"
-    export *
-  }
-  module sysroot_endian_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/endian.h"
-    export *
-  }
-  module sysroot_fcntl_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/fcntl.h"
-    export *
-  }
-  module sysroot_features_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/features.h"
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/sys/cdefs.h"
-    export *
-  }
-  module sysroot_getopt_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/getopt.h"
-    export *
-  }
-  module sysroot_gnu_stubs_lp64_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/gnu/stubs-lp64.h"
-    export *
-  }
-  module sysroot_gnu_stubs_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/gnu/stubs.h"
-    export *
-  }
-  module sysroot_linux_errno_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/linux/errno.h"
-    export *
-  }
-  module sysroot_linux_falloc_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/linux/falloc.h"
-    export *
-  }
-  module sysroot_linux_ioctl_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/linux/ioctl.h"
-    export *
-  }
-  module sysroot_linux_posix_types_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/linux/posix_types.h"
-    export *
-  }
-  module sysroot_linux_stddef_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/linux/stddef.h"
-    export *
-  }
-  module sysroot_linux_types_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/linux/types.h"
-    export *
-  }
-  module sysroot_locale_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/locale.h"
-    export *
-  }
-  module sysroot_nl_types_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/nl_types.h"
-    export *
-  }
-  module sysroot_pthread_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/pthread.h"
-    export *
-  }
-  module sysroot_sched_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/sched.h"
-    export *
-  }
-  module sysroot_setjmp_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/setjmp.h"
-    export *
-  }
-  module sysroot_signal_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/signal.h"
-    export *
-  }
-  module sysroot_stdc_predef_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/stdc-predef.h"
-    export *
-  }
-  module sysroot_stdio_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/stdio.h"
-    export *
-  }
-  module sysroot_strings_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/strings.h"
-    export *
-  }
-  module sysroot_sys_ioctl_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/sys/ioctl.h"
-    export *
-  }
-  module sysroot_sys_procfs_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/sys/procfs.h"
-    export *
-  }
-  module sysroot_sys_select_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/sys/select.h"
-    export *
-  }
-  module sysroot_sys_time_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/sys/time.h"
-    export *
-  }
-  module sysroot_sys_ttydefaults_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/sys/ttydefaults.h"
-    export *
-  }
-  module sysroot_sys_types_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/sys/types.h"
-    export *
-  }
-  module sysroot_sys_ucontext_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/sys/ucontext.h"
-    export *
-  }
-  module sysroot_sys_user_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/aarch64-linux-gnu/sys/user.h"
-    export *
-  }
-  module sysroot_threads_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/threads.h"
-    export *
-  }
-  module sysroot_time_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/time.h"
-    export *
-  }
-  module sysroot_unistd_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/unistd.h"
-    export *
-  }
-  module sysroot_wchar_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/wchar.h"
-    export *
-  }
-}
-
-module sys_stage2 [system] [extern_c] {
-  module sysroot_stdlib_h {
-    header "../../linux/debian_bullseye_arm64-sysroot/usr/include/stdlib.h"
-    export *
-  }
-}
diff --git a/build/modules/linux-arm64/module.modulemap.in b/build/modules/linux-arm64/module.modulemap.in
new file mode 100644
index 0000000..3b8f764
--- /dev/null
+++ b/build/modules/linux-arm64/module.modulemap.in
@@ -0,0 +1,218 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// AUTOGENERATED FILE. DO NOT EDIT.
+// To regenerate, see instructions at build/modules/modularize/README.md
+
+
+module sys_stage1 [system] [extern_c] {
+  module sysroot_alloca_h {
+    header "$sysroot/alloca.h"
+    export *
+  }
+  module sysroot_asm_generic_bitsperlong_h {
+    header "$sysroot/asm-generic/bitsperlong.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_base_h {
+    header "$sysroot/asm-generic/errno-base.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_h {
+    header "$sysroot/asm-generic/errno.h"
+    export *
+  }
+  module sysroot_asm_generic_int_ll64_h {
+    header "$sysroot/asm-generic/int-ll64.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctl_h {
+    header "$sysroot/asm-generic/ioctl.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctls_h {
+    header "$sysroot/asm-generic/ioctls.h"
+    export *
+  }
+  module sysroot_asm_generic_posix_types_h {
+    header "$sysroot/asm-generic/posix_types.h"
+    export *
+  }
+  module sysroot_asm_generic_types_h {
+    header "$sysroot/asm-generic/types.h"
+    export *
+  }
+  module sysroot_asm_bitsperlong_h {
+    header "$sysroot/aarch64-linux-gnu/asm/bitsperlong.h"
+    export *
+  }
+  module sysroot_asm_errno_h {
+    header "$sysroot/aarch64-linux-gnu/asm/errno.h"
+    export *
+  }
+  module sysroot_asm_ioctl_h {
+    header "$sysroot/aarch64-linux-gnu/asm/ioctl.h"
+    export *
+  }
+  module sysroot_asm_ioctls_h {
+    header "$sysroot/aarch64-linux-gnu/asm/ioctls.h"
+    export *
+  }
+  module sysroot_asm_posix_types_h {
+    header "$sysroot/aarch64-linux-gnu/asm/posix_types.h"
+    export *
+  }
+  module sysroot_asm_sigcontext_h {
+    header "$sysroot/aarch64-linux-gnu/asm/sigcontext.h"
+    export *
+  }
+  module sysroot_asm_sve_context_h {
+    header "$sysroot/aarch64-linux-gnu/asm/sve_context.h"
+    export *
+  }
+  module sysroot_asm_types_h {
+    header "$sysroot/aarch64-linux-gnu/asm/types.h"
+    export *
+  }
+  module sysroot_endian_h {
+    header "$sysroot/endian.h"
+    export *
+  }
+  module sysroot_fcntl_h {
+    header "$sysroot/fcntl.h"
+    export *
+  }
+  module sysroot_features_h {
+    header "$sysroot/features.h"
+    header "$sysroot/aarch64-linux-gnu/sys/cdefs.h"
+    export *
+  }
+  module sysroot_getopt_h {
+    header "$sysroot/getopt.h"
+    export *
+  }
+  module sysroot_gnu_stubs_lp64_h {
+    header "$sysroot/aarch64-linux-gnu/gnu/stubs-lp64.h"
+    export *
+  }
+  module sysroot_gnu_stubs_h {
+    header "$sysroot/aarch64-linux-gnu/gnu/stubs.h"
+    export *
+  }
+  module sysroot_linux_errno_h {
+    header "$sysroot/linux/errno.h"
+    export *
+  }
+  module sysroot_linux_falloc_h {
+    header "$sysroot/linux/falloc.h"
+    export *
+  }
+  module sysroot_linux_ioctl_h {
+    header "$sysroot/linux/ioctl.h"
+    export *
+  }
+  module sysroot_linux_posix_types_h {
+    header "$sysroot/linux/posix_types.h"
+    export *
+  }
+  module sysroot_linux_stddef_h {
+    header "$sysroot/linux/stddef.h"
+    export *
+  }
+  module sysroot_linux_types_h {
+    header "$sysroot/linux/types.h"
+    export *
+  }
+  module sysroot_locale_h {
+    header "$sysroot/locale.h"
+    export *
+  }
+  module sysroot_nl_types_h {
+    header "$sysroot/nl_types.h"
+    export *
+  }
+  module sysroot_pthread_h {
+    header "$sysroot/pthread.h"
+    export *
+  }
+  module sysroot_sched_h {
+    header "$sysroot/sched.h"
+    export *
+  }
+  module sysroot_setjmp_h {
+    header "$sysroot/setjmp.h"
+    export *
+  }
+  module sysroot_signal_h {
+    header "$sysroot/signal.h"
+    export *
+  }
+  module sysroot_stdc_predef_h {
+    header "$sysroot/stdc-predef.h"
+    export *
+  }
+  module sysroot_stdio_h {
+    header "$sysroot/stdio.h"
+    export *
+  }
+  module sysroot_strings_h {
+    header "$sysroot/strings.h"
+    export *
+  }
+  module sysroot_sys_ioctl_h {
+    header "$sysroot/aarch64-linux-gnu/sys/ioctl.h"
+    export *
+  }
+  module sysroot_sys_procfs_h {
+    header "$sysroot/aarch64-linux-gnu/sys/procfs.h"
+    export *
+  }
+  module sysroot_sys_select_h {
+    header "$sysroot/aarch64-linux-gnu/sys/select.h"
+    export *
+  }
+  module sysroot_sys_time_h {
+    header "$sysroot/aarch64-linux-gnu/sys/time.h"
+    export *
+  }
+  module sysroot_sys_ttydefaults_h {
+    header "$sysroot/aarch64-linux-gnu/sys/ttydefaults.h"
+    export *
+  }
+  module sysroot_sys_types_h {
+    header "$sysroot/aarch64-linux-gnu/sys/types.h"
+    export *
+  }
+  module sysroot_sys_ucontext_h {
+    header "$sysroot/aarch64-linux-gnu/sys/ucontext.h"
+    export *
+  }
+  module sysroot_sys_user_h {
+    header "$sysroot/aarch64-linux-gnu/sys/user.h"
+    export *
+  }
+  module sysroot_threads_h {
+    header "$sysroot/threads.h"
+    export *
+  }
+  module sysroot_time_h {
+    header "$sysroot/time.h"
+    export *
+  }
+  module sysroot_unistd_h {
+    header "$sysroot/unistd.h"
+    export *
+  }
+  module sysroot_wchar_h {
+    header "$sysroot/wchar.h"
+    export *
+  }
+}
+
+module sys_stage2 [system] [extern_c] {
+  module sysroot_stdlib_h {
+    header "$sysroot/stdlib.h"
+    export *
+  }
+}
diff --git a/build/modules/linux-x64/BUILD.gn b/build/modules/linux-x64/BUILD.gn
index 8899069..d516d84 100644
--- a/build/modules/linux-x64/BUILD.gn
+++ b/build/modules/linux-x64/BUILD.gn
@@ -7,8 +7,9 @@
 
 import("//buildtools/third_party/libc++/modules.gni")
 
-modulemap_config("sysroot_modulemap") {
-  source = "module.modulemap"
+sysroot_modulemap("sysroot_modulemap") {
+  source = "module.modulemap.in"
+  out = "${target_gen_dir}/module.modulemap"
 }
 
 builtin_module("_Builtin_float") {
diff --git a/build/modules/linux-x64/module.modulemap b/build/modules/linux-x64/module.modulemap
deleted file mode 100644
index 94beafd9..0000000
--- a/build/modules/linux-x64/module.modulemap
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// AUTOGENERATED FILE. DO NOT EDIT.
-// To regenerate, see instructions at build/modules/modularize/README.md
-
-
-module sys_stage1 [system] [extern_c] {
-  module sysroot_alloca_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/alloca.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_base_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/asm-generic/errno-base.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/asm-generic/errno.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctl_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/asm-generic/ioctl.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctls_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/asm-generic/ioctls.h"
-    export *
-  }
-  module sysroot_asm_errno_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/asm/errno.h"
-    export *
-  }
-  module sysroot_asm_ioctl_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/asm/ioctl.h"
-    export *
-  }
-  module sysroot_asm_ioctls_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/asm/ioctls.h"
-    export *
-  }
-  module sysroot_endian_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/endian.h"
-    export *
-  }
-  module sysroot_fcntl_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/fcntl.h"
-    export *
-  }
-  module sysroot_features_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/features.h"
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/sys/cdefs.h"
-    export *
-  }
-  module sysroot_getopt_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/getopt.h"
-    export *
-  }
-  module sysroot_gnu_stubs_64_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/gnu/stubs-64.h"
-    export *
-  }
-  module sysroot_gnu_stubs_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/gnu/stubs.h"
-    export *
-  }
-  module sysroot_linux_errno_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/linux/errno.h"
-    export *
-  }
-  module sysroot_linux_falloc_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/linux/falloc.h"
-    export *
-  }
-  module sysroot_linux_ioctl_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/linux/ioctl.h"
-    export *
-  }
-  module sysroot_locale_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/locale.h"
-    export *
-  }
-  module sysroot_nl_types_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/nl_types.h"
-    export *
-  }
-  module sysroot_pthread_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/pthread.h"
-    export *
-  }
-  module sysroot_sched_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/sched.h"
-    export *
-  }
-  module sysroot_setjmp_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/setjmp.h"
-    export *
-  }
-  module sysroot_signal_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/signal.h"
-    export *
-  }
-  module sysroot_stdc_predef_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/stdc-predef.h"
-    export *
-  }
-  module sysroot_stdio_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/stdio.h"
-    export *
-  }
-  module sysroot_strings_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/strings.h"
-    export *
-  }
-  module sysroot_sys_ioctl_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/sys/ioctl.h"
-    export *
-  }
-  module sysroot_sys_select_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/sys/select.h"
-    export *
-  }
-  module sysroot_sys_ttydefaults_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/sys/ttydefaults.h"
-    export *
-  }
-  module sysroot_sys_types_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/sys/types.h"
-    export *
-  }
-  module sysroot_sys_ucontext_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/x86_64-linux-gnu/sys/ucontext.h"
-    export *
-  }
-  module sysroot_threads_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/threads.h"
-    export *
-  }
-  module sysroot_time_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/time.h"
-    export *
-  }
-  module sysroot_unistd_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/unistd.h"
-    export *
-  }
-  module sysroot_wchar_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/wchar.h"
-    export *
-  }
-}
-
-module sys_stage2 [system] [extern_c] {
-  module sysroot_stdlib_h {
-    header "../../linux/debian_bullseye_amd64-sysroot/usr/include/stdlib.h"
-    export *
-  }
-}
diff --git a/build/modules/linux-x64/module.modulemap.in b/build/modules/linux-x64/module.modulemap.in
new file mode 100644
index 0000000..f42e281
--- /dev/null
+++ b/build/modules/linux-x64/module.modulemap.in
@@ -0,0 +1,158 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// AUTOGENERATED FILE. DO NOT EDIT.
+// To regenerate, see instructions at build/modules/modularize/README.md
+
+
+module sys_stage1 [system] [extern_c] {
+  module sysroot_alloca_h {
+    header "$sysroot/alloca.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_base_h {
+    header "$sysroot/asm-generic/errno-base.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_h {
+    header "$sysroot/asm-generic/errno.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctl_h {
+    header "$sysroot/asm-generic/ioctl.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctls_h {
+    header "$sysroot/asm-generic/ioctls.h"
+    export *
+  }
+  module sysroot_asm_errno_h {
+    header "$sysroot/x86_64-linux-gnu/asm/errno.h"
+    export *
+  }
+  module sysroot_asm_ioctl_h {
+    header "$sysroot/x86_64-linux-gnu/asm/ioctl.h"
+    export *
+  }
+  module sysroot_asm_ioctls_h {
+    header "$sysroot/x86_64-linux-gnu/asm/ioctls.h"
+    export *
+  }
+  module sysroot_endian_h {
+    header "$sysroot/endian.h"
+    export *
+  }
+  module sysroot_fcntl_h {
+    header "$sysroot/fcntl.h"
+    export *
+  }
+  module sysroot_features_h {
+    header "$sysroot/features.h"
+    header "$sysroot/x86_64-linux-gnu/sys/cdefs.h"
+    export *
+  }
+  module sysroot_getopt_h {
+    header "$sysroot/getopt.h"
+    export *
+  }
+  module sysroot_gnu_stubs_64_h {
+    header "$sysroot/x86_64-linux-gnu/gnu/stubs-64.h"
+    export *
+  }
+  module sysroot_gnu_stubs_h {
+    header "$sysroot/x86_64-linux-gnu/gnu/stubs.h"
+    export *
+  }
+  module sysroot_linux_errno_h {
+    header "$sysroot/linux/errno.h"
+    export *
+  }
+  module sysroot_linux_falloc_h {
+    header "$sysroot/linux/falloc.h"
+    export *
+  }
+  module sysroot_linux_ioctl_h {
+    header "$sysroot/linux/ioctl.h"
+    export *
+  }
+  module sysroot_locale_h {
+    header "$sysroot/locale.h"
+    export *
+  }
+  module sysroot_nl_types_h {
+    header "$sysroot/nl_types.h"
+    export *
+  }
+  module sysroot_pthread_h {
+    header "$sysroot/pthread.h"
+    export *
+  }
+  module sysroot_sched_h {
+    header "$sysroot/sched.h"
+    export *
+  }
+  module sysroot_setjmp_h {
+    header "$sysroot/setjmp.h"
+    export *
+  }
+  module sysroot_signal_h {
+    header "$sysroot/signal.h"
+    export *
+  }
+  module sysroot_stdc_predef_h {
+    header "$sysroot/stdc-predef.h"
+    export *
+  }
+  module sysroot_stdio_h {
+    header "$sysroot/stdio.h"
+    export *
+  }
+  module sysroot_strings_h {
+    header "$sysroot/strings.h"
+    export *
+  }
+  module sysroot_sys_ioctl_h {
+    header "$sysroot/x86_64-linux-gnu/sys/ioctl.h"
+    export *
+  }
+  module sysroot_sys_select_h {
+    header "$sysroot/x86_64-linux-gnu/sys/select.h"
+    export *
+  }
+  module sysroot_sys_ttydefaults_h {
+    header "$sysroot/x86_64-linux-gnu/sys/ttydefaults.h"
+    export *
+  }
+  module sysroot_sys_types_h {
+    header "$sysroot/x86_64-linux-gnu/sys/types.h"
+    export *
+  }
+  module sysroot_sys_ucontext_h {
+    header "$sysroot/x86_64-linux-gnu/sys/ucontext.h"
+    export *
+  }
+  module sysroot_threads_h {
+    header "$sysroot/threads.h"
+    export *
+  }
+  module sysroot_time_h {
+    header "$sysroot/time.h"
+    export *
+  }
+  module sysroot_unistd_h {
+    header "$sysroot/unistd.h"
+    export *
+  }
+  module sysroot_wchar_h {
+    header "$sysroot/wchar.h"
+    export *
+  }
+}
+
+module sys_stage2 [system] [extern_c] {
+  module sysroot_stdlib_h {
+    header "$sysroot/stdlib.h"
+    export *
+  }
+}
diff --git a/build/modules/linux-x86/BUILD.gn b/build/modules/linux-x86/BUILD.gn
index 8899069..d516d84 100644
--- a/build/modules/linux-x86/BUILD.gn
+++ b/build/modules/linux-x86/BUILD.gn
@@ -7,8 +7,9 @@
 
 import("//buildtools/third_party/libc++/modules.gni")
 
-modulemap_config("sysroot_modulemap") {
-  source = "module.modulemap"
+sysroot_modulemap("sysroot_modulemap") {
+  source = "module.modulemap.in"
+  out = "${target_gen_dir}/module.modulemap"
 }
 
 builtin_module("_Builtin_float") {
diff --git a/build/modules/linux-x86/module.modulemap b/build/modules/linux-x86/module.modulemap
deleted file mode 100644
index 382f6c7..0000000
--- a/build/modules/linux-x86/module.modulemap
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// AUTOGENERATED FILE. DO NOT EDIT.
-// To regenerate, see instructions at build/modules/modularize/README.md
-
-
-module sys_stage1 [system] [extern_c] {
-  module sysroot_alloca_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/alloca.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_base_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/asm-generic/errno-base.h"
-    export *
-  }
-  module sysroot_asm_generic_errno_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/asm-generic/errno.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctl_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/asm-generic/ioctl.h"
-    export *
-  }
-  module sysroot_asm_generic_ioctls_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/asm-generic/ioctls.h"
-    export *
-  }
-  module sysroot_asm_errno_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/i386-linux-gnu/asm/errno.h"
-    export *
-  }
-  module sysroot_asm_ioctl_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/i386-linux-gnu/asm/ioctl.h"
-    export *
-  }
-  module sysroot_asm_ioctls_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/i386-linux-gnu/asm/ioctls.h"
-    export *
-  }
-  module sysroot_endian_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/endian.h"
-    export *
-  }
-  module sysroot_fcntl_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/fcntl.h"
-    export *
-  }
-  module sysroot_features_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/features.h"
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/i386-linux-gnu/sys/cdefs.h"
-    export *
-  }
-  module sysroot_getopt_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/getopt.h"
-    export *
-  }
-  module sysroot_gnu_stubs_32_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/i386-linux-gnu/gnu/stubs-32.h"
-    export *
-  }
-  module sysroot_gnu_stubs_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/i386-linux-gnu/gnu/stubs.h"
-    export *
-  }
-  module sysroot_linux_errno_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/linux/errno.h"
-    export *
-  }
-  module sysroot_linux_falloc_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/linux/falloc.h"
-    export *
-  }
-  module sysroot_linux_ioctl_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/linux/ioctl.h"
-    export *
-  }
-  module sysroot_locale_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/locale.h"
-    export *
-  }
-  module sysroot_nl_types_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/nl_types.h"
-    export *
-  }
-  module sysroot_pthread_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/pthread.h"
-    export *
-  }
-  module sysroot_sched_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/sched.h"
-    export *
-  }
-  module sysroot_setjmp_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/setjmp.h"
-    export *
-  }
-  module sysroot_signal_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/signal.h"
-    export *
-  }
-  module sysroot_stdc_predef_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/stdc-predef.h"
-    export *
-  }
-  module sysroot_stdio_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/stdio.h"
-    export *
-  }
-  module sysroot_strings_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/strings.h"
-    export *
-  }
-  module sysroot_sys_ioctl_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/i386-linux-gnu/sys/ioctl.h"
-    export *
-  }
-  module sysroot_sys_select_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/i386-linux-gnu/sys/select.h"
-    export *
-  }
-  module sysroot_sys_ttydefaults_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/i386-linux-gnu/sys/ttydefaults.h"
-    export *
-  }
-  module sysroot_sys_types_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/i386-linux-gnu/sys/types.h"
-    export *
-  }
-  module sysroot_sys_ucontext_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/i386-linux-gnu/sys/ucontext.h"
-    export *
-  }
-  module sysroot_threads_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/threads.h"
-    export *
-  }
-  module sysroot_time_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/time.h"
-    export *
-  }
-  module sysroot_unistd_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/unistd.h"
-    export *
-  }
-  module sysroot_wchar_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/wchar.h"
-    export *
-  }
-}
-
-module sys_stage2 [system] [extern_c] {
-  module sysroot_stdlib_h {
-    header "../../linux/debian_bullseye_i386-sysroot/usr/include/stdlib.h"
-    export *
-  }
-}
diff --git a/build/modules/linux-x86/module.modulemap.in b/build/modules/linux-x86/module.modulemap.in
new file mode 100644
index 0000000..ae12bd5
--- /dev/null
+++ b/build/modules/linux-x86/module.modulemap.in
@@ -0,0 +1,158 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// AUTOGENERATED FILE. DO NOT EDIT.
+// To regenerate, see instructions at build/modules/modularize/README.md
+
+
+module sys_stage1 [system] [extern_c] {
+  module sysroot_alloca_h {
+    header "$sysroot/alloca.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_base_h {
+    header "$sysroot/asm-generic/errno-base.h"
+    export *
+  }
+  module sysroot_asm_generic_errno_h {
+    header "$sysroot/asm-generic/errno.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctl_h {
+    header "$sysroot/asm-generic/ioctl.h"
+    export *
+  }
+  module sysroot_asm_generic_ioctls_h {
+    header "$sysroot/asm-generic/ioctls.h"
+    export *
+  }
+  module sysroot_asm_errno_h {
+    header "$sysroot/i386-linux-gnu/asm/errno.h"
+    export *
+  }
+  module sysroot_asm_ioctl_h {
+    header "$sysroot/i386-linux-gnu/asm/ioctl.h"
+    export *
+  }
+  module sysroot_asm_ioctls_h {
+    header "$sysroot/i386-linux-gnu/asm/ioctls.h"
+    export *
+  }
+  module sysroot_endian_h {
+    header "$sysroot/endian.h"
+    export *
+  }
+  module sysroot_fcntl_h {
+    header "$sysroot/fcntl.h"
+    export *
+  }
+  module sysroot_features_h {
+    header "$sysroot/features.h"
+    header "$sysroot/i386-linux-gnu/sys/cdefs.h"
+    export *
+  }
+  module sysroot_getopt_h {
+    header "$sysroot/getopt.h"
+    export *
+  }
+  module sysroot_gnu_stubs_32_h {
+    header "$sysroot/i386-linux-gnu/gnu/stubs-32.h"
+    export *
+  }
+  module sysroot_gnu_stubs_h {
+    header "$sysroot/i386-linux-gnu/gnu/stubs.h"
+    export *
+  }
+  module sysroot_linux_errno_h {
+    header "$sysroot/linux/errno.h"
+    export *
+  }
+  module sysroot_linux_falloc_h {
+    header "$sysroot/linux/falloc.h"
+    export *
+  }
+  module sysroot_linux_ioctl_h {
+    header "$sysroot/linux/ioctl.h"
+    export *
+  }
+  module sysroot_locale_h {
+    header "$sysroot/locale.h"
+    export *
+  }
+  module sysroot_nl_types_h {
+    header "$sysroot/nl_types.h"
+    export *
+  }
+  module sysroot_pthread_h {
+    header "$sysroot/pthread.h"
+    export *
+  }
+  module sysroot_sched_h {
+    header "$sysroot/sched.h"
+    export *
+  }
+  module sysroot_setjmp_h {
+    header "$sysroot/setjmp.h"
+    export *
+  }
+  module sysroot_signal_h {
+    header "$sysroot/signal.h"
+    export *
+  }
+  module sysroot_stdc_predef_h {
+    header "$sysroot/stdc-predef.h"
+    export *
+  }
+  module sysroot_stdio_h {
+    header "$sysroot/stdio.h"
+    export *
+  }
+  module sysroot_strings_h {
+    header "$sysroot/strings.h"
+    export *
+  }
+  module sysroot_sys_ioctl_h {
+    header "$sysroot/i386-linux-gnu/sys/ioctl.h"
+    export *
+  }
+  module sysroot_sys_select_h {
+    header "$sysroot/i386-linux-gnu/sys/select.h"
+    export *
+  }
+  module sysroot_sys_ttydefaults_h {
+    header "$sysroot/i386-linux-gnu/sys/ttydefaults.h"
+    export *
+  }
+  module sysroot_sys_types_h {
+    header "$sysroot/i386-linux-gnu/sys/types.h"
+    export *
+  }
+  module sysroot_sys_ucontext_h {
+    header "$sysroot/i386-linux-gnu/sys/ucontext.h"
+    export *
+  }
+  module sysroot_threads_h {
+    header "$sysroot/threads.h"
+    export *
+  }
+  module sysroot_time_h {
+    header "$sysroot/time.h"
+    export *
+  }
+  module sysroot_unistd_h {
+    header "$sysroot/unistd.h"
+    export *
+  }
+  module sysroot_wchar_h {
+    header "$sysroot/wchar.h"
+    export *
+  }
+}
+
+module sys_stage2 [system] [extern_c] {
+  module sysroot_stdlib_h {
+    header "$sysroot/stdlib.h"
+    export *
+  }
+}
diff --git a/build/modules/modularize/config.py b/build/modules/modularize/config.py
index 2530e49..b5a6bbd 100644
--- a/build/modules/modularize/config.py
+++ b/build/modules/modularize/config.py
@@ -48,7 +48,8 @@
 ]
 
 
-def fix_graph(graph: dict[str, Header], compiler: 'Compiler'):
+def fix_graph(graph: dict[str, Header],
+              compiler: 'Compiler') -> dict[pathlib.Path, str]:
   """Applies manual augmentation of the header graph."""
 
   def add_dep(frm, to, check=True):
@@ -130,6 +131,15 @@
     # if it's textual, limits.h undefs something it defined itself.
     graph['linux/limits.h'].textual = True
 
+  # Windows has multiple include directories contained with the sysroot.
+  if compiler.os == Os.Win:
+    return {
+        graph['corecrt.h'].abs.parent.parent: '$windows_kits',
+        graph['eh.h'].abs.parent: '$msvc',
+    }
+  else:
+    return {sysroot: '$sysroot'}
+
 
 def should_compile(target: Target) -> bool:
   """Decides whether a target should be compiled or not.
diff --git a/build/modules/modularize/modularize.py b/build/modules/modularize/modularize.py
index 06db79e..4c66b36 100755
--- a/build/modules/modularize/modularize.py
+++ b/build/modules/modularize/modularize.py
@@ -129,12 +129,12 @@
     return
 
   graph = compiler.compile_all()
-  fix_graph(graph, compiler)
+  replacements = fix_graph(graph, compiler)
   targets = run_build(graph)
   out_dir.mkdir(exist_ok=True, parents=False)
   if compiler.sysroot_dir == IncludeDir.Sysroot:
     render.render_modulemap(out_dir=out_dir,
-                            sysroot=compiler.sysroot,
+                            replacements=replacements,
                             targets=targets)
   render.render_build_gn(
       out_dir=out_dir,
diff --git a/build/modules/modularize/render.py b/build/modules/modularize/render.py
index 64ecadd..9419082 100644
--- a/build/modules/modularize/render.py
+++ b/build/modules/modularize/render.py
@@ -28,8 +28,9 @@
     IncludeDir.SysrootModule: 'apple_sysroot_module',
 }
 
-_SYSROOT_MODULEMAP = """modulemap_config("sysroot_modulemap") {
-  source = "module.modulemap"
+_SYSROOT_MODULEMAP = """sysroot_modulemap("sysroot_modulemap") {
+  source = "module.modulemap.in"
+  out = "${target_gen_dir}/module.modulemap"
 }
 
 """
@@ -71,7 +72,8 @@
   path.write_text(content)
 
 
-def render_modulemap(out_dir: pathlib.Path, sysroot: pathlib.Path,
+def render_modulemap(out_dir: pathlib.Path, replacements: dict[pathlib.Path,
+                                                               str],
                      targets: list[Target]):
   """Writes a modulemap to {out_dir}"""
   f = io.StringIO()
@@ -85,8 +87,12 @@
       f.write(f'  module {header.submodule_name} {{\n')
       for single in sorted(header.group):
         assert single.abs is not None
-        f.write(
-            f'    header "{single.abs.relative_to(out_dir, walk_up=True)}"\n')
+        path = str(single.abs)
+        for frm, to in replacements.items():
+          path = path.replace(str(frm), to)
+        # After replacements, all paths should be absolute.
+        assert not path.startswith('/'), path
+        f.write(f'    header "{path}"\n')
       if not header.exports and header.exports is not None:
         f.write('    export *\n')
       for export in header.exports or []:
@@ -95,7 +101,7 @@
       f.write('  }\n')
 
     f.write('}\n')
-  _update_content(out_dir / 'module.modulemap', f.getvalue())
+  _update_content(out_dir / 'module.modulemap.in', f.getvalue())
 
 
 def _render_string_list(f, indent: int, key: str, values: list[str]):
@@ -148,7 +154,8 @@
         all_modulemap_configs.add(modulemap_target)
 
     f.write(f'{rule}("{target.name}") {{\n')
-    if target.include_dir in [IncludeDir.SysrootModule, IncludeDir.Framework] and modulemap_target is not None:
+    if target.include_dir in [IncludeDir.SysrootModule, IncludeDir.Framework
+                              ] and modulemap_target is not None:
       f.write(f'  modulemap = ":{modulemap_target}"\n')
       if kind == IncludeDir.SysrootModule:
         f.write(f'  modulemap_path = "{rel}"\n')
diff --git a/build/modules/win-x64/BUILD.gn b/build/modules/win-x64/BUILD.gn
index 9622c02..2c5e565 100644
--- a/build/modules/win-x64/BUILD.gn
+++ b/build/modules/win-x64/BUILD.gn
@@ -7,8 +7,9 @@
 
 import("//buildtools/third_party/libc++/modules.gni")
 
-modulemap_config("sysroot_modulemap") {
-  source = "module.modulemap"
+sysroot_modulemap("sysroot_modulemap") {
+  source = "module.modulemap.in"
+  out = "${target_gen_dir}/module.modulemap"
 }
 
 builtin_module("_Builtin_float") {
diff --git a/build/modules/win-x64/module.modulemap b/build/modules/win-x64/module.modulemap
deleted file mode 100644
index 59e544c8b..0000000
--- a/build/modules/win-x64/module.modulemap
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// AUTOGENERATED FILE. DO NOT EDIT.
-// To regenerate, see instructions at build/modules/modularize/README.md
-
-
-module sys_stage1 [system] [extern_c] {
-  module sysroot___msvc_cxx_stdatomic_hpp {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/__msvc_cxx_stdatomic.hpp"
-    export *
-  }
-  module sysroot_concurrencysal_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/concurrencysal.h"
-    export *
-  }
-  module sysroot_corecrt_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt.h"
-    export *
-  }
-  module sysroot_corecrt_malloc_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_malloc.h"
-    export *
-  }
-  module sysroot_corecrt_math_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_math.h"
-    export *
-  }
-  module sysroot_corecrt_search_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_search.h"
-    export *
-  }
-  module sysroot_corecrt_share_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_share.h"
-    export *
-  }
-  module sysroot_corecrt_stdio_config_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_stdio_config.h"
-    export *
-  }
-  module sysroot_corecrt_terminate_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_terminate.h"
-    export *
-  }
-  module sysroot_corecrt_wconio_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_wconio.h"
-    export *
-  }
-  module sysroot_corecrt_wctype_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_wctype.h"
-    export *
-  }
-  module sysroot_corecrt_wdirect_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_wdirect.h"
-    export *
-  }
-  module sysroot_corecrt_wio_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_wio.h"
-    export *
-  }
-  module sysroot_corecrt_wprocess_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_wprocess.h"
-    export *
-  }
-  module sysroot_corecrt_wstdio_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_wstdio.h"
-    export *
-  }
-  module sysroot_corecrt_wstdlib_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_wstdlib.h"
-    export *
-  }
-  module sysroot_corecrt_wstring_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_wstring.h"
-    export *
-  }
-  module sysroot_corecrt_wtime_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_wtime.h"
-    export *
-  }
-  module sysroot_crtdbg_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/crtdbg.h"
-    export *
-  }
-  module sysroot_crtdefs_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/crtdefs.h"
-    export *
-  }
-  module sysroot_eh_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/eh.h"
-    export *
-  }
-  module sysroot_fcntl_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/fcntl.h"
-    export *
-  }
-  module sysroot_locale_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/locale.h"
-    export *
-  }
-  module sysroot_malloc_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/malloc.h"
-    export *
-  }
-  module sysroot_new_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/new.h"
-    export *
-  }
-  module sysroot_sal_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/sal.h"
-    export *
-  }
-  module sysroot_setjmp_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/setjmp.h"
-    export *
-  }
-  module sysroot_signal_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/signal.h"
-    export *
-  }
-  module sysroot_stdarg_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/stdarg.h"
-    export *
-  }
-  module sysroot_stddef_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/stddef.h"
-    export *
-  }
-  module sysroot_stdio_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/stdio.h"
-    export *
-  }
-  module sysroot_sys_stat_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/sys/stat.h"
-    export *
-  }
-  module sysroot_sys_types_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/sys/types.h"
-    export *
-  }
-  module sysroot_time_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/time.h"
-    export *
-  }
-  module sysroot_use_ansi_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/use_ansi.h"
-    export *
-  }
-  module sysroot_vadefs_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/vadefs.h"
-    export *
-  }
-  module sysroot_vcruntime_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/vcruntime.h"
-    export *
-  }
-  module sysroot_vcruntime_exception_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/vcruntime_exception.h"
-    export *
-  }
-  module sysroot_vcruntime_new_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/vcruntime_new.h"
-    export *
-  }
-  module sysroot_vcruntime_new_debug_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/vcruntime_new_debug.h"
-    export *
-  }
-  module sysroot_vcruntime_string_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/vcruntime_string.h"
-    export *
-  }
-  module sysroot_vcruntime_typeinfo_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/vcruntime_typeinfo.h"
-    export *
-  }
-  module sysroot_winapifamily_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/shared/winapifamily.h"
-    export *
-  }
-  module sysroot_winpackagefamily_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/shared/winpackagefamily.h"
-    export *
-  }
-  module sysroot_xkeycheck_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/xkeycheck.h"
-    export *
-  }
-  module sysroot_yvals_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/yvals.h"
-    export *
-  }
-  module sysroot_yvals_core_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/yvals_core.h"
-    export *
-  }
-}
-
-module sys_stage2 [system] [extern_c] {
-  module sysroot_corecrt_memcpy_s_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_memcpy_s.h"
-    export *
-  }
-  module sysroot_corecrt_memory_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/corecrt_memory.h"
-    export *
-  }
-  module sysroot_stdlib_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/stdlib.h"
-    export *
-  }
-  module sysroot_threads_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/VC/Tools/MSVC/14.44.35207/include/threads.h"
-    export *
-  }
-}
-
-module sys_stage3 [system] [extern_c] {
-  module sysroot_wchar_h {
-    header "../../../third_party/depot_tools/win_toolchain/vs_files/e4305f407e/Windows Kits/10/Include/10.0.26100.0/ucrt/wchar.h"
-    export *
-  }
-}
diff --git a/build/modules/win-x64/module.modulemap.in b/build/modules/win-x64/module.modulemap.in
new file mode 100644
index 0000000..d66c7576
--- /dev/null
+++ b/build/modules/win-x64/module.modulemap.in
@@ -0,0 +1,224 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// AUTOGENERATED FILE. DO NOT EDIT.
+// To regenerate, see instructions at build/modules/modularize/README.md
+
+
+module sys_stage1 [system] [extern_c] {
+  module sysroot___msvc_cxx_stdatomic_hpp {
+    header "$msvc/__msvc_cxx_stdatomic.hpp"
+    export *
+  }
+  module sysroot_concurrencysal_h {
+    header "$msvc/concurrencysal.h"
+    export *
+  }
+  module sysroot_corecrt_h {
+    header "$windows_kits/ucrt/corecrt.h"
+    export *
+  }
+  module sysroot_corecrt_malloc_h {
+    header "$windows_kits/ucrt/corecrt_malloc.h"
+    export *
+  }
+  module sysroot_corecrt_math_h {
+    header "$windows_kits/ucrt/corecrt_math.h"
+    export *
+  }
+  module sysroot_corecrt_search_h {
+    header "$windows_kits/ucrt/corecrt_search.h"
+    export *
+  }
+  module sysroot_corecrt_share_h {
+    header "$windows_kits/ucrt/corecrt_share.h"
+    export *
+  }
+  module sysroot_corecrt_stdio_config_h {
+    header "$windows_kits/ucrt/corecrt_stdio_config.h"
+    export *
+  }
+  module sysroot_corecrt_terminate_h {
+    header "$windows_kits/ucrt/corecrt_terminate.h"
+    export *
+  }
+  module sysroot_corecrt_wconio_h {
+    header "$windows_kits/ucrt/corecrt_wconio.h"
+    export *
+  }
+  module sysroot_corecrt_wctype_h {
+    header "$windows_kits/ucrt/corecrt_wctype.h"
+    export *
+  }
+  module sysroot_corecrt_wdirect_h {
+    header "$windows_kits/ucrt/corecrt_wdirect.h"
+    export *
+  }
+  module sysroot_corecrt_wio_h {
+    header "$windows_kits/ucrt/corecrt_wio.h"
+    export *
+  }
+  module sysroot_corecrt_wprocess_h {
+    header "$windows_kits/ucrt/corecrt_wprocess.h"
+    export *
+  }
+  module sysroot_corecrt_wstdio_h {
+    header "$windows_kits/ucrt/corecrt_wstdio.h"
+    export *
+  }
+  module sysroot_corecrt_wstdlib_h {
+    header "$windows_kits/ucrt/corecrt_wstdlib.h"
+    export *
+  }
+  module sysroot_corecrt_wstring_h {
+    header "$windows_kits/ucrt/corecrt_wstring.h"
+    export *
+  }
+  module sysroot_corecrt_wtime_h {
+    header "$windows_kits/ucrt/corecrt_wtime.h"
+    export *
+  }
+  module sysroot_crtdbg_h {
+    header "$windows_kits/ucrt/crtdbg.h"
+    export *
+  }
+  module sysroot_crtdefs_h {
+    header "$msvc/crtdefs.h"
+    export *
+  }
+  module sysroot_eh_h {
+    header "$msvc/eh.h"
+    export *
+  }
+  module sysroot_fcntl_h {
+    header "$windows_kits/ucrt/fcntl.h"
+    export *
+  }
+  module sysroot_locale_h {
+    header "$windows_kits/ucrt/locale.h"
+    export *
+  }
+  module sysroot_malloc_h {
+    header "$windows_kits/ucrt/malloc.h"
+    export *
+  }
+  module sysroot_new_h {
+    header "$windows_kits/ucrt/new.h"
+    export *
+  }
+  module sysroot_sal_h {
+    header "$msvc/sal.h"
+    export *
+  }
+  module sysroot_setjmp_h {
+    header "$msvc/setjmp.h"
+    export *
+  }
+  module sysroot_signal_h {
+    header "$windows_kits/ucrt/signal.h"
+    export *
+  }
+  module sysroot_stdarg_h {
+    header "$msvc/stdarg.h"
+    export *
+  }
+  module sysroot_stddef_h {
+    header "$windows_kits/ucrt/stddef.h"
+    export *
+  }
+  module sysroot_stdio_h {
+    header "$windows_kits/ucrt/stdio.h"
+    export *
+  }
+  module sysroot_sys_stat_h {
+    header "$windows_kits/ucrt/sys/stat.h"
+    export *
+  }
+  module sysroot_sys_types_h {
+    header "$windows_kits/ucrt/sys/types.h"
+    export *
+  }
+  module sysroot_time_h {
+    header "$windows_kits/ucrt/time.h"
+    export *
+  }
+  module sysroot_use_ansi_h {
+    header "$msvc/use_ansi.h"
+    export *
+  }
+  module sysroot_vadefs_h {
+    header "$msvc/vadefs.h"
+    export *
+  }
+  module sysroot_vcruntime_h {
+    header "$msvc/vcruntime.h"
+    export *
+  }
+  module sysroot_vcruntime_exception_h {
+    header "$msvc/vcruntime_exception.h"
+    export *
+  }
+  module sysroot_vcruntime_new_h {
+    header "$msvc/vcruntime_new.h"
+    export *
+  }
+  module sysroot_vcruntime_new_debug_h {
+    header "$msvc/vcruntime_new_debug.h"
+    export *
+  }
+  module sysroot_vcruntime_string_h {
+    header "$msvc/vcruntime_string.h"
+    export *
+  }
+  module sysroot_vcruntime_typeinfo_h {
+    header "$msvc/vcruntime_typeinfo.h"
+    export *
+  }
+  module sysroot_winapifamily_h {
+    header "$windows_kits/shared/winapifamily.h"
+    export *
+  }
+  module sysroot_winpackagefamily_h {
+    header "$windows_kits/shared/winpackagefamily.h"
+    export *
+  }
+  module sysroot_xkeycheck_h {
+    header "$msvc/xkeycheck.h"
+    export *
+  }
+  module sysroot_yvals_h {
+    header "$msvc/yvals.h"
+    export *
+  }
+  module sysroot_yvals_core_h {
+    header "$msvc/yvals_core.h"
+    export *
+  }
+}
+
+module sys_stage2 [system] [extern_c] {
+  module sysroot_corecrt_memcpy_s_h {
+    header "$windows_kits/ucrt/corecrt_memcpy_s.h"
+    export *
+  }
+  module sysroot_corecrt_memory_h {
+    header "$windows_kits/ucrt/corecrt_memory.h"
+    export *
+  }
+  module sysroot_stdlib_h {
+    header "$windows_kits/ucrt/stdlib.h"
+    export *
+  }
+  module sysroot_threads_h {
+    header "$msvc/threads.h"
+    export *
+  }
+}
+
+module sys_stage3 [system] [extern_c] {
+  module sysroot_wchar_h {
+    header "$windows_kits/ucrt/wchar.h"
+    export *
+  }
+}
diff --git a/build/toolchain/win/setup_toolchain.py b/build/toolchain/win/setup_toolchain.py
index d659889..e0b7c03 100644
--- a/build/toolchain/win/setup_toolchain.py
+++ b/build/toolchain/win/setup_toolchain.py
@@ -10,7 +10,6 @@
 # win tool. The script assumes that the root build directory is the current dir
 # and the files will be written to the current directory.
 
-
 import errno
 import json
 import os
@@ -23,6 +22,8 @@
 
 SCRIPT_DIR = os.path.dirname(__file__)
 SDK_VERSION = '10.0.26100.0'
+MSVC_DIR = re.compile('^.*/VC/Tools/MSVC/[^/]+/include$')
+WINDOWS_KITS_DIR = re.compile(r'^(.*/Windows Kits/\d+/Include/[^/]+)/.*')
 
 
 def _ExtractImportantEnvironment(output_of_set):
@@ -92,8 +93,10 @@
   """Given a bat command, runs it and returns env vars set by it."""
   args = args[:]
   args.extend(('&&', 'set'))
-  popen = subprocess.Popen(
-      args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+  popen = subprocess.Popen(args,
+                           shell=True,
+                           stdout=subprocess.PIPE,
+                           stderr=subprocess.STDOUT)
   variables, _ = popen.communicate()
   if popen.returncode != 0:
     raise Exception('"%s" failed with error %d' % (args, popen.returncode))
@@ -147,9 +150,8 @@
     if 'GYP_MSVS_OVERRIDE_PATH' not in os.environ:
       os.environ['GYP_MSVS_OVERRIDE_PATH'] = _DetectVisualStudioPath()
     # We only support x64-hosted tools.
-    script_path = os.path.normpath(os.path.join(
-                                       os.environ['GYP_MSVS_OVERRIDE_PATH'],
-                                       'VC/vcvarsall.bat'))
+    script_path = os.path.normpath(
+        os.path.join(os.environ['GYP_MSVS_OVERRIDE_PATH'], 'VC/vcvarsall.bat'))
     if not os.path.exists(script_path):
       # vcvarsall.bat for VS 2017 fails if run after running vcvarsall.bat from
       # VS 2013 or VS 2015. Fix this by clearing the vsinstalldir environment
@@ -166,9 +168,9 @@
           del os.environ['LIB']
         if 'LIBPATH' in os.environ:
           del os.environ['LIBPATH']
-      other_path = os.path.normpath(os.path.join(
-                                        os.environ['GYP_MSVS_OVERRIDE_PATH'],
-                                        'VC/Auxiliary/Build/vcvarsall.bat'))
+      other_path = os.path.normpath(
+          os.path.join(os.environ['GYP_MSVS_OVERRIDE_PATH'],
+                       'VC/Auxiliary/Build/vcvarsall.bat'))
       if not os.path.exists(other_path):
         raise Exception('%s is missing - make sure VC++ tools are installed.' %
                         script_path)
@@ -177,7 +179,10 @@
     if (cpu != 'x64'):
       # x64 is default target CPU thus any other CPU requires a target set
       cpu_arg += '_' + cpu
-    args = [script_path, cpu_arg, ]
+    args = [
+        script_path,
+        cpu_arg,
+    ]
     # Store target must come before any SDK version declaration
     if (target_store):
       args.append('store')
@@ -254,6 +259,8 @@
   vc_bin_dir = ''
   include = ''
   lib = ''
+  windows_kits_dir = ''
+  msvc_dir = ''
 
   def relflag(s):  # Make s relative to builddir when cwd and sdk on same drive.
     try:
@@ -280,6 +287,14 @@
       lib = [p.replace('"', r'\"') for p in env['LIB'].split(';') if p]
       lib = list(map(relflag, lib))
 
+      for i in include:
+        msvc_match = MSVC_DIR.match(i)
+        if msvc_match is not None:
+          msvc_dir = msvc_match.group(0)
+        windows_kits_match = WINDOWS_KITS_DIR.match(i)
+        if windows_kits_match is not None:
+          windows_kits_dir = windows_kits_match.group(1)
+
       include_I = ['/I' + i for i in include]
       include_imsvc = ['-imsvc' + i for i in include]
       libpath_flags = ['-libpath:' + i for i in lib]
@@ -319,6 +334,9 @@
     print(f'libpath_lldlink_flags = {ListToArgString(libpath_flags)}')
     print(f'libpath_lldlink_flags_list = {ListToArgList(libpath_flags)}')
 
+  print(f'msvc_dir = {gn_helpers.ToGNString(msvc_dir)}')
+  print(f'windows_kits_dir = {gn_helpers.ToGNString(windows_kits_dir)}')
+
 
 if __name__ == '__main__':
   main()
diff --git a/buildtools/third_party/libc++/modules.gni b/buildtools/third_party/libc++/modules.gni
index 89c8808e..d975e238 100644
--- a/buildtools/third_party/libc++/modules.gni
+++ b/buildtools/third_party/libc++/modules.gni
@@ -5,6 +5,10 @@
 import("//build/config/apple/apple_sdk.gni")
 import("//build/config/c++/modules.gni")
 import("//build/config/clang/clang.gni")
+import("//build/config/sysroot.gni")
+if (is_win) {
+  import("//build/toolchain/win/win_toolchain_data.gni")
+}
 
 configs_to_add = [
   "//buildtools/third_party/libc++:config",
@@ -112,7 +116,7 @@
     template("sysroot_module") {
       clang_module(target_name) {
         forward_variables_from(invoker, "*")
-        modulemap = "module.modulemap"
+        modulemap = "${target_gen_dir}/module.modulemap"
         public_configs = [ ":sysroot_modulemap" ]
       }
     }
@@ -178,6 +182,49 @@
   }
 }
 
+template("sysroot_modulemap") {
+  content = read_file(invoker.source, "string")
+  if (is_win) {
+    if (current_cpu == "x64") {
+      win_toolchain_data = win_toolchain_data_x64
+    } else if (current_cpu == "x86") {
+      win_toolchain_data = win_toolchain_data_x86
+    } else if (current_cpu == "arm64") {
+      win_toolchain_data = win_toolchain_data_arm64
+    } else {
+      error("Unsuppported windows CPU, add it to win_toolchain_data.gni")
+    }
+
+    # This must be relative to the directory the modulemap is contained within.
+    content = string_replace(content,
+                             "\$msvc",
+                             rebase_path(win_toolchain_data.msvc_dir,
+                                         target_gen_dir,
+                                         root_build_dir))
+    content = string_replace(content,
+                             "\$windows_kits",
+                             rebase_path(win_toolchain_data.windows_kits_dir,
+                                         target_gen_dir,
+                                         root_build_dir))
+  } else {
+    include_dir = "${sysroot}/usr/include"
+    if (is_fuchsia) {
+      include_dir = "${sysroot}/include"
+    }
+
+    # This must be relative to the directory the modulemap is contained within.
+    content =
+        string_replace(content,
+                       "\$sysroot",
+                       rebase_path(include_dir, target_gen_dir, root_build_dir))
+  }
+  write_file(invoker.out, content)
+
+  modulemap_config(target_name) {
+    source = invoker.out
+  }
+}
+
 template("apple_sysroot_modulemap") {
   modulemap_config(target_name) {
     source = "${sysroot_include_dir}/${invoker.sysroot_path}"
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/PartnerBookmarkTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/PartnerBookmarkTest.java
index 7321204..ab85fc4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/PartnerBookmarkTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/PartnerBookmarkTest.java
@@ -169,6 +169,7 @@
         assertEquals(View.GONE, more2.getVisibility());
     }
 
+    // Disabled on android.emulator_12l_landscape - crbug.com/442769979.
     @Test
     @MediumTest
     public void testCannotSelectPartner() throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoPermissionLeakageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoPermissionLeakageTest.java
index 198a2c04..216c2a1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoPermissionLeakageTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoPermissionLeakageTest.java
@@ -172,6 +172,7 @@
         assertDialogIsShown();
     }
 
+    // Disabled on android.emulator_12l_landscape - crbug.com/442769979.
     @Test
     @LargeTest
     @UseMethodParameter(TestParams.IncognitoToIncognito.class)
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoDiscoverabilityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoDiscoverabilityTest.java
index 41e566d..32fabd4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoDiscoverabilityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoDiscoverabilityTest.java
@@ -299,6 +299,7 @@
     }
 
     /** Tests omnibox permission when permission is blocked by the user. */
+    // Disabled on android.emulator_12l_landscape - crbug.com/442769979.
     @Test
     @MediumTest
     @Feature({"PageInfoDiscoverability"})
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/RuntimePermissionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/RuntimePermissionTest.java
index aa873070..f604d1f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/RuntimePermissionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/RuntimePermissionTest.java
@@ -223,6 +223,7 @@
                 R.string.infobar_missing_microphone_permission_text);
     }
 
+    // Disabled on android.emulator_12l_landscape - crbug.com/442769979.
     @Test
     @MediumTest
     @Feature({"RuntimePermissions", "Location"})
diff --git a/chrome/android/profiles/arm.newest.txt b/chrome/android/profiles/arm.newest.txt
index 1c17590..643980f 100644
--- a/chrome/android/profiles/arm.newest.txt
+++ b/chrome/android/profiles/arm.newest.txt
@@ -1 +1 @@
-chromeos-chrome-arm-141.0.7389.0_pre1509040_rc-r1-merged.afdo.bz2
+chromeos-chrome-arm-142.0.7391.0_pre1509560_rc-r1-merged.afdo.bz2
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 7052472..41cd6f9e 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-141.0.7389.0_pre1509040_rc-r1-merged.afdo.bz2
+chromeos-chrome-amd64-142.0.7391.0_pre1509560_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb
index b3d3695c..0b0049f 100644
--- a/chrome/app/resources/chromium_strings_ar.xtb
+++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -61,9 +61,9 @@
 <translation id="1820835682567584003">‏يحاول Chromium <ph name="AUTHENTICATION_PURPOSE" />.</translation>
 <translation id="1838374766361614909">محو البحث</translation>
 <translation id="18552579716432081">‏لحذف بيانات التصفّح من هذا الجهاز فقط والاحتفاظ بها في حسابك على Google، يُرجى <ph name="BEGIN_LINK" />تسجيل الخروج من Chromium<ph name="END_LINK" />.</translation>
-<translation id="185970820835152459">‏يمكنك إدارة حسابات Google التي تم تسجيل الدخول إليها. يتم استخدام حساباتك على Google في متصفّح Chromium و"متجر Play" وGmail والمزيد. إذا أردت إضافة حساب لمستخدم آخر، مثل أحد أفراد العائلة، أضِف شخصًا جديدًا إلى <ph name="DEVICE_TYPE" /> بدلاً من ذلك. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
+<translation id="185970820835152459">‏يمكنك إدارة حسابات Google التي تم تسجيل الدخول إليها. يتم استخدام حساباتك على Google في متصفّح Chromium و"متجر Play" وGmail والمزيد. إذا أردت إضافة حساب لمستخدم آخر، مثل أحد أفراد العائلة، يمكنك إضافة شخص جديد إلى <ph name="DEVICE_TYPE" /> بدلاً من ذلك. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
 <translation id="1862852878885210965">البحث باستخدام ميزة "البحث بالصور"</translation>
-<translation id="1863308913976887472">‏يمكن أن تخزّن المواقع الإلكترونية معلومات عن اهتماماتك في متصفّح Chromium. على سبيل المثال، إذا انتقلت إلى موقع إلكتروني لشراء حذاء لاستخدامه في سباق ماراثون، قد يحدّد هذا الموقع الإلكتروني حسب تقديره أنك مهتم بسباقات الماراثون. وبعد ذلك، إذا انتقلت إلى موقع إلكتروني آخر للتسجيل في سباق ماراثون، يمكن أن يعرض لك هذا الموقع الإلكتروني إعلانًا عن الأحذية المخصّصة للجري بناءً على اهتماماتك.</translation>
+<translation id="1863308913976887472">‏يمكن أن تخزّن المواقع الإلكترونية معلومات عن اهتماماتك في متصفّح Chromium. على سبيل المثال، إذا انتقلت إلى موقع إلكتروني لشراء حذاء لاستخدامه في سباق ماراثون، قد يحدّد هذا الموقع الإلكتروني حسب تقديره أنه لديك اهتمام بسباقات الماراثون. وبعد ذلك، إذا انتقلت إلى موقع إلكتروني آخر للتسجيل في سباق ماراثون، يمكن أن يعرض لك هذا الموقع الإلكتروني إعلانًا عن الأحذية المخصّصة للجري بناءً على اهتماماتك.</translation>
 <translation id="1880677175115548835">اختيار نص</translation>
 <translation id="1881322772814446296">‏أنت بصدد تسجيل الدخول باستخدام حساب مُدار، ما يتيح للمشرف إمكانية التحكم في ملفك الشخصي على Chromium. وستكون بياناتك في Chromium مثل تطبيقاتك وإشاراتك المرجعية وسجلك وكلمات المرور التابعة لك والإعدادات الأخرى مرتبطة دائمًا بالمستخدم <ph name="USER_NAME" />. يمكنك حذف هذه البيانات عبر لوحة تحكم حسابات Google، ولكن لا يمكنك إقران هذه البيانات بحساب آخر. ويُمكنك اختيار إنشاء ملف شخصي جديد للإبقاء على بياناتك الحالية في Chromium بشكل مستقل. <ph name="LEARN_MORE" /></translation>
 <translation id="1896836275755235458">‏يحافظ Chromium على طاقة البطارية من خلال الحدّ من الأنشطة في الخلفية والتأثيرات المرئية، مثل التمرير السلس وعدد اللقطات في الثانية للفيديو. <ph name="BEGIN_LINK" />مزيد من المعلومات حول ميزة "توفير البطارية"<ph name="END_LINK" /></translation>
@@ -247,7 +247,7 @@
 <translation id="4122186850977583290">‏الانتقال إلى صفحة "لمحة عن Chromium"</translation>
 <translation id="4148957013307229264">جارٍ التثبيت...</translation>
 <translation id="419998258129752635">‏<ph name="PAGE_TITLE" /> - تسجيل الدخول إلى الشبكة - Chromium</translation>
-<translation id="421369550622382712">‏اكتشف تطبيقات، وألعاب، وإضافات، ومظاهر رائعة لمتصفح Chromium.</translation>
+<translation id="421369550622382712">‏يمكنك اكتشاف تطبيقات، وألعاب، وإضافات، ومظاهر رائعة لمتصفح Chromium.</translation>
 <translation id="4217080900579554343">‏يمكنك تسجيل الدخول إلى Chromium للحصول على هذه الإضافة وغيرها على جميع أجهزة الكمبيوتر الخاصة بك</translation>
 <translation id="4217972271355023382">‏للحفاظ على أمانك على الإنترنت من خلال خيارات أحد والدَيك، يُرجى الانتقال إلى ملفك الشخصي على Chromium الذي سجّلت الدخول إليه من قبل باستخدام الحساب <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="4222932583846282852">جارٍ الإلغاء...</translation>
@@ -401,7 +401,7 @@
 <translation id="6174920971222007286">‏قد يكون هذا الملف خطيرًا.<ph name="LINE_BREAK" />بإمكان Chromium التحقُّق من عملية التنزيل هذه عند إدخال كلمة المرور. وتُرسل معلومات حول الملف إلى ميزة "التصفّح الآمن من Google"، ولكن يبقى محتوى الملف وكلمة المرور على جهازك.</translation>
 <translation id="6182736845697986886">تعذَّر تثبيت التطبيق بسبب حدوث خطأ داخلي في خادم التحديث.</translation>
 <translation id="6183079672144801177">‏يُرجى التأكُّد من تسجيل الدخول إلى متصفِّح Chromium على جهازك <ph name="TARGET_DEVICE_NAME" /> ثم محاولة الإرسال مرة أخرى.</translation>
-<translation id="6212496753309875659">‏يحتوي هذا الكمبيوتر فعلاً على إصدار أحدث من Chromium. إذا كان البرنامج لا يعمل، يُرجى إزالة Chromium وإعادة المحاولة.</translation>
+<translation id="6212496753309875659">‏يحتوي هذا الكمبيوتر فعلاً على إصدار أحدث من Chromium. إذا كان البرنامج لا يعمل، يُرجى إلغاء تثبيت Chromium وإعادة المحاولة.</translation>
 <translation id="6219195342503754812">{0,plural, =0{‏ستتم إعادة تشغيل Chromium الآن}=1{‏ستتم إعادة تشغيل Chromium في غضون ثانية واحدة}two{‏ستتم إعادة تشغيل Chromium في غضون ثانيتين}few{‏ستتم إعادة تشغيل Chromium في غضون # ثوان}many{‏ستتم إعادة تشغيل Chromium في غضون # ثانيةً}other{‏ستتم إعادة تشغيل Chromium في غضون # ثانية}}</translation>
 <translation id="6239161312595354541">طرح أسئلة حول هذا الفيديو باستخدام ميزة "البحث بالصور"</translation>
 <translation id="6241367896540709610">‏يحتاج Chromium إلى إذن للوصول إلى مساحة التخزين من أجل تنزيل الملفات.</translation>
@@ -424,7 +424,7 @@
 <translation id="6388799252195623474">أريد مساعدة بخصوص هذا المحتوى</translation>
 <translation id="6390800440335263989">‏للمتابعة، يُرجى تسجيل الدخول إلى Chromium باستخدام حساب <ph name="EMAIL" />. ويضمن ذلك أنّك قد اطّلعت على سياسات مؤسستك.</translation>
 <translation id="6400112897226594999">‏شعار Chromium على شاشة كمبيوتر</translation>
-<translation id="6403826409255603130">‏ إن Chromium هو متصفح ويب يشغّل صفحات الويب والتطبيقات بسرعة مذهلة. إنه سريع وثابت وسهل الاستخدام. يمكنك تصفح الويب بشكل أكثر أمانًا من خلال ميزات الحماية من البرامج الضارة والتصيّد الاحتيالي المدمجة في Chromium.</translation>
+<translation id="6403826409255603130">‏إن Chromium هو متصفح ويب يشغّل صفحات الويب والتطبيقات بسرعة مذهلة. إنه سريع وثابت وسهل الاستخدام. يمكنك تصفح الويب بشكل أكثر أمانًا من خلال ميزات الحماية من البرامج الضارة والتصيّد الاحتيالي المدمجة في Chromium.</translation>
 <translation id="6436260184216827876">ميزة "البحث بالصور" ليست متوفرة. يُرجى إعادة المحاولة لاحقًا.</translation>
 <translation id="6442900851116057561">‏إعادة تشغيل نظام التشغيل ChromiumOS</translation>
 <translation id="6443470774889161065">‏يُحمِّل Chromium مسبقًا المزيد من الصفحات التي يُحتمل زيارتها، وذلك بهدف تحميلها بسرعة أكبر عند زيارتك لها.</translation>
@@ -482,7 +482,7 @@
 <translation id="7011190694940573312">تعذّر تثبيت هذا الإصدار من نظام التشغيل لأنّه غير متوافق.</translation>
 <translation id="7024536598735240744">حدث خطأ في فك ضغط الحزمة: <ph name="UNPACK_ERROR" />.</translation>
 <translation id="7025789849649390912">تم إيقاف التثبيت.</translation>
-<translation id="7045244423563602563">‏اجعل Chromium متصفِّحك الدائم</translation>
+<translation id="7045244423563602563">‏يمكنك جعل Chromium متصفِّحك الدائم</translation>
 <translation id="705851970750939768">‏تحديث Chromium</translation>
 <translation id="7067091210845072982">‏في حال لم تتضمن صورة ما وصفًا مفيدًا، سيحاول Chromium توفير وصف لك. لإنشاء الأوصاف، سيتم إرسال الصور إلى Google.</translation>
 <translation id="7141270731789036260">‏تخصيص Chrome for Testing</translation>
@@ -542,7 +542,7 @@
 <translation id="7810005234485217901">يمكنك تثبيت ميزة "البحث بالصور" للوصول إليها بسهولة</translation>
 <translation id="7828947555739565424">‏يتوفّر حاليًا على هذا الجهاز ملف شخصي لهذا الحساب على Chromium.</translation>
 <translation id="7845233973568007926">شكرًا على التثبيت. عليك إعادة تشغيل الكمبيوتر قبل استخدام <ph name="BUNDLE_NAME" />.</translation>
-<translation id="7859018312476869945">‏عند الكتابة في شريط العناوين أو مربّع البحث، يرسل Chromium ما تكتبه إلى محرك البحث التلقائي للحصول على اقتراحات أفضل. يتم إيقاف هذا الإعداد في "وضع التصفّح المتخفي".</translation>
+<translation id="7859018312476869945">‏عند الكتابة في شريط العناوين أو مربّع البحث، يرسل Chromium ما تمّت كتابته إلى محرك البحث التلقائي للحصول على اقتراحات أفضل. يتم إيقاف هذا الإعداد في "وضع التصفّح المتخفي".</translation>
 <translation id="7867198900892795913">‏تعذّرت إعادة التحميل Chromium إلى آخر إصدار، لذلك قد تفوتك الميزات الجديدة وعمليات إصلاح الأمان.</translation>
 <translation id="7872446069773932638">جارٍ التنزيل… الثواني المتبقّية: <ph name="SECONDS" /></translation>
 <translation id="7873537467422636035">‏في حال نسيت عبارة المرور أو أردت تغيير هذه الإعدادات، يمكنك <ph name="BEGIN_LINK" />حذف بيانات Chromium في حسابك<ph name="END_LINK" /></translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb
index e311a8b3..ed544d5 100644
--- a/chrome/app/resources/chromium_strings_fa.xtb
+++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -67,7 +67,7 @@
 <translation id="1880677175115548835">انتخاب نوشتار</translation>
 <translation id="1881322772814446296">‏شما با حساب مدیریت‌شده وارد سیستم می‌شوید و به سرپرست آن اجازه کنترل بر نمایه Chromium خود را می‌دهید. داده‌های Chromium شما شامل برنامه‌ها، نشانک‌ها، سابقه، گذرواژه‌ها و سایر تنظیمات برای همیشه به <ph name="USER_NAME" /> مرتبط خواهد شد. می‌توانید این داده‌ها را از طریق داشبورد حساب‌های Google حذف کنید اما نمی‌توانید این داده‌ها را به حساب دیگری مرتبط سازید. در صورت تمایل برای ذخیره داده‌های Chromium موجود به صورت جداگانه می‌توانید نمایه جدیدی ایجاد کنید. <ph name="LEARN_MORE" /></translation>
 <translation id="1896836275755235458">‏‫Chromium با محدود کردن فعالیت پس‌زمینه و جلوه‌های دیداری، مثل پیمایش روان و نرخ فریم ویدیو، در مصرف باتری صرفه‌جویی می‌کند. <ph name="BEGIN_LINK" />درباره «بهینه‌سازی انرژی» بیشتر بدانید<ph name="END_LINK" /></translation>
-<translation id="1898804291554630487">سؤال درباره این صفحه</translation>
+<translation id="1898804291554630487">پرسش درباره این صفحه</translation>
 <translation id="1900969832270057921">‏سرویس به‌روزرسان Chromium</translation>
 <translation id="1911763535808217981">‏با خاموش کردن این گزینه، می‌توانید بدون ورود به سیستم Chromium به سیستم سایت‌های Google مانند Gmail وارد شوید</translation>
 <translation id="1916451563296275579">‏برداشتن این داده‌های برنامه از Chromium</translation>
@@ -320,7 +320,7 @@
 <translation id="5224391634244552924">‏گذرواژه ذخیره‌شده‌ای وجود ندارد. Chromium زمانی می‌تواند گذرواژه‌هایتان را بررسی کند که آن‌ها را ذخیره کرده باشید.</translation>
 <translation id="5231355151045086930">‏خروج از سیستم Chromium</translation>
 <translation id="5234764350956374838">رد کردن</translation>
-<translation id="5254739261293693943">پرسیدن درباره این ویدیو</translation>
+<translation id="5254739261293693943">پرسش درباره این ویدیو</translation>
 <translation id="5277894862589591112">‏برای اعمال تغییراتتان، Chromium را راه‌اندازی مجدد کنید</translation>
 <translation id="5286907366254680517">تشخیص داده شد</translation>
 <translation id="5294316920224716406">‏هنگام مرور «درحالت ناشناس»، Chromium قبل‌از اینکه سایت را ازطریق اتصال ناامن بار کند به شما هشدار می‌دهد</translation>
@@ -544,7 +544,7 @@
 <translation id="7867198900892795913">‏Chromium به جدیدترین نسخه به‌روزرسانی نشد، بنابراین قابلیت‌های جدید و رفع اشکال‌های امنیتی را ندارید.</translation>
 <translation id="7872446069773932638">درحال بارگیری… <ph name="SECONDS" /> ثانیه باقی مانده است</translation>
 <translation id="7873537467422636035">‏اگر گذرعبارت را فراموش کرده‌اید یا می‌خواهید این تنظیم را تغییر دهید، <ph name="BEGIN_LINK" />داده‌های Chromium ذخیره‌شده در حسابتان را حذف کنید<ph name="END_LINK" /></translation>
-<translation id="7877212753140190672">پرسیدن درباره این تصویر</translation>
+<translation id="7877212753140190672">پرسش درباره این تصویر</translation>
 <translation id="7888981273428720788">‏تنظیم Chromium به‌عنوان مرورگر پیش‌فرض</translation>
 <translation id="7934340546140346950">‏‫Chromium اتصال‌های ناامن را درصورت امکان به‌طور خودکار به HTTPS ارتقا می‌دهد</translation>
 <translation id="7937630085815544518">‏شما بعنوان <ph name="USER_EMAIL_ADDRESS" /> وارد سیستم Chromium شده‌اید. لطفاً برای ورود به سیستم مجدد از همان حساب استفاده کنید.</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb
index 4aec67d..21f04979d 100644
--- a/chrome/app/resources/chromium_strings_iw.xtb
+++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -623,7 +623,7 @@
 <translation id="8880203542552872219">‏אם שינית את הסיסמה הזו, יש לערוך את הסיסמה השמורה ב-Chromium כך שהיא תתאים לסיסמה החדשה שלך.</translation>
 <translation id="8891709362986793894">‏לפי דרישת הארגון שלך, עליך להיכנס לחשבון ב-Chromium</translation>
 <translation id="8907580949721785412">‏Chromium מנסה להציג סיסמאות. יש להקליד את הסיסמה שלך ל-Windows כדי לאפשר זאת.</translation>
-<translation id="8931379085695076764">‏Chromium יכול להעריך מהם תחומי העניין שלך על סמך היסטוריית הגלישה שלך מהשבועות האחרונים. המידע הזה נשאר במכשיר שלך.</translation>
+<translation id="8931379085695076764">‏‫Chromium יכול להעריך מהם תחומי העניין שלך על סמך היסטוריית הגלישה שלך מהשבועות האחרונים. המידע הזה נשאר במכשיר שלך.</translation>
 <translation id="8941642502866065432">‏לא ניתן לעדכן את Chromium</translation>
 <translation id="897581876605952338">‏הלוגו של Chromium Enterprise</translation>
 <translation id="8988036198400390003">‏ניהול הפרופילים ב-Chromium</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 13afd5b5..5425c8e 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -3243,6 +3243,7 @@
 <translation id="3226487301970807183">በግራ የተሰለፈ የጎን ፓነልን ይቀያይሩ</translation>
 <translation id="322708765617468434">ከውቅረቱ በኋላ በማንኛውም ጊዜ ሌላ ሰውን ወደ መሣሪያው ማከል ይችላሉ። እያንዳንዱ ሰው ተሞክሯቸውን ግላዊ ማድረግ እና ውሂብን የግል አድርገው ማቆየት ይችላሉ።</translation>
 <translation id="3227137524299004712">ማይክሮፎን</translation>
+<translation id="3227701057281907159">መጠገን</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{ከ<ph name="BEGIN_LINK" />Chrome የድር መደብር<ph name="END_LINK" /> በመጡ ተመሳሳይ ቅጥያዎች ያስወግዱት ወይም ይተኩት።}one{ከ<ph name="BEGIN_LINK" />Chrome የድር መደብር<ph name="END_LINK" /> በመጡ ተመሳሳይ ቅጥያዎች ያስወግዱት ወይም ይተኩት}other{ከ<ph name="BEGIN_LINK" />Chrome የድር መደብር<ph name="END_LINK" /> በመጡ ተመሳሳይ ቅጥያዎች ያስወግዷቸው ወይም ይተኳቸው}}</translation>
 <translation id="3229254977651514276">ቀኑን ይፈትሹ</translation>
 <translation id="3230539834943294477">የእገዛ ጽሁፎችን ይመልከቱ ወይም የመሣሪያ ድጋፍ ያግኙ</translation>
@@ -3407,6 +3408,7 @@
 <translation id="3347086966102161372">የምስል አድራሻ &amp;ቅዳ</translation>
 <translation id="3348038390189153836">ተነቃይ መሣሪያ ተገኝቷል</translation>
 <translation id="3348131053948466246">ስሜት ገላጭ ምስል ተጠቁሟል። ለመዳሰስ ወደ ላይ እና ወደ ታች ይጫኑና ለማስገባት አስገባን ይጫኑ።</translation>
+<translation id="3348973040180736882">አለማመቅ</translation>
 <translation id="3349933790966648062">የማህደረ ትውስታ</translation>
 <translation id="3350450887151703713">10 ሰከንዶችን ዳግም አጫውት</translation>
 <translation id="3351472127384196879">በብዕር መዳፊትዎ ላይ አዝራሮችን ያክሉ ወይም ያግኙ</translation>
@@ -11776,6 +11778,7 @@
 <translation id="9173063514323762371">&amp;የዕልባቶች አሞሌን ደብቅ</translation>
 <translation id="917350715406657904">የእርስዎ ወላጅ ለ<ph name="APP_NAME" /> ያቀናበሩት የጊዜ ገደብ ላይ ደርሰዋል። ነገ ለ<ph name="TIME_LIMIT" /> ሊጠቀሙበት ይችላሉ።</translation>
 <translation id="9174401638287877180">የአጠቃቀም እና የምርመራ ውሂብ ይላኩ። የምርመራ፣ የመሣሪያ እና የመተግበሪያ አጠቃቀም ውሂብ በራስ-ሰር ወደ Google በመላክ የልጅዎን የAndroid ተሞክሮ እንዲሻሻል ያግዙ። ይህ ልጅዎን ለመለየት ሥራ ላይ አይውልም፣ እና የስርዓት እና የመተግበሪያ እርጋታን እና ሌሎች ማሻሻያዎችን ያግዛል። አንዳንድ ውሑድ ውሂብ እንዲሁም የGoogle መተግበሪያዎችን እና እንደ የAndroid ገንቢዎች ያሉ አጋሮችን ያግዛሉ። የተጨማሪ የድር እና መተግበሪያ እንቅስቃሴ ቅንብር ለልጅዎ በርቶ ከሆነ ይህ ውሂብ ወደ የGoogle መለያቸው ሊቀመጥ ይችላል።</translation>
+<translation id="9174854240439014335">በመስኮቱ ግራ ወይም ቀኝ ጠርዝ ላይ የተከፈለ ዕይታ ጎትትና አኑርን ፍቀድ</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - የብሉቱዝ መሣሪያ ተገናኝቷል</translation>
 <translation id="9177859716483578738">ለመቀጠል፣ <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> የእርስዎን <ph name="FIELDS_STRING" /> ከዚህ ጣቢያ ጋር ያጋራል። የዚህን ጣቢያ <ph name="BEGIN_LINK" />የግላዊነት መመሪያ<ph name="END_LINK" /> ይመልከቱ።</translation>
 <translation id="9178061802301856367">የመለያ መግቢያ ውሂብን ይሰርዙ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index aa68296..30bfc83 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -27,7 +27,7 @@
 <translation id="1011003645819296594">الأجهزة المحفوظة</translation>
 <translation id="1011355516189274711">مستوى صوت "تحويل النص إلى كلام"</translation>
 <translation id="1011431628606634753">‏يجب تغيير رقم التعريف الشخصي المخصّص لاسترداد الحساب في خدمة "مدير كلمات المرور في Google"</translation>
-<translation id="1012794136286421601">‏تجري مزامنة المستندات وجداول البيانات والعروض التقديمية والرسومات. افتح تطبيق Google Drive للدخول إليها على الإنترنت أو بلا إنترنت.</translation>
+<translation id="1012794136286421601">‏تجري مزامنة المستندات وجداول البيانات والعروض التقديمية والرسومات. يُرجى فتح تطبيق Google Drive للوصول إليها على الإنترنت أو بلا إنترنت.</translation>
 <translation id="1012876632442809908">‏جهاز USB-C (المنفذ الأمامي)</translation>
 <translation id="1015041505466489552">TrackPoint</translation>
 <translation id="1015318665228971643">تعديل اسم المجلد</translation>
@@ -186,7 +186,7 @@
 <translation id="1119447706177454957">خطأ داخلي</translation>
 <translation id="1122068467107743258">العمل</translation>
 <translation id="1122198203221319518">&amp;الأدوات</translation>
-<translation id="1122242684574577509">‏‫فشلت المصادقة‬. انقر للانتقال إلى صفحة تسجيل الدخول لشبكة Wi-Fi التي تستخدمها (<ph name="NETWORK_ID" />).</translation>
+<translation id="1122242684574577509">‏‫فشلت المصادقة‬. يُرجى النقر للانتقال إلى صفحة تسجيل الدخول لشبكة Wi-Fi المستخدَمة (<ph name="NETWORK_ID" />).</translation>
 <translation id="1122587596907914265">صمِّم خلفيات فريدة</translation>
 <translation id="1122656823581975100">{NUM_SITES,plural, =1{تم العثور على كلمة مرور واحدة محتمَل تعرّضها للاختراق.}zero{تم العثور على {NUM_SITES} كلمة مرور محتمَل تعرّضها للاختراق.}two{تم العثور على كلمتَي مرور ({NUM_SITES}) محتمَل تعرّضهما للاختراق.}few{تم العثور على {NUM_SITES} كلمات مرور محتمَل تعرّضها للاختراق.}many{تم العثور على {NUM_SITES} كلمة مرور محتمَل تعرّضها للاختراق.}other{تم العثور على {NUM_SITES} كلمة مرور محتمَل تعرّضها للاختراق.}}</translation>
 <translation id="1122913801042512795">تفاصيل تسجيل الدخول إلى حسابك قديمة. يُرجى تسجيل الخروج ثم تسجيل الدخول مرة أخرى.</translation>
@@ -297,7 +297,7 @@
 <translation id="1190155014618058972">إنشاء مجموعة مفاتيح مخصّصة</translation>
 <translation id="11901918071949011">{NUM_FILES,plural, =1{الوصول إلى ملف مخزّن على جهاز الكمبيوتر}zero{ الوصول إلى # من الملفات المخزّنة على جهاز الكمبيوتر}two{الوصول إلى ملفين (#) مخزّنين على جهاز الكمبيوتر}few{ الوصول إلى # ملفات مخزّنة على جهاز الكمبيوتر}many{الوصول إلى # ملفًا مخزنًا على جهاز الكمبيوتر}other{الوصول إلى # من الملفات المخزّنة على جهاز الكمبيوتر}}</translation>
 <translation id="1190706173655543975">‏سياسات تطبيقات Microsoft</translation>
-<translation id="1191353342579061195">اختَر الوضع الذي يناسب احتياجاتك. لتغيير الوضع والخلفية وشاشة الاستراحة وغير ذلك، ما عليك سوى النقر بزر الماوس الأيمن على سطح المكتب.</translation>
+<translation id="1191353342579061195">يرجى اختيار المظهر الذي يناسب احتياجاتك. لتغيير المظهر والخلفية وشاشة الاستراحة وغير ذلك، ما عليك سوى النقر بزر الماوس الأيمن على سطح المكتب.</translation>
 <translation id="1192706927100816598">{0,plural, =1{سيتم تسجيل خروجك تلقائيًا بعد ثانية واحدة.
 يتطلَّب <ph name="DOMAIN" /> منك الإبقاء على بطاقتك الذكية مُدخَلة.}zero{سيتم تسجيل خروجك تلقائيًا بعد # ثانية.
 يتطلَّب <ph name="DOMAIN" /> منك الإبقاء على بطاقتك الذكية مُدخَلة.}two{سيتم تسجيل خروجك تلقائيًا بعد ثانيتَين.
@@ -360,7 +360,7 @@
 <translation id="1227993798763400520">تعذَّر البث. يُرجى المحاولة مرة أخرى.</translation>
 <translation id="1230417814058465809">الحماية العادية مفعَّلة. لزيادة مستوى الأمان، يمكنك استخدام "الحماية المُحسَّنة".</translation>
 <translation id="1230961867057865279">الصفحة ليست باللغة <ph name="LANGUAGE" /></translation>
-<translation id="1231426483209637778">سنتذكر شبكتك في المرة القادمة التي تستخدم فيها <ph name="DEVICE_TYPE" />.</translation>
+<translation id="1231426483209637778">سنتذكر شبكتك عند استخدامك <ph name="DEVICE_TYPE" /> في المرة القادمة.</translation>
 <translation id="1231489110997683307">الصفحة ليست باللغة <ph name="LANGUAGE" /></translation>
 <translation id="1231572247662419826">يمكن للمواقع الإلكترونية طلب تخزين إدخالات الماوس واستخدامها</translation>
 <translation id="1232569758102978740">بلا عنوان</translation>
@@ -373,7 +373,7 @@
 <translation id="123578888592755962">القرص ممتلئ</translation>
 <translation id="1235924639474699896">{COUNT,plural, =1{نص واحد}zero{# نص}two{نصّان}few{# نصوص}many{# نصًّا}other{# نص}}</translation>
 <translation id="1237950098253310325">‏أعِد ترتيب <ph name="BUTTON_NAME" /> باستخدام مفتاح Ctrl + السهم المتّجه للأعلى أو السهم المتّجه للأسفل</translation>
-<translation id="1238293488628890871">هل تريد تبديل الملف الشخصي؟</translation>
+<translation id="1238293488628890871">هل المطلوب تبديل الملف الشخصي؟</translation>
 <translation id="1239594683407221485">يمكنك استكشاف محتوى الجهاز في تطبيق الملفات.</translation>
 <translation id="1239841552505950173">تشغيل التطبيق</translation>
 <translation id="1241066500170667906">اختَر حالة ميزة "<ph name="EXPERIMENT_NAME" />" التجريبية.</translation>
@@ -629,7 +629,7 @@
 <translation id="1427179946227469514">حدّة صوت "تحويل النص إلى كلام"</translation>
 <translation id="1427269577154060167">البلد</translation>
 <translation id="142765311413773645">انتهت صلاحية ترخيص <ph name="APP_NAME" /></translation>
-<translation id="1428373049397869723">‏يمكنك فتح الملفات المتوافقة وتعديلها باستخدام هذا التطبيق من تطبيق Finder أو من تطبيقات أخرى. للتحكّم في الملفات التي تفتح هذا التطبيق تلقائيًا، <ph name="BEGIN_LINK" />تعرَّف على كيفية تحديد التطبيقات التلقائية على جهازك<ph name="END_LINK" />.</translation>
+<translation id="1428373049397869723">‏يمكنك فتح الملفات المتوافقة وتعديلها باستخدام هذا التطبيق من تطبيق Finder أو من تطبيقات أخرى. للتحكّم في الملفات التي تفتح هذا التطبيق تلقائيًا، <ph name="BEGIN_LINK" />يمكنك التعرّف على كيفية تحديد التطبيقات التلقائية على جهازك<ph name="END_LINK" />.</translation>
 <translation id="1428657116642077141">لقد حفظت ملاحظة بشأن كلمة مرور على هذا الموقع الإلكتروني. لعرضها، اختَر "إدارة كلمات المرور" في شريط البحث أو شريط العناوين.</translation>
 <translation id="1429300045468813835">تم محو الكل</translation>
 <translation id="1430915738399379752">طباعة</translation>
@@ -818,7 +818,7 @@
 <translation id="1552752544932680961">إدارة الإضافة</translation>
 <translation id="1553538517812678578">غير محدودة</translation>
 <translation id="1553947773881524342">‏تعرَّف على <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /> حول Microsoft 365 على جهاز Chromebook.</translation>
-<translation id="1554640914375980459">يتم تشغيل وميض الشاشة عند تلقّي إشعارات. يُرجى توخّي الحذر عند استخدام الإشعارات المصحوبة بوميض إذا كنت تعاني من حساسية الضوء.</translation>
+<translation id="1554640914375980459">يتم تشغيل وميض الشاشة عند تلقّي إشعارات. يُرجى توخّي الحذر عند استخدام الإشعارات المصحوبة بوميض إذا كانت لديك حساسية من الضوء.</translation>
 <translation id="1555130319947370107">أزرق</translation>
 <translation id="1556127816860282890">قد يتم إيقاف الأنشطة التي تتم في الخلفية وبعض التأثيرات المرئية، مثل الانتقال السلس للأعلى أو للأسفل.</translation>
 <translation id="1556537182262721003">تعذر نقل دليل الإضافة إلى الملف الشخصي.</translation>
@@ -861,7 +861,7 @@
 <translation id="1582955169539260415">حذف [<ph name="FINGERPRINT_NAME" />]</translation>
 <translation id="1583082742220286248">جارٍ استئناف الجلسة</translation>
 <translation id="1583127975413389276">تتم معالجة اللغة <ph name="LANGUAGE" /> محليًّا على الجهاز وبلا اتصال بالإنترنت.</translation>
-<translation id="1584990664401018068">‏قد تتطلب شبكة اللاسلكي، Wi-Fi التي تستخدمها <ph name="NETWORK_ID" /> مصادقة.</translation>
+<translation id="1584990664401018068">‏قد تتطلب شبكة Wi-Fi المُستخدمة <ph name="NETWORK_ID" /> مصادقة.</translation>
 <translation id="1585717515139318619">‏أضاف برنامج آخر بجهاز الكمبيوتر مظهرًا قد يؤدي إلى تغيير طريقة عمل Chrome.
 
 <ph name="EXTENSION_NAME" /></translation>
@@ -1253,7 +1253,7 @@
 <translation id="184273675144259287">‏استبدال تطبيقات وملفات Linux بنسخة احتياطية سابقة</translation>
 <translation id="1842766183094193446">هل تريد حقًا تفعيل الوضع التجريبي؟</translation>
 <translation id="1843048149176045210">نسخ رابط التنزيل</translation>
-<translation id="1845060436536902492">‏يُستخدم قارئ الشاشة ChromeVox على ChromeOS Flex بشكل أساسي من قِبل الأشخاص المكفوفين أو الذين يعانون من ضعف في النظر من أجل قراءة النص المعروض على الشاشة باستخدام برنامج تحويل النص إلى كلام أو جهاز عرض بلغة برايل. اضغط على مفتاح المسافة لتفعيل ChromeVox. عند تفعيل ChromeVox، يمكنك إجراء جولة سريعة للتعرّف على ميزاته.</translation>
+<translation id="1845060436536902492">‏يُستخدم قارئ الشاشة ChromeVox على ChromeOS Flex بشكل أساسي من قِبل الأشخاص المكفوفين أو الذين يعانون من ضعف في النظر من أجل قراءة النص المعروض على الشاشة باستخدام برنامج تحويل النص إلى كلام أو جهاز عرض بلغة برايل. يمكنك الضغط على مفتاح المسافة لتفعيل ChromeVox. عند تفعيل ChromeVox، يمكنك إجراء جولة سريعة للتعرّف على ميزاته.</translation>
 <translation id="1845727111305721124">المواقع الإلكترونية التي يُسمح لها بتشغيل الصوت</translation>
 <translation id="1846308012215045257">‏انقر بالماوس مع الضغط على مفتاح Ctrl لتشغيل <ph name="PLUGIN_NAME" /></translation>
 <translation id="1848219224579402567">تسجيل الخروج عند إغلاق الغطاء</translation>
@@ -1507,7 +1507,7 @@
 <translation id="2018189721942291407">هل عليك التسجيل؟</translation>
 <translation id="2018352199541442911">عذرًا، لا يتوفر جهاز مساحة التخزين الخارجية للاستخدام في الوقت الحالي.</translation>
 <translation id="2019213483156307334">حدث خطأ أثناء إضافة الشرط</translation>
-<translation id="2019718679933488176">&amp;فتح ملف الصوت في علامة تبويب جديدة</translation>
+<translation id="2019718679933488176">&amp;فتح صوت في علامة تبويب جديدة</translation>
 <translation id="2020183425253392403">عرض إعدادات عنوان الشبكة</translation>
 <translation id="2020225359413970060">فحص الملف</translation>
 <translation id="2022953316617983419">رمز الاستجابة السريعة</translation>
@@ -1999,7 +1999,7 @@
 <translation id="2350133097354918058">إعادة التحميل</translation>
 <translation id="2350182423316644347">جارٍ إعداد التطبيق...</translation>
 <translation id="235028206512346451">سيتم قفل الشاشة تلقائيًا عندما تكون بعيدًا عن الجهاز. وعند استخدامك للجهاز، ستظل الشاشة في الوضع النشط لفترة أطول. وفي حال عدم استخدام شاشة القفل، ينتقل الجهاز إلى وضع السكون بدلاً من قفل الشاشة.</translation>
-<translation id="2351923523007389195">تم منح إذن الوصول إلى الموقع الجغرافي: <ph name="PERMISSION_DETAILS" />. فعِّل إذن <ph name="LINK_BEGIN" />الوصول إلى الموقع الجغرافي للنظام<ph name="LINK_END" />.</translation>
+<translation id="2351923523007389195">تم منح إذن الوصول إلى الموقع الجغرافي: <ph name="PERMISSION_DETAILS" />. يُرجى تفعيل إذن <ph name="LINK_BEGIN" />الوصول إلى الموقع الجغرافي للنظام<ph name="LINK_END" />.</translation>
 <translation id="2352662711729498748">&lt; 1 ميغابايت</translation>
 <translation id="2353168619378866466">فتح المجموعة</translation>
 <translation id="2353297238722298836">تم السماح باستخدام الكاميرا والميكروفون</translation>
@@ -2333,7 +2333,7 @@
 <translation id="2573276323521243649">الرجوع من صفحة اختيار الأفاتار</translation>
 <translation id="2573417407488272418">احتفظ بنسخة احتياطية من التطبيقات والملفات في الملفات &gt; ملفاتي قبل الترقية.</translation>
 <translation id="2573831315551295105">تخصيص مفتاح تحكّم للإجراء "<ph name="ACTION" />"</translation>
-<translation id="2575247648642144396">سيكون هذا الرمز مرئيًا عندما تتمكن الإضافة من تنفيذ الإجراءات على الصفحة الحالية. يمكنك استخدام هذه الإضافة بالنقر على الرمز أو بالضغط على <ph name="EXTENSION_SHORTCUT" />.</translation>
+<translation id="2575247648642144396">سيظهر هذا الرمز عند عمل الإضافة في الصفحة الحالية. يمكنك استخدام هذه الإضافة بالنقر على هذا الرمز أو بالضغط على <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2575407791320728464">‏عنوان URL غير صالح. يجب تنسيق العنوان بشكل صحيح.</translation>
 <translation id="2575441894380764255">المواقع الإلكترونية التي لا يُسمح لها بعرض الإعلانات المضلِّلة أو غير المرغوب فيها</translation>
 <translation id="2575713839157415345">{YEARS,plural, =1{سيتم حفظ بيانات هذا الجهاز لمدة سنة واحدة ويمكنك توصيله بدون استخدام رمز في المرة القادمة. تم ضبط هذا الإعداد من قِبل المشرف.}zero{سيتم حفظ بيانات هذا الجهاز لمدة {YEARS} سنة ويمكنك توصيله بدون استخدام رمز في المرة القادمة. تم ضبط هذا الإعداد من قِبل المشرف.}two{سيتم حفظ بيانات هذا الجهاز لمدة سنتَين ({YEARS}) ويمكنك توصيله بدون استخدام رمز في المرة القادمة. تم ضبط هذا الإعداد من قِبل المشرف.}few{سيتم حفظ بيانات هذا الجهاز لمدة {YEARS} سنوات ويمكنك توصيله بدون استخدام رمز في المرة القادمة. تم ضبط هذا الإعداد من قِبل المشرف.}many{سيتم حفظ بيانات هذا الجهاز لمدة {YEARS} سنة ويمكنك توصيله بدون استخدام رمز في المرة القادمة. تم ضبط هذا الإعداد من قِبل المشرف.}other{سيتم حفظ بيانات هذا الجهاز لمدة {YEARS} سنة ويمكنك توصيله بدون استخدام رمز في المرة القادمة. تم ضبط هذا الإعداد من قِبل المشرف.}}</translation>
@@ -2343,7 +2343,7 @@
 <translation id="2580889980133367162">السماح دائمًا لـ <ph name="HOST" /> بتنزيل عدة ملفات</translation>
 <translation id="258095186877893873">طويل</translation>
 <translation id="2581786034175502848">‏الضغط على مفتاح Shift‏ 5 مرّات لإعادة تفعيلها</translation>
-<translation id="2581992808349413349">‏استخدِم اتصالاً آمنًا للبحث عن عنوان IP لموقع إلكتروني في نظام أسماء النطاقات (DNS). ويعتمد ذلك على مقدِّم خدمة مُدار ومسجّل على الرابط <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" />.</translation>
+<translation id="2581992808349413349">‏يرجى استخدام اتصال آمن للبحث عن عنوان IP لموقع إلكتروني في نظام أسماء النطاقات (DNS). ويعتمد ذلك على مقدِّم خدمة مُدار ومسجّل على الرابط <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" />.</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (النظام الأساسي <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2583905535229480958">أي قارئ بطاقات ذكية</translation>
 <translation id="2584109212074498965">‏تعذّر الحصول على تذكرة Kerberos. يُرجى إعادة المحاولة أو التواصل مع مشرف أجهزة مؤسستك. (رمز الخطأ <ph name="ERROR_CODE" />).</translation>
@@ -2887,7 +2887,7 @@
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (الإضافة متوفرة)</translation>
 <translation id="2961695502793809356">انقر للانتقال إلى الأمام واضغط لمشاهدة السجل</translation>
 <translation id="29618148602069201">الموضوع</translation>
-<translation id="2963151496262057773">المكوّن الإضافي التالي غير مستجيب: <ph name="PLUGIN_NAME" />‏، هل تريد إيقافه؟</translation>
+<translation id="2963151496262057773">المكوّن الإضافي التالي غير مستجيب: <ph name="PLUGIN_NAME" />‏، هل نقوم بإيقافه؟</translation>
 <translation id="2964193600955408481">‏إيقاف Wi-Fi</translation>
 <translation id="2964245677645334031">إمكانية ظهور الجهاز الذي يستخدم ميزة "المشاركة عن قرب"</translation>
 <translation id="2964387589834028666">حماسي</translation>
@@ -2916,7 +2916,7 @@
 <translation id="2983818520079887040">الإعدادات...</translation>
 <translation id="2984384421572259426">هل مطلوب حذف علامات التبويب غير المستخدَمة؟</translation>
 <translation id="2984727013951557074">‏لا تزال عملية مزامنة الملف مع Drive جارية.</translation>
-<translation id="2985348301114641460">هل تريد إرسال طلب إلى المشرف لتثبيت "<ph name="EXTENSION_NAME" />"؟</translation>
+<translation id="2985348301114641460">هل نرسل عنك طلبًا إلى المشرف لتثبيت "<ph name="EXTENSION_NAME" />"؟</translation>
 <translation id="2985476671756533899">{NUM_SUB_APPS,plural, =1{ألغَى "<ph name="APP_NAME" />" تثبيت تطبيق واحد}zero{ألغَى "<ph name="APP_NAME" />" تثبيت # تطبيق}two{ألغَى "<ph name="APP_NAME" />" تثبيت تطبيقَين}few{ألغَى "<ph name="APP_NAME" />" تثبيت # تطبيقات}many{ألغَى "<ph name="APP_NAME" />" تثبيت # تطبيقًا}other{ألغَى "<ph name="APP_NAME" />" تثبيت # تطبيق}}</translation>
 <translation id="2987620471460279764">النصوص التي تمت مشاركتها من جهاز آخر</translation>
 <translation id="2988018669686457659">عارِض احتياطي</translation>
@@ -3121,7 +3121,7 @@
 <translation id="3127862849166875294">‏تغيير حجم قرص نظام التشغيل Linux</translation>
 <translation id="3129150892373332590">‏سيؤدي هذا الإجراء إلى إيقاف ميزة المشاركة الدائمة لأجهزة USB مع الضيوف، ما سيؤدي أيضًا إلى إعادة ضبط كل البيانات التي تم الاحتفاظ بها. هل أنت متأكّد؟</translation>
 <translation id="3129173833825111527">الهامش الأيسر</translation>
-<translation id="3130528281680948470">ستتم إعادة ضبط جهازك وستتم إزالة كل حسابات المستخدمين والبيانات المحلية. ولا يمكن التراجع عن ذلك.</translation>
+<translation id="3130528281680948470">ستتم إعادة ضبط جهازك وإزالة كل حسابات المستخدمين والبيانات المحلية. ولا يمكن التراجع عن ذلك.</translation>
 <translation id="3130863904455712965">السجلّ وغير ذلك</translation>
 <translation id="313205617302240621">هل نسيت كلمة المرور؟</translation>
 <translation id="3132277757485842847">‏تعذَّر علينا المحافظة على الاتصال بهاتفك. يُرجى التأكد من أن هاتفك قريب وغير مُقفل وتم تفعيل بلوتوث وWi-Fi فيه.</translation>
@@ -3322,7 +3322,7 @@
 <translation id="3285322247471302225">&amp;علامة تبويب جديدة</translation>
 <translation id="3285465040399788513">لا تتوفّر مساحة تخزين كافية على الجهاز لإكمال عملية الإعداد. يُرجى إخلاء بعض المساحة وإعادة المحاولة.</translation>
 <translation id="3285500645985761267">السماح للمواقع الإلكترونية ذات الصلة بالاطّلاع على نشاطك في المجموعة</translation>
-<translation id="328571385944182268">هل تريد حفظ كلمات المرور؟</translation>
+<translation id="328571385944182268">حفظ كلمات المرور؟</translation>
 <translation id="3289668031376215426">الكتابة بالأحرف الكبيرة تلقائيًا</translation>
 <translation id="3289856944988573801">‏للتحقق من وجود تحديثات، يُرجى استخدام شبكة Ethernet أو Wi-Fi.</translation>
 <translation id="3290249595466894471">يُرسِل هذا الوضع أيضًا عددًا قليلاً من الصفحات وعمليات التنزيل وأنشطة الإضافات ومعلومات النظام للمساعدة في اكتشاف التهديدات الجديدة.</translation>
@@ -3537,7 +3537,7 @@
 <translation id="3437072258256045988">‏إدارة نشاطك على "تطبيقات Gemini"</translation>
 <translation id="3437397693214267762">‏الاطّلاع على ملفات "تقويم Outlook"‏ (Outlook Calendar) وSharePoint وOneDrive</translation>
 <translation id="3438633801274389918">النينجا</translation>
-<translation id="3439153939049640737">السماح دائمًا لـ <ph name="HOST" /> بالدخول إلى الميكروفون</translation>
+<translation id="3439153939049640737">السماح دائمًا لـ <ph name="HOST" /> بالوصول إلى الميكروفون</translation>
 <translation id="3439970425423980614">‏جارٍ فتح ملف PDF في تطبيق المعاينة</translation>
 <translation id="3440663250074896476">مزيد من الإجراءات للإشارة المرجعية <ph name="BOOKMARK_NAME" /></translation>
 <translation id="3441653493275994384">الشاشة</translation>
@@ -3806,7 +3806,7 @@
 <translation id="3621202678540785336">الإدخال</translation>
 <translation id="362266093274784978">{COUNT,plural, =1{تطبيق واحد}zero{# تطبيق}two{تطبيقان}few{# تطبيقات}many{# تطبيقًا}other{# تطبيق}}</translation>
 <translation id="3622820753353315928">لون وميض الشاشة</translation>
-<translation id="3623318122257816196">يمكن للمواقع الإلكترونية التي تنتقل إليها تضمين محتوى من مواقع إلكترونية أخرى، مثل الصور والإعلانات والنصوص. وقد تطلب هذه المواقع الإلكترونية الأخرى إذنًا لاستخدام المعلومات التي تم حفظها عنك أثناء تصفُّح الموقع الإلكتروني.</translation>
+<translation id="3623318122257816196">يمكن للمواقع الإلكترونية التي تتم زيارتها تضمين محتوى من مواقع إلكترونية أخرى، مثل الصور والإعلانات والنصوص. وقد تطلب هذه المواقع الإلكترونية الأخرى إذنًا لاستخدام المعلومات التي تم حفظها عنك أثناء تصفُّح الموقع الإلكتروني.</translation>
 <translation id="362333465072914957">‏في انتظار إصدار شهادة CA</translation>
 <translation id="3623598555687153298">سيؤدي هذا الإجراء إلى حذف <ph name="TOTAL_USAGE" /> من البيانات التي خزّنتها المواقع الإلكترونية المُدرَجة.</translation>
 <translation id="3624567683873126087">‏فتح قفل الجهاز وتسجيل الدخول إلى حساب Google</translation>
@@ -4249,7 +4249,7 @@
 <translation id="3898233949376129212">لغة الجهاز</translation>
 <translation id="3898327728850887246">يحتاج <ph name="SITE_NAME" /> إلى الإذنَين: <ph name="FIRST_PERMISSION" /> و<ph name="SECOND_PERMISSION" />.</translation>
 <translation id="3898498281932368596">حظر الحساب ومغادرة المجموعة</translation>
-<translation id="3898743717925399322">‏تم حفظ كلمة مرور <ph name="WEBSITE" /> على هذا الجهاز وفي حسابك على Google. مِن أيّهما تريد حذف كلمة المرور هذه؟</translation>
+<translation id="3898743717925399322">‏تم حفظ كلمة مرور <ph name="WEBSITE" /> على هذا الجهاز وفي حسابك على Google. يمكنك حذفها من أي من الموقعين أو من كليهما.</translation>
 <translation id="3898768766145818464">تشغيل الفيديو أو إيقافه مؤقتًا</translation>
 <translation id="389901847090970821">تحديد لوحة مفاتيح</translation>
 <translation id="3899457911440165602">حدث خطأ أثناء حذف الشهادة</translation>
@@ -4273,17 +4273,17 @@
 <translation id="3915280005470252504">البحث الصوتي</translation>
 <translation id="3916445069167113093">هذا النوع من الملفات قد يلحق الضرر بالكمبيوتر. هل المطلوب الاحتفاظ بـ <ph name="FILE_NAME" /> على أيّ حال؟</translation>
 <translation id="3917184139185490151">‏يحتوي الكمبيوتر على وحدة أمان يتم استخدامها لتفعيل العديد من ميزات الأمان المُهمة في نظام التشغيل Chrome. يمكنك الانتقال إلى مركز مساعدة Chromebook للتعرّف على مزيد من المعلومات: https://support.google.com/chromebook/?p=sm.</translation>
-<translation id="3917644013202553949">لا تتوفّر مساحة تخزين كافية لمزامنة ملفاتك. جرِّب إخلاء بعض المساحة.</translation>
+<translation id="3917644013202553949">لا تتوفّر مساحة تخزين كافية لمزامنة ملفاتك. يمكنك محاولة إخلاء بعض المساحة.</translation>
 <translation id="3919145445993746351">للحصول على الإضافات على جميع أجهزة الكمبيوتر، يُرجى تفعيل المزامنة</translation>
 <translation id="3919229493046408863">إيقاف الإشعارات عندما تكون الأجهزة قريبة</translation>
-<translation id="3919262972282962508">‏لن تُفتَح الإصدارات القديمة من تطبيقات Chrome على الأجهزة التي تعمل بنظام التشغيل Mac بعد كانون الأول (ديسمبر) 2022. يمكنك التواصل مع المشرف للتحديث إلى إصدار جديد من هذا التطبيق أو إزالته.</translation>
+<translation id="3919262972282962508">‏لن تُفتَح الإصدارات القديمة من تطبيقات Chrome على الأجهزة التي تعمل بنظام التشغيل Mac بعد ديسمبر 2022. يمكنك التواصل مع المشرف للتحديث إلى إصدار جديد من هذا التطبيق أو إزالته.</translation>
 <translation id="3919376399641777316">‏يتم استخدام مساحة التخزين في Google Drive.</translation>
 <translation id="3919798653937160644">لن تظهر في سجلّ المتصفّح الصفحات التي تعرضها في هذه النافذة، ولن تترك أي آثار أخرى في الكمبيوتر، مثل ملفات تعريف الارتباط، بعد إغلاق جميع النوافذ المفتوحة في وضع الضيف، علمًا أنه سيتم الاحتفاظ بأي ملفات يتم تنزيلها.</translation>
 <translation id="3920504717067627103">سياسات الشهادة</translation>
 <translation id="3920909973552939961">المواقع الإلكترونية التي لا يُسمح لها بتثبيت معالجات الدفع</translation>
 <translation id="3922823422695198027">تم ضبط تطبيقات أخرى لفتح الروابط نفسها مثل <ph name="APP_NAME" />. وسيؤدي هذا الإجراء إلى منع <ph name="APP_NAME_2" /> و<ph name="APP_NAME_3" /> و<ph name="APP_NAME_4" /> من فتح الروابط المتوافقة.</translation>
 <translation id="3923184630988645767">استخدام البيانات</translation>
-<translation id="3923221004758245114">هل تريد إزالة "<ph name="VM_NAME" />" من <ph name="DEVICE_TYPE" />؟ سيؤدي هذا الإجراء إلى حذف جميع التطبيقات والبيانات في الجهاز الافتراضي.</translation>
+<translation id="3923221004758245114">هل المطلوب إزالة "<ph name="VM_NAME" />" من <ph name="DEVICE_TYPE" />؟ سيؤدي هذا الإجراء إلى حذف جميع التطبيقات والبيانات في الجهاز الافتراضي.</translation>
 <translation id="3923494859158167397">ما مِن شبكات جوّال تم إعدادها.</translation>
 <translation id="3923676227229836009">يتم السماح لهذه الصفحة بعرض الملفات.</translation>
 <translation id="3923958273791212723">تنبيهات بشأن مشاكل الأداء</translation>
@@ -4552,11 +4552,11 @@
 <translation id="4107793386654579933">اختيار اختصار للإجراء "<ph name="ACTION_NAME" />"</translation>
 <translation id="4109135793348361820">نقل النافذة إلى <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
 <translation id="4110485659976215879">استعادة التحذير</translation>
-<translation id="4112194537011183136"><ph name="DEVICE_NAME" /> (غير متصل بالإنترنت)</translation>
+<translation id="4112194537011183136">‫<ph name="DEVICE_NAME" /> (غير متصل بالإنترنت)</translation>
 <translation id="4113743276555482284">كلمة مرور الملف</translation>
 <translation id="4113888471797244232">‏<ph name="BEGIN_PARAGRAPH1" />عند تفعيل الإعداد "دقة الموقع الجغرافي"، يتم جمع المعلومات عن الإشارات اللاسلكية، مثل إشارات نقاط وصول Wi-Fi وشبكة الجوّال وأبراج الاتصالات وبيانات أدوات الاستشعار في الجهاز، مثل مقياس التسارع والجيروسكوب، واستخدامها لتقدير الموقع الجغرافي للجهاز بشكل أكثر دقة والذي تستخدمه تطبيقات وخدمات Android لتوفير الميزات المستنِدة إلى الموقع الجغرافي. ولإجراء ذلك، تجمع Google بشكل دوري المعلومات عن أدوات الاستشعار في جهازك والإشارات اللاسلكية التي يتم رصدها بالقرب منك لجمع بيانات المواقع الجغرافية للإشارات اللاسلكية.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />تستخدم Google هذه البيانات بدون الكشف عن هويتك لتحسين دقة تحديد المواقع الجغرافية والخدمات المستندة إليها وتحسين خدمات Google وتقديمها وصيانتها بشكل عام. ونعالج هذه المعلومات استنادًا إلى المصالح المشروعة للجهات الخارجية وGoogle من أجل تلبية احتياجات المستخدمين.<ph name="END_PARAGRAPH2" />
-    <ph name="BEGIN_PARAGRAPH3" />يمكنك إيقاف الإعداد "دقة الموقع الجغرافي" في أي وقت ضمن إعدادات الموقع الجغرافي في جهازك، وذلك من خلال الانتقال إلى "الإعدادات" &gt; "الخصوصية والأمان" &gt; "عناصر التحكّم في الخصوصية" &gt; "الوصول إلى الموقع الجغرافي" &gt; "الإعدادات المتقدمة للموقع الجغرافي". وفي حال إيقافه، لن يتم جمع أي بيانات تخص دقة الموقع الجغرافي. في تطبيقات وخدمات Android، يتم استخدام عنوان IP فقط، في حال توفُّره، لتحديد الموقع الجغرافي لجهازك، ما قد يؤثّر في توفُّر المواقع الجغرافية ودقتها التي تستخدمها تطبيقات وخدمات Android، مثل "خرائط Google".<ph name="END_PARAGRAPH3" />
+    <ph name="BEGIN_PARAGRAPH3" />يمكنك إيقاف الإعداد "دقة الموقع الجغرافي" في أي وقت ضمن إعدادات الموقع الجغرافي في جهازك، وذلك من خلال الانتقال إلى "الإعدادات" &gt; "الخصوصية والأمان" &gt; "عناصر التحكّم في الخصوصية" &gt; "الوصول إلى الموقع الجغرافي" &gt; "الإعدادات المتقدمة للموقع الجغرافي". وفي حال إيقافه، لن يتم جمع أي بيانات تخص دقة الموقع الجغرافي. في تطبيقات وخدمات Android، يتم استخدام عنوان IP فقط، في حال توفُّره، لتحديد الموقع الجغرافي لجهازك، ما قد يؤثر على دقة وتوفّر المواقع في تطبيقات مثل "خرائط Google".<ph name="END_PARAGRAPH3" />
     <ph name="BEGIN_PARAGRAPH4" /><ph name="LINK_BEGIN" />مزيد من المعلومات عن الإعداد "دقة الموقع الجغرافي"<ph name="LINK_END" /><ph name="END_PARAGRAPH4" /></translation>
 <translation id="4114391251600134209">{COUNT,plural, =0{ما مِن كلمات مرور محفوظة}=1{تم التحقّق من كلمة مرور واحدة}two{تم التحقّق من كلمتَي مرور ({COUNT})}few{تم التحقّق من {COUNT} كلمات مرور}many{تم التحقّق من {COUNT} كلمة مرور}other{تم التحقّق من {COUNT} كلمة مرور}}</translation>
 <translation id="4114524937989710624">‏تظهر لك ملفات مُقترحة لمساعدتك في الرجوع بسهولة إلى آخر نشاط أجريته في Google Drive.
@@ -4598,7 +4598,7 @@
 <translation id="4138598238327913711">يتوفّر التدقيق النحوي في الوقت الحالي للغة الإنجليزية فقط.</translation>
 <translation id="413915106327509564">‏<ph name="WINDOW_TITLE" /> - متصّل بجهاز HID</translation>
 <translation id="4139326893730851150">تحديثات البرامج الثابتة</translation>
-<translation id="4142052906269098341">يمكنك فتح قفل جهاز <ph name="DEVICE_TYPE" /> باستخدام هاتفك. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
+<translation id="4142052906269098341">يمكنك فتح قفل الجهاز <ph name="DEVICE_TYPE" /> باستخدام هاتفك <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
 <translation id="4146026355784316281">افتح دائمًا باستخدام عرض النظام</translation>
 <translation id="4146785383423576110">إعادة الضبط وإزالة البرامج الضارة</translation>
 <translation id="4147099377280085053">اختيار جدول بلغة برايل</translation>
@@ -4728,7 +4728,7 @@
 <translation id="4250680216510889253">لا</translation>
 <translation id="4251243704979202079">سيتمكّن <ph name="ORIGIN" /> من عرض الملفات الموجودة في "<ph name="FOLDERNAME" />" وإنشاء نُسخ منها</translation>
 <translation id="4251377547188244181">تسجيل الجهاز في وضع الكشك واللوحات الرقمية</translation>
-<translation id="4252828488489674554">انقر بزر الماوس الأيمن على اسم مجموعة علامات التبويب لتعديلها أو انقر لتصغيرها.</translation>
+<translation id="4252828488489674554">يرجى النقر بزر الماوس الأيمن على اسم مجموعة علامات التبويب لتعديلها أو النقر لتصغيرها.</translation>
 <translation id="4252899949534773101">البلوتوث غير مُفعَّل</translation>
 <translation id="4252996741873942488"><ph name="WINDOW_TITLE" /> - تمت مشاركة محتوى علامة التبويب</translation>
 <translation id="4253168017788158739">ملاحظة</translation>
@@ -4877,7 +4877,7 @@
 <translation id="435185728237714178">الانتقال إلى تطبيق "<ph name="APP_NAME" />" لإدارة التطبيقات التي يتم تثبيتها وبثّها</translation>
 <translation id="4352913519324947509">لم يتم تغيير كلمة المرور، ولكن ما زال بإمكانك الوصول إلى الموقع الإلكتروني باستخدام كلمة المرور الحالية</translation>
 <translation id="4354073718307267720">طلب الإذن عند محاولة موقع إلكتروني إنشاء خريطة ثلاثية الأبعاد للبيئة المحيطة بك أو تتبُّع موضع الكاميرا</translation>
-<translation id="4354344420232759511">ستظهر المواقع التي تزورها هنا.</translation>
+<translation id="4354344420232759511">ستظهر المواقع التي تتم زيارتها هنا.</translation>
 <translation id="435527878592612277">اختيار صورتك</translation>
 <translation id="4356100841225547054">إيقاف الصوت</translation>
 <translation id="4357583358198801992">عرض مجموعات علامات التبويب</translation>
@@ -5294,7 +5294,7 @@
 <translation id="4651484272688821107">تعذَّر تحميل المكوِّن على الإنترنت باستخدام موارد الوضع التجريبي.</translation>
 <translation id="4651921906638302153">لا يمكن تسجيل الدخول باستخدام هذا الحساب</translation>
 <translation id="4652921642122345344">سرعة الصوت <ph name="RATE" /> مرة</translation>
-<translation id="4652935475563630866">‏يتطلب تغيير إعدادات الكاميرا إعادة تشغيل نظام Parallels Desktop. أعِد تشغيل نظام Parallels Desktop للمتابعة.</translation>
+<translation id="4652935475563630866">‏يتطلب تغيير إعدادات الكاميرا إعادة تشغيل نظام Parallels Desktop. يرجى إعادة تشغيل نظام Parallels Desktop للمتابعة.</translation>
 <translation id="4653116291358041820">ظل صغير</translation>
 <translation id="4653405415038586100">‏حدث خطأ أثناء إعداد نظام التشغيل Linux.</translation>
 <translation id="4654236001025007561">‏أصبح بإمكانك الآن مشاركة الملفات مع أجهزة Chromebook وأجهزة تعمل بنظام التشغيل Android</translation>
@@ -5498,7 +5498,7 @@
 <translation id="4804818685124855865">إلغاء الربط</translation>
 <translation id="4804827417948292437">أفوكادو</translation>
 <translation id="4806071198808203109">حفظ إط&amp;ار الفيديو باسم...</translation>
-<translation id="4806457879608775995">مراجعة هذه البنود والتحكّم في بياناتك</translation>
+<translation id="4806457879608775995">ننصحك بمراجعة هذه البنود والتحكّم في بياناتك</translation>
 <translation id="4807098396393229769">الاسم المكتوب على البطاقة</translation>
 <translation id="4807122856660838973">تفعيل ميزة "التصفُّح الآمن"</translation>
 <translation id="4807514039636325497">‏تفاصيل D-Bus</translation>
@@ -5729,7 +5729,7 @@
 <translation id="4954652437333037880">ملف</translation>
 <translation id="4955707703665801001">إمكانية ظهور الجهاز الذي يستخدم ميزة "<ph name="FEATURE_NAME" />"</translation>
 <translation id="4955710816792587366">اختيار رقم التعريف الشخصي</translation>
-<translation id="4956593309300508411">هل تريد إيقاف المشاركة؟</translation>
+<translation id="4956593309300508411">إيقاف المشاركة؟</translation>
 <translation id="4956847150856741762">1</translation>
 <translation id="4958009531430054995">هل تريد حفظ الإشارة المرجعية في مجلد على هذا الجهاز فقط؟</translation>
 <translation id="4959262764292427323">‏يتم حفظ كلمات المرور في حسابك على Google ما يُمكّنك من استخدامها على أي جهاز آخر.</translation>
@@ -6104,7 +6104,7 @@
 <translation id="5227679487546032910">الأفاتار التلقائي باللون الأزرق المخضر</translation>
 <translation id="5228245824943774148">هناك <ph name="NUM_DEVICES_CONNECTED" /> جهاز متصل.</translation>
 <translation id="5228579091201413441">تفعيل المزامنة</translation>
-<translation id="5228704301508740018">{GROUP_COUNT,plural, =1{هل تريد إلغاء تجميع مجموعة علامات التبويب؟}zero{هل تريد إلغاء تجميع مجموعات علامات التبويب؟}two{هل تريد إلغاء تجميع مجموعتَي علامات التبويب؟}few{هل تريد إلغاء تجميع مجموعات علامات التبويب؟}many{هل تريد إلغاء تجميع مجموعات علامات التبويب؟}other{هل تريد إلغاء تجميع مجموعات علامات التبويب؟}}</translation>
+<translation id="5228704301508740018">{GROUP_COUNT,plural, =1{هل المطلوب إلغاء تجميع مجموعة علامات التبويب؟}zero{هل المطلوب إلغاء تجميع مجموعات علامات التبويب؟}two{هل المطلوب إلغاء تجميع مجموعتَي علامات التبويب؟}few{هل المطلوب إلغاء تجميع مجموعات علامات التبويب؟}many{هل المطلوب إلغاء تجميع مجموعات علامات التبويب؟}other{هل المطلوب إلغاء تجميع مجموعات علامات التبويب؟}}</translation>
 <translation id="5230190638672215545">‏اكتب uow لإظهار ươ</translation>
 <translation id="5230516054153933099">نافذة</translation>
 <translation id="5232714764496316200">‏واجباتك المنزلية أصبحت أسهل مع "عدسة Google"</translation>
@@ -6130,7 +6130,7 @@
 <translation id="5244234799035360187">‏ستظهر مساحة تخزين OneDrive الآن في تطبيق "الملفات".</translation>
 <translation id="5244466461749935369">عدم إلغاء تثبيت الإضافة حاليًا</translation>
 <translation id="5244474230056479698">المزامنة مع <ph name="EMAIL" /></translation>
-<translation id="5245610266855777041">بدء استخدام حساب مدرسة</translation>
+<translation id="5245610266855777041">بدء استخدام حساب تديره مؤسسة تعليمية</translation>
 <translation id="5246282308050205996">حدث عطل في <ph name="APP_NAME" />. يمكنك النقر على هذا البالون لإعادة تشغيل التطبيق.</translation>
 <translation id="5247051749037287028">الاسم المعروض (اختياري)</translation>
 <translation id="5247243947166567755">اختيار "<ph name="BOOKMARK_TITLE" />"</translation>
@@ -6300,7 +6300,7 @@
 <translation id="5375374982898812658">ستفقد على الفور إمكانية الوصول إلى مجموعة علامات التبويب "<ph name="GROUP_NAME" />"، وسيتم حذفها من جميع أجهزتك</translation>
 <translation id="5375577102295339548">يمكن للمواقع الإلكترونية المساعدة في إثبات أنّك لست برنامج تتبُّع</translation>
 <translation id="5376094717770783089">طلبات الوصول إلى الموقع الإلكتروني</translation>
-<translation id="5376169624176189338">انقر للرجوع إلى الوراء واضغط لمشاهدة السجل</translation>
+<translation id="5376169624176189338">يرجى النقر للرجوع إلى الوراء والضغط لمشاهدة السجل</translation>
 <translation id="5376931455988532197">الملف كبير جدًا</translation>
 <translation id="5377367976106153749">هل تريد تفعيل إمكانية الوصول إلى الكاميرا؟</translation>
 <translation id="5379140238605961210">متابعة حظر الدخول إلى الميكروفون</translation>
@@ -6337,7 +6337,7 @@
 <translation id="5402367795255837559">لغة برايل</translation>
 <translation id="5402815541704507626">تنزيل التحديث باستخدام بيانات الجوّال</translation>
 <translation id="5404557844330880551">مزيد من المعلومات حول ميزة "مقارنة المنتجات"</translation>
-<translation id="5404740137318486384">اضغط على مفتاح تحكّم معيَّن أو مفتاح على لوحة المفاتيح لتخصيصه للإجراء "<ph name="ACTION" />".
+<translation id="5404740137318486384">يرجى الضغط على مفتاح تحكّم معيَّن أو مفتاح على لوحة المفاتيح لتخصيصه للإجراء "<ph name="ACTION" />".
 ويمكنك تخصيص عدة مفاتيح تحكّم لهذا الإجراء.</translation>
 <translation id="540495485885201800">تبديل العنصر المختار مع العنصر السابق</translation>
 <translation id="5405146885510277940">إعادة ضبط الإعدادات</translation>
@@ -6782,7 +6782,7 @@
 <translation id="572328651809341494">علامات التبويب الأخيرة</translation>
 <translation id="5723508132121499792">ليس هناك تطبيقات خلفية قيد التشغيل</translation>
 <translation id="5725112283692663422">إرسال ملاحظات عن ميزة إنشاء مظهر باستخدام الذكاء الاصطناعي</translation>
-<translation id="5727728807527375859">قد تلحق الإضافات والتطبيقات والمظاهر الضرر بالكمبيوتر، فهل تريد بالتأكيد المتابعة؟</translation>
+<translation id="5727728807527375859">قد تلحق الإضافات والتطبيقات والمظاهر الضرر بالكمبيوتر، فهل نتابع العملية؟</translation>
 <translation id="5728072125198221967">‏خدمات Google المرتبطة</translation>
 <translation id="5728290366864286776">يمكن لهذه الإضافة قراءة معلومات الموقع الإلكتروني أو يمكن أن تعمل في الخلفية.</translation>
 <translation id="5728450728039149624">‏خيارات قفل شاشة Smart Lock</translation>
@@ -6847,7 +6847,7 @@
 <translation id="5776450228446082914">قائمة المواقع الإلكترونية التي يمكن فتحها في أي متصفِّح</translation>
 <translation id="5776571780337000608">يمكنك فتح الملفات المتوافقة وتعديلها باستخدام هذا التطبيق من متصفِّح الملفات الذي تستخدمه أو من تطبيقات أخرى. للتحكّم في الملفات التي تفتح هذا التطبيق تلقائيًا، <ph name="BEGIN_LINK" />تعرَّف على كيفية تحديد التطبيقات التلقائية على جهازك<ph name="END_LINK" />.</translation>
 <translation id="5778491106820461378">‏يمكنك إدارة حسابات Google التي تم تسجيل الدخول إليها، وذلك من خلال الانتقال إلى <ph name="LINK_BEGIN" />الإعدادات<ph name="LINK_END" />. ويمكن أن تنطبق الأذونات التي منحتها إلى المواقع الإلكترونية والتطبيقات على جميع الحسابات. إذا كنت لا تريد السماح للمواقع الإلكترونية أو التطبيقات بالوصول إلى معلومات حسابك، يمكنك تسجيل الدخول إلى <ph name="DEVICE_TYPE" /> بصفتك ضيفًا.</translation>
-<translation id="5780011244986845107">يتضمَّن المجلَّد الذي اخترته ملفات حساسة. هل تريد بالتأكيد منح "<ph name="APP_NAME" />" الوصول الدائم للقراءة في هذا المجلَّد؟</translation>
+<translation id="5780011244986845107">يتضمَّن المجلَّد الذي اخترته ملفات حساسة. هل المطلوب فعلًا منح "<ph name="APP_NAME" />" الوصول الدائم للقراءة في هذا المجلَّد؟</translation>
 <translation id="5780940414249100901">‏إرسال بيانات الاستخدام والتشخيص: يُرسل هذا الجهاز حاليًا بيانات التشخيص وبيانات استخدام الجهاز والتطبيقات إلى Google تلقائيًا. ولن يتم استخدام هذه البيانات لتحديد هوية طفلك، بل ستُستخدَم لتعزيز استقرار النظام والتطبيقات وإجراء المزيد من التحسينات. ستساعد أيضًا بعض البيانات المجمّعة تطبيقات Google وشركاءها، مثل مطوّري تطبيقات Android. ويفرض المالك هذا <ph name="BEGIN_LINK1" />الإعداد<ph name="END_LINK1" />. في حال تفعيل إعداد "النشاط الإضافي على الويب وفي التطبيقات" لطفلك، قد يتم حفظ هذه البيانات في حسابه على Google. <ph name="BEGIN_LINK2" />مزيد من المعلومات حول المقاييس<ph name="BEGIN_LINK2_END" />مزيد من المعلومات<ph name="END_LINK2" /></translation>
 <translation id="5780973441651030252">أولوية المعالجة</translation>
 <translation id="5781092003150880845">المزامنة باسم <ph name="ACCOUNT_FULL_NAME" /></translation>
@@ -7609,7 +7609,7 @@
 <translation id="6307268917612054609">بإمكان التطبيقات والمواقع الإلكترونية التي لديها أذونات وصول إلى الكاميرا وكذلك خدمات النظام استخدام الكاميرا</translation>
 <translation id="6307990684951724544">النظام مشغول</translation>
 <translation id="6308493641021088955">خدمة تسجيل الدخول مقدّمة من <ph name="EXTENSION_NAME" /></translation>
-<translation id="6308937455967653460">حف&amp;ظ الرابط باسم...</translation>
+<translation id="6308937455967653460">حفظ الرابط باسم…</translation>
 <translation id="6309443618838462258">لا يسمح المشرف باستخدام أسلوب الإدخال هذا.</translation>
 <translation id="6309510305002439352">تم إيقاف الميكروفون</translation>
 <translation id="6310141306111263820">‏تعذّر تثبيت الملف التعريفي لشريحة eSIM. للحصول على المساعدة، يُرجى التواصل مع مشغّل شبكة الجوّال.</translation>
@@ -7634,7 +7634,7 @@
 <translation id="6326855256003666642">عدد مرات التحقق من الاتصال</translation>
 <translation id="6327065839080961103">استخدام البيانات في ميزة "<ph name="FEATURE_NAME" />"</translation>
 <translation id="6327785803543103246">اكتشاف الخادم الوكيل للويب تلقائيًا</translation>
-<translation id="6329916384047371874">ستستخدِم كلمة المرور الخاصة بـ <ph name="PASSWORD_DOMAIN" /> على <ph name="DOMAIN" />. لا تستخدِم كلمة المرور إلا إذا كنت تثق في <ph name="DOMAIN" />.</translation>
+<translation id="6329916384047371874">سيتم استخدام كلمة مرور <ph name="PASSWORD_DOMAIN" /> على <ph name="DOMAIN" />. يجب استخدامها فقط بحال ثقتك في <ph name="DOMAIN" />.</translation>
 <translation id="6331857227627979149">‏سيتم حفظ مفتاح المرور في "مدير كلمات المرور في Google" ضمن الحساب "<ph name="ACCOUNT_NAME" />". ولن تكون هناك حاجة إلى إجراء ذلك سوى مرة واحدة.</translation>
 <translation id="6333064448949140209">‏سيتم إرسال الملف إلى Google لتصحيح الأخطاء</translation>
 <translation id="6333170995003625229">تعذّر التحقُّق من عنوان بريدك الإلكتروني أو كلمة مرورك. يرجى محاولة تسجيل الدخول مرة أخرى.</translation>
@@ -7661,7 +7661,7 @@
 <translation id="634792071306410644">لا يمكن لأحد المشاركة معك إلا عندما يكون جهازك مرئيًا</translation>
 <translation id="6348252528297699679">لإيقاف إمكانية الوصول إلى الموقع الجغرافي، انتقِل إلى "الإعدادات" &gt; "الخصوصية والأمان" &gt; "عناصر التحكّم في الخصوصية" &gt; "الوصول إلى الموقع الجغرافي". <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
 <translation id="6348805481186204412">مساحة التخزين بلا اتصال بالإنترنت</translation>
-<translation id="6349101878882523185">تثبيت "<ph name="APP_NAME" />"</translation>
+<translation id="6349101878882523185">تثبيت <ph name="APP_NAME" /></translation>
 <translation id="6350821834561350243">يُرجى تقديم وصف واضح للمشكلة وخطوات إعادة إنتاجها (إن أمكن ذلك).</translation>
 <translation id="6351178441572658285">لغات التطبيقات</translation>
 <translation id="6354918092619878358">‏منحنى SECG ناقص المقطع secp256r1‏ (aka ANSI X9.62 prime256v1‏، NIST P-256)</translation>
@@ -7697,7 +7697,7 @@
 <translation id="6378392501584240055">‏الفتح في شبكات Wi-Fi</translation>
 <translation id="6379228010899751161">يُرجى إثبات هويتك للتأكّد من أنّه يمكنك استخدام كلمات المرور في حسابك (<ph name="ACCOUNT_EMAIL" />)</translation>
 <translation id="6379827283296619736">لا، أريد مواصلة استخدام ملف العمل هذا</translation>
-<translation id="6380143666419481200">القبول والمواصلة</translation>
+<translation id="6380143666419481200">قبول ومتابعة</translation>
 <translation id="6383382161803538830">وضع القراءة غير متاح على هذه الصفحة</translation>
 <translation id="638418309848716977">الروابط المتوافقة</translation>
 <translation id="6384275966486438344">تغيير إعدادات البحث لـ: <ph name="SEARCH_HOST" /></translation>
@@ -7765,7 +7765,7 @@
 <translation id="6434309073475700221">تجاهل</translation>
 <translation id="6434325376267409267">يجب تحديث الجهاز للتمكّن من استخدام <ph name="APP_NAME" />.</translation>
 <translation id="6434755719322447931">فوضوية</translation>
-<translation id="6435339218366409950">اختَر اللغة التي تريد الترجمة إليها.</translation>
+<translation id="6435339218366409950">يُرجى اختيار لغة الترجمة.</translation>
 <translation id="6436164536244065364">عرض في السوق الإلكتروني</translation>
 <translation id="6436778875248895551">حظَر المشرف الإضافة "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="6438234780621650381">إعادة ضبط الإعدادات</translation>
@@ -7779,7 +7779,7 @@
 <translation id="6444147596556711162">استخدِم الإجراءين "التالي" و"السابق" للتنقُّل بين العناصر على الشاشة.</translation>
 <translation id="6444690771728873098">يمكنك مشاركة نسخة من كلمة المرور بأمان مع أي فرد في مجموعة عائلتك.</translation>
 <translation id="6444909401984215022"><ph name="WINDOW_TITLE" /> - يتم البحث عن جهاز يتضمّن بلوتوث</translation>
-<translation id="6445450263907939268">إذا كنت لا تريد هذه التغييرات، فيمكنك استعادة الإعدادات السابقة.</translation>
+<translation id="6445450263907939268">يمكنك التراجع عن هذه التغييرات من خلال استعادة الإعدادات السابقة.</translation>
 <translation id="6446213738085045933">إنشاء اختصار على سطح المكتب</translation>
 <translation id="6447842834002726250">ملفّات تعريف الارتباط</translation>
 <translation id="6450876761651513209">تغيير الإعدادات المتعلقة بالخصوصية</translation>
@@ -7874,7 +7874,7 @@
 <translation id="651753338596587143">‏حدث خطأ أثناء تثبيت ملحقات المحتوى القابل للتنزيل (DLC). يُرجى محاولة إعادة تشغيل الجهاز وإذا استمرت المشكلة، يُرجى إرسال ملاحظاتك وإضافة عبارة ‎#bruschetta في الوصف. رمز الخطأ هو <ph name="ERROR" />.</translation>
 <translation id="6517709704288360414">من المحتمَل أن يتوقف جهازك عن العمل بشكل صحيح، وقد تظهر مشاكل تتعلّق بالأمان والأداء. عند إيقاف التحديثات، قد يتأثّر أيضًا الحق في تقديم دعاوى قانونية في حال حدوث أي مشاكل.</translation>
 <translation id="6518014396551869914">نسخ صورة</translation>
-<translation id="6518133107902771759">تحقق</translation>
+<translation id="6518133107902771759">تأكيد</translation>
 <translation id="651942933739530207">هل تريد أن يشارك <ph name="APP_NAME" /> شاشتك وإخراج الصوت؟</translation>
 <translation id="6519437681804756269">[<ph name="TIMESTAMP" />]
         <ph name="FILE_INFO" />
@@ -7957,7 +7957,7 @@
 <translation id="65711204837946324">يجب الحصول على إذن لإجراء عملية التنزيل.</translation>
 <translation id="6571533309669248172">تنسيق النص</translation>
 <translation id="6571772921213691236">تعديل بيانات تسجيل الدخول</translation>
-<translation id="657229725818377235">عزِّز حماية جهازك من المواقع الإلكترونية الضارّة وعمليات التنزيل الخطيرة.</translation>
+<translation id="657229725818377235">يمكنك تعزيز حماية جهازك من المواقع الإلكترونية الضارّة وعمليات التنزيل الخطيرة.</translation>
 <translation id="6573096386450695060">السماح دومًا</translation>
 <translation id="6573497332121198392">تتعذَّر إزالة الاختصار.</translation>
 <translation id="6573915150656780875">‏لم تعُد تحديثات الأمان والبرامج متوفّرة لجهازك. ننصحك بشراء جهاز Chromebook جديد للحصول على أفضل تجربة استخدام.</translation>
@@ -8285,7 +8285,7 @@
 <translation id="6793610798874309813">يمكن أن يتكوّن رقم التعريف الشخصي من 4 أحرف أو أكثر</translation>
 <translation id="6793879402816827484">↓ <ph name="STATUS" /></translation>
 <translation id="6794175321111873395">تم نسخ <ph name="DOWNLOAD_URL" /> إلى الحافظة</translation>
-<translation id="6794511157503068">‏إذا كان مفتاح المرور الذي يخصّ "<ph name="APP_NAME" />" محفوظًا في مفتاح أمان USB، أدخِل مفتاح الأمان واضغط على الزر الخاص به الآن.</translation>
+<translation id="6794511157503068">‏إذا كان مفتاح المرور الذي يخصّ "<ph name="APP_NAME" />" محفوظًا في مفتاح أمان USB، عليك إدخال مفتاح الأمان والضغط على الزر الخاص به الآن.</translation>
 <translation id="679486139907144816">‏لتسجيل الدخول إلى هذا الموقع الإلكتروني باستخدام مفتاح مرور، يجب تفعيل Windows Hello من خلال الإعدادات. بعد ذلك، عليك الرجوع إلى هذا الموقع الإلكتروني وإعادة المحاولة.</translation>
 <translation id="6795371939514004514">تتيح لك ميزة "المسح التلقائي" إمكانية التنقُّل بين العناصر على الشاشة تلقائيًا. عند تمييز عنصر معيَّن، اضغط على "اختيار" لتنشيطه.</translation>
 <translation id="6795884519221689054">باندا</translation>
@@ -8341,7 +8341,7 @@
 <translation id="6820079682647046800">‏تعذّرت مصادقة Kerberos</translation>
 <translation id="6821439254917412979">إزالة تثبيت <ph name="EXTENSION_NAME" /></translation>
 <translation id="6823174134746916417">الضغط للنقر على لوحة اللمس</translation>
-<translation id="6823561724060793716">يمكنك فتح معلومات الصفحة من شريط العناوين للاطّلاع على معلومات إضافية حول الصفحة التي تزورها.</translation>
+<translation id="6823561724060793716">يمكنك فتح معلومات الصفحة من شريط العناوين للاطّلاع على تفاصيل إضافية حول الصفحة التي تتمّ زيارتها.</translation>
 <translation id="6824564591481349393">نسخ عنوان البريد الإلكتروني</translation>
 <translation id="6824584962142919697">وعناصر الفحص</translation>
 <translation id="6825184156888454064">تصنيف بحسب الاسم</translation>
@@ -8386,7 +8386,7 @@
 <translation id="6846178040388691741">تريد الإضافة "<ph name="EXTENSION_NAME" />" طباعة <ph name="FILE_NAME" /> باستخدام <ph name="PRINTER_NAME" />.</translation>
 <translation id="6846843854964504403">إعادة الضبط لتعزيز الأمان</translation>
 <translation id="6847125920277401289">إخلاء بعض المساحة للمواصلة</translation>
-<translation id="6848716236260083778">لإعداد بصمة الإصبع، اطلب من طفلك لمس مستشعر بصمات الإصبع. ويتم تخزين بيانات بصمة إصبع طفلك بشكل آمن وتظلّ محفوظة على جهاز <ph name="DEVICE_TYPE" /> هذا.</translation>
+<translation id="6848716236260083778">لإعداد بصمة الإصبع، على طفلك لمس مستشعر بصمات الإصبع. ويتم تخزين بيانات بصمة إصبع طفلك بشكل آمن وتظلّ محفوظة على جهاز <ph name="DEVICE_TYPE" /> هذا.</translation>
 <translation id="6850286078059909152">لون النص</translation>
 <translation id="6850925512806464982">سيفقد جميع المستخدمين على الفور إمكانية الوصول إلى مجموعة علامات التبويب هذه، وسيتم حذفها من جميع الأجهزة</translation>
 <translation id="6851181413209322061">‏يَسمح بإرسال بيانات الاستخدام والتشخيص. ويُرسل هذا الجهاز حاليًا بيانات التشخيص وبيانات استخدام التطبيقات والجهاز تلقائيًا إلى Google. ولن يتم استخدام هذه البيانات للتعرّف على حسابك الفرعي، بل ستُستخدَم لتعزيز استقرار النظام والتطبيقات وإجراء المزيد من التحسينات. ستساعد أيضًا بعض البيانات المجمّعة تطبيقات Google وشركاءها، مثل مطوّري تطبيقات Android. ويفرض المالك هذا الإعداد. في حال تفعيل إعداد "النشاط الإضافي على الويب وفي التطبيقات" لحسابك الفرعي، قد يتم حفظ هذه البيانات في حسابك على Google.</translation>
@@ -8408,7 +8408,7 @@
 <translation id="6861179941841598556">مزيد من الإجراءات لملف "<ph name="PROFILE_NAME" />" الشخصي</translation>
 <translation id="6862472520095266519">يجب ألا يتجاوز عدد الأحرف في الاسم 32 حرفًا</translation>
 <translation id="6863496016067551393">المواقع الإلكترونية التي تسمح باستخدام كل الإضافات</translation>
-<translation id="686366188661646310">هل تريد حذف كلمة المرور؟</translation>
+<translation id="686366188661646310">هل المطلوب حذف كلمة المرور؟</translation>
 <translation id="6863925886424789941">الكولوسيوم</translation>
 <translation id="6865313869410766144">بيانات الملء التلقائي للنماذج</translation>
 <translation id="6865708901122695652">‏سجلّات أحداث WebRTC (<ph name="WEBRTC_EVENT_LOG_COUNT" />)</translation>
@@ -8481,7 +8481,7 @@
 <translation id="6917873303492266709">‏لمشاركة مجموعات علامات التبويب والانضمام إليها والتعاون فيها، يمكنك فتح الإعدادات وتفعيل خيار "السماح بتسجيل الدخول إلى Chrome"</translation>
 <translation id="6918677045355889289">‏مطلوب تحديث نظام التشغيل Chrome</translation>
 <translation id="6918733588290914545">‏بدء الإعداد السريع باستخدام هاتف Android</translation>
-<translation id="6919354101107095996">جرِّب تسجيل الدخول إلى الموقع الإلكتروني، ثم حاوِل تنزيل الملف مرة أخرى.</translation>
+<translation id="6919354101107095996">يرجى محاولة تسجيل الدخول إلى الموقع الإلكتروني، ثم تنزيل الملف مرة أخرى.</translation>
 <translation id="6919952941889172531">‏هل تريد أيضًا تفعيل ميزة "الحماية المُحسَّنة للتصفّح الآمن" لهذا الملف الشخصي في Chrome؟</translation>
 <translation id="6920473853105515518">‏يُرجى التأكُّد من أنّ <ph name="DEVICE_TYPE" /> متصل بالإنترنت ثم إعادة المحاولة. يمكنك أيضًا الانتقال إلى play.google/play-terms على جهاز آخر.</translation>
 <translation id="6920989436227028121">فتح كعلامة تبويب عادية</translation>
@@ -8822,13 +8822,13 @@
 <translation id="7171259390164035663">عدم التسجيل</translation>
 <translation id="7172470549472604877">{NUM_TABS,plural, =1{إضافة علامة التبويب إلى مجموعة جديدة}zero{إضافة علامات التبويب إلى مجموعة جديدة}two{إضافة علامتَي التبويب إلى مجموعة جديدة}few{إضافة علامات التبويب إلى مجموعة جديدة}many{إضافة علامات التبويب إلى مجموعة جديدة}other{إضافة علامات التبويب إلى مجموعة جديدة}}</translation>
 <translation id="7173114856073700355">فتح الإعدادات</translation>
-<translation id="7174199383876220879">إليك إعداد جديد. يمكنك التحكم في الموسيقى والفيديوهات وغير ذلك.</translation>
+<translation id="7174199383876220879">ميزة جديدة: التحكّم في الموسيقى والفيديوهات وغير ذلك</translation>
 <translation id="7175037578838465313">إعداد <ph name="NAME" /></translation>
 <translation id="7175353351958621980">تم التحميل من:</translation>
 <translation id="7180611975245234373">إعادة التحميل</translation>
 <translation id="7180865173735832675">تخصيص</translation>
 <translation id="7181117767881540376">إخفاء شريط الإشارات</translation>
-<translation id="7181329571386134105">‏للسماح لـ "<ph name="CHILD_NAME" />" بتثبيت الإضافات المستقبلية بدون موافقتك، افتح تطبيق Family Link على جهازك وعدِّل إعدادات Google Chrome الخاصة بـ "<ph name="CHILD_NAME" />".</translation>
+<translation id="7181329571386134105">‏للسماح لـ "<ph name="CHILD_NAME" />" بتثبيت الإضافات المستقبلية بدون موافقتك، عليك فتح تطبيق Family Link على جهازك وتعديل إعدادات Google Chrome الخاصة بـ "<ph name="CHILD_NAME" />".</translation>
 <translation id="7181840534454431748">الانضمام إلى مجموعة علامات التبويب مع "<ph name="OWNER_FIRST_NAME" />"
             {NUM_OTHER_MEMBERS,plural, =0{الانضمام إلى مجموعة علامات التبويب مع "<ph name="OWNER_FIRST_NAME" />"}=1{الانضمام إلى مجموعة علامات التبويب مع "<ph name="OWNER_FIRST_NAME" />" ومستخدم واحد آخر}two{الانضمام إلى مجموعة علامات التبويب مع "<ph name="OWNER_FIRST_NAME" />" ومستخدمَين آخرَين}few{الانضمام إلى مجموعة علامات التبويب مع "<ph name="OWNER_FIRST_NAME" />" و# مستخدمِين آخرِين}many{الانضمام إلى مجموعة علامات التبويب مع "<ph name="OWNER_FIRST_NAME" />" و# مستخدمًا آخر}other{الانضمام إلى مجموعة علامات التبويب مع "<ph name="OWNER_FIRST_NAME" />" و# مستخدم آخر}}</translation>
 <translation id="7181976109296206547">‏مراجعة التعديلات التي تم إجراؤها على الشعار والاسم وعنوان URL</translation>
@@ -8844,7 +8844,7 @@
 <translation id="7189234443051076392">التأكد من توفر مساحة كافية على جهازك</translation>
 <translation id="7189451821249468368">ليست لديك ترقيات كافية لتسجيل هذا الجهاز. يُرجى التواصل مع قسم المبيعات لشراء المزيد من الترقيات. في حال وصلتك هذه الرسالة عن طريق الخطأ، يُرجى التواصل مع فريق الدعم.</translation>
 <translation id="7189965711416741966">تمت إضافة بصمة إصبع.</translation>
-<translation id="7190921792980745354">هل تريد حظر "<ph name="MEMBER_FULL_NAME" />"؟</translation>
+<translation id="7190921792980745354">هل مطلوب حظر "<ph name="MEMBER_FULL_NAME" />"؟</translation>
 <translation id="7191063546666816478">ستظل بعض الروابط المتوافقة مفتوحة في تطبيقات <ph name="APP_NAME" /> و<ph name="APP_NAME_2" /> و<ph name="APP_NAME_3" /> وتطبيقات أخرى يبلغ عددها <ph name="NUMBER_OF_OTHER_APPS" />.</translation>
 <translation id="7191159667348037">‏طابعة غير معروفة (USB)</translation>
 <translation id="7191631508323321927">ردهة</translation>
@@ -9388,7 +9388,7 @@
 <translation id="7566969018588966785">إنشاء مجموعة مفاتيح</translation>
 <translation id="7567100268516475532">نقل علامة التبويب إلى وضع "تقسيم العرض"</translation>
 <translation id="7568014768212280234">مجموعة علامات التبويب ممتلئة، ولا يمكن للأعضاء الجدد الانضمام باستخدام الرابط</translation>
-<translation id="7568759527730933493">‏استخدِم اتصالاً آمنًا للبحث عن عنوان IP لموقع إلكتروني في نظام أسماء النطاقات (DNS). يعتمد ذلك على مقدِّم خدمة مُدار ومسجّل على الرابط <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" />، علمًا بأنّه لا يتم استخدام الاتصالات الآمنة لبعض النطاقات التي ضبطها المشرف.</translation>
+<translation id="7568759527730933493">‏يرجى استخدام اتصال آمن للبحث عن عنوان IP لموقع إلكتروني في نظام أسماء النطاقات (DNS). ويعتمد ذلك على مقدِّم خدمة مُدار ومسجّل على الرابط <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" />. لا يتم استخدام الاتصالات الآمنة لبعض النطاقات التي ضبطها المشرف.</translation>
 <translation id="756876171895853918">تخصيص الأفاتار</translation>
 <translation id="7568790562536448087">تحديث</translation>
 <translation id="7569983096843329377">أسود</translation>
@@ -9434,7 +9434,7 @@
 <translation id="7606248551867844312">تأكيد الاقتصاص</translation>
 <translation id="7606560865764296217">إيقاف الصورة المتحركة مؤقتًا</translation>
 <translation id="7606639338662398635">مجموعات علامات التبويب</translation>
-<translation id="7607002721634913082">تعليق التحميل</translation>
+<translation id="7607002721634913082">متوقف مؤقتًا</translation>
 <translation id="7608810328871051088">‏إعدادات Android المفضّلة</translation>
 <translation id="7609148976235050828">يُرجى الاتصال بالإنترنت وإعادة المحاولة.</translation>
 <translation id="7610337976012700501">‏لاستخدام ميزة "<ph name="FEATURE_NAME" />" مع جهات الاتصال هذه، أضِف إلى تلك الجهات عنوان البريد الإلكتروني المرتبط بحساب كل منها على Google.</translation>
@@ -9584,7 +9584,7 @@
 <translation id="7694246789328885917">أداة التمييز</translation>
 <translation id="7694895628076803349">‏عدم إظهار ملفات Drive</translation>
 <translation id="7696063401938172191">على '<ph name="PHONE_NAME" />':</translation>
-<translation id="7697109152153663933">انقر على "كلمات المرور والملء التلقائي".</translation>
+<translation id="7697109152153663933">يُرجى النقر على "كلمات المرور والملء التلقائي".</translation>
 <translation id="769824636077131955">إنّ حجم هذا المستند كبير بدرجة يتعذّر معها إجراء فحص الأمان. يمكنك طباعة مستندات يصل حجمها إلى 50 ميغابايت.</translation>
 <translation id="7698507637739331665">تم حظر بعض العناصر</translation>
 <translation id="7700516433658473670">الطابعات والماسحات الضوئية</translation>
@@ -9713,7 +9713,7 @@
 <translation id="778480864305029524">‏فعّل الإشعارات لخدمات Google Play لاستخدام التوصيل الفوري</translation>
 <translation id="7785471469930192436">يمكنك الاطّلاع على تعليمات محرّك البحث بشأن حذف سجلّ البحث، إن أمكن.</translation>
 <translation id="77855763949601045">فتح الملف الشخصي للضيف</translation>
-<translation id="7786663536153819505">اتّبِع التعليمات التي تظهر على هاتفك لمسح رمز الاستجابة السريعة ضوئيًا. تأكَّد من تفعيل البلوتوث على هاتفك.
+<translation id="7786663536153819505">يرجى اتباع التعليمات التي تظهر على هاتفك لمسح رمز الاستجابة السريعة ضوئيًا. يجب التأكد من تفعيل البلوتوث على هاتفك.
     <ph name="BR" />
     <ph name="BR" />
     جهازك مرئي للأجهزة القريبة باسم <ph name="QUICK_START_DEVICE_DISPLAY_NAME" />…</translation>
@@ -9868,9 +9868,9 @@
 <translation id="7893008570150657497">الوصول إلى الصور والموسيقى والوسائط الأخرى من جهاز الكمبيوتر</translation>
 <translation id="7893153962594818789">تم إيقاف البلوتوث في جهاز <ph name="DEVICE_TYPE" /> هذا. أدخل كلمة مرورك، وشغّل البلوتوث.</translation>
 <translation id="7893393459573308604"><ph name="ENGINE_NAME" /> (التلقائي)</translation>
-<translation id="7896292361319775586">هل تريد حفظ <ph name="FILE" />؟</translation>
+<translation id="7896292361319775586">حفظ <ph name="FILE" />؟</translation>
 <translation id="789722939441020330">عدم السماح للمواقع الإلكترونية بتنزيل عدّة ملفات تلقائيًا</translation>
-<translation id="7897900149154324287">في المستقبل، تأكد من إخراج الجهاز القابل للإزالة في تطبيق الملفات قبل فصله؛ وإلا قد تفقد بيانات.</translation>
+<translation id="7897900149154324287">في المستقبل، يرجى التأكد من إخراج الجهاز القابل للإزالة في تطبيق الملفات قبل فصله؛ وإلا قد تضيع بعض البيانات.</translation>
 <translation id="7898725031477653577">ترجمة اللغة دومًا</translation>
 <translation id="7900950034255258543">للتأكّد من إمكانية استخدام هذا الجهاز بأمان، يُمكن لمؤسستك الاطّلاع على معلومات حول نظام التشغيل والمتصفّح والإعدادات والبرامج المثبَّتة على الجهاز</translation>
 <translation id="7901405293566323524">Phone Hub</translation>
@@ -9927,7 +9927,7 @@
 <translation id="7933518760693751884">لحفظ إحدى الصفحات والاطّلاع عليها لاحقًا، انقر على رمز الإشارة المرجعية.</translation>
 <translation id="7933634003144813719">إدارة المجلدات التي تمت مشاركتها</translation>
 <translation id="793531125873261495">حدث خطأ أثناء تنزيل الآلة الافتراضية. يُرجى إعادة المحاولة.</translation>
-<translation id="7936195481975600746">لمشاركة شاشتك، استخدِم أداة اختيار الشاشة في النظام</translation>
+<translation id="7936195481975600746">لمشاركة شاشتك، يمكنك استخدام أداة اختيار الشاشة في النظام</translation>
 <translation id="7937809006412909895">جارٍ جمع بيانات التشخيص</translation>
 <translation id="7938881824185772026">مختبرات</translation>
 <translation id="7939062555109487992">خيارات متقدمة</translation>
@@ -10419,7 +10419,7 @@
 <translation id="8259048637628995340">‏يمكنك توصيل هاتفك للحصول على تجربة استخدام أسلس، وكل ذلك على نظام Android</translation>
 <translation id="8260177673299865994">تحسين حماية عمليات التنزيل</translation>
 <translation id="8260864402787962391">الماوس</translation>
-<translation id="8261378640211443080">هذه الإضافة غير مدرجة في <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> وربما تمت إضافتها بدون علمك.</translation>
+<translation id="8261378640211443080">هذه الإضافة غير مُدرَجة في <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> وربما تكون قد أضيفت بدون علمك.</translation>
 <translation id="8261506727792406068">حذف</translation>
 <translation id="8261625296061301062">تم تثبيت برنامج الماسح الضوئي</translation>
 <translation id="8263149565724023141">التطبيقات ذات الصلة</translation>
@@ -10864,7 +10864,7 @@
 <translation id="8571213806525832805">آخر 4 أسابيع</translation>
 <translation id="8571323456914890254">فتح في وضع "تقسيم العرض"</translation>
 <translation id="8571687764447439720">‏إضافة تذكرة Kerberos</translation>
-<translation id="8572052284359771939">‏يُرسِل هذا الوضع إلى "التصفّح الآمن من Google" عناوين URL التي تزورها وعيّنة صغيرة من محتوى الصفحات وعمليات التنزيل ونشاط الإضافات ومعلومات النظام للتأكّد من أنّها ليست ضارة.</translation>
+<translation id="8572052284359771939">‏يُرسِل هذا الإعداد إلى ميزة "التصفّح الآمن من Google" عناوين URL التي تتم زيارتها وعيّنة صغيرة من محتوى الصفحات وعمليات التنزيل ونشاط الإضافات ومعلومات النظام للتأكّد من أنّها ليست ضارّة.</translation>
 <translation id="8573111744706778015">‏اكتب uo7 لإظهار ươ</translation>
 <translation id="8574990355410201600">السماح دومًا بتشغيل الصوت على <ph name="HOST" /></translation>
 <translation id="8575286410928791436">يُرجى الضغط مع الاستمرار على <ph name="KEY_EQUIVALENT" /> للإنهاء</translation>
@@ -11146,9 +11146,9 @@
 <translation id="8751329102746373229">من المُشرف</translation>
 <translation id="8752451679755290210">التنقُّل بين العناصر تلقائيًا</translation>
 <translation id="8753948258138515839">‏يتيح تطبيق "الملفات" وصولاً سريعًا إلى الملفات التي تم حفظها على Google Drive أو وحدة التخزين الخارجية أو الجهاز الذي يعمل بنظام التشغيل ChromeOS Flex.</translation>
-<translation id="8754200782896249056">‏&lt;p&gt;عند تشغيل <ph name="PRODUCT_NAME" /> من خلال بيئة معتمدة لسطح المكتب، سيتم استخدام إعدادات الخادم الوكيل للنظام. ومع ذلك، يحتمل إما أن يكون نظامك غير مدعم أو أنه ربما حدثت مشكلة أثناء تشغيل إعداد نظامك.&lt;/p&gt;
+<translation id="8754200782896249056">‏&lt;p&gt;عند تشغيل <ph name="PRODUCT_NAME" /> من خلال بيئة متوافقة لسطح المكتب، سيتم استخدام إعدادات الخادم الوكيل للنظام. ومع ذلك، يحتمل أن نظامك لا يسمح باستخدام التطبيق أو أنه ربما حدثت مشكلة أثناء تشغيل تهيئة نظامك.&lt;/p&gt;
 
-          &lt;p&gt;لكن لا يزال بإمكانك الإعداد من خلال سطر الأوامر. يُرجى الاطّلاع على &lt;code&gt;man <ph name="PRODUCT_BINARY_NAME" />&lt;/code&gt; للمزيد من المعلومات عن المتغيرات لكل من العلامات والبيئة.&lt;/p&gt;</translation>
+        &lt;p&gt;ولكن لا يزال بإمكانك التهيئة من خلال سطر الأوامر. الرجاء الاطلاع على &lt;code&gt;man <ph name="PRODUCT_BINARY_NAME" />&lt;/code&gt; للمزيد من المعلومات عن المتغيرات لكل من العلامات والبيئة.&lt;/p&gt;</translation>
 <translation id="8755175579224030324">تنفيذ المهام المتعلّقة بالأمان في مؤسستك، مثل إدارة الشهادات والمفاتيح المُخزَّنة على الجهاز</translation>
 <translation id="875532100880844232">يمكنك اختيار إجراء لكل مفتاح في <ph name="DEVICE_NAME" />.</translation>
 <translation id="8755376271068075440">أ&amp;كبر</translation>
@@ -11359,7 +11359,7 @@
 <translation id="8898786835233784856">اختيار علامة التبويب التالية</translation>
 <translation id="8898790559170352647">‏إضافة حسابك على Microsoft</translation>
 <translation id="8898822736010347272">‏إرسال عناوين URL الخاصّة ببعض الصفحات التي تزورها، وعدد محدود من معلومات النظام، وبعض أنواع محتوى الصفحات إلى Google، وذلك للمساعدة على اكتشاف التهديدات الجديدة وتوفير الحماية لجميع المستخدمين على الويب</translation>
-<translation id="8899851313684471736">&amp;فتح الرّابط في نافذة جديدة</translation>
+<translation id="8899851313684471736">&amp;فتح رابط في نافذة جديدة</translation>
 <translation id="8900413463156971200">تفعيل شبكة الجوّال</translation>
 <translation id="8902059453911237649">{NUM_DAYS,plural, =1{يطلُب <ph name="MANAGER" /> منك الاحتفاظ بنسخة احتياطية من بياناتك وإرجاع جهاز <ph name="DEVICE_TYPE" /> اليوم.}zero{يطلُب <ph name="MANAGER" /> منك الاحتفاظ بنسخة احتياطية من بياناتك وإرجاع جهاز <ph name="DEVICE_TYPE" /> هذا قبل الموعد النهائي.}two{يطلُب <ph name="MANAGER" /> منك الاحتفاظ بنسخة احتياطية من بياناتك وإرجاع جهاز <ph name="DEVICE_TYPE" /> هذا قبل الموعد النهائي.}few{يطلُب <ph name="MANAGER" /> منك الاحتفاظ بنسخة احتياطية من بياناتك وإرجاع جهاز <ph name="DEVICE_TYPE" /> هذا قبل الموعد النهائي.}many{يطلُب <ph name="MANAGER" /> منك الاحتفاظ بنسخة احتياطية من بياناتك وإرجاع جهاز <ph name="DEVICE_TYPE" /> هذا قبل الموعد النهائي.}other{يطلُب <ph name="MANAGER" /> منك الاحتفاظ بنسخة احتياطية من بياناتك وإرجاع جهاز <ph name="DEVICE_TYPE" /> هذا قبل الموعد النهائي.}}</translation>
 <translation id="8902667442496790482">فتح إعدادات سماع الاختيار</translation>
@@ -11640,7 +11640,7 @@
 <translation id="9085776959277692427">لم يتم اختيار <ph name="LANGUAGE" />. يُرجى الضغط على مفتاح "البحث" ومفتاح "المسافة" للاختيار.</translation>
 <translation id="9087949559523851360">إضافة مستخدم محظور</translation>
 <translation id="9088234649737575428">تم حظر <ph name="PLUGIN_NAME" /> بموجب سياسة المؤسسة</translation>
-<translation id="9088446193279799727">‏تعذّر إعداد نظام التشغيل Linux. اتصل بالإنترنت وحاول مرة أخرى.</translation>
+<translation id="9088446193279799727">‏تعذّر إعداد نظام التشغيل Linux. يُرجى الاتصال بالإنترنت وإعادة المحاولة.</translation>
 <translation id="90885733430013283">Wi-Fi SSID</translation>
 <translation id="9088858349441302494">يخضع لإدارة <ph name="VALUE" /></translation>
 <translation id="9089416786594320554">أساليب الإدخال</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index 842d906..bdbe689d 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -3233,6 +3233,7 @@
 <translation id="3226487301970807183">Sol yan panelə keçin</translation>
 <translation id="322708765617468434">Ayarlamadan sonra cihaza başqa şəxs əlavə edə bilərsiniz. Hamı öz təcrübəsini fərdiləşdirə və datanı məxfi saxlaya bilər.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
+<translation id="3227701057281907159">Düzəliş edilir</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Onu silin və ya <ph name="BEGIN_LINK" />Chrome Veb Marketdən<ph name="END_LINK" /> bənzər artırmalar ilə əvəz edin.}other{Onları silin və ya <ph name="BEGIN_LINK" />Chrome Veb Marketdən<ph name="END_LINK" /> bənzər artırmalar ilə əvəz edin}}</translation>
 <translation id="3229254977651514276">Tarixi yoxlayın</translation>
 <translation id="3230539834943294477">Yardım məqalələrinə baxın və ya cihaz dəstəyi alın</translation>
@@ -3397,6 +3398,7 @@
 <translation id="3347086966102161372">Şəkil ünvanını kopyalayın</translation>
 <translation id="3348038390189153836">Çıxarıla bilən cihaz aşkarlandı</translation>
 <translation id="3348131053948466246">Emoji təklif edilib. Hərəkət etmək üçün yuxarı və ya aşağı, daxil etmək üçün isə enter düyməsinə basın.</translation>
+<translation id="3348973040180736882">Sıxılmış fayl açılır</translation>
 <translation id="3349933790966648062">Yaddaş Sahəsi</translation>
 <translation id="3350450887151703713">10 saniyə təkrar oxudun</translation>
 <translation id="3351472127384196879">Qələmdə düymələr əlavə edin və ya yerlərini müəyyənləşdirin</translation>
@@ -11752,6 +11754,7 @@
 <translation id="9173063514323762371">&amp;Əlfəcin panelini gizlədin</translation>
 <translation id="917350715406657904">Valideyniniz tərəfindən <ph name="APP_NAME" /> üçün təyin edilən limitə çatdınız. Ondan sabah <ph name="TIME_LIMIT" /> müddətinə istifadə edə bilərsiniz.</translation>
 <translation id="9174401638287877180">İstifadə və diaqnostika datasını göndərin. Diaqnostika, cihaz və tətbiqdən istifadə datasını avtomatik olaraq Google'a göndərməklə uşağınızın Android təcrübəsini təkmilləşdirməyə kömək edin. Bu məlumatlardan uşağınızı müəyyən etmək üçün istifadə edilməyəcək. Onlar sistem və tətbiq sabitliyi və digər təkmilləşdirmələrə kömək edəcək. Bəzi ümumiləşdirilmiş məlumatlar Google tətbiqlərinə və Android tərtibatçıları kimi partnyorlara da kömək edəcək. Uşağınız üçün əlavə Veb və Tətbiq Fəaliyyəti ayarı aktiv edilərsə, bu data Google Hesabınızda saxlanıla bilər.</translation>
+<translation id="9174854240439014335">Pəncərənin sol və ya sağ kənarında bölünmüş görünüşü sürüşdürüb buraxmağa icazə verin</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - Bluetooth cihazı qoşuldu</translation>
 <translation id="9177859716483578738">Davam etmək üçün <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> <ph name="FIELDS_STRING" /> kimi məlumatlarınızı bu sayt ilə paylaşacaq. Bu saytın <ph name="BEGIN_LINK" />məxfilik siyasətinə<ph name="END_LINK" /> baxın.</translation>
 <translation id="9178061802301856367">Giriş datasını silin</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index 686493da..92331696 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -3235,6 +3235,7 @@
 <translation id="3226487301970807183">Паказаць або схаваць бакавую панэль злева</translation>
 <translation id="322708765617468434">Дадаць яшчэ аднаго карыстальніка на прыладу можна будзе пасля наладжвання. Дададзеныя карыстальнікі могуць персаналізаваць патрэбныя функцыі. Пры гэтым іх даныя застаюцца прыватнымі.</translation>
 <translation id="3227137524299004712">Мікрафон</translation>
+<translation id="3227701057281907159">Прымяняецца патч</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Выдаліце яго або замяніце аналагічнымі пашырэннямі з <ph name="BEGIN_LINK" />Вэб-крамы Chrome<ph name="END_LINK" />.}one{Выдаліце іх або замяніце аналагічнымі пашырэннямі з <ph name="BEGIN_LINK" />Вэб-крамы Chrome<ph name="END_LINK" />.}few{Выдаліце іх або замяніце аналагічнымі пашырэннямі з <ph name="BEGIN_LINK" />Вэб-крамы Chrome<ph name="END_LINK" />.}many{Выдаліце іх або замяніце аналагічнымі пашырэннямі з <ph name="BEGIN_LINK" />Вэб-крамы Chrome<ph name="END_LINK" />.}other{Выдаліце іх або замяніце аналагічнымі пашырэннямі з <ph name="BEGIN_LINK" />Вэб-крамы Chrome<ph name="END_LINK" />.}}</translation>
 <translation id="3229254977651514276">Праверце дату</translation>
 <translation id="3230539834943294477">Праглядзець даведачныя артыкулы або звязацца са службай падтрымкі прылады</translation>
@@ -3399,6 +3400,7 @@
 <translation id="3347086966102161372">К&amp;апіраваць адрас відарыса</translation>
 <translation id="3348038390189153836">Выяўлена здымная прылада</translation>
 <translation id="3348131053948466246">Прапануюцца эмодзі. Для навігацыі карыстайцеся клавішамі "ўверх" і "ўніз". Для ўстаўкі націсніце Enter.</translation>
+<translation id="3348973040180736882">Выконваецца распакоўванне</translation>
 <translation id="3349933790966648062">Выкарыстанне памяці</translation>
 <translation id="3350450887151703713">Пераматаць на 10 секунд назад</translation>
 <translation id="3351472127384196879">Дадайце кнопкі стылуса або змяніце іх размяшчэнне</translation>
@@ -11763,6 +11765,7 @@
 <translation id="9173063514323762371">&amp;Схаваць панэль закладак</translation>
 <translation id="917350715406657904">Скончыўся ліміт часу, зададзены бацькамі для праграмы "<ph name="APP_NAME" />". Заўтра ёю можна будзе карыстацца <ph name="TIME_LIMIT" />.</translation>
 <translation id="9174401638287877180">Адпраўка даных пра выкарыстанне і дыягностыку. Дапамажыце палепшыць функцыянальнасць прылады Android для дзіцяці шляхам аўтаматычнай адпраўкі даных пра дыягностыку, выкарыстанне прылады і праграм у Google. Яны не будуць выкарыстаны для ідэнтыфікацыі асобы дзіцяці, але дапамогуць у паляпшэнні стабільнасці сістэмы і праграм і іншых удасканаленнях. Некаторыя згрупаваныя даныя таксама будуць карысныя для праграм і партнёраў Google, напрыклад распрацоўшчыкаў Android. Калі для вашага дзіцяці ўключана налада "Дадатковыя дзеянні ў інтэрнэце і праграмах", то адпаведныя даныя могуць захоўвацца ў яго Уліковым запісе Google.</translation>
+<translation id="9174854240439014335">Дазволіць перацягванне ў рэжыме падзеленага экрана на левы або правы край акна</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – падключана прылада Bluetooth</translation>
 <translation id="9177859716483578738">Каб працягнуць, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> абагуліць з гэтым сайтам наступныя даныя: <ph name="FIELDS_STRING" />. Азнаёмцеся з <ph name="BEGIN_LINK" />палітыкай прыватнасці<ph name="END_LINK" /> сайта.</translation>
 <translation id="9178061802301856367">Выдаленне даных для ўваходу</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 7b4f338..b37caf3 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -3248,6 +3248,7 @@
 <translation id="3226487301970807183">বাঁদিক বরাবর অ্যালাইন থাকা সাইড প্যানেল টগল করুন</translation>
 <translation id="322708765617468434">সেট-আপ করার পরে আপনি যেকোনও সময় অন্য ব্যক্তিকে যোগ করতে পারবেন। প্রত্যেক ব্যক্তি নিজের অ্যাকাউন্ট পছন্দমতো সেট-আপ করে ডেটা ব্যক্তিগত রাখতে পারবেন।</translation>
 <translation id="3227137524299004712">মাইক্রোফোন</translation>
+<translation id="3227701057281907159">প্যাচ করা হচ্ছে</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{<ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> থেকে একই ধরনের এক্সটেনশন দিয়ে এটি বদলে নিন অথবা সরিয়ে দিন।}one{<ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> থেকে একই ধরনের এক্সটেনশন দিয়ে এগুলি বদলে নিন অথবা সরিয়ে দিন}other{<ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> থেকে একই ধরনের এক্সটেনশন দিয়ে এগুলি বদলে নিন অথবা সরিয়ে দিন}}</translation>
 <translation id="3229254977651514276">তারিখ চেক করুন</translation>
 <translation id="3230539834943294477">সহায়তা নিবন্ধ দেখুন অথবা ডিভাইসের সহায়তা খুঁজে দেখুন</translation>
@@ -3412,6 +3413,7 @@
 <translation id="3347086966102161372">ছবি অ্যাড্রেস কপি করুন</translation>
 <translation id="3348038390189153836">সরানোযোগ্য ডিভাইস শনাক্ত করা হয়েছে</translation>
 <translation id="3348131053948466246">ইমোজি সাজেস্ট করা হয়েছে। নেভিগেট করতে ঊর্ধ্বমুখী বা নিম্নমুখী তীরচিহ্ন আঁকা বোতাম প্রেস করুন। ইমোজি যোগ করতে Enter প্রেস করুন।</translation>
+<translation id="3348973040180736882">ডিকম্প্রেস করা হচ্ছে</translation>
 <translation id="3349933790966648062">মেমরি ফুটপ্রিন্ট</translation>
 <translation id="3350450887151703713">১০ সেকেন্ডে রিপ্লে করুন</translation>
 <translation id="3351472127384196879">আপনার পেনে বোতাম যোগ করুন অথবা জায়গা পরিবর্তন করুন</translation>
@@ -11778,6 +11780,7 @@
 <translation id="9173063514323762371">বুকমার্ক বার &amp;লুকান</translation>
 <translation id="917350715406657904"><ph name="APP_NAME" />-এর জন্য আপনার অভিভাবক যে সময়সীমা সেট করেছেন তা পার হয়ে গেছে। আগামীকাল আপনি আবার এটি <ph name="TIME_LIMIT" />-এর জন্য ব্যবহার করতে পারবেন।</translation>
 <translation id="9174401638287877180">ব্যবহার এবং ডায়াগনস্টিক বিষয়ক ডেটা পাঠান। Google-এ অটোমেটিক ডায়াগনস্টিক, ডিভাইস এবং অ্যাপ ব্যবহারের ডেটা পাঠিয়ে, আপনার সন্তানের Android অভিজ্ঞতাকে উন্নত করতে সাহায্য করুন। এটি আপনার সন্তানকে শনাক্ত করতে ব্যবহার করা হবে না এবং সিস্টেম ও অ্যাপের স্টেবিলিটি বাড়াতে ও অন্যান্য উন্নতিতে সাহায্য করবে। কিছু একত্রিত করা ডেটা Android ডেভেলপারের মতো Google অ্যাপ এবং পার্টনারদেরও সাহায্য করবে। অতিরিক্ত 'ওয়েব ও অ্যাপ অ্যাক্টিভিটি' সেটিং আপনার সন্তানের ডিভাইসের জন্য চালু করা থাকলে, এই ডেটা তাদের Google অ্যাকাউন্টে সেভ করা হতে পারে।</translation>
+<translation id="9174854240439014335">স্প্লিট ভিউতে উইন্ডোর বাঁদিকের বা ডানদিকের কোণে টেনে এনে রাখার সুবিধা চালু করুন</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - ব্লুটুথ ডিভাইস সংযুক্ত হয়েছে</translation>
 <translation id="9177859716483578738">চালিয়ে যেতে, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> এই সাইটের সাথে আপনার <ph name="FIELDS_STRING" /> শেয়ার করবে। এই সাইটের <ph name="BEGIN_LINK" />গোপনীয়তা নীতি<ph name="END_LINK" /> দেখুন।</translation>
 <translation id="9178061802301856367">সাইন-ইন সম্পর্কিত ডেটা মুছে ফেলুন</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index 39f37eb..151a52af 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -3246,6 +3246,7 @@
 <translation id="3226487301970807183">Aktivirajte/deaktivirajte bočnu ploču poredanu nalijevo</translation>
 <translation id="322708765617468434">Uvijek možete dodati drugu osobu na uređaj nakon postavljanja. Svaka osoba može personalizirati svoje iskustvo i čuvati privatnost podataka.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
+<translation id="3227701057281907159">Primjena zakrpe</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Uklonite je ili zamijenite sličnim ekstenzijama iz <ph name="BEGIN_LINK" />Chrome Web trgovine<ph name="END_LINK" />.}one{Uklonite ih ili zamijenite sličnim ekstenzijama iz <ph name="BEGIN_LINK" />Chrome Web trgovine<ph name="END_LINK" />}few{Uklonite ih ili zamijenite sličnim ekstenzijama iz <ph name="BEGIN_LINK" />Chrome Web trgovine<ph name="END_LINK" />}other{Uklonite ih ili zamijenite sličnim ekstenzijama iz <ph name="BEGIN_LINK" />Chrome Web trgovine<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">Provjerite datum</translation>
 <translation id="3230539834943294477">Pregledajte članke za pomoć ili pronađite podršku za uređaj</translation>
@@ -3410,6 +3411,7 @@
 <translation id="3347086966102161372">K&amp;opiraj adresu slike</translation>
 <translation id="3348038390189153836">Otkriven je uklonjivi uređaj</translation>
 <translation id="3348131053948466246">Predložena je emoji sličica. Pritisnite strelicu nadolje ili nagore za kretanje i tipku enter za umetanje.</translation>
+<translation id="3348973040180736882">Dekompresija</translation>
 <translation id="3349933790966648062">Otisak iz memorije</translation>
 <translation id="3350450887151703713">Ponovo reproduciraj 10 s</translation>
 <translation id="3351472127384196879">Dodajte ili pronađite dugmad na olovci</translation>
@@ -11779,6 +11781,7 @@
 <translation id="9173063514323762371">&amp;Sakrij traku oznaka</translation>
 <translation id="917350715406657904">Dostignuto je vremensko ograničenje koje je tvoj roditelj postavio za <ph name="APP_NAME" />. Sutra je možeš koristiti <ph name="TIME_LIMIT" />.</translation>
 <translation id="9174401638287877180">Šaljite podatke o korištenju i dijagnostici. Poboljšajte iskustvo koje vaše dijete ima s Androidom automatskim slanjem podataka o dijagnostici, uređaju i korištenju aplikacija Googleu. Ovo se neće koristiti za identifikaciju vašeg djeteta i pomoći će stabilnosti sistema i aplikacije, kao i drugim unapređenjima. Neki zbirni podaci će također pomoći Googleovim aplikacijama i partnerima, kao što su Androidovi programeri. Ako je za vaše dijete uključena postavka za dodatnu Aktivnost na webu i u aplikacijama, ovi podaci mogu biti sačuvani na Google računu djeteta.</translation>
+<translation id="9174854240439014335">Dozvoli prevlačenje i ispuštanje u podijeljenom prikazu na lijevom ili desnom rubu prozora</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – Bluetooth uređaj je povezan</translation>
 <translation id="9177859716483578738">Da nastavite, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> će dijeliti vaše <ph name="FIELDS_STRING" /> s ovom web lokacijom. Pogledajte <ph name="BEGIN_LINK" />pravila privatnosti<ph name="END_LINK" /> ove web lokacije.</translation>
 <translation id="9178061802301856367">Izbrišite podatke za prijavu</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 9a0980f..f5b0211 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -3232,6 +3232,7 @@
 <translation id="3226487301970807183">Commuta el tauler lateral alineat a l'esquerra</translation>
 <translation id="322708765617468434">Sempre pots afegir una altra persona al dispositiu després de la configuració. Cada persona pot personalitzar la seva experiència i mantenir la privadesa de les dades.</translation>
 <translation id="3227137524299004712">Micròfon</translation>
+<translation id="3227701057281907159">S'està aplicant el pedaç</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Suprimeix-la o substitueix-la per una extensió similar de <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.}other{Suprimeix-les o substitueix-les per extensions similars de <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.}}</translation>
 <translation id="3229254977651514276">Comprova la data</translation>
 <translation id="3230539834943294477">Consulta els articles d'ajuda o cerca assistència per a dispositius</translation>
@@ -3396,6 +3397,7 @@
 <translation id="3347086966102161372">C&amp;opia l'adreça de la imatge</translation>
 <translation id="3348038390189153836">S'ha detectat un dispositiu extraïble</translation>
 <translation id="3348131053948466246">Se suggereixen emojis. Prem les tecles amunt i avall per navegar-hi i Retorn per inserir-ne un.</translation>
+<translation id="3348973040180736882">S'està descomprimint</translation>
 <translation id="3349933790966648062">Ús de la memòria</translation>
 <translation id="3350450887151703713">Torna a reproduir 10 segons</translation>
 <translation id="3351472127384196879">Afegeix o localitza botons al llapis</translation>
@@ -11756,6 +11758,7 @@
 <translation id="9173063514323762371">Amaga la barra d'adreces d'interès</translation>
 <translation id="917350715406657904">Has arribat al límit de temps que els teus pares han definit per a l'aplicació <ph name="APP_NAME" />. Demà podràs utilitzar-la durant <ph name="TIME_LIMIT" />.</translation>
 <translation id="9174401638287877180">Envia dades d'ús i de diagnòstic. Ajuda a millorar l'experiència a Android del teu fill enviant automàticament a Google dades de diagnòstic, del dispositiu i d'ús d'aplicacions. Aquestes dades no es faran servir per identificar el teu fill i ajudaran a millorar l'estabilitat del sistema i de les aplicacions, entre altres característiques. Una part de les dades agregades també serà útil per a les aplicacions i per als partners de Google, com ara els desenvolupadors d'Android. Si l'opció Activitat al web i en aplicacions addicional està activada per al teu fill, és possible que aquestes dades es desin al seu Compte de Google.</translation>
+<translation id="9174854240439014335">Permet arrossegar i deixar anar la visualització dividida a la vora esquerra o dreta de la finestra</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" />: hi ha un dispositiu Bluetooth connectat</translation>
 <translation id="9177859716483578738">Per continuar, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> compartirà la teva informació (<ph name="FIELDS_STRING" />) amb aquest lloc web. Consulta la <ph name="BEGIN_LINK" />política de privadesa<ph name="END_LINK" /> d'aquest lloc web.</translation>
 <translation id="9178061802301856367">Suprimeix les dades d'inici de sessió</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb
index 5a715a79..87cc088 100644
--- a/chrome/app/resources/generated_resources_cy.xtb
+++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -3250,6 +3250,7 @@
 <translation id="3226487301970807183">Toglo'r panel ochr sydd wedi'i alinio i'r chwith</translation>
 <translation id="322708765617468434">Gallwch chi bob amser ychwanegu person arall at y ddyfais ar ôl gosod. Gall pob person bersonoleiddio eu profiad a chadw data yn breifat.</translation>
 <translation id="3227137524299004712">Meicroffon</translation>
+<translation id="3227701057281907159">Wrthi'n patsio</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Tynnwch neu amnewidiwch ef gydag estyniadau tebyg o <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.}zero{Tynnwch neu amnewidiwch nhw gydag estyniadau tebyg o <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />}two{Tynnwch neu amnewidiwch nhw gydag estyniadau tebyg o <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />}few{Tynnwch neu amnewidiwch nhw gydag estyniadau tebyg o <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />}many{Tynnwch neu amnewidiwch nhw gydag estyniadau tebyg o <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />}other{Tynnwch neu amnewidiwch nhw gydag estyniadau tebyg o <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">Gwiriwch y dyddiad</translation>
 <translation id="3230539834943294477">Gweld erthyglau cymorth neu ddod o hyd i gymorth dyfais</translation>
@@ -3414,6 +3415,7 @@
 <translation id="3347086966102161372">Copïo cyfeiriad y llun</translation>
 <translation id="3348038390189153836">Mae dyfais y gellir ei thynnu wedi'i chanfod</translation>
 <translation id="3348131053948466246">Awgrymir Emoji. Pwyswch i fyny neu i lawr i lywio ac Enter i fewnosod.</translation>
+<translation id="3348973040180736882">Wrthi'n dadgywasgu</translation>
 <translation id="3349933790966648062">Ôl-troed Cof</translation>
 <translation id="3350450887151703713">Ailchwarae 10 eiliad</translation>
 <translation id="3351472127384196879">Ychwanegu neu leoli botymau ar eich pin ysgrifennu</translation>
@@ -11787,6 +11789,7 @@
 <translation id="9173063514323762371">&amp;Cuddio'r Bar Nodau Tudalen</translation>
 <translation id="917350715406657904">Gwnaethoch gyrraedd y terfyn amser a osodwyd gan eich rhiant ar gyfer <ph name="APP_NAME" />. Gallwch ei ddefnyddio am <ph name="TIME_LIMIT" /> yfory.</translation>
 <translation id="9174401638287877180">Anfon data defnydd a diagnostig. Helpwch i wella profiad Android eich plentyn drwy anfon data diagnostig, dyfais ac ap yn awtomatig at Google. Ni ddefnyddir hwn i adnabod eich plentyn a bydd yn helpu sefydlogrwydd system ac ap a gwelliannau eraill. Bydd rhywfaint o ddata cyfanredol hefyd yn helpu apiau a phartneriaid Google, megis datblygwyr Android. Os yw'r gosodiad Gweithgarwch ar y We ac Apiau ychwanegol wedi'i droi ymlaen ar gyfer eich plentyn, gellir cadw'r data hyn i'w Gyfrif Google.</translation>
+<translation id="9174854240439014335">Caniatáu llusgo a gollwng gwedd hollt ar ymyl chwith neu dde'r ffenestr</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - Mae dyfais Bluetooth wedi'i chysylltu</translation>
 <translation id="9177859716483578738">I barhau, bydd <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> yn rhannu'ch <ph name="FIELDS_STRING" /> â'r wefan hon. Gweld <ph name="BEGIN_LINK" />polisi preifatrwydd<ph name="END_LINK" /> y wefan hon.</translation>
 <translation id="9178061802301856367">Dileu data mewngofnodi</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index a0a04ee4d..d16b6b9 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -3249,6 +3249,7 @@
 <translation id="3226487301970807183">Vis/skjul venstrejusteret sidepanel</translation>
 <translation id="322708765617468434">Du kan til enhver tid føje en anden person til enheden efter konfigurationen. Hver person kan tilpasse sin brugeroplevelse personligt og holde sine data private.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
+<translation id="3227701057281907159">Retter program</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Fjern eller erstat den med lignende udvidelser fra <ph name="BEGIN_LINK" />Chrome Webshop<ph name="END_LINK" />.}one{Fjern eller erstat den med lignende udvidelser fra <ph name="BEGIN_LINK" />Chrome Webshop<ph name="END_LINK" />}other{Fjern eller erstat dem med lignende udvidelser fra <ph name="BEGIN_LINK" />Chrome Webshop<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">Tjek datoen</translation>
 <translation id="3230539834943294477">Se artikler i Hjælp, eller find enhedssupport</translation>
@@ -3413,6 +3414,7 @@
 <translation id="3347086966102161372">K&amp;opiér billedets webadresse</translation>
 <translation id="3348038390189153836">Der er registreret en flytbar enhed</translation>
 <translation id="3348131053948466246">Forslag til emojis. Tryk op eller ned for at navigere, og skriv for at indsætte.</translation>
+<translation id="3348973040180736882">Dekomprimerer</translation>
 <translation id="3349933790966648062">Hukommelsesforbrug</translation>
 <translation id="3350450887151703713">Spol 10 sekunder tilbage</translation>
 <translation id="3351472127384196879">Tilføj eller find knapper på din pen</translation>
@@ -11779,6 +11781,7 @@
 <translation id="9173063514323762371">Skjul bogmærkelinjen</translation>
 <translation id="917350715406657904">Du har nået den grænse, din forælder har angivet for <ph name="APP_NAME" />. Du kan bruge den i <ph name="TIME_LIMIT" /> i morgen.</translation>
 <translation id="9174401638287877180">Send brugs- og diagnosticeringsdata. Hjælp med at forbedre dit barns Android-oplevelse ved automatisk at sende diagnosticerings- og enhedsdata samt data om brug af apps til Google. Disse data bruges ikke til at identificere dit barn. De bruges kun til forbedring af bl.a. systemets og appens stabilitet. Visse aggregerede data hjælper også Google-apps og -partnere, f.eks. Android-udviklere. Hvis indstillingen for yderligere web- og appaktivitet er aktiveret for dit barn, gemmes disse data muligvis på barnets Google-konto.</translation>
+<translation id="9174854240439014335">Tillad træk og slip i opdelt visning i venstre eller højre kant af vinduet</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – en Bluetooth-enhed er forbundet</translation>
 <translation id="9177859716483578738">For at fortsætte deler <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> <ph name="FIELDS_STRING" /> med dette website. Se dette websites <ph name="BEGIN_LINK" />privatlivspolitik<ph name="END_LINK" />.</translation>
 <translation id="9178061802301856367">Slet logindata</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 91d8905..61a39b0 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -3229,6 +3229,7 @@
 <translation id="3226487301970807183">Linke Seitenleiste ein-/ausblenden</translation>
 <translation id="322708765617468434">Nach der Einrichtung kannst du dem Gerät jederzeit eine weitere Person hinzufügen. Jeder Nutzer kann seine Einstellungen personalisieren. Dabei bleiben die Daten der einzelnen Nutzer privat.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
+<translation id="3227701057281907159">Patchen</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Entferne sie oder ersetze sie durch ähnliche Erweiterungen aus dem <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.}other{Entferne sie oder ersetze sie durch ähnliche Erweiterungen aus dem <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">Bitte überprüfe das Datum</translation>
 <translation id="3230539834943294477">Hilfeartikel ansehen oder Gerätesupport erhalten</translation>
@@ -3393,6 +3394,7 @@
 <translation id="3347086966102161372">Bildadresse k&amp;opieren</translation>
 <translation id="3348038390189153836">Externes Gerät erkannt</translation>
 <translation id="3348131053948466246">Emoji vorgeschlagen. Drücke die Nach-oben- oder Nach-unten-Taste, um ein Emoji auszuwählen und bestätige die Auswahl mit der Eingabetaste.</translation>
+<translation id="3348973040180736882">Entpacken</translation>
 <translation id="3349933790966648062">Speicherbedarf</translation>
 <translation id="3350450887151703713">10 Sekunden zurückspulen</translation>
 <translation id="3351472127384196879">Tasten an deinem Stift hinzufügen oder finden</translation>
@@ -11751,6 +11753,7 @@
 <translation id="9173063514323762371">&amp;Lesezeichenleiste ausblenden</translation>
 <translation id="917350715406657904">Du hast das Zeitlimit erreicht, das deine Eltern für <ph name="APP_NAME" /> festgelegt haben. Morgen kannst du die App wieder <ph name="TIME_LIMIT" /> lang nutzen.</translation>
 <translation id="9174401638287877180">Du hast die Möglichkeit, Nutzungsdaten &amp; Fehlerberichte zu senden. Du kannst uns helfen, Android für dein Kind zu verbessern, indem du zulässt, dass Diagnose- und Gerätedaten sowie App-Nutzungsdaten automatisch an Google gesendet werden. Dein Kind wird mithilfe dieser Daten nicht identifiziert, sie helfen jedoch beispielsweise dabei, die Stabilität des Systems und der Apps zu verbessern. Einige aggregierte Daten sind auch für Apps und Partner von Google, beispielsweise Android-Entwickler, nützlich. Wenn die Einstellung „Zusätzliche Web- &amp; App-Aktivitäten“ für dein Kind aktiviert ist, werden diese Daten möglicherweise in seinem Google-Konto gespeichert.</translation>
+<translation id="9174854240439014335">Drag-and-drop für geteilte Ansicht am linken oder rechten Fensterrand zulassen</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – Bluetooth-Gerät verbunden</translation>
 <translation id="9177859716483578738"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> teilt zum Fortfahren <ph name="FIELDS_STRING" /> mit dieser Website. Lies die <ph name="BEGIN_LINK" />Datenschutzerklärung<ph name="END_LINK" /> dieser Website.</translation>
 <translation id="9178061802301856367">Anmeldedaten löschen</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 3854c425..19445d16 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -3247,6 +3247,7 @@
 <translation id="3226487301970807183">Toggle left-aligned side panel</translation>
 <translation id="322708765617468434">You can always add another person to the device after setup. Each person can personalise their experience and keep data private.</translation>
 <translation id="3227137524299004712">Microphone</translation>
+<translation id="3227701057281907159">Patching</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Remove or replace it with similar extensions from the <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.}other{Remove or replace them with similar extensions from the <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">Check the date</translation>
 <translation id="3230539834943294477">View help articles or find device support</translation>
@@ -3411,6 +3412,7 @@
 <translation id="3347086966102161372">C&amp;opy image address</translation>
 <translation id="3348038390189153836">Removable device detected</translation>
 <translation id="3348131053948466246">Emoji suggested. Press up or down to navigate, and enter to insert.</translation>
+<translation id="3348973040180736882">Decompressing</translation>
 <translation id="3349933790966648062">Memory footprint</translation>
 <translation id="3350450887151703713">Replay 10 seconds</translation>
 <translation id="3351472127384196879">Add or locate buttons on your pen</translation>
@@ -11774,6 +11776,7 @@
 <translation id="9173063514323762371">Hide bookmarks bar</translation>
 <translation id="917350715406657904">You reached the time limit that your parent set for <ph name="APP_NAME" />. You can use it for <ph name="TIME_LIMIT" /> tomorrow.</translation>
 <translation id="9174401638287877180">Send usage and diagnostic data. Help improve your child's Android experience by automatically sending diagnostic, device and app usage data to Google. This won't be used to identify your child, and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If additional Web &amp; App Activity setting is turned on for your child, this data may be saved to their Google Account.</translation>
+<translation id="9174854240439014335">Allow split view drag and drop on left or right edge of window</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – Bluetooth device connected</translation>
 <translation id="9177859716483578738">To continue, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> will share your <ph name="FIELDS_STRING" /> with this site. See this site's <ph name="BEGIN_LINK" />privacy policy<ph name="END_LINK" />.</translation>
 <translation id="9178061802301856367">Delete sign-in data</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index fa9d2819..ae9388c 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -503,7 +503,7 @@
 <translation id="1331065030686329928">Gestionar el grupo de pestañas <ph name="GROUP_NAME" /></translation>
 <translation id="1331977651797684645">Es mi perfil</translation>
 <translation id="1333489022424033687">Es posible que algunas funciones de <ph name="ORIGIN" /> no estén disponibles si no borras los datos que otros sitios han almacenado en tu dispositivo</translation>
-<translation id="1333965224356556482">No permitir que los sitios vean tu ubicación</translation>
+<translation id="1333965224356556482">No permitir que los sitios accedan a tu ubicación</translation>
 <translation id="1335282218035876586">Tu Chromebook ya no recibe actualizaciones de seguridad ni de software. Cambia de Chromebook para disfrutar de la mejor experiencia.</translation>
 <translation id="133535873114485416">Método de introducción preferido</translation>
 <translation id="1335929031622236846">Registra el dispositivo</translation>
@@ -3731,7 +3731,7 @@
 <translation id="3569682580018832495"><ph name="ORIGIN" /> puede ver los siguientes archivos y carpetas:</translation>
 <translation id="3571734092741541777">Configurar</translation>
 <translation id="3572031449439748861"><ph name="NUM_EXTENSIONS" /> extensiones se han desactivado</translation>
-<translation id="3575121482199441727">Permitir en este sitio web</translation>
+<translation id="3575121482199441727">Permitir en este sitio</translation>
 <translation id="3575224072358507281">Recoger direcciones IP y resultados de medición de redes para Measurement Lab, de acuerdo con su política de privacidad (measurementlab.net/privacy)</translation>
 <translation id="3577036603268648505">Más seguridad online</translation>
 <translation id="3577473026931028326">Se ha producido un error. Inténtalo de nuevo.</translation>
@@ -10819,7 +10819,7 @@
 <translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="MANAGER" /> gestiona <ph name="USER_EMAIL" />. No puedes añadir este correo como cuenta adicional.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Para usar <ph name="USER_EMAIL" />, primero cierra sesión en tu <ph name="DEVICE_TYPE" />. Después, en la parte inferior de la pantalla de inicio de sesión, selecciona Añadir perfil.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="85486688517848470">Mantén pulsada la tecla de búsqueda para cambiar el comportamiento de las teclas de la fila superior</translation>
-<translation id="8549127125482561383">Cómo mostrar solicitudes</translation>
+<translation id="8549127125482561383">Cómo mostrar las solicitudes</translation>
 <translation id="8549316893834449916">La cuenta de Google que uses para iniciar sesión en tu Chromebook debe ser la misma que usas para Gmail, Drive, YouTube y otros servicios.</translation>
 <translation id="8550239873869577759">Se ha descargado un archivo sospechoso</translation>
 <translation id="8551388862522347954">Licencias</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index b13437d..4ae40ddf 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -3238,6 +3238,7 @@
 <translation id="3226487301970807183">Vasakule joondatud külgpaneeli kuvamine/peitmine</translation>
 <translation id="322708765617468434">Teil on võimalik pärast seadistamist alati inimesi seadmesse juurde lisada. Iga inimene saab oma kasutuskogemuse isikupärastada ja andmed privaatsena hoida.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
+<translation id="3227701057281907159">Paikamine</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Eemaldage see või asendage sarnase laiendusega <ph name="BEGIN_LINK" />Chrome'i veebipoest<ph name="END_LINK" />}other{Eemaldage need või asendage sarnaste laiendustega <ph name="BEGIN_LINK" />Chrome'i veebipoest<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">Kontrollige kuupäeva</translation>
 <translation id="3230539834943294477">Abikeskuse artiklite kuvamine või seadmetoe otsimine</translation>
@@ -3402,6 +3403,7 @@
 <translation id="3347086966102161372">K&amp;opeeri kujutise aadress</translation>
 <translation id="3348038390189153836">Leiti irdseade</translation>
 <translation id="3348131053948466246">Soovitatakse emotikone. Navigeerimiseks vajutage üles- või allanoolt ja sisestamiseks sisestusklahvi.</translation>
+<translation id="3348973040180736882">Lahtipakkimine</translation>
 <translation id="3349933790966648062">Mälu jalajälg</translation>
 <translation id="3350450887151703713">Esita 10 sekundit uuesti</translation>
 <translation id="3351472127384196879">Pliiatsi nuppude lisamine või nende asukoha leidmine</translation>
@@ -11765,6 +11767,7 @@
 <translation id="9173063514323762371">Peida järjehoidjariba</translation>
 <translation id="917350715406657904">Jõudsid piiranguni, mille sinu vanem teenuses <ph name="APP_NAME" /> määras. Saad seda homme kasutada <ph name="TIME_LIMIT" />.</translation>
 <translation id="9174401638287877180">Kasutus- ja diagnostikaandmete saatmine. Aidake täiustada oma lapse Androidi kasutuskogemust, saates Google'ile automaatselt seadme teavet ning rakenduse kasutus- ja diagnostikaandmeid. Neid andmeid ei kasutata teie lapse isiku tuvastamiseks ning need aitavad parandada süsteemi ja rakenduse stabiilsust ning muud. Teatud koondandmed on abiks ka Google'i rakendustele ja partneritele, näiteks Androidi arendajatele. Kui täiendavad veebi- ja rakendustegevused on teie lapse jaoks sisse lülitatud, võidakse need andmed salvestada tema Google'i kontole.</translation>
+<translation id="9174854240439014335">Luba jagatud vaate pukseerimine akna vasakus või paremas servas</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – Bluetoothi seade on ühendatud</translation>
 <translation id="9177859716483578738">Jätkamiseks jagab <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> selle saidiga teie andmeid (<ph name="FIELDS_STRING" />). Vaadake selle saidi <ph name="BEGIN_LINK" />privaatsuseeskirju<ph name="END_LINK" />.</translation>
 <translation id="9178061802301856367">Sisselogimisandmete kustutamine</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 9644fba..6ee71a82 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1327,7 +1327,7 @@
 <translation id="1896043844785689584">برای تنظیم اثر انگشت، از فرزندتان بخواهید حسگر اثر انگشت را در پایین گوشه سمت راست صفحه‌کلید لمس کند. داده‌های اثر انگشت فرزندتان به‌صورت ایمن ذخیره می‌شود و هرگز از این <ph name="DEVICE_TYPE" /> خارج نمی‌شود.</translation>
 <translation id="1897120393475391208">از گذرواژه قوی استفاده کنید</translation>
 <translation id="1897860317037652061">اسکن انجام نشد</translation>
-<translation id="1898804291554630487">سؤال درباره این صفحه</translation>
+<translation id="1898804291554630487">پرسش درباره این صفحه</translation>
 <translation id="1900305421498694955">‏ممکن است برنامه‌های Google Play برای خواندن فایل‌های موجود در دستگاه‌های ذخیره‌سازی خارجی و نوشتن در آن‌ها، نیازمند دسترسی کامل به سیستم فایل باشند. فایل‌ها و پوشه‌های ایجادشده در دستگاه برای هر فردی که از درایو خارجی استفاده می‌کند، نمایان است. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation>
 <translation id="1901213235765457754">از سرپرست بخواهید این برنامه را به‌روزرسانی کند</translation>
 <translation id="1901303067676059328">انتخاب &amp;همه</translation>
@@ -5779,7 +5779,7 @@
 <translation id="4989966318180235467">بازرسی صفحه &amp;پس‌زمینه</translation>
 <translation id="4990673372047946816">دوربینی دردسترس نیست</translation>
 <translation id="4991420928586866460">در نظر گرفتن کلیدهای ردیف بالا به عنوان کلیدهای عملکرد</translation>
-<translation id="4991873517942703737">سؤال درباره این سند</translation>
+<translation id="4991873517942703737">پرسش درباره این سند</translation>
 <translation id="4992443049233195791">‏تنظیمات فایل Microsoft 365</translation>
 <translation id="4992458225095111526">‏تأیید Powerwash</translation>
 <translation id="4992473555164495036">سرپرست سیستم روش‌های ورودی دردسترس را محدود کرده است.</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 4ff6841..c77e1cd 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -3246,6 +3246,7 @@
 <translation id="3226487301970807183">Näytä/piilota vasemmalle tasattu sivupaneeli</translation>
 <translation id="322708765617468434">Voit lisätä laitteelle toisen henkilön milloin tahansa käyttöönoton jälkeen. Jokainen henkilö voi tehdä kokemuksestaan omannäköisen ja pitää datan yksityisenä.</translation>
 <translation id="3227137524299004712">Mikrofoni</translation>
+<translation id="3227701057281907159">Korjataan</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Poista se tai korvaa se samanlaisilla laajennuksilla <ph name="BEGIN_LINK" />Chrome Web Storesta<ph name="END_LINK" />.}other{Poista ne tai korvaa ne samanlaisilla laajennuksilla <ph name="BEGIN_LINK" />Chrome Web Storesta<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">Tarkista päivämäärä</translation>
 <translation id="3230539834943294477">Katso ohjeartikkeleita tai etsi laitetukea</translation>
@@ -3410,6 +3411,7 @@
 <translation id="3347086966102161372">K&amp;opioi kuvan osoite</translation>
 <translation id="3348038390189153836">Havaittiin irrotettava laite</translation>
 <translation id="3348131053948466246">Emojia ehdotettiin. Siirry painamalla ala- tai ylänuolta ja lisää emoji painamalla Enter.</translation>
+<translation id="3348973040180736882">Puretaan</translation>
 <translation id="3349933790966648062">Käytetty muisti</translation>
 <translation id="3350450887151703713">Toista uudelleen 10 sekuntia</translation>
 <translation id="3351472127384196879">Lisää tai etsi painikkeita kynällä</translation>
@@ -11769,6 +11771,7 @@
 <translation id="9173063514323762371">&amp;Piilota kirjanmerkkipalkki</translation>
 <translation id="917350715406657904">Vanhempasi asettama aikaraja (<ph name="APP_NAME" />) tuli täyteen. Huomenna voit käyttää sovellusta <ph name="TIME_LIMIT" />.</translation>
 <translation id="9174401638287877180">Lähetä käyttö- ja diagnostiikkadataa. Auta parantamaan lapsesi Android-käyttökokemusta lähettämällä diagnostiikkadataa sekä laitteen ja sovellusten käyttödataa automaattisesti Googlelle. Dataa ei käytetä lapsesi henkilöllisyyden selvittämiseen – sen avulla parannetaan esimerkiksi järjestelmän ja sovellusten vakautta. Kootusta datasta on hyötyä myös Googlen sovelluksille ja kumppaneille, kuten Android-kehittäjille. Jos muun verkko- ja sovellustoiminnan asetus on lapsella päällä, tätä dataa voidaan tallentaa hänen Google-tililleen.</translation>
+<translation id="9174854240439014335">Salli jaetun näkymän vetäminen ja pudottaminen ikkunan vasempaan tai oikeaan reunaan</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – Bluetooth-laite yhdistetty</translation>
 <translation id="9177859716483578738">Jos jatkat, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> jakaa <ph name="FIELDS_STRING" /> tälle sivustolle. Tutustu sivuston <ph name="BEGIN_LINK" />tietosuojakäytäntöön<ph name="END_LINK" />.</translation>
 <translation id="9178061802301856367">Poista kirjautumisdata</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index cb4359d..1e7eb2ef 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -3248,6 +3248,7 @@
 <translation id="3226487301970807183">I-toggle ang panel sa gilid na naka-align sa kaliwa</translation>
 <translation id="322708765617468434">Puwede kang magdagdag ng isa pang tao sa device anumang oras pagkatapos ng pag-set up. Magagawa ng bawat taong i-personalize ang kanyang experience at panatilihing pribado ang data.</translation>
 <translation id="3227137524299004712">Mikropono</translation>
+<translation id="3227701057281907159">Pag-patch</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Alisin o palitan ito ng mga katulad na extension mula sa <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.}one{Alisin o palitan ang mga ito ng mga katulad na extension mula sa <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />}other{Alisin o palitan ang mga ito ng mga katulad na extension mula sa <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">Tingnan ang petsa</translation>
 <translation id="3230539834943294477">Tumingin ng mga artikulo ng tulong o humanap ng suporta sa device</translation>
@@ -3412,6 +3413,7 @@
 <translation id="3347086966102161372">K&amp;opyahin ang address ng larawan</translation>
 <translation id="3348038390189153836">Natuklasan ang natatanggal na device</translation>
 <translation id="3348131053948466246">Iminumungkahi ang emoji Pindutin ang up o down para mag-navigate at ang enter para maglagay.</translation>
+<translation id="3348973040180736882">Pag-decompress</translation>
 <translation id="3349933790966648062">Footprint ng Memory</translation>
 <translation id="3350450887151703713">I-replay nang 10 segundo</translation>
 <translation id="3351472127384196879">Magdagdag o magtakda ng mga button sa iyong pen</translation>
@@ -11780,6 +11782,7 @@
 <translation id="9173063514323762371">&amp;Itago ang Bookmarks Bar</translation>
 <translation id="917350715406657904">Naabot mo na ang limitasyon sa oras na itinakda ng iyong magulang para sa <ph name="APP_NAME" />. Puwede mo itong magamit nang <ph name="TIME_LIMIT" /> bukas.</translation>
 <translation id="9174401638287877180">Magpadala ng data ng paggamit at diagnostic. Tumulong sa pagpapaganda ng karanasan sa Android ng iyong anak sa pamamagitan ng awtomatikong pagpapadala ng diagnostic na data, data ng device, at data ng paggamit sa app sa Google. Hindi ito gagamitin para tukuyin ang pagkakakilanlan ng iyong anak, at makakatulong ito sa stability ng system at ng app, at sa iba pang pagpapahusay. Makakatulong din ang ilang pinagsama-samang data sa mga app at partner ng Google, gaya ng mga developer ng Android. Kung naka-on ang karagdagang setting ng Aktibidad sa Web at App para sa iyong anak, posibleng ma-save ang data na ito sa kanyang Google Account.</translation>
+<translation id="9174854240439014335">Payagan ang pag-drag at pag-drop sa kaliwa o kanang gilid ng window sa split view</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - May nakakonektang bluetooth device</translation>
 <translation id="9177859716483578738">Para magpatuloy, ishe-share ng <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ang iyong <ph name="FIELDS_STRING" /> sa site na ito. Tingnan ang <ph name="BEGIN_LINK" />patakaran sa privacy<ph name="END_LINK" /> ng site na ito.</translation>
 <translation id="9178061802301856367">I-delete ang data sa pag-sign in</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 84a04c5..b8c90e4 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -3233,6 +3233,7 @@
 <translation id="3226487301970807183">Activer/désactiver le panneau latéral aligné à gauche</translation>
 <translation id="322708765617468434">Vous pourrez toujours ajouter une autre personne à l'appareil après la configuration. Chaque personne pourra personnaliser son expérience et préserver la confidentialité de ses données.</translation>
 <translation id="3227137524299004712">Micro</translation>
+<translation id="3227701057281907159">Application d'un fichier correctif…</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Supprimez-la ou remplacez-la par des extensions similaires du <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.}one{Supprimez-la ou remplacez-la par des extensions similaires du <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.}other{Supprimez-les ou remplacez-les par des extensions similaires du <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.}}</translation>
 <translation id="3229254977651514276">Vérifiez la date</translation>
 <translation id="3230539834943294477">Consulter les articles d'aide ou obtenir de l'aide concernant les appareils</translation>
@@ -3397,6 +3398,7 @@
 <translation id="3347086966102161372">C&amp;opier l'adresse de l'image</translation>
 <translation id="3348038390189153836">Nouveau matériel détecté</translation>
 <translation id="3348131053948466246">Emoji suggérés. Appuyez sur la flèche vers le haut ou vers le bas pour sélectionner un emoji, puis sur Entrée pour l'insérer.</translation>
+<translation id="3348973040180736882">Décompression…</translation>
 <translation id="3349933790966648062">Espace mémoire utilisé</translation>
 <translation id="3350450887151703713">Relire 10 secondes</translation>
 <translation id="3351472127384196879">Ajouter ou localiser des boutons sur le stylet</translation>
@@ -11762,6 +11764,7 @@
 <translation id="9173063514323762371">Masquer la barre de favoris</translation>
 <translation id="917350715406657904">Tu as atteint la limite de temps définie par un parent pour <ph name="APP_NAME" />. Tu pourras de nouveau l'utiliser demain pendant <ph name="TIME_LIMIT" />.</translation>
 <translation id="9174401638287877180">Envoyer des données d'utilisation et de diagnostic. Contribuez à l'amélioration de l'expérience de votre enfant sur Android en envoyant automatiquement à Google des données liées à l'utilisation de l'appareil et des applications, ainsi que des données de diagnostic. Ces informations ne seront pas utilisées pour identifier votre enfant, mais elles nous aideront à améliorer, entre autres, la stabilité du système et des applications. Certaines données globales seront également utiles aux développeurs des applications Google et à nos partenaires tels que les développeurs Android. Si vous avez activé le paramètre "Activité additionnelle sur le Web et les applications" pour votre enfant, ces données peuvent être enregistrées dans son compte Google.</translation>
+<translation id="9174854240439014335">Autoriser le glisser-déposer en vue fractionnée sur le bord gauche ou droit de la fenêtre</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – Appareil Bluetooth connecté</translation>
 <translation id="9177859716483578738">Pour continuer, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> partagera avec ce site <ph name="FIELDS_STRING" />. Consultez les <ph name="BEGIN_LINK" />Règles de confidentialité<ph name="END_LINK" /> de ce site.</translation>
 <translation id="9178061802301856367">Supprimer les données de connexion</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb
index eea7c93..0aecb6b2 100644
--- a/chrome/app/resources/generated_resources_gl.xtb
+++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -3233,6 +3233,7 @@
 <translation id="3226487301970807183">Activar/Desactivar panel lateral aliñado á esquerda</translation>
 <translation id="322708765617468434">Despois da configuración, podes engadir máis persoas sempre que queiras. Cada unha delas pode personalizar a súa experiencia e protexer a privacidade dos seus datos.</translation>
 <translation id="3227137524299004712">Micrófono</translation>
+<translation id="3227701057281907159">Aplicando parche</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Quítaa ou substitúea por outra similar de <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />}other{Quítaas ou substitúeas por outras similares de <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.}}</translation>
 <translation id="3229254977651514276">Comproba a data</translation>
 <translation id="3230539834943294477">Consulta artigos de axuda ou busca asistencia para dispositivos</translation>
@@ -3397,6 +3398,7 @@
 <translation id="3347086966102161372">C&amp;opiar enderezo da imaxe</translation>
 <translation id="3348038390189153836">Dispositivo extraíble detectado</translation>
 <translation id="3348131053948466246">Emojis suxeridos. Preme arriba e abaixo para desprazarte, e Intro para inserilo.</translation>
+<translation id="3348973040180736882">Descomprimindo</translation>
 <translation id="3349933790966648062">Uso de memoria</translation>
 <translation id="3350450887151703713">Volver reproducir 10 segundos</translation>
 <translation id="3351472127384196879">Engade botóns no lapis ou cámbialles a localización</translation>
@@ -11758,6 +11760,7 @@
 <translation id="9173063514323762371">Ocultar barra de marcadores</translation>
 <translation id="917350715406657904">Chegaches ao límite que definiu teu pai ou túa nai para <ph name="APP_NAME" />. Mañá poderás utilizala durante <ph name="TIME_LIMIT" />.</translation>
 <translation id="9174401638287877180">Enviar datos de uso e diagnóstico. Envía automaticamente datos de diagnóstico e de uso do dispositivo e das aplicacións a Google para axudar a mellorar a experiencia do teu fillo en Android. Esta información non se utilizará para identificar o teu fillo, senón co obxectivo de aumentar a estabilidade do sistema e das aplicacións, e de realizar outras melloras. Algúns datos agregados tamén serán útiles para as aplicacións e os socios de Google, como os programadores de Android. Se está activada a opción de configuración Actividade web e das aplicacións adicional para o teu fillo, estes datos pódense gardar na súa Conta de Google</translation>
+<translation id="9174854240439014335">Permitir acción de arrastrar e soltar na vista dividida no bordo esquerdo ou dereito da ventá</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" />: conectouse a un dispositivo Bluetooth</translation>
 <translation id="9177859716483578738">Para continuar, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> compartirá con este sitio os seguintes datos: <ph name="FIELDS_STRING" />. Consulta a <ph name="BEGIN_LINK" />política de privacidade<ph name="END_LINK" /> do sitio.</translation>
 <translation id="9178061802301856367">Eliminar os datos de inicio de sesión</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index d4aa4d66..f76a282 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -3232,6 +3232,7 @@
 <translation id="3226487301970807183">ડાબેથી સંરેખિત બાજુની પૅનલ ટૉગલ કરો</translation>
 <translation id="322708765617468434">સેટઅપ કર્યા પછી તમે હંમેશા અન્ય કોઈપણ વ્યક્તિને ડિવાઇસમાં ઉમેરી શકો છો. દરેક વ્યક્તિ તેમનો અનુભવ મનગમતો બનાવી શકે છે અને ડેટા ખાનગી રાખી શકે છે.</translation>
 <translation id="3227137524299004712">માઇક્રોફોન</translation>
+<translation id="3227701057281907159">પૅચ કરી રહ્યાં છીએ</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{<ph name="BEGIN_LINK" />Chrome વેબ સ્ટોર<ph name="END_LINK" />માંથી તેને કાઢી નાખો અથવા સમાન એક્સ્ટેન્શન વડે બદલો.}one{<ph name="BEGIN_LINK" />Chrome વેબ સ્ટોર<ph name="END_LINK" />માંથી તેમને કાઢી નાખો અથવા સમાન એક્સ્ટેન્શન વડે બદલો}other{<ph name="BEGIN_LINK" />Chrome વેબ સ્ટોર<ph name="END_LINK" />માંથી તેમને કાઢી નાખો અથવા સમાન એક્સ્ટેન્શન વડે બદલો}}</translation>
 <translation id="3229254977651514276">તારીખ ચેક કરો</translation>
 <translation id="3230539834943294477">સહાય લેખો જુઓ અથવા ડિવાઇસ માટે સપોર્ટ મેળવો</translation>
@@ -3396,6 +3397,7 @@
 <translation id="3347086966102161372">છબી સરનામું કૉ&amp;પિ કરો</translation>
 <translation id="3348038390189153836">કાઢી નાખવા યોગ્ય ઉપકરણ મળ્યું</translation>
 <translation id="3348131053948466246">સૂચવેલા ઇમોજી. નૅવિગેટ કરવા માટે ઉપર અથવા નીચેની ઍરો કી દબાવો અને મનપસંદ ઇમોજીને શામેલ કરવા enter કી દબાવો.</translation>
+<translation id="3348973040180736882">ડીકમ્પ્રેસ કરી રહ્યાં છીએ</translation>
 <translation id="3349933790966648062">મેમરી ફૂટપ્રિન્ટ</translation>
 <translation id="3350450887151703713">10 સેકન્ડ ફરીથી ચલાવો</translation>
 <translation id="3351472127384196879">તમારી પેન પર બટન ઉમેરો અથવા શોધો</translation>
@@ -11758,6 +11760,7 @@
 <translation id="9173063514323762371">અને બુકમાર્ક બાર છુપાવો</translation>
 <translation id="917350715406657904"><ph name="APP_NAME" /> માટે તમારા માતાપિતાએ સેટ કરેલી સમયમર્યાદાએ તમે પહોંચી ગયા છો. તમે આવતી કાલે <ph name="TIME_LIMIT" /> માટે તેનો ઉપયોગ કરી શકશો.</translation>
 <translation id="9174401638287877180">વપરાશ અને નિદાનનો ડેટા મોકલો. Googleને નિદાન, ડિવાઇસ અને ઍપ વપરાશનો ડેટા ઑટોમૅટિક રીતે મોકલીને તમારા બાળકના Android અનુભવને બહેતર બનાવવામાં સહાય કરો. આનો ઉપયોગ તમારા બાળકને ઓળખવા માટે થશે નહીં અને સિસ્ટમ અને ઍપની સ્થિરતા અને અન્ય સુધારણાઓમાં સહાય કરશે. એકત્ર કરેલો કેટલોક ડેટા Google ઍપ અને ભાગીદારો, જેમ કે Android ડેવલપરને પણ સહાય કરશે. જો તમારા બાળક માટે વધારાનું વેબ અને ઍપ પ્રવૃત્તિ સેટિંગ ચાલુ હોય, તો આ ડેટા તેમના Google એકાઉન્ટમાં સાચવવામાં આવી શકે છે.</translation>
+<translation id="9174854240439014335">વિન્ડોની ડાબી કે જમણી કિનારી પર વિભાજિત વ્યૂને ખેંચવાની અને છોડવાની મંજૂરી આપો</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - Bluetooth ડિવાઇસ કનેક્ટ કર્યું</translation>
 <translation id="9177859716483578738">ચાલુ રાખવા માટે, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> આ સાઇટ સાથે તમારું <ph name="FIELDS_STRING" /> શેર કરશે. આ સાઇટની <ph name="BEGIN_LINK" />પ્રાઇવસી પૉલિસી<ph name="END_LINK" /> જુઓ.</translation>
 <translation id="9178061802301856367">સાઇન-ઇન ડેટા ડિલીટ કરો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index a5a4eac..d87b057 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -3248,6 +3248,7 @@
 <translation id="3226487301970807183">बाईं ओर अलाइन साइड पैनल को टॉगल करें</translation>
 <translation id="322708765617468434">सेटअप पूरा होने के बाद, डिवाइस में किसी भी व्यक्ति को कभी भी जोड़ा जा सकता है. हर व्यक्ति अपने अनुभव को पसंद के हिसाब से बना सकता है और डेटा को निजी रख सकता है.</translation>
 <translation id="3227137524299004712">माइक्रोफ़ोन</translation>
+<translation id="3227701057281907159">पैच किया जा रहा है</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{इस एक्सटेंशन को <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> पर मौजूद मिलते-जुलते एक्सटेंशन से बदलें या हटाएं.}one{इस एक्सटेंशन को <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> पर मौजूद मिलते-जुलते एक्सटेंशन से बदलें या हटाएं}other{इन एक्सटेंशन को <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> पर मौजूद मिलते-जुलते एक्सटेंशन से बदलें या हटाएं}}</translation>
 <translation id="3229254977651514276">तारीख की जांच करें</translation>
 <translation id="3230539834943294477">सहायता लेख देखें या डिवाइस से जुड़ी सहायता पाएं</translation>
@@ -3412,6 +3413,7 @@
 <translation id="3347086966102161372">इमेज के पते को कॉपी करें</translation>
 <translation id="3348038390189153836">निकालने योग्‍य डिवाइस का पता चला</translation>
 <translation id="3348131053948466246">सुझाए गए इमोजी. नेविगेट करने के लिए, ऊपर या नीचे वाला तीर का निशान दबाएं. इमोजी डालने के लिए enter दबाएं.</translation>
+<translation id="3348973040180736882">डीकंप्रेस किया जा रहा है</translation>
 <translation id="3349933790966648062">मेमोरी फ़ुटप्रिंट</translation>
 <translation id="3350450887151703713">10 सेकंड फिर से चलाएं</translation>
 <translation id="3351472127384196879">अपने पेन के लिए बटन जोड़ें या उनकी जगह बदलें</translation>
@@ -11773,6 +11775,7 @@
 <translation id="9173063514323762371">बुकमार्क बार छिपाएं</translation>
 <translation id="917350715406657904">आप उस समयसीमा तक पहुंच गए हैं जो आपके माता-पिता ने <ph name="APP_NAME" /> के लिए तय की थी. आप इसे कल <ph name="TIME_LIMIT" /> के लिए इस्तेमाल कर सकते हैं.</translation>
 <translation id="9174401638287877180">इस्तेमाल और गड़बड़ी की जानकारी से जुड़ा डेटा भेजें. Google को गड़बड़ी, डिवाइस, और ऐप्लिकेशन के इस्तेमाल से जुड़ा डेटा अपने-आप भेजकर, अपने बच्चे के Android अनुभव को बेहतर बनाने में मदद करें. इसका इस्तेमाल आपके बच्चे की पहचान करने के लिए नहीं किया जाएगा. यह सिस्टम और ऐप्लिकेशन की स्थिरता बढ़ाने और दूसरे सुधार करने में मदद करेगा. इकट्ठा किया गया कुछ डेटा, Google ऐप्लिकेशन और पार्टनर की भी मदद करेगा. जैसे, Android डेवलपर. अगर आपके बच्चे के लिए 'अन्य वेब और ऐप्लिकेशन गतिविधि' सेटिंग चालू है, तो यह डेटा उसके Google खाते में सेव किया जा सकता है.</translation>
+<translation id="9174854240439014335">विंडो के बाएं या दाएं किनारे पर स्प्लिट व्यू को खींचने और छोड़ने की अनुमति दें</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - ब्लूटूथ डिवाइस कनेक्ट है</translation>
 <translation id="9177859716483578738">जारी रखने के लिए, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> इस साइट के साथ आपका <ph name="FIELDS_STRING" /> शेयर करेगा. इस साइट की <ph name="BEGIN_LINK" />निजता नीति<ph name="END_LINK" /> देखें.</translation>
 <translation id="9178061802301856367">साइन इन करने का डेटा मिटाएं</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 6aa2de8..f31830b 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -3236,6 +3236,7 @@
 <translation id="3226487301970807183">Uključivanje/isključivanje bočne ploče s lijevim poravnanjem</translation>
 <translation id="322708765617468434">Nakon postavljanja uvijek možete dodati drugu osobu na uređaj. Svaka osoba može prilagoditi svoje iskustvo i zadržati privatnost svojih podataka.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
+<translation id="3227701057281907159">Primjena zakrpe</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Uklonite ga ili zamijenite sličnim proširenjima iz <ph name="BEGIN_LINK" />Chrome web-trgovine<ph name="END_LINK" />.}one{Uklonite ih ili zamijenite sličnim proširenjima iz <ph name="BEGIN_LINK" />Chrome web-trgovine<ph name="END_LINK" />}few{Uklonite ih ili zamijenite sličnim proširenjima iz <ph name="BEGIN_LINK" />Chrome web-trgovine<ph name="END_LINK" />}other{Uklonite ih ili zamijenite sličnim proširenjima iz <ph name="BEGIN_LINK" />Chrome web-trgovine<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">Provjerite datum</translation>
 <translation id="3230539834943294477">Pogledajte članke pomoći ili pronađite podršku za uređaj</translation>
@@ -3400,6 +3401,7 @@
 <translation id="3347086966102161372">K&amp;opiraj adresu slike</translation>
 <translation id="3348038390189153836">Otkriven je uklonjivi uređaj</translation>
 <translation id="3348131053948466246">Emoji je predložen. Pritisnite tipke za gore ili dolje za kretanje i tipku Enter za umetanje.</translation>
+<translation id="3348973040180736882">Dekomprimiranje</translation>
 <translation id="3349933790966648062">Upotreba memorije</translation>
 <translation id="3350450887151703713">Ponovno reproduciraj 10 s</translation>
 <translation id="3351472127384196879">Dodajte ili pronađite gumbe na olovci</translation>
@@ -11764,6 +11766,7 @@
 <translation id="9173063514323762371">&amp;Sakrij traku oznaka</translation>
 <translation id="917350715406657904">Dosegnuto je vremensko ograničenje koje je tvoj roditelj postavio za aplikaciju <ph name="APP_NAME" />. Sutra je možeš koristiti <ph name="TIME_LIMIT" />.</translation>
 <translation id="9174401638287877180">Slanje podataka o upotrebi i dijagnostici. Pomognite poboljšati djetetov doživljaj Androida automatskim slanjem dijagnostičkih podataka i podataka o upotrebi uređaja i aplikacija Googleu. Ti se podaci neće upotrebljavati za identifikaciju vašeg djeteta, a pomoći će poboljšati sustav, stabilnost aplikacija i drugo. Neki skupni podaci pomoći će i Googleovim aplikacijama i partnerima, na primjer razvojnim programerima za Android. Ako je za vaše dijete uključena dodatna aktivnost na webu i u aplikacijama, ti se podaci mogu spremati na djetetov Google račun.</translation>
+<translation id="9174854240439014335">Dopusti povlačenje i ispuštanje u podijeljenom prikazu na lijevom ili desnom rubu prozora</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – Bluetooth uređaj povezan</translation>
 <translation id="9177859716483578738">Da biste nastavili, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> će podijeliti vaše podatke, odnosno <ph name="FIELDS_STRING" /> s ovom web-lokacijom. Pogledajte <ph name="BEGIN_LINK" />pravila o privatnosti<ph name="END_LINK" /> ove web-lokacije.</translation>
 <translation id="9178061802301856367">Brisanje podataka za prijavu</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 879970e..19e9f82a 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -3246,6 +3246,7 @@
 <translation id="3226487301970807183">Kapcsoló balra igazított oldalsó panelje</translation>
 <translation id="322708765617468434">A beállítás után bármikor hozzáadhat új személyt az eszközhöz. Bárki személyre szabhatja a saját élményét, és gondoskodhat adatainak biztonságáról.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
+<translation id="3227701057281907159">Javítás…</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Távolítsa el vagy cserélje le hasonló bővítményre a <ph name="BEGIN_LINK" />Chrome Webáruházban<ph name="END_LINK" />.}other{Távolítsa el vagy cserélje le őket hasonló bővítményekre a <ph name="BEGIN_LINK" />Chrome Webáruházban<ph name="END_LINK" />.}}</translation>
 <translation id="3229254977651514276">Ellenőrizze a dátumot</translation>
 <translation id="3230539834943294477">Súgócikkek megtekintése vagy eszköztámogatás keresése</translation>
@@ -3410,6 +3411,7 @@
 <translation id="3347086966102161372">Képcím más&amp;olása</translation>
 <translation id="3348038390189153836">A rendszer cserélhető eszközt észlelt</translation>
 <translation id="3348131053948466246">Javasolt emoji. A beszúráshoz nyomja meg a fel vagy le nyilat, majd az Enter billentyűt.</translation>
+<translation id="3348973040180736882">Kibontás…</translation>
 <translation id="3349933790966648062">Memóriamennyiség</translation>
 <translation id="3350450887151703713">10 másodperc megismétlése</translation>
 <translation id="3351472127384196879">A tollon lévő gombok hozzáadása vagy megkeresése</translation>
@@ -11772,6 +11774,7 @@
 <translation id="9173063514323762371">&amp;Könyvjelzősáv elrejtése</translation>
 <translation id="917350715406657904">Elérted a szülő által beállított időkorlátot a(z) <ph name="APP_NAME" /> alkalmazásban. Holnap újra használhatod a megadott ideig (<ph name="TIME_LIMIT" />).</translation>
 <translation id="9174401638287877180">Használati és diagnosztikai adatok küldése. Segítsen gyermeke Android-élményének továbbfejlesztésében azzal, hogy automatikusan diagnosztikai, valamint eszköz- és alkalmazáshasználati adatokat küld a Google-nak. Az adatok a rendszer- és alkalmazásstabilitás javításában, valamint más fejlesztésekben segítenek, nem használjuk fel őket az Ön gyermekének azonosítására. Bizonyos összesített adatok a Google-alkalmazásoknak és -partnereknek, például az Android-fejlesztőknek is segítenek. Ha az Internetes és alkalmazástevékenységek beállítás is be van kapcsolva a gyermekénél, akkor a rendszer ezeket az adatokat mentheti a gyermek Google-fiókjába.</translation>
+<translation id="9174854240439014335">Osztott nézetes húzás engedélyezése az ablak bal vagy jobb szélére</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – Bluetooth-eszköz csatlakoztatva</translation>
 <translation id="9177859716483578738">A folytatáshoz a(z) <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> megosztja a következőket ezzel a webhellyel: <ph name="FIELDS_STRING" />. Olvassa el a webhely <ph name="BEGIN_LINK" />adatvédelmi irányelveit<ph name="END_LINK" />.</translation>
 <translation id="9178061802301856367">Bejelentkezési adatok törlése</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 529f2acd..2aa32ed3 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -3247,6 +3247,7 @@
 <translation id="3226487301970807183">Aktifkan panel samping rata kiri</translation>
 <translation id="322708765617468434">Anda dapat menambahkan pengguna lain ke perangkat setelah penyiapan kapan saja. Setiap pengguna dapat mempersonalisasi pengalaman dan menjaga privasi datanya.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
+<translation id="3227701057281907159">Pemberian patch</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Hapus atau ganti dengan ekstensi serupa dari <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.}other{Hapus atau ganti dengan ekstensi serupa dari <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">Periksa tanggal</translation>
 <translation id="3230539834943294477">Lihat artikel bantuan atau temukan dukungan perangkat</translation>
@@ -3411,6 +3412,7 @@
 <translation id="3347086966102161372">S&amp;alin alamat gambar</translation>
 <translation id="3348038390189153836">Perangkat yang dapat dicopot terdeteksi</translation>
 <translation id="3348131053948466246">Emoji yang disarankan. Tekan panah atas atau bawah untuk memilih dan enter untuk menyisipkan.</translation>
+<translation id="3348973040180736882">Mendekompresi</translation>
 <translation id="3349933790966648062">Jejak Memori</translation>
 <translation id="3350450887151703713">Putar ulang 10 detik</translation>
 <translation id="3351472127384196879">Tambahkan atau temukan tombol di pen</translation>
@@ -11773,6 +11775,7 @@
 <translation id="9173063514323762371">&amp;Sembunyikan Kolom Bookmark</translation>
 <translation id="917350715406657904">Kamu sudah mencapai batas waktu yang ditetapkan orang tuamu untuk <ph name="APP_NAME" />. Kamu bisa menggunakannya besok selama <ph name="TIME_LIMIT" />.</translation>
 <translation id="9174401638287877180">Kirimkan data penggunaan dan diagnostik. Bantu tingkatkan pengalaman penggunaan Android oleh anak Anda dengan mengirimkan data diagnostik, perangkat, dan penggunaan aplikasi ke Google secara otomatis. Data ini tidak akan digunakan untuk mengidentifikasi anak Anda dan akan membantu meningkatkan performa sistem, stabilitas aplikasi, dan lainnya. Beberapa data gabungan juga akan membantu aplikasi dan partner Google, seperti developer Android. Jika setelan Aktivitas Web &amp; Aplikasi tambahan diaktifkan untuk anak Anda, data ini dapat disimpan ke Akun Google miliknya.</translation>
+<translation id="9174854240439014335">Izinkan tarik lalu lepas tampilan terpisah di tepi kiri atau kanan jendela</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - Perangkat Bluetooth terhubung</translation>
 <translation id="9177859716483578738">Untuk melanjutkan, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> akan membagikan <ph name="FIELDS_STRING" /> Anda ke situs ini. Lihat <ph name="BEGIN_LINK" />kebijakan privasi<ph name="END_LINK" /> situs ini.</translation>
 <translation id="9178061802301856367">Hapus data login</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index c6847f7..b18b7ca 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -3248,6 +3248,7 @@
 <translation id="3226487301970807183">Sýna/fela hliðarglugga sem er jafnaður til vinstri</translation>
 <translation id="322708765617468434">Þú getur alltaf bætt öðrum einstakling við tækið eftir uppsetningu. Hver einstaklingur getur sérsniðið upplifun sína og haldið gögnunum sínum lokuðum.</translation>
 <translation id="3227137524299004712">Hljóðnemi</translation>
+<translation id="3227701057281907159">Plástrar</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Fjarlægðu hana eða skiptu henni út með svipuðum viðbótum úr <ph name="BEGIN_LINK" />vefverslun Chrome<ph name="END_LINK" />.}one{Fjarlægðu þær eða skiptu þeim út með svipuðum viðbótum úr <ph name="BEGIN_LINK" />vefverslun Chrome<ph name="END_LINK" />.}other{Fjarlægðu þær eða skiptu þeim út með svipuðum viðbótum úr <ph name="BEGIN_LINK" />vefverslun Chrome<ph name="END_LINK" />.}}</translation>
 <translation id="3229254977651514276">Athugaðu dagsetninguna</translation>
 <translation id="3230539834943294477">Skoða hjálpargreinar eða finna stuðning við tæki</translation>
@@ -3412,6 +3413,7 @@
 <translation id="3347086966102161372">A&amp;frita slóð myndar</translation>
 <translation id="3348038390189153836">Laust tæki fannst</translation>
 <translation id="3348131053948466246">Tillaga að emoji. Ýttu upp eða niður til að fletta og ýttu á Enter til að færa inn.</translation>
+<translation id="3348973040180736882">Afþjappar</translation>
 <translation id="3349933790966648062">Minnisferill</translation>
 <translation id="3350450887151703713">Endurspila 10 sekúndur</translation>
 <translation id="3351472127384196879">Bættu við eða staðsettu hnappa á pennanum</translation>
@@ -11776,6 +11778,7 @@
 <translation id="9173063514323762371">Fela bókamerkjastiku</translation>
 <translation id="917350715406657904">Þú hefur náð tímamörkunum sem foreldri þitt stillti fyrir <ph name="APP_NAME" />. Þú getur notað forritið í <ph name="TIME_LIMIT" /> á morgun.</translation>
 <translation id="9174401638287877180">Senda notkunar- og greiningargögn. Hjálpaðu okkur að bæta Android fyrir barnið þitt með því að senda sjálfkrafa greiningargögn, tækisgögn og upplýsingar um forritanotkun til Google. Þetta verður ekki notað til að bera kennsl á barnið þitt og mun stuðla að stöðugleika kerfa og forrita og öðrum endurbótum. Sum uppsöfnuð gögn munu einnig gagnast forritum og samstarfsaðilum Google, til dæmis þróunaraðilum Android. Ef kveikt er á ítarlegri vef- og forritavirkni fyrir barnið geta þessi gögn verið vistuð á Google-reikningi barnsins.</translation>
+<translation id="9174854240439014335">Leyfa að draga og sleppa á vinstri eða hægri jaðri glugga í skjáskiptingu</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – Bluetooth-tæki tengt</translation>
 <translation id="9177859716483578738"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> mun deila <ph name="FIELDS_STRING" /> með þessu vefsvæði til að geta haldið áfram. Sjá <ph name="BEGIN_LINK" />persónuverndarstefnu<ph name="END_LINK" /> vefsvæðisins.</translation>
 <translation id="9178061802301856367">Eyða innskráningargögnum</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 63e4d02..97067f8 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1529,9 +1529,9 @@
 <translation id="2031914984822377766">יש להוסיף את <ph name="LINK_BEGIN" />שפות האתר<ph name="LINK_END" /> המועדפות. השפה המובילה מהרשימה תשמש לתרגומים.</translation>
 <translation id="2032837042715970520">‏חובה להזין OTP</translation>
 <translation id="2034346955588403444">‏הוספת עוד רשת Wi-Fi</translation>
-<translation id="2037445849770872822">‏הוגדר פיקוח על חשבון Google הזה. כדי להגדיר עוד אפשרויות של בקרת הורים יש ללחוץ על 'המשך'.
+<translation id="2037445849770872822">‏הוגדר פיקוח על החשבון הזה ב-Google. כדי להגדיר עוד אפשרויות של בקרת הורים, צריך ללחוץ על "המשך".
 
-אחרת, יש לצאת עכשיו כדי שהשינויים בחשבון יופיעו במכשיר הזה.
+אחרת, עליך לצאת עכשיו כדי שהשינויים בחשבון יופיעו במכשיר.
 
 כדי לנהל את הגדרות החשבון הזה אפשר להתקין את האפליקציה Family Link במכשיר.  שלחנו לך הוראות באימייל.</translation>
 <translation id="2037486735086318591">הגדרה של <ph name="FEATURE_NAME" /> מאפשרת לכם לשתף קבצים עם אנשים אחרים בסביבה ולקבל מהם קבצים</translation>
@@ -1729,7 +1729,7 @@
 <translation id="2165177462441582039">יש לבחור את משך הזמן שבו ההדגשה תוצב על פריט כלשהו</translation>
 <translation id="2166369534954157698">דג סקרן שט בים זך ולפתע מצא חבורה נחמדה</translation>
 <translation id="2169062631698640254">אני רוצה להיכנס בכל זאת</translation>
-<translation id="2173302385160625112">יש לבדוק את החיבור לאינטרנט</translation>
+<translation id="2173302385160625112">צריך לבדוק את החיבור לאינטרנט</translation>
 <translation id="2173801458090845390">הוספת מזהה דרישה למכשיר הזה</translation>
 <translation id="2175384018164129879">ניהול של מנועי החיפוש ושל החיפוש באתרים ספציפיים</translation>
 <translation id="2175526076681939329">שימוש במקלדת הראשית</translation>
@@ -2012,7 +2012,7 @@
 <translation id="2355314311311231464">הקצאת המשאבים נכשלה מאחר שלא ניתן היה לאחזר את פרטי החשבון שלך. יש לנסות שוב. קוד שגיאה: <ph name="ERROR_CODE" />.</translation>
 <translation id="2355477091455974894">אפשרויות לחיסכון באנרגיה</translation>
 <translation id="2355604387869345912">הפעלת שיתוף אינטרנט מיידי בין מכשירים</translation>
-<translation id="2356070529366658676">לשאול</translation>
+<translation id="2356070529366658676">לשאלה בצ'אט</translation>
 <translation id="2357330829548294574">הסרה של <ph name="USER_NAME" /></translation>
 <translation id="2357343506242630761">הוספת אתר לרשימת האתרים המותרים</translation>
 <translation id="2358777858338503863">יש ללחוץ כדי לתת גישה לתוסף בכתובת <ph name="ORIGIN" />:</translation>
@@ -2253,7 +2253,7 @@
 <translation id="251425554130284360">‏מוצגים דפים שביקרת בהם והצעות לחיפושים כדי שיהיה קל לחזור לפעילות האחרונה שלך.
         <ph name="BREAK" />
         <ph name="BREAK" />
-        ניתן לנהל את ההגדרות דרך התפריט בכרטיס או לראות עוד אפשרויות ב'התאמה אישית של Chrome'.</translation>
+        ניתן לנהל את ההגדרות דרך התפריט בכרטיס או לראות עוד אפשרויות ב"התאמה אישית של Chrome".</translation>
 <translation id="2514326558286966059">ביטול נעילה במהירות באמצעות טביעת אצבע</translation>
 <translation id="2514465118223423406">כשהעכבר מחובר</translation>
 <translation id="2514938842036917377">הפעולה הזו תגרום למחיקת נתונים בנפח של <ph name="TOTAL_USAGE" /> שאוחסנו על ידי <ph name="SITE_NAME" />, אתרים קשורים והאפליקציות המותקנות</translation>
@@ -3122,7 +3122,7 @@
 <translation id="3124332159330678621">‏אפשר להתאים אישית את Chrome כדי לשנות את מראה הדפדפן</translation>
 <translation id="3125816458150005808">אפשר לבטל את ההצמדה ולפתוח אותה מהתפריט</translation>
 <translation id="3126026824346185272">Ctrl</translation>
-<translation id="3127860049873093642">‏כדי להימנע מבעיות בטעינה ובביצועים, יש להשתמש במתאם מתח תואם של Dell, או מסוג USB-C.</translation>
+<translation id="3127860049873093642">‏כדי להימנע מבעיות בטעינה ובביצועים, יש להשתמש במתאם מתח תואם של Dell, או USB Type-C.</translation>
 <translation id="3127862849166875294">‏שינוי הגודל של שטח האחסון של Linux בכונן</translation>
 <translation id="3129150892373332590">‏הפעולה הזו תשבית את השיתוף המתמשך של מכשירי USB עם אורחים, ותאפס את כל האפשרויות. להמשיך?</translation>
 <translation id="3129173833825111527">שוליים שמאליים</translation>
@@ -3246,6 +3246,7 @@
 <translation id="3226487301970807183">החלפת מצב לחלונית הצדדית משמאל</translation>
 <translation id="322708765617468434">תמיד אפשר להוסיף אדם נוסף למכשיר אחרי ההגדרה. כל משתמש יכול להתאים אישית את חוויית המשתמש שלו ולהגן על פרטיות הנתונים.</translation>
 <translation id="3227137524299004712">מיקרופון</translation>
+<translation id="3227701057281907159">תיקון</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{‏אפשר להסיר את התוסף, או להחליף אותו בתוספים דומים מ<ph name="BEGIN_LINK" />חנות האינטרנט של Chrome<ph name="END_LINK" />.}one{‏אפשר להסיר את התוספים, או להחליף אותם בתוספים דומים מ<ph name="BEGIN_LINK" />חנות האינטרנט של Chrome<ph name="END_LINK" />}two{‏אפשר להסיר את התוספים, או להחליף אותם בתוספים דומים מ<ph name="BEGIN_LINK" />חנות האינטרנט של Chrome<ph name="END_LINK" />}other{‏אפשר להסיר את התוספים, או להחליף אותם בתוספים דומים מ<ph name="BEGIN_LINK" />חנות האינטרנט של Chrome<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">צריך לבדוק שהתאריך תקין</translation>
 <translation id="3230539834943294477">עיון במאמרי עזרה או חיפוש תמיכה במכשיר</translation>
@@ -3410,6 +3411,7 @@
 <translation id="3347086966102161372">העתקת כתובת &amp;תמונה</translation>
 <translation id="3348038390189153836">זוהה התקן נשלף</translation>
 <translation id="3348131053948466246">‏הצעות לאמוג'י. כדי לעבור בין ההצעות, מקישים על החיצים למעלה או למטה. כדי להוסיף אמוג'י, מקישים על Enter.</translation>
+<translation id="3348973040180736882">חילוץ</translation>
 <translation id="3349933790966648062">הזיכרון שבשימוש</translation>
 <translation id="3350450887151703713">הפעלה מחדש של 10 שניות</translation>
 <translation id="3351472127384196879">הוספה או זיהוי כפתורים בעט</translation>
@@ -3983,7 +3985,7 @@
 <translation id="3730298295914858769">‏היכולות של Wi-Fi ישיר:</translation>
 <translation id="3732078975418297900">שגיאה בשורה <ph name="ERROR_LINE" /></translation>
 <translation id="3732108843630241049">המכשיר הזה כבר לא מקבל עדכוני תוכנה אוטומטיים. מומלץ להפעיל את עדכוני האבטחה המורחבים כדי להמשיך לקבל עדכונים שקשורים לאבטחה, ליציבות ולביצועים. חלק מהתכונות יהיו מוגבלות. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
-<translation id="3732414796052961578">המשך בתור <ph name="ACCOUNT_NAME" /></translation>
+<translation id="3732414796052961578">להמשך בתור <ph name="ACCOUNT_NAME" /></translation>
 <translation id="3732530910372558017">קוד האימות יכול להיות באורך של 63 תווים לכל היותר</translation>
 <translation id="3732706448780793442">הזנה ידנית</translation>
 <translation id="3733296813637058299">‏נתקין את האפליקציות האלו בשבילך. אפליקציות נוספות בשביל <ph name="DEVICE_TYPE" /> זמינות בחנות Play.</translation>
@@ -3999,7 +4001,7 @@
 <translation id="3740945083753997630">הקטנה של התצוגה והטקסט</translation>
 <translation id="3741056951918180319">תמיד אפשר ללחוץ על התוסף כדי להשתמש בו בכל אתר שהוא</translation>
 <translation id="374124333420280219">פרטי האפליקציה:</translation>
-<translation id="3741510433331996336">צריך להפעיל מחדש את המכשיר כדי לסיים את העדכון</translation>
+<translation id="3741510433331996336">כדי לסיים את העדכון, צריך להפעיל מחדש את המכשיר</translation>
 <translation id="3742235229730461951">פריסת מקלדת בקוריאנית</translation>
 <translation id="3743842571276656710">צריך להזין קוד אימות כדי להתאים עם <ph name="DEVICE_NAME" /></translation>
 <translation id="3744219658596020825">הסיסמאות שלך לא יובאו</translation>
@@ -5270,7 +5272,7 @@
 <translation id="4632655012900268062">התאמה אישית של הכרטיסים</translation>
 <translation id="4633003931260532286">כדי להשתמש בתוסף יש צורך ב-"<ph name="IMPORT_NAME" />" בגרסה "<ph name="IMPORT_VERSION" />" לפחות, אך הגרסה המותקנת היא רק "<ph name="INSTALLED_VERSION" />"</translation>
 <translation id="4633757335284074492">‏רוצה לגבות ב-Google Drive? זה מאפשר לשחזר נתונים או להחליף מכשיר מתי שרוצים. הגיבוי כולל נתוני אפליקציות. הגיבויים מועלים ל-Google ומוצפנים באמצעות סיסמת חשבון Google של הילד או הילדה שלך.</translation>
-<translation id="4634575639321169635">אפשר להגדיר את המכשיר לעבודה או לשימוש אישי</translation>
+<translation id="4634575639321169635">להגדרת המכשיר לעבודה או לשימוש אישי</translation>
 <translation id="4635072447747973225">‏הסרה של Crostini</translation>
 <translation id="4635398712689569051"><ph name="PAGE_NAME" /> לא זמין למשתמשים במצב אורח.</translation>
 <translation id="4636187126182557415">העדפות המערכת</translation>
@@ -5704,7 +5706,7 @@
 <translation id="4930406318748549391">המיקום של החלונית הצדדית</translation>
 <translation id="4930447554870711875">מפתחים</translation>
 <translation id="4930714375720679147">הפעלה</translation>
-<translation id="4931347390544064118">אם בוחרים ברשת ברירת המחדל, לא בטוח שתמיד יהיה חיבור מאובטח. מומלץ לבחור ספק אחר כדי שהחיבור שלך תמיד יהיה מאובטח.</translation>
+<translation id="4931347390544064118">אם בוחרים ברשת ברירת המחדל, לא בטוח שתמיד יהיה חיבור מאובטח. מומלץ לבחור ספק אחר כדי שהחיבור תמיד יהיה מאובטח.</translation>
 <translation id="4931387733184123331">ליקויי מאורות</translation>
 <translation id="4932733599132424254">תאריך</translation>
 <translation id="4933484234309072027">מוטבע ב-<ph name="URL" /></translation>
@@ -5900,7 +5902,7 @@
 <translation id="5083035541015925118">‏Ctrl +‏ Alt + חץ למעלה</translation>
 <translation id="5084328598860513926">תהליך ההכנה לשימוש נקטע. יש לנסות שוב, או לפנות לבעלים או למנהל של המכשיר. קוד שגיאה: <ph name="ERROR_CODE" />.</translation>
 <translation id="5084622689760736648">יותר סביר שאתרים יפעלו כצפוי</translation>
-<translation id="5084686326967545037">פועלים לפי השלבים במכשיר</translation>
+<translation id="5084686326967545037">יש לפעול לפי השלבים במכשיר</translation>
 <translation id="5085162214018721575">חיפוש עדכונים מתבצע</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="508645147179720015">ההערה מכילה יותר מ-1,000 תווים</translation>
@@ -6259,7 +6261,7 @@
 <translation id="5337207153202941678">השבתת ההדגשה</translation>
 <translation id="5337771866151525739">הותקן על ידי צד שלישי.</translation>
 <translation id="5337926771328966926">השם הנוכחי של המכשיר הוא <ph name="DEVICE_NAME" /></translation>
-<translation id="5338338064218053691">אפשר לגלוש בפרטיות באמצעות חלון אנונימי</translation>
+<translation id="5338338064218053691">אפשר לגלוש בפרטיות באמצעות חלון פרטי</translation>
 <translation id="5338503421962489998">אחסון מקומי</translation>
 <translation id="5340787663756381836">&amp;חיפוש ועריכה</translation>
 <translation id="5341793073192892252">‏קובצי ה-Cookie הבאים נחסמו (קובצי Cookie של צד שלישי נחסמים ללא יוצא מן הכלל)</translation>
@@ -7893,7 +7895,7 @@
 <translation id="652492607360843641">התחברת אל רשת <ph name="NETWORK_TYPE" />.</translation>
 <translation id="6525767484449074555">לוחצים על 'התקנה'</translation>
 <translation id="6527303717912515753">שיתוף</translation>
-<translation id="6527574156657772563">‏אין מכשירים זמינים. צריך להוסיף את חשבון Google לטלפון שלך כדי לחבר אותו ל-<ph name="DEVICE_TYPE" /> הזה. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
+<translation id="6527574156657772563">‏אין מכשירים זמינים. כדי לחבר את ה-<ph name="DEVICE_TYPE" /> לטלפון, צריך להוסיף את חשבון Google לטלפון. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
 <translation id="652948702951888897">‏היסטוריה של Chrome</translation>
 <translation id="6530030995840538405">תמונה <ph name="INDEX" /> של <ph name="SUBJECT" /> שנוצרה</translation>
 <translation id="6530186581263215931">את ההגדרות האלה אוכף מנהל המערכת</translation>
@@ -8314,9 +8316,9 @@
 <translation id="6808166974213191158">‏כלי לכתיבה של תמונת המערכת של ChromeOS Flex</translation>
 <translation id="6808193438228982088">שועל</translation>
 <translation id="6809470175540814047">פתיחה בחלון אנונימי</translation>
-<translation id="6809656734323672573">‏אם נקבל את הסכמתך, Google Assistant תעבור למצב המתנה לזיהוי הפקודה “Hey Google” ותוכל לזהות באמצעות Voice Match שהפקודה היא ממך.
+<translation id="6809656734323672573">‏אם נקבל את ההסכמה שלך, Google Assistant תעבור למצב המתנה לזיהוי הפקודה “Hey Google” ותוכל לזהות באמצעות Voice Match שהפקודה היא ממך.
     <ph name="BR" />
-    התכונה Voice Match מאפשרת ל-Assistant לזהות את הקול שלך ולהבדיל בינך לאחרים. Assistant משתמשת בקטעי קול שלך כדי ליצור תבנית קול ייחודית, המאוחסנת רק במכשיר שלך. יכול להיות שתבנית הקול שלך תישלח באופן זמני אל Google כדי לשפר את זיהוי הקול שלך.
+    התכונה Voice Match מאפשרת ל-Assistant לזהות את הקול שלך ולהבדיל בינך לאחרים. ‫Assistant משתמשת בקטעי הקול שלך כדי ליצור תבנית קול ייחודית, שנשמרת רק במכשיר שלך. יכול להיות שתבנית הקול תישלח באופן זמני אל Google כדי לשפר את זיהוי הקול שלך.
     <ph name="BR" />
     החלטת שהתכונה Voice Match לא מתאימה לך? בכל שלב ניתן להסיר את התכונה בהגדרות של Assistant. יש לך אפשרות לראות או למחוק את קטעי הקול שהקלטת בהגדרה של Voice Match בכתובת <ph name="VOICE_MATCH_SETTINGS_URL" />.
     <ph name="BR" />
@@ -9272,7 +9274,7 @@
 <translation id="7479221278376295180">סקירה כללית של השימוש בשטח אחסון</translation>
 <translation id="747981547666531654">‏יש חיבור למכשירי Bluetooth בשם <ph name="FIRST_DEVICE" /> ו-<ph name="SECOND_DEVICE" /></translation>
 <translation id="7481312909269577407">קדימה</translation>
-<translation id="7481358317100446445">מוכן</translation>
+<translation id="7481358317100446445">אפשר להתחיל</translation>
 <translation id="748138892655239008">מגבלות בסיסיות של אישור </translation>
 <translation id="7482823403440483089">מילוי אוטומטי משופר</translation>
 <translation id="7483732342458943943">הקישור הזה לא עובד</translation>
@@ -9565,7 +9567,7 @@
 המידע יכול לכלול פרטים על תוכנות שהותקנו, קבצים, הדפדפן, מערכת ההפעלה של המכשיר וכתובות IP.</translation>
 <translation id="7683373461016844951">כדי להמשיך יש ללחוץ על 'אישור' ולאחר מכן ללחוץ על 'הוספת משתמש' כדי ליצור פרופיל חדש בשביל כתובת האימייל שלך ב-<ph name="DOMAIN" />.</translation>
 <translation id="7683834360226457448">כלי תצוגה ללקויי ראייה</translation>
-<translation id="7684212569183643648">הותקן על ידי מנהל המערכת שלך</translation>
+<translation id="7684212569183643648">הותקן על ידי האדמין השלך</translation>
 <translation id="7684559058815332124">מעבר אל דף ההתחברות לפורטל החובה</translation>
 <translation id="7684718995427157417">‏כדי ליצור ולבדוק אפליקציות, יש להפעיל את ממשק הגישור של Android‏ (ADB). הערה: לאחר ביצוע הפעולה הזו יתאפשר להתקין אפליקציות ל-Android שלא אומתו על-ידי Google. כמו כן, כדי להשבית את התכונה, יש לאפס את המכשיר להגדרות היצרן.</translation>
 <translation id="7684913007876670600">כדי להציג תצוגה פשוטה יותר של הדף הזה, פותחים את החלונית הצדדית ובוחרים באפשרות "מצב קריאה"</translation>
@@ -10561,7 +10563,7 @@
 <translation id="8352287103893778223">שם קבוצת הכרטיסיות</translation>
 <translation id="835238322900896202">היתה שגיאה בתהליך ההסרה. יש להסיר את ההתקנה דרך הטרמינל.</translation>
 <translation id="8353420862507374944">‏הפעלת Cast, שמירה ושיתוף</translation>
-<translation id="8353683614194668312">יכול:</translation>
+<translation id="8353683614194668312">התוסף יכול:</translation>
 <translation id="8354034204605718473">קוד האימות של הילד או הילדה נוסף</translation>
 <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation>
 <translation id="8356409598322585307">כבר רשמת את המכשיר הזה. אין צורך לרשום אותו שוב.</translation>
@@ -11205,7 +11207,7 @@
 <translation id="879413103056696865">בזמן שהנקודה לשיתוף אינטרנט פועלת, <ph name="PHONE_NAME" />:</translation>
 <translation id="8794548468611058947">‏במקום להזין את הסיסמה לחשבון Google כדי להיכנס, אפשר ליצור קוד אימות למכשיר <ph name="DEVICE_TYPE" /> הזה</translation>
 <translation id="8795916974678578410">חלון חדש</translation>
-<translation id="8796919761992612392">‏&amp;התאמה אישית של Chrome</translation>
+<translation id="8796919761992612392">‏התאמה אישית של Chrome</translation>
 <translation id="8797459392481275117">אל תתרגמו את האתר הזה אף פעם</translation>
 <translation id="8798099450830957504">ברירת מחדל</translation>
 <translation id="8800034312320686233">האתר לא פועל?</translation>
@@ -11699,7 +11701,7 @@
 <translation id="9120693811286642342">‏<ph name="BEGIN_PARAGRAPH1" />כדי ליהנות מהחוויה הכי טובה, צריך להתקין את <ph name="DEVICE_OS" /> בדיסק הפנימי. יש לך גם אפשרות להתקין את זה בהמשך ממסך ההתחברות.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />אם לא מתאים לך להתקין עכשיו, אפשר להריץ את המערכת מ-USB ולנסות אותה. מערכת ההפעלה והנתונים הנוכחיים שלך ימשיכו לפעול, אבל ייתכן שיהיו מגבלות על נפח אחסון וביצועים.<ph name="END_PARAGRAPH2" /></translation>
 <translation id="9120761757252614786">התאמה אישית של סרגל הכלים</translation>
-<translation id="9120800848981545750">‏כדאי להוריד את Chrome ל-iOS כדי לגשת לכרטיסיות, לסימניות ולסיסמאות בטלפון.</translation>
+<translation id="9120800848981545750">‏רוצה לגשת לכרטיסיות, לסימניות ולסיסמאות בטלפון? אפשר להוריד את Chrome ל-iOS</translation>
 <translation id="9121814364785106365">פתיחה ככרטיסייה מוצמדת</translation>
 <translation id="9122099953033442610">{MULTI_GROUP_TAB_COUNT,plural, =0{לסגור את הכרטיסייה ולמחוק את הקבוצה?}=1{לסגור את הכרטיסיות ולמחוק את הקבוצה?}one{לסגור את הכרטיסיות ולמחוק את הקבוצות?}two{לסגור את הכרטיסיות ולמחוק את הקבוצות?}other{לסגור את הכרטיסיות ולמחוק את הקבוצות?}}</translation>
 <translation id="9122788874051694311">לשמור את מפתח הגישה הזה מחוץ למצב הפרטי?</translation>
@@ -11779,6 +11781,7 @@
 <translation id="9173063514323762371">הסתרת סרגל הסימניות</translation>
 <translation id="917350715406657904">הגעת למגבלת הזמן שנקבעה על ידי ההורה שלך לאפליקציה <ph name="APP_NAME" />. מחר אפשר יהיה להשתמש בה למשך <ph name="TIME_LIMIT" />.</translation>
 <translation id="9174401638287877180">‏שליחת מידע לגבי אופן השימוש בנתונים וניתוח הביצועים. כדי לתרום לשיפור חוויית המשתמש של הילד או הילדה ב-Android, אפשר לשלוח אל Google באופן אוטומטי נתוני אבחון, נתוני מכשיר ונתוני שימוש באפליקציות. הנתונים האלה לא ישמשו כדי לזהות את הילד או הילדה שלך, והם יעזרו לנו לשמור על היציבות של המערכת ושל האפליקציות ולבצע שיפורים אחרים. חלק מהנתונים הנצברים יעזרו גם לשפר את האפליקציות של Google וכן יעזרו לשותפים של Google, כמו מפתחים של Android. אם ההגדרה 'פעילות באפליקציות ובאתרי אינטרנט נוספים' הופעלה עבור הילד או הילדה שלך, ייתכן שהנתונים יישמרו בחשבון Google שלהם.</translation>
+<translation id="9174854240439014335">אפשר לגרור ולשחרר את התצוגה המפוצלת בקצה השמאלי או הימני של החלון</translation>
 <translation id="9176611096776448349">‏<ph name="WINDOW_TITLE" /> - מכשיר Bluetooth מחובר</translation>
 <translation id="9177859716483578738">כדי להמשיך, הפרטים <ph name="FIELDS_STRING" /> שלך ישותפו על ידי <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> עם האתר הזה. <ph name="BEGIN_LINK" />כאן מפורטת מדיניות הפרטיות<ph name="END_LINK" /> של האתר הזה.</translation>
 <translation id="9178061802301856367">מחיקת פרטי הכניסה</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index 891291b..f68d4aeb 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -3234,6 +3234,7 @@
 <translation id="3226487301970807183">მარცხნივი სწორების გვერდითა პანელზე გადართვა</translation>
 <translation id="322708765617468434">სხვა პიროვნების დამატებას მოწყობილობის დაყენების შემდეგ ნებისმიერ დროს შეძლებთ. თითოეულ ადამიანს შეეძლება ფუნქციების პერსონალიზება და მონაცემების განცალკევებით შენახვა.</translation>
 <translation id="3227137524299004712">მიკროფონი</translation>
+<translation id="3227701057281907159">შეკეთება</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{ამოშალეთ ან ჩაანაცვლეთ ის მსგავსი გაფართოებით <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />-იდან.}other{ამოშალეთ ან ჩაანაცვლეთ ისინი მსგავსი გაფართოებით <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />-იდან.}}</translation>
 <translation id="3229254977651514276">შეამოწმეთ თარიღი</translation>
 <translation id="3230539834943294477">იხილეთ დახმარების სტატიები ან მიიღეთ მხარდაჭერა მოწყობილობასთან დაკავშირებით</translation>
@@ -3398,6 +3399,7 @@
 <translation id="3347086966102161372">სურათის მისამართის კ&amp;ოპირება</translation>
 <translation id="3348038390189153836">აღმოჩენილია ამოშლადი მოწყობილობა</translation>
 <translation id="3348131053948466246">შემოთავაზებულია emoji. ნავიგაციისთვის დააჭირეთ კლავიშებს ზემოთ ან ქვემოთ მიმართული ისრით, შეყვანისთვის დააჭირეთ enter-ს.</translation>
+<translation id="3348973040180736882">შეკუმშვის გაუქმება</translation>
 <translation id="3349933790966648062">მეხსიერების მოხმარება</translation>
 <translation id="3350450887151703713">10 წამის ხელახლა დაკვრა</translation>
 <translation id="3351472127384196879">დაამატეთ ან იპოვეთ ღილაკები თქვენს კალამზე</translation>
@@ -11758,6 +11760,7 @@
 <translation id="9173063514323762371">სანიშნეების ზოლის &amp;დამალვა</translation>
 <translation id="917350715406657904">მიღწეულია მშობლის მიერ <ph name="APP_NAME" />-ზე დაწესებული დროის ლიმიტი. ხვალ შეგიძლიათ <ph name="TIME_LIMIT" /> გამოიყენოთ ის.</translation>
 <translation id="9174401638287877180">გამოყენებისა და დიაგნოსტიკის მონაცემების გაგზავნა. ხელი შეუწყვეთ Android-ის გაუმჯობესებას თქვენი შვილისთვის, დიაგნოსტიკისა და მოწყობილობის/აპების გამოყენების მონაცემების ავტომატურად გაგზავნით Google-ში. აღნიშნული მონაცემები არ იქნება გამოყენებული თქვენი შვილის ვინაობის დასადგენად, არამედ დაგვეხმარება სისტემის/აპების სტაბილურობისა და სხვა ფუნქციების გაუმჯობესებაში. გარდა ამისა, გაერთიანებული მონაცემების ნაწილი ხელს შეუწყობს Google აპებსა და პარტნიორებს, მაგალითად, Android-ის დეველოპერებს. თუ თქვენი შვილისთვის ჩართულია ვებსა და აპებში დამატებითი აქტივობის პარამეტრი, აღნიშნული მონაცემები შესაძლოა შეინახოს მის Google ანგარიშში.</translation>
+<translation id="9174854240439014335">დაუშვით გაყოფილი ხედის ჩავლებით გადატანა ფანჯრის მარცხენა ან მარჯვენა კიდეზე</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> — დაკავშირებულია Bluetooth მოწყობილობა</translation>
 <translation id="9177859716483578738">გასაგრძელებლად <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" />-ის მიერ ამ საიტთან გაზიარდება <ph name="FIELDS_STRING" />. გაეცანით ამ საიტის <ph name="BEGIN_LINK" />კონფიდენციალურობის დებულებას<ph name="END_LINK" />.</translation>
 <translation id="9178061802301856367">წაშალეთ სისტემაში შესვლის მონაცემები</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index 580af18..f0f1ea5 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -3229,6 +3229,7 @@
 <translation id="3226487301970807183">Сол жақ бүйірлік панельді көрсету/жасыру</translation>
 <translation id="322708765617468434">Орнатқаннан кейін әрдайым құрылғыға басқа адам қосуға болады. Әр адам өзінің тәжірибесін жекелендіріп, деректерін құпия сақтай алады.</translation>
 <translation id="3227137524299004712">Микрофон</translation>
+<translation id="3227701057281907159">Түзетіліп жатыр</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Оны өшіріңіз немесе <ph name="BEGIN_LINK" />Chrome Web Store-дағы<ph name="END_LINK" /> ұқсас кеңейтімдермен ауыстырыңыз.}other{Оларды өшіріңіз немесе <ph name="BEGIN_LINK" />Chrome Web Store-дағы<ph name="END_LINK" /> ұқсас кеңейтімдермен ауыстырыңыз.}}</translation>
 <translation id="3229254977651514276">Күнді тексеріңіз.</translation>
 <translation id="3230539834943294477">Анықтамалық мақалаларды көріңіз немесе құрылғының қолдауын табыңыз.</translation>
@@ -3393,6 +3394,7 @@
 <translation id="3347086966102161372">Кескін мекенжайын к&amp;өшіру</translation>
 <translation id="3348038390189153836">Алынбалы құрылғы анықталды</translation>
 <translation id="3348131053948466246">Эмоджи ұсынылады. Жылжу үшін жоғары не төмен және енгізу үшін Enter пернесін басыңыз.</translation>
+<translation id="3348973040180736882">Мұрағаттан шығарылып жатыр</translation>
 <translation id="3349933790966648062">Пайдаланылатын жад көлемі</translation>
 <translation id="3350450887151703713">10 секундты қайта ойнату</translation>
 <translation id="3351472127384196879">Қаламдағы түймелерді қосу немесе табу</translation>
@@ -11748,6 +11750,7 @@
 <translation id="9173063514323762371">&amp;Бетбелгілер жолағын жасыру</translation>
 <translation id="917350715406657904"><ph name="APP_NAME" /> үшін ата-анаңыз белгілеген уақыт шегіне жеттіңіз. Оны ертең <ph name="TIME_LIMIT" /> бойы пайдалана аласыз.</translation>
 <translation id="9174401638287877180">Пайдалану және диагностика туралы деректерді жіберу. Диагностикалық деректерді, сондай-ақ құрылғы мен қолданбаларды пайдалану деректерін Google қызметіне автоматты түрде жіберу арқылы балаңыздың Android жүйесін пайдалану тәжірибесін жақсартуға көмектесіңіз. Бұл деректер баланың жеке басын анықтауға пайдаланылмайды. Олар жүйе мен қолданбаның тұрақты жұмыс істеуіне және басқа да жақсартулар енгізуге көмектеседі. Кейбір жиынтық деректер Google қолданбаларын жетілдіруге және Android әзірлеушілері сияқты серіктестердің жұмысына көмектеседі. Егер "Интернет пен қолданбаларды пайдаланудың қосымша тарихы" параметрі қосулы болса, бұл деректер балаңыздың Google аккаунтына сақталуы мүмкін.</translation>
+<translation id="9174854240439014335">Терезенің сол немесе оң жақ шетінде бөлінген көріністі сүйреп қоюға рұқсат беру</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – Bluetooth құрылғысы қосылды</translation>
 <translation id="9177859716483578738">Жалғастыру үшін <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> сіздің <ph name="FIELDS_STRING" /> деректеріңізді осы сайтпен бөліседі. Осы сайттың <ph name="BEGIN_LINK" />Құпиялық саясатын<ph name="END_LINK" /> қараңыз.</translation>
 <translation id="9178061802301856367">Кіру деректерін жою</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb
index 07e76dc..77093fa 100644
--- a/chrome/app/resources/generated_resources_km.xtb
+++ b/chrome/app/resources/generated_resources_km.xtb
@@ -3245,6 +3245,7 @@
 <translation id="3226487301970807183">បិទ/បើកផ្ទាំងចំហៀង​ដែលតម្រឹមខាងឆ្វេង</translation>
 <translation id="322708765617468434">អ្នកអាច​បញ្ចូលមនុស្ស​ម្នាក់ទៀត​ទៅក្នុង​ឧបករណ៍​បានជានិច្ច បន្ទាប់ពី​រៀបចំហើយ។ មនុស្សម្នាក់ៗ​អាចកំណត់​បទពិសោធន៍ប្រើប្រាស់​របស់ខ្លួន​ឱ្យមាន​លក្ខណៈផ្ទាល់ខ្លួន និងរក្សា​ទិន្នន័យជា​លក្ខណៈឯកជន។</translation>
 <translation id="3227137524299004712">ម៉ៃក្រូហ្វូន</translation>
+<translation id="3227701057281907159">កំពុងប្រើ​បំណះ</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{ដកចេញ ឬ​ជំនួសវា​ដោយ​កម្មវិធីបន្ថែម​ស្រដៀងគ្នា​ពី <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />។}other{ដកចេញ ឬ​ជំនួស​ពួកវា​ដោយ​កម្មវិធីបន្ថែម​ស្រដៀងគ្នា​ពី <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">ពិនិត្យមើល​កាលបរិច្ឆេទ</translation>
 <translation id="3230539834943294477">មើល​អត្ថបទជំនួយ ឬ​ស្វែងរក​ជំនួយ​ឧបករណ៍</translation>
@@ -3409,6 +3410,7 @@
 <translation id="3347086966102161372">ថតចម្លងអាសយដ្ឋានរូបភាព</translation>
 <translation id="3348038390189153836">ឧបករណ៍ផ្ទុកដែលអាចដកចេញត្រូវបានបានរកឃើញ</translation>
 <translation id="3348131053948466246">បានណែនាំរូប​អារម្មណ៍។ សូមចុចឡើងលើ ឬចុះក្រោម ដើម្បីរុករក និងចុច "enter" ដើម្បីបញ្ចូល។</translation>
+<translation id="3348973040180736882">កំពុង​ពន្លា</translation>
 <translation id="3349933790966648062">បរិមាណអង្គចងចាំដែលកំពុងដំណើរការ</translation>
 <translation id="3350450887151703713">ចាក់​ឡើងវិញ 10 វិនាទី</translation>
 <translation id="3351472127384196879">បញ្ចូល ឬ​កំណត់ទីតាំង​ប៊ូតុង​នៅលើ​ប៊ិករបស់អ្នក</translation>
@@ -11770,6 +11772,7 @@
 <translation id="9173063514323762371">&amp;លាក់​របារចំណាំ</translation>
 <translation id="917350715406657904">អ្នកបានឈានដល់រយៈពេលកំណត់​ ដែលមាតាបិតារបស់អ្នក​បានកំណត់សម្រាប់ <ph name="APP_NAME" /> ហើយ។ អ្នកអាចប្រើ​កម្មវិធីនេះ​​រយៈពេល <ph name="TIME_LIMIT" /> នៅថ្ងៃស្អែក។</translation>
 <translation id="9174401638287877180">បញ្ជូន​ទិន្នន័យនៃការ​ប្រើប្រាស់ និង​ការវិភាគ។ ជួយធ្វើឱ្យ​បទពិសោធន៍ប្រើប្រាស់ Android របស់កូនអ្នក​ប្រសើរឡើង ដោយ​បញ្ជូន​ទិន្នន័យ​នៃការ​វិភាគ ​​ឧបករណ៍ និង​ការប្រើប្រាស់កម្មវិធី​ទៅ Google ដោយ​ស្វ័យប្រវត្តិ។ សកម្មភាពនេះ​នឹងមិនត្រូវ​បានធ្វើឡើង ដើម្បី​កំណត់​អត្តសញ្ញាណ​កូន​របស់អ្នក​នោះទេ តែការធ្វើបែបនេះ​នឹងជួយដល់ស្ថិរភាពកម្មវិធី និងប្រព័ន្ធ ព្រមទាំង​ការកែលម្អ​ផ្សេងទៀត។ ទិន្នន័យ​ប្រមូលបាន​មួយចំនួន​ក៏នឹង​ជួយដល់​កម្មវិធី និង​ដៃគូ Google ដូចជា​អ្នកអភិវឌ្ឍន៍ Android ផងដែរ។ ប្រសិនបើ​ការកំណត់​សកម្មភាព​កម្មវិធី និង​គេហទំព័រ​បន្ថែម​ត្រូវបាន​បើកសម្រាប់​កូនរបស់អ្នក នោះ​ទិន្នន័យនេះ​អាចត្រូវ​បានរក្សាទុក​ទៅក្នុង​គណនី Google របស់គាត់។</translation>
+<translation id="9174854240439014335">អនុញ្ញាតឱ្យ​អូស​ហើយ​ទម្លាក់​ទិដ្ឋភាព​បំបែក​នៅគែម​ខាងឆ្វេង ឬខាងស្ដាំ​នៃវិនដូ</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - បាន​ភ្ជាប់​ឧបករណ៍​ប៊្លូធូស​</translation>
 <translation id="9177859716483578738">ដើម្បី​បន្ត <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> នឹង​ចែករំលែក<ph name="FIELDS_STRING" />របស់អ្នក​ជាមួយ​គេហទំព័រ​នេះ។ សូមមើល<ph name="BEGIN_LINK" />គោលការណ៍​ឯកជនភាព<ph name="END_LINK" />របស់​គេហទំព័រ​នេះ។</translation>
 <translation id="9178061802301856367">លុប​ទិន្នន័យ​សម្រាប់​ចូលគណនី</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index a4dcb85..90848682 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -3247,6 +3247,7 @@
 <translation id="3226487301970807183">Сол жактагы капталдагы тилкени өчүрүү/күйгүзүү</translation>
 <translation id="322708765617468434">Тууралагандан кийин түзмөккө каалаган убакта башка кишини кошо аласыз. Ар бир адам интерфейсти жекелештирип, маалыматын купуя сактай алат.</translation>
 <translation id="3227137524299004712">Микрофон</translation>
+<translation id="3227701057281907159">Оңдолууда</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Аны <ph name="BEGIN_LINK" />Chrome Интернет дүкөнүнөн<ph name="END_LINK" /> өчүрүңүз же окшош кеңейтүүлөр менен алмаштырыңыз.}other{Аларды <ph name="BEGIN_LINK" />Chrome Интернет дүкөнүнөн<ph name="END_LINK" /> өчүрүңүз же окшош кеңейтүүлөр менен алмаштырыңыз.}}</translation>
 <translation id="3229254977651514276">Күндү текшерүү</translation>
 <translation id="3230539834943294477">Макалаларды окуп же түзмөктү колдонуу боюнча жардам алыңыз</translation>
@@ -3411,6 +3412,7 @@
 <translation id="3347086966102161372">С&amp;үрөт дарегин көчүрүү</translation>
 <translation id="3348038390189153836">Көчмө түзмөк табылды</translation>
 <translation id="3348131053948466246">Быйтыкча сунушталды. Чабыттоо үчүн өйдө же ылдый жебени басыңыз, ал эми киргизүү үчүн Enter баскычын басыңыз.</translation>
+<translation id="3348973040180736882">Кысылган файлдан чыгарылууда</translation>
 <translation id="3349933790966648062">Эстутумдун колдонулушу</translation>
 <translation id="3350450887151703713">10 секундду кайталоо</translation>
 <translation id="3351472127384196879">Калемдеги баскычтарды кошуп же табыңыз</translation>
@@ -11772,6 +11774,7 @@
 <translation id="9173063514323762371">&amp;Кыстармалар тилкесин жашыруу</translation>
 <translation id="917350715406657904">Ата-энең <ph name="APP_NAME" /> колдонмосуна койгон чекке жеттиң. Аны эртең <ph name="TIME_LIMIT" /> колдоно аласың.</translation>
 <translation id="9174401638287877180">Колдонуу жана мүчүлүштүктөрдү аныктоо маалыматын жөнөтүү. Балаңыздын Android'ди колдонуу тажрыйбасын жакшыртууга көмөктөшүп, мүчүлүштүктөрдү издөө жана түзмөк менен колдонмолорду пайдалануу маалыматын автоматтык түрдө Google'га жөнөтүүгө уруксат бериңиз. Бул маалымат балаңыздын өздүгүн аныктоо үчүн колдонулбайт жана тутум менен колдонмонун кыйла туруктуу иштешин камсыз кылууга жана башка нерселерди жакшыртууга көмөктөшөт. Айрым маалыматтар тобу Google колдонмолоруна жана Android'дин иштеп чыгуучулары сыяктуу өнөктөштөрүнө да жардам берет. Эгер кошумча Колдонмолор жана Интернеттеги аракеттер таржымалы балаңыз үчүн күйгүзүлгөн болсо, бул маалымат анын Google аккаунтуна сакталышы мүмкүн.</translation>
+<translation id="9174854240439014335">Бөлүп көрүү режиминде терезенин сол же оң жагына сүйрөп барууга уруксат берүү</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – Bluetooth түзмөгү туташты</translation>
 <translation id="9177859716483578738">Улантуу үчүн <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> <ph name="FIELDS_STRING" /> ушул сайт менен бөлүшөт. Бул сайттын <ph name="BEGIN_LINK" />купуялык эрежелерин<ph name="END_LINK" /> караңыз.</translation>
 <translation id="9178061802301856367">Аккаунтка кирүү дайындарын өчүрүү</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 7006fd7..d315755 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -3234,6 +3234,7 @@
 <translation id="3226487301970807183">Pārvietot kreisās puses sānu paneli</translation>
 <translation id="322708765617468434">Pēc iestatīšanas varēsiet jebkurā brīdī ierīcē pievienot citu personu. Katra persona var personalizēt savu pieredzi, un katras personas dati ir konfidenciāli.</translation>
 <translation id="3227137524299004712">Mikrofons</translation>
+<translation id="3227701057281907159">Notiek ielāpa lietošana…</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Noņemiet paplašinājumu vai aizstājiet to ar līdzīgiem paplašinājumiem no <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.}zero{Noņemiet paplašinājumus vai aizstājiet tos ar līdzīgiem paplašinājumiem no <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.}one{Noņemiet paplašinājumus vai aizstājiet tos ar līdzīgiem paplašinājumiem no <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.}other{Noņemiet paplašinājumus vai aizstājiet tos ar līdzīgiem paplašinājumiem no <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" />.}}</translation>
 <translation id="3229254977651514276">Pārbaudiet datumu</translation>
 <translation id="3230539834943294477">Varat skatīt palīdzības rakstus vai atrast ierīces atbalsta informāciju</translation>
@@ -3398,6 +3399,7 @@
 <translation id="3347086966102161372">Kopēt attēla adresi</translation>
 <translation id="3348038390189153836">Konstatēta noņemama ierīce</translation>
 <translation id="3348131053948466246">Tiek ieteikta emocijzīme. Lai pārvietotos, nospiediet augšupvērsto vai lejupvērsto bultiņu. Lai ievietotu emocijzīmi, nospiediet ievadīšanas taustiņu.</translation>
+<translation id="3348973040180736882">Notiek atspiešana…</translation>
 <translation id="3349933790966648062">Atmiņas pēdas nospiedums</translation>
 <translation id="3350450887151703713">Atskaņot 10 sekundes vēlreiz</translation>
 <translation id="3351472127384196879">Pievienojiet vai atrodiet pildspalvas pogas</translation>
@@ -11762,6 +11764,7 @@
 <translation id="9173063514323762371">&amp;Slēpt grāmatzīmju joslu</translation>
 <translation id="917350715406657904">Ir sasniegts laika ierobežojums, ko jūsu vecāki iestatīja lietotnes <ph name="APP_NAME" /> izmantošanai. Rīt varēsiet to izmantot <ph name="TIME_LIMIT" />.</translation>
 <translation id="9174401638287877180">Lietojuma un diagnostikas datu sūtīšana. Palīdziet uzlabot bērna Android lietošanas pieredzi, automātiski nosūtot diagnostikas, ierīces un lietotņu lietojuma datus uzņēmumam Google. Šī informācija netiks izmantota jūsu bērna identificēšanai, un tā palīdzēs uzlabot sistēmas un lietotņu stabilitāti un daudz ko citu. Noteiktus apkopotus datus izmantos arī Google lietotņu izstrādātāji un partneri, piemēram, Android izstrādātāji. Ja jūsu bērnam ir ieslēgts iestatījums “papildu darbības tīmeklī un lietotnēs”, šie dati var tikt saglabāti bērna Google kontā.</translation>
+<translation id="9174854240439014335">Atļaut dalītā skata vilkšanu un nomešanu loga kreisajā vai labajā malā</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> — pievienota Bluetooth ierīce</translation>
 <translation id="9177859716483578738">Lai turpinātu, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> kopīgos ar šo vietni šādus jūsu datus: <ph name="FIELDS_STRING" />. Skatiet šīs vietnes <ph name="BEGIN_LINK" />konfidencialitātes politiku<ph name="END_LINK" />.</translation>
 <translation id="9178061802301856367">Pierakstīšanās datu dzēšana</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index b30935b..b8b995f1 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -3243,6 +3243,7 @@
 <translation id="3226487301970807183">Зүүн талд зэрэгцүүлсэн хажуугийн самбарыг асаах/унтраах</translation>
 <translation id="322708765617468434">Та тохируулгын дараа төхөөрөмжид хүссэн үедээ өөр хүн нэмэх боломжтой. Хүн бүр хэрэглээгээ хувийн болгох ба өгөгдлийг хувийн байлгах боломжтой.</translation>
 <translation id="3227137524299004712">Микрофон</translation>
+<translation id="3227701057281907159">Нөхөж байна</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Үүнийг хасах эсвэл <ph name="BEGIN_LINK" />Chrome Веб дэлгүүрээс<ph name="END_LINK" /> төстэй өргөтгөлөөр солино уу.}other{Тэдгээрийг хасах эсвэл <ph name="BEGIN_LINK" />Chrome Веб дэлгүүрээс<ph name="END_LINK" /> төстэй өргөтгөлүүдээр солино уу.}}</translation>
 <translation id="3229254977651514276">Огноог шалгана уу</translation>
 <translation id="3230539834943294477">Тусламжийн нийтлэлийг харах эсвэл төхөөрөмжийн тусламжийг олно уу</translation>
@@ -3407,6 +3408,7 @@
 <translation id="3347086966102161372">Зургийн хаягийг хуулах</translation>
 <translation id="3348038390189153836">Зөөврийн төхөөрөмж илэрсэн байна</translation>
 <translation id="3348131053948466246">Санал болгож буй эможи. Дээш эсвэл доош дарж шилжээд, enter дарж оруулна.</translation>
+<translation id="3348973040180736882">Задалж байна</translation>
 <translation id="3349933790966648062">Санах ойн ул мөр</translation>
 <translation id="3350450887151703713">10 секунд дахин тоглуулах</translation>
 <translation id="3351472127384196879">Үзгэн дээрээ товчлуурууд нэмэх эсвэл тэдгээрийн байрлалыг тогтоох</translation>
@@ -11763,6 +11765,7 @@
 <translation id="9173063514323762371">&amp;Хавчуургын хэсгийг нуух</translation>
 <translation id="917350715406657904">Та <ph name="APP_NAME" /> дээр таны эцэг эхийн тохируулсан цагийн хязгаарт хүрсэн байна. Та түүнийг маргааш <ph name="TIME_LIMIT" />-н турш ашиглах боломжтой.</translation>
 <translation id="9174401638287877180">Ашиглалт болон оношилгооны өгөгдлийг илгээнэ үү. Оношилгоо, төхөөрөмж болон аппын ашиглалтын өгөгдлийг Google-д автоматаар илгээж, хүүхдийнхээ Android-н хэрэглээг сайжруулахад тусална уу. Үүнийг таны хүүхдийг тодорхойлоход ашиглахгүй бөгөөд энэ нь систем, аппын тогтвортой байдал болон бусад зүйлийг сайжруулахад тусална. Хуримтлуулсан зарим өгөгдөл нь Google-н аппууд болон Android хөгжүүлэгч зэрэг түншүүдэд мөн тусална. Хэрэв таны хүүхдийн Веб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг түүний Google Бүртгэлд хадгалж болзошгүй.</translation>
+<translation id="9174854240439014335">Цонхны зүүн, баруун ирмэгээс чирч буулгаснаар хуваасан харагдах байдал үүсгэхийг зөвшөөрөх</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - Bluetooth төхөөрөмжийг холбосон</translation>
 <translation id="9177859716483578738">Үргэлжлүүлэхийн тулд <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> таны <ph name="FIELDS_STRING" />-г энэ сайттай хуваалцана. Энэ сайтын <ph name="BEGIN_LINK" />Нууцлалын бодлогыг<ph name="END_LINK" /> харна уу.</translation>
 <translation id="9178061802301856367">Нэвтрэх өгөгдлийг устгах</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index d246183..9f94f71 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -3246,6 +3246,7 @@
 <translation id="3226487301970807183">डाव्या बाजूला अलाइन केलेले साइड पॅनल टॉगल करा</translation>
 <translation id="322708765617468434">सेटअप केल्यानंतर तुम्ही नेहमी दुसऱ्या व्यक्तीला डिव्हाइसमध्ये जोडू शकता. प्रत्येक व्यक्ती स्वतःचा अनुभव पर्सनलाइझ करू शकते आणि डेटा खाजगी ठेवू शकते.</translation>
 <translation id="3227137524299004712">मायक्रोफोन</translation>
+<translation id="3227701057281907159">पॅच करत आहे</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{<ph name="BEGIN_LINK" />Chrome वेब स्टोअर<ph name="END_LINK" /> वरील सारख्या एक्स्टेंशनसह ते काढून टाका किंवा बदला.}other{<ph name="BEGIN_LINK" />Chrome वेब स्टोअर<ph name="END_LINK" /> वरील सारख्या एक्स्टेंशनसह ती काढून टाका किंवा बदला}}</translation>
 <translation id="3229254977651514276">तारीख तपासा</translation>
 <translation id="3230539834943294477">मदतपर लेख पहा किंवा डिव्हाइस सपोर्ट शोधा</translation>
@@ -3410,6 +3411,7 @@
 <translation id="3347086966102161372">इमेज पत्ता कॉपी करा</translation>
 <translation id="3348038390189153836">काढण्यायोग्य डिव्हाइस आढळले</translation>
 <translation id="3348131053948466246">इमोजी सुचवल्या आहेत. नेव्हिगेट करण्यासाठी वर किंवा खाली प्रेस करा आणि घालण्यासाठी एंटर करा.</translation>
+<translation id="3348973040180736882">डीकाँप्रेस करत आहे</translation>
 <translation id="3349933790966648062">मेमरी फुटप्रिंट</translation>
 <translation id="3350450887151703713">१० सेकंद रीप्ले करा</translation>
 <translation id="3351472127384196879">तुमच्या पेनवर बटणे जोडा किंवा शोधा</translation>
@@ -11773,6 +11775,7 @@
 <translation id="9173063514323762371">&amp;बुकमार्क बार लपवा</translation>
 <translation id="917350715406657904">तुमच्या पालकाने <ph name="APP_NAME" /> साठी सेट केलेली वेळ मर्यादा तुम्ही गाठली आहे. तुम्ही ते उद्या <ph name="TIME_LIMIT" /> साठी वापरू शकता.</translation>
 <translation id="9174401638287877180">वापर आणि निदान डेटा पाठवा. Google ला निदान आणि डिव्हाइस आणि अ‍ॅप वापर डेटा आपोआप पाठवून तुमच्या मुलाच्या Android अनुभवात सुधारणा करण्यात मदत करा. हे तुमच्या मुलाला ओळखण्यासाठी वापरले जाणार नाही आणि सिस्टीम व अ‍ॅप स्थिरता तसेच इतर सुधारणांमध्ये मदत करेल. काही अ‍ॅग्रिगेट डेटा Google अ‍ॅप्स आणि Android डेव्हलपर यांसारख्या भागीदारांनादेखील मदत करेल. तुमच्या मुलासाठी अतिरिक्त वेब आणि अ‍ॅप अ‍ॅक्टिव्हिटी सेटिंग सुरू केलेले असल्यास, हा डेटा त्यांच्या Google खात्यामध्ये स्टोअर केला जाऊ शकतो.</translation>
+<translation id="9174854240439014335">विंडोच्या डाव्या किंवा उजव्या कडेवरून विभाजित दृश्य ड्रॅग करून ड्रॉप करायला अनुमती द्या</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - ब्लूटूथ डिव्हाइस कनेक्ट केले</translation>
 <translation id="9177859716483578738">पुढे सुरू ठेवण्यासाठी, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> तुमचे <ph name="FIELDS_STRING" /> या साइटसोबत शेअर करेल. या साइटचे <ph name="BEGIN_LINK" />गोपनीयता धोरण<ph name="END_LINK" /> पहा.</translation>
 <translation id="9178061802301856367">साइन इन डेटा हटवा</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb
index b46c2dee..86c59c0f 100644
--- a/chrome/app/resources/generated_resources_ne.xtb
+++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -3230,6 +3230,7 @@
 <translation id="3226487301970807183">बायाँतिर एलाइन गरिएको साइड प्यानल टगल गर्नुहोस्</translation>
 <translation id="322708765617468434">तपाईं सेटअप गर्ने प्रक्रिया पूरा भएपछि जुनसुकै बेला डिभाइसमा अर्को व्यक्तिलाई समावेश गर्न सक्नुहुन्छ। हरेक व्यक्ति आफूले प्रयोग गर्ने सुविधा पर्सनलाइज गर्न र जानकारी गोप्य राख्न सक्छन्।</translation>
 <translation id="3227137524299004712">माइक्रोफोन</translation>
+<translation id="3227701057281907159">प्याच गरिँदछ छ</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{यो एक्स्टेन्सन हटाउनुहोस् वा यसलाई <ph name="BEGIN_LINK" />Chrome वेब स्टोर<ph name="END_LINK" />मा उपलब्ध उस्तै एक्स्टेन्सनले प्रतिस्थापन गर्नुहोस्।}other{यी एक्स्टेन्सन हटाउनुहोस् वा यिनलाई <ph name="BEGIN_LINK" />Chrome वेब स्टोर<ph name="END_LINK" />मा उपलब्ध उस्तै एक्स्टेन्सनहरूले प्रतिस्थापन गर्नुहोस्}}</translation>
 <translation id="3229254977651514276">मिति जाँच गर्नुहोस्</translation>
 <translation id="3230539834943294477">मद्दतसम्बन्धी लेख हेर्नुहोस् वा डिभाइसको ग्राहक सेवा विभागमा सम्पर्क गर्नुहोस्</translation>
@@ -3394,6 +3395,7 @@
 <translation id="3347086966102161372">फोटो ठेगाना कपी गर्नुहोस्</translation>
 <translation id="3348038390189153836">हटाउन सकिने यन्त्र पत्ता लगाइयो</translation>
 <translation id="3348131053948466246">सुझाव गरिएको इमोजी। नेभिगेट गर्न माथि फर्केको वा तल फर्केको तीर कुञ्जी थिच्नुहोस् अनि इमोजी इन्सर्ट गर्न Enter थिच्नुहोस्।</translation>
+<translation id="3348973040180736882">डिकम्प्रेस गरिँदै छ</translation>
 <translation id="3349933790966648062">मेमोरीको इतिहास</translation>
 <translation id="3350450887151703713">१० सेकेन्ड रिप्ले गर्नुहोस्</translation>
 <translation id="3351472127384196879">पेनमा नयाँ बटन हाल्नुहोस् वा पहिले नै भएका बटनहरू पत्ता लगाउनुहोस्</translation>
@@ -11753,6 +11755,7 @@
 <translation id="9173063514323762371">बुकमार्क बार लुकाउनुहोस्</translation>
 <translation id="917350715406657904">तपाईं आफ्ना अभिभावकले <ph name="APP_NAME" /> मा निर्धारण गर्नुभएको समयको सीमामा पुग्नुभयो। तपाईं भोलि यसलाई <ph name="TIME_LIMIT" /> प्रयोग गर्न सक्नुहुन्छ।</translation>
 <translation id="9174401638287877180">प्रयोग तथा निदानसम्बन्धी डेटा पठाउनुहोस्। निदान, डिभाइस र एपको प्रयोगसम्बन्धी डेटा स्वतः Google लाई पठाएर आफ्ना बच्चाको Android सम्बन्धी अनुभवमा सुधार ल्याउन मद्दत गर्नुहोस्। यस्तो डेटा तपाईंका बच्चाको पहिचान गर्ने प्रयोजनका लागि प्रयोग गरिने छैन र यसले सिस्टम तथा एपको स्थिरता र अन्य कुराहरूमा सुधार ल्याउन मद्दत गर्ने छ। केही समग्र डेटाले Google का एप तथा Android का विकासकर्ता जस्ता साझेदारहरूलाई पनि मद्दत गर्ने छन्। तपाईंका बच्चाका खातामा वेब तथा एपसम्बन्धी अतिरिक्त गतिविधिको सेटिङ सक्रिय गरिएको छ भने यो डेटा उनको Google खातामा सेभ गरिन सक्छ।</translation>
+<translation id="9174854240439014335">स्प्लिट भ्यूलाई विन्डोको बायाँ वा दायाँ किनारमा ड्र्याग एन्ड ड्रप गर्ने अनुमति दिनुहोस्</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - ब्लुटुथ यन्त्र जडान गरिएको छ</translation>
 <translation id="9177859716483578738"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ले जारी राख्ने प्रयोजनका लागि तपाईंको <ph name="FIELDS_STRING" /> यो साइटसँग सेयर गर्ने छ। यो साइटको <ph name="BEGIN_LINK" />गोपनीयता नीति<ph name="END_LINK" /> हेर्नुहोस्।</translation>
 <translation id="9178061802301856367">साइनइन डेटा मेट्नुहोस्</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index 35b983e..e2a330a 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -3241,6 +3241,7 @@
 <translation id="3226487301970807183">Slå av/på venstrejustert sidepanel</translation>
 <translation id="322708765617468434">Du kan når som helst legge til flere personer på enheten etter konfigureringen. Hver person kan få en personlig opplevelse og holde dataene sine private.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
+<translation id="3227701057281907159">Feilretting</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Fjern eller erstatt den med lignende utvidelser fra <ph name="BEGIN_LINK" />Chrome Nettmarked<ph name="END_LINK" />.}other{Fjern eller erstatt dem med lignende utvidelser fra <ph name="BEGIN_LINK" />Chrome Nettmarked<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">Sjekk datoen</translation>
 <translation id="3230539834943294477">Se hjelpeartikler, eller finn brukerstøtte for enheten</translation>
@@ -3405,6 +3406,7 @@
 <translation id="3347086966102161372">K&amp;opiér bildeadressen</translation>
 <translation id="3348038390189153836">Oppdaget flyttbar enhet</translation>
 <translation id="3348131053948466246">En emoji er foreslått. Bruk pil opp og pil ned for å navigere og Enter for å sette inn.</translation>
+<translation id="3348973040180736882">Dekomprimering</translation>
 <translation id="3349933790966648062">Minnebruk</translation>
 <translation id="3350450887151703713">Spill av de siste 10 sekundene på nytt</translation>
 <translation id="3351472127384196879">Legg til eller finn knapper på pekepennen</translation>
@@ -11763,6 +11765,7 @@
 <translation id="9173063514323762371">&amp;Skjul bokmerkeraden</translation>
 <translation id="917350715406657904">Du har nådd tidsgrensen som forelderen din har angitt for <ph name="APP_NAME" />. Du kan bruke appen i <ph name="TIME_LIMIT" /> i morgen.</translation>
 <translation id="9174401638287877180">Send bruks- og diagnostikkdata. Hjelp til med å gjøre Android-opplevelsen bedre for barnet ditt ved å sende diagnostikk-, enhets- og appbruksdata til Google automatisk. Disse dataene brukes ikke til å identifisere barnet ditt, men bidrar til å gjøre systemet og appene bedre og mer stabile. Noen aggregerte data hjelper også Google-apper og -partnere, for eksempel Android-utviklere. Hvis du har slått på innstillingen for annen nett- og appaktivitet for barnet ditt, kan disse dataene bli lagret i barnets Google-konto.</translation>
+<translation id="9174854240439014335">Tillat dra-og-slipp for delt visning på venstre eller høyre kant av vinduet</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – en Bluetooth-enhet er tilkoblet</translation>
 <translation id="9177859716483578738">Før du kan fortsette, må <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> dele <ph name="FIELDS_STRING" /> med dette nettstedet. Se nettstedets <ph name="BEGIN_LINK" />personvernregler<ph name="END_LINK" />.</translation>
 <translation id="9178061802301856367">Slett påloggingsinformasjon</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb
index 9b20b86..c3dff1b5 100644
--- a/chrome/app/resources/generated_resources_pa.xtb
+++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -3249,6 +3249,7 @@
 <translation id="3226487301970807183">ਖੱਬੇ ਪਾਸੇ ਇਕਸਾਰ ਕੀਤੇ ਸਾਈਡ ਪੈਨਲ ਨੂੰ ਟੌਗਲ ਕਰੋ</translation>
 <translation id="322708765617468434">ਤੁਸੀਂ ਸੈੱਟਅੱਪ ਤੋਂ ਬਾਅਦ ਕਿਸੇ ਵੀ ਵੇਲੇ ਹੋਰ ਵਿਅਕਤੀ ਨੂੰ ਸ਼ਾਮਲ ਕਰ ਸਕਦੇ ਹੋ। ਹਰੇਕ ਵਿਅਕਤੀ ਆਪਣੇ ਅਨੁਭਵ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾ ਸਕਦਾ ਹੈ ਅਤੇ ਡਾਟੇ ਨੂੰ ਨਿੱਜੀ ਰੱਖ ਸਕਦਾ ਹੈ।</translation>
 <translation id="3227137524299004712">ਮਾਈਕ੍ਰੋਫੋਨ</translation>
+<translation id="3227701057281907159">ਪੈਚ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{ਇਸ ਨੂੰ <ph name="BEGIN_LINK" />Chrome ਵੈੱਬ ਸਟੋਰ<ph name="END_LINK" /> ਵਿੱਚ ਉਪਲਬਧ ਮਿਲਦੀਆਂ-ਜੁਲਦੀਆਂ ਐਕਸਟੈਂਸ਼ਨਾਂ ਨਾਲ ਬਦਲੋ ਜਾਂ ਹਟਾਓ।}one{ਇਸ ਨੂੰ <ph name="BEGIN_LINK" />Chrome ਵੈੱਬ ਸਟੋਰ<ph name="END_LINK" /> ਵਿੱਚ ਉਪਲਬਧ ਮਿਲਦੀਆਂ-ਜੁਲਦੀਆਂ ਐਕਸਟੈਂਸ਼ਨਾਂ ਨਾਲ ਬਦਲੋ ਜਾਂ ਹਟਾਓ}other{ਇਨ੍ਹਾਂ ਨੂੰ <ph name="BEGIN_LINK" />Chrome ਵੈੱਬ ਸਟੋਰ<ph name="END_LINK" /> ਵਿੱਚ ਉਪਲਬਧ ਮਿਲਦੀਆਂ-ਜੁਲਦੀਆਂ ਐਕਸਟੈਂਸ਼ਨਾਂ ਨਾਲ ਬਦਲੋ ਜਾਂ ਹਟਾਓ}}</translation>
 <translation id="3229254977651514276">ਤਾਰੀਖ ਦੀ ਜਾਂਚ ਕਰੋ</translation>
 <translation id="3230539834943294477">ਮਦਦ ਲੇਖ ਦੇਖੋ ਜਾਂ ਡੀਵਾਈਸ ਸੰਬੰਧੀ ਸਹਾਇਤਾ ਲੱਭੋ</translation>
@@ -3413,6 +3414,7 @@
 <translation id="3347086966102161372">ਚਿੱਤਰ ਪਤਾ ਕਾ&amp;ਪੀ ਕਰੋ</translation>
 <translation id="3348038390189153836">ਹਟਾਉਣਯੋਗ ਡੀਵਾਈਸ ਖੋਜੀ ਗਈ</translation>
 <translation id="3348131053948466246">ਇਮੋਜੀ ਸੁਝਾਇਆ ਗਿਆ। ਨੈਵੀਗੇਟ ਕਰਨ ਲਈ ਉੱਪਰ ਜਾਂ ਹੇਠਾਂ ਵੱਲ ਦੀ ਤੀਰ ਕੁੰਜੀ ਦਬਾਓ ਅਤੇ ਦਾਖਲ ਕਰਨ ਲਈ Enter ਦਬਾਓ।</translation>
+<translation id="3348973040180736882">ਨਪੀੜਨ ਹਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ</translation>
 <translation id="3349933790966648062">ਵਰਤੀ ਗਈ ਮੈਮੋਰੀ</translation>
 <translation id="3350450887151703713">10 ਸਕਿੰਟ ਮੁੜ-ਚਲਾਓ</translation>
 <translation id="3351472127384196879">ਆਪਣੇ ਪੈੱਨ 'ਤੇ ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ ਜਾਂ ਲੱਭੋ</translation>
@@ -11776,6 +11778,7 @@
 <translation id="9173063514323762371">ਬੁੱਕਮਾਰਕ ਬਾਰ ਲੁਕਾਓ</translation>
 <translation id="917350715406657904">ਤੁਸੀਂ <ph name="APP_NAME" /> ਲਈ ਤੁਹਾਡੇ ਮਾਂ-ਪਿਓ ਵੱਲੋਂ ਸੈੱਟ ਕੀਤੀ ਗਈ ਸਮਾਂ ਸੀਮਾ ਪੂਰੀ ਕਰ ਲਈ ਹੈ। ਤੁਸੀਂ ਕੱਲ੍ਹ ਇਸਨੂੰ <ph name="TIME_LIMIT" /> ਮਿੰਟਾਂ ਲਈ ਵਰਤ ਸਕਦੇ ਹੋ।</translation>
 <translation id="9174401638287877180">ਵਰਤੋਂ ਅਤੇ ਤਸ਼ਖੀਸ ਡਾਟਾ ਭੇਜੋ। Google ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਤਸ਼ਖੀਸ, ਡੀਵਾਈਸ ਅਤੇ ਐਪ ਵਰਤੋਂ ਡਾਟਾ ਭੇਜ ਕੇ ਆਪਣੇ ਬੱਚੇ ਦੇ Android ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰੋ। ਇਸਦੀ ਵਰਤੋਂ ਤੁਹਾਡੇ ਬੱਚੇ ਦੀ ਪਛਾਣ ਕਰਨ ਲਈ ਨਹੀਂ ਕੀਤੀ ਜਾਵੇਗੀ ਅਤੇ ਸਿਸਟਮ ਅਤੇ ਐਪ ਸਥਿਰਤਾ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਮਿਲੇਗੀ। ਕੁਝ ਏਕੀਕ੍ਰਿਤ ਜਾਣਕਾਰੀ Google ਐਪਾਂ ਅਤੇ ਪਾਰਟਨਰਾਂ, ਜਿਵੇਂ ਕਿ Android ਵਿਕਾਸਕਾਰਾਂ ਦੀ ਵੀ ਮਦਦ ਕਰੇਗੀ। ਜੇ ਤੁਹਾਡੇ ਬੱਚੇ ਲਈ ਵਧੀਕ 'ਵੈੱਬ ਅਤੇ ਐਪ ਸਰਗਰਮੀ' ਸੈਟਿੰਗ ਚਾਲੂ ਹੋਵੇ, ਤਾਂ ਇਹ ਡਾਟਾ ਉਹਨਾਂ ਦੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।</translation>
+<translation id="9174854240439014335">ਵਿੰਡੋ ਦੇ ਸੱਜੇ ਜਾਂ ਖੱਬੇ ਕੋਨੇ 'ਤੇ ਸਪਲਿਟ ਦ੍ਰਿਸ਼ ਨੂੰ ਘਸੀਟਣ ਅਤੇ ਛੱਡਣ ਦੀ ਆਗਿਆ ਦਿਓ</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਕਨੈਕਟ ਕੀਤੀ ਗਈ</translation>
 <translation id="9177859716483578738">ਜਾਰੀ ਰੱਖਣ ਲਈ, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ਤੁਹਾਡੇ <ph name="FIELDS_STRING" /> ਨੂੰ ਇਸ ਸਾਈਟ ਨਾਲ ਸਾਂਝਾ ਕਰੇਗਾ। ਇਸ ਸਾਈਟ ਦੀ <ph name="BEGIN_LINK" />ਪਰਦੇਦਾਰੀ ਨੀਤੀ<ph name="END_LINK" /> ਦੇਖੋ।</translation>
 <translation id="9178061802301856367">ਸਾਈਨ-ਇਨ ਡਾਟਾ ਮਿਟਾਓ</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 8f15957..9cae6a5 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -3236,6 +3236,7 @@
 <translation id="3226487301970807183">Показать или скрыть боковую панель слева</translation>
 <translation id="322708765617468434">После настройки вы в любое время сможете добавить на устройство другого человека. У каждого пользователя будет возможность персонализировать устройство и обеспечить конфиденциальность своих данных.</translation>
 <translation id="3227137524299004712">Микрофон</translation>
+<translation id="3227701057281907159">Исправление</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Удалите его или замените другим расширением из <ph name="BEGIN_LINK" />интернет-магазина Chrome<ph name="END_LINK" />.}one{Удалите их или замените другими расширениями из <ph name="BEGIN_LINK" />интернет-магазина Chrome<ph name="END_LINK" />.}few{Удалите их или замените другими расширениями из <ph name="BEGIN_LINK" />интернет-магазина Chrome<ph name="END_LINK" />.}many{Удалите их или замените другими расширениями из <ph name="BEGIN_LINK" />интернет-магазина Chrome<ph name="END_LINK" />.}other{Удалите их или замените другими расширениями из <ph name="BEGIN_LINK" />интернет-магазина Chrome<ph name="END_LINK" />.}}</translation>
 <translation id="3229254977651514276">Проверьте дату.</translation>
 <translation id="3230539834943294477">Открыть справку или обратиться в службу поддержки устройства</translation>
@@ -3400,6 +3401,7 @@
 <translation id="3347086966102161372">&amp;Копировать URL картинки</translation>
 <translation id="3348038390189153836">Обнаружено съемное устройство</translation>
 <translation id="3348131053948466246">Предлагаются эмодзи. Выберите подходящий вариант стрелками вверх или вниз и нажмите Ввод.</translation>
+<translation id="3348973040180736882">Распаковка</translation>
 <translation id="3349933790966648062">Память</translation>
 <translation id="3350450887151703713">Перемотать на 10 секунд назад</translation>
 <translation id="3351472127384196879">Добавьте или переназначьте кнопки пера</translation>
@@ -11770,6 +11772,7 @@
 <translation id="9173063514323762371">Скрыть панель закладок</translation>
 <translation id="917350715406657904">Время, установленное родителями для приложения "<ph name="APP_NAME" />", истекло. Лимит на завтра: <ph name="TIME_LIMIT" />.</translation>
 <translation id="9174401638287877180">Отправка данных об использовании и диагностике. Помогите сделать Android ещё лучше – разрешите автоматически отправлять в Google диагностическую информацию, данные об использовании приложений и самого устройства. Эти данные не будут использоваться для того, чтобы установить личность ребенка. Они помогут нам повысить стабильность приложений и внести другие улучшения. Некоторые агрегированные данные пригодятся партнерам Google, например разработчикам Android. Если у ребенка включена запись дополнительной истории приложений и веб-поиска, эта информация может сохраняться в его аккаунте.</translation>
+<translation id="9174854240439014335">Разрешить перетаскивание к левому или правому краю окна в режиме Split View</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" />: подключено устройство Bluetooth</translation>
 <translation id="9177859716483578738">Чтобы продолжить, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> передаст этому сайту ваши данные (<ph name="FIELDS_STRING" />). Ознакомьтесь с <ph name="BEGIN_LINK" />политикой конфиденциальности<ph name="END_LINK" /> сайта.</translation>
 <translation id="9178061802301856367">Удаление учетных данных</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb
index 018fc36..87293dd6 100644
--- a/chrome/app/resources/generated_resources_sr-Latn.xtb
+++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -3232,6 +3232,7 @@
 <translation id="3226487301970807183">Uključite/isključite bočnu tablu sa leve strane</translation>
 <translation id="322708765617468434">Uvek možete da dodate drugu osobu na uređaj posle podešavanja. Svaka osoba može da personalizuje doživljaj i čuva privatnost podataka.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
+<translation id="3227701057281907159">Koristi se zakrpa</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Uklonite ga ili zamenite sličnim dodacima iz <ph name="BEGIN_LINK" />Chrome veb-prodavnice<ph name="END_LINK" />.}one{Uklonite ih ili zamenite sličnim dodacima iz <ph name="BEGIN_LINK" />Chrome veb-prodavnice<ph name="END_LINK" />}few{Uklonite ih ili zamenite sličnim dodacima iz <ph name="BEGIN_LINK" />Chrome veb-prodavnice<ph name="END_LINK" />}other{Uklonite ih ili zamenite sličnim dodacima iz <ph name="BEGIN_LINK" />Chrome veb-prodavnice<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">Proverite datum</translation>
 <translation id="3230539834943294477">Pogledajte članke pomoći ili pronađite podršku za uređaje</translation>
@@ -3396,6 +3397,7 @@
 <translation id="3347086966102161372">K&amp;opiraj adresu slike</translation>
 <translation id="3348038390189153836">Otkriven je prenosivi uređaj</translation>
 <translation id="3348131053948466246">Emodži je predložen. Pritisnite nagore ili nadole da biste se kretali i Enter za unos.</translation>
+<translation id="3348973040180736882">Dekomprimuje se</translation>
 <translation id="3349933790966648062">Memorijski prostor u upotrebi</translation>
 <translation id="3350450887151703713">Ponovo pusti 10 sekundi</translation>
 <translation id="3351472127384196879">Dodajte ili pronađite dugmad na olovci</translation>
@@ -11764,6 +11766,7 @@
 <translation id="9173063514323762371">Sakrij traku sa obeleživačima</translation>
 <translation id="917350715406657904">Dostigao/la si vremensko ograničenje koje je roditelj podesio za: <ph name="APP_NAME" />. Sutra imaš <ph name="TIME_LIMIT" /> na raspolaganju.</translation>
 <translation id="9174401638287877180">Šaljite podatke o korišćenju i dijagnostičke podatke. Pomozite nam da poboljšamo Android doživljaj za dete tako što ćete automatski slati Google-u podatke o dijagnostici i korišćenju uređaja i aplikacija. Te informacije se neće koristiti za identifikaciju deteta i pomoći će u održavanju stabilnosti sistema i aplikacije i drugim podešavanjima. Neki objedinjeni podaci će takođe pomoći Google aplikacijama i partnerima, poput Android programera. Ako za dete uključite podešavanje dodatne aktivnosti na vebu i u aplikacijama, ti podaci će se možda čuvati na Google nalogu deteta.</translation>
+<translation id="9174854240439014335">Dozvoli prevlačenje i otpuštanje u podeljenom prikazu na levoj ili desnoj ivici prozora</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – Bluetooth uređaje je povezan</translation>
 <translation id="9177859716483578738">Da biste nastavili, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> će deliti <ph name="FIELDS_STRING" /> sa ovim sajtom. Pogledajte <ph name="BEGIN_LINK" />politiku privatnosti<ph name="END_LINK" /> ovog sajta.</translation>
 <translation id="9178061802301856367">Izbrišite podatke za prijavljivanje</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 7163056..8edda8d 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -3232,6 +3232,7 @@
 <translation id="3226487301970807183">Укључите/искључите бочну таблу са леве стране</translation>
 <translation id="322708765617468434">Увек можете да додате другу особу на уређај после подешавања. Свака особа може да персонализује доживљај и чува приватност података.</translation>
 <translation id="3227137524299004712">Микрофон</translation>
+<translation id="3227701057281907159">Користи се закрпа</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Уклоните га или замените сличним додацима из <ph name="BEGIN_LINK" />Chrome веб-продавнице<ph name="END_LINK" />.}one{Уклоните их или замените сличним додацима из <ph name="BEGIN_LINK" />Chrome веб-продавнице<ph name="END_LINK" />}few{Уклоните их или замените сличним додацима из <ph name="BEGIN_LINK" />Chrome веб-продавнице<ph name="END_LINK" />}other{Уклоните их или замените сличним додацима из <ph name="BEGIN_LINK" />Chrome веб-продавнице<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">Проверите датум</translation>
 <translation id="3230539834943294477">Погледајте чланке помоћи или пронађите подршку за уређаје</translation>
@@ -3396,6 +3397,7 @@
 <translation id="3347086966102161372">К&amp;опирај адресу слике</translation>
 <translation id="3348038390189153836">Откривен је преносиви уређај</translation>
 <translation id="3348131053948466246">Емоџи је предложен. Притисните нагоре или надоле да бисте се кретали и Enter за унос.</translation>
+<translation id="3348973040180736882">Декомпримује се</translation>
 <translation id="3349933790966648062">Меморијски простор у употреби</translation>
 <translation id="3350450887151703713">Поново пусти 10 секунди</translation>
 <translation id="3351472127384196879">Додајте или пронађите дугмад на оловци</translation>
@@ -11764,6 +11766,7 @@
 <translation id="9173063514323762371">Сакриј траку са обележивачима</translation>
 <translation id="917350715406657904">Достигао/ла си временско ограничење које је родитељ подесио за: <ph name="APP_NAME" />. Сутра имаш <ph name="TIME_LIMIT" /> на располагању.</translation>
 <translation id="9174401638287877180">Шаљите податке о коришћењу и дијагностичке податке. Помозите нам да побољшамо Android доживљај за дете тако што ћете аутоматски слати Google-у податке о дијагностици и коришћењу уређаја и апликација. Те информације се неће користити за идентификацију детета и помоћи ће у одржавању стабилности система и апликације и другим подешавањима. Неки обједињени подаци ће такође помоћи Google апликацијама и партнерима, попут Android програмера. Ако за дете укључите подешавање додатне активности на вебу и у апликацијама, ти подаци ће се можда чувати на Google налогу детета.</translation>
+<translation id="9174854240439014335">Дозволи превлачење и отпуштање у подељеном приказу на левој или десној ивици прозора</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – Bluetooth уређаје је повезан</translation>
 <translation id="9177859716483578738">Да бисте наставили, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ће делити <ph name="FIELDS_STRING" /> са овим сајтом. Погледајте <ph name="BEGIN_LINK" />политику приватности<ph name="END_LINK" /> овог сајта.</translation>
 <translation id="9178061802301856367">Избришите податке за пријављивање</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 5d4423cc..9923630 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -3245,6 +3245,7 @@
 <translation id="3226487301970807183">ఎడమవైపు అమర్చబడిన సైడ్ ప్యానెల్‌ను టోగుల్ చేయండి</translation>
 <translation id="322708765617468434">సెటప్ తర్వాత మీరు ఎప్పుడైనా పరికరానికి మరొక వ్యక్తిని జోడించవచ్చు. ప్రతి వ్యక్తి వారి ఎక్స్‌పీరియన్స్‌ను వ్యక్తిగతీకరించుకోవచ్చు, వారి డేటాను ప్రైవేట్‌గా ఉంచుకోవచ్చు.</translation>
 <translation id="3227137524299004712">మైక్రోఫోన్</translation>
+<translation id="3227701057281907159">ప్యాచింగ్</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{<ph name="BEGIN_LINK" />Chrome వెబ్ స్టోర్<ph name="END_LINK" /> నుండి ఒకే రకమైన ఎక్స్‌టెన్షన్‌లతో దాన్ని తీసివేయండి లేదా రీప్లేస్ చేయండి.}other{<ph name="BEGIN_LINK" />Chrome వెబ్ స్టోర్<ph name="END_LINK" /> నుండి ఒకే రకమైన ఎక్స్‌టెన్షన్‌లతో వాటిని తీసివేయండి లేదా రీప్లేస్ చేయండి}}</translation>
 <translation id="3229254977651514276">తేదీని చెక్ చేయండి</translation>
 <translation id="3230539834943294477">సహాయక ఆర్టికల్స్‌ను చూడండి లేదా పరికర సపోర్ట్‌ను కనుగొనండి</translation>
@@ -3409,6 +3410,7 @@
 <translation id="3347086966102161372">చిత్రం అడ్రస్‌ను కా&amp;పీ చేయి</translation>
 <translation id="3348038390189153836">తొలగించగల పరికరం కనుగొనబడింది</translation>
 <translation id="3348131053948466246">సూచించిన ఎమోజి. నావిగేట్ చేయడానికి పైకి లేదా కిందకి నొక్కండి, జొప్పించడానికి 'Enter' నొక్కండి.</translation>
+<translation id="3348973040180736882">డీకంప్రెసింగ్</translation>
 <translation id="3349933790966648062">మెమరీ ఫుట్‌ప్రింట్</translation>
 <translation id="3350450887151703713">10 సెకన్లు రీప్లే చేయండి</translation>
 <translation id="3351472127384196879">మీ పెన్‌పై బటన్‌లను జోడించండి లేదా గుర్తించండి</translation>
@@ -11767,6 +11769,7 @@
 <translation id="9173063514323762371">&amp;బుక్‌మార్క్‌ల బార్‌ను దాచండి</translation>
 <translation id="917350715406657904"><ph name="APP_NAME" /> కోసం మీ తల్లి/తండ్రి సెట్ చేసిన సమయ పరిమితిని మీరు చేరుకున్నారు. మీరు రేపు దానిని <ph name="TIME_LIMIT" /> సమయం ఉపయోగించవచ్చు.</translation>
 <translation id="9174401638287877180">వినియోగం &amp; విశ్లేషణల డేటాను పంపండి. సమస్య విశ్లేషణ, పరికరం, యాప్ వినియోగ డేటాను ఆటోమేటిక్‌గా Googleకు పంపడం ద్వారా మీ చిన్నారి Android అనుభవాన్ని మెరుగుపరచడంలో సహాయపడండి. ఇది మీ చిన్నారిని గుర్తించడానికి ఉపయోగించబడదు, ఇది కేవలం సిస్టమ్, యాప్ స్థిరత్వానికి, ఇతర మెరుగుదలలకు సహాయపడుతుంది. కొంత ఏకీకృత డేటా కూడా Google యాప్‌లకు, Android డెవలపర్‌ల లాంటి భాగస్వాములకు సహాయపడుతుంది. మీ చిన్నారి కోసం అదనపు వెబ్ &amp; యాప్ యాక్టివిటీ సెట్టింగ్‌ను ఆన్ చేసినట్లయితే, ఈ డేటా వారి Google ఖాతాలో సేవ్ చేయబడవచ్చు.</translation>
+<translation id="9174854240439014335">ఒక చోటు నుండి మరొక చోటుకు లాగి, వదలడానికి వీలుగా విండో వ్యూను ఎడమ భాగం, కుడి భాగంగా విభజించేందుకు అనుమతించండి</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - బ్లూటూత్ పరికరం కనెక్ట్ చేయబడింది</translation>
 <translation id="9177859716483578738">కొనసాగించడానికి, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ఈ సైట్‌తో మీ <ph name="FIELDS_STRING" />‌ను షేర్ చేస్తుంది. ఈ సైట్ <ph name="BEGIN_LINK" />గోప్యతా పాలసీని<ph name="END_LINK" /> చూడండి.</translation>
 <translation id="9178061802301856367">సైన్-ఇన్ డేటాను తొలగించండి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 408d7ae..7ece063 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -3232,6 +3232,7 @@
 <translation id="3226487301970807183">เปิด/ปิดแผงด้านข้างแบบจัดข้อความชิดซ้าย</translation>
 <translation id="322708765617468434">คุณเพิ่มคนอื่นลงในอุปกรณ์หลังการตั้งค่าได้ทุกเมื่อ โดยแต่ละคนจะปรับเปลี่ยนประสบการณ์การใช้งานในแบบของตนและเก็บเป็นข้อมูลส่วนตัวได้</translation>
 <translation id="3227137524299004712">ไมโครโฟน</translation>
+<translation id="3227701057281907159">กำลังแพตช์</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{นำออกหรือแทนที่ด้วยส่วนขยายที่คล้ายกันจาก <ph name="BEGIN_LINK" />Chrome เว็บสโตร์<ph name="END_LINK" />}other{นำออกหรือแทนที่ด้วยส่วนขยายที่คล้ายกันจาก <ph name="BEGIN_LINK" />Chrome เว็บสโตร์<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">ตรวจสอบวันที่</translation>
 <translation id="3230539834943294477">ดูบทความช่วยเหลือหรือหาการสนับสนุนของอุปกรณ์</translation>
@@ -3396,6 +3397,7 @@
 <translation id="3347086966102161372">คัด&amp;ลอกที่อยู่รูปภาพ</translation>
 <translation id="3348038390189153836">พบอุปกรณ์แบบถอดออกได้</translation>
 <translation id="3348131053948466246">มีการแนะนำอีโมจิ กดขึ้นหรือลงเพื่อไปยังอีโมจิที่ต้องการแล้วกด Enter เพื่อแทรก</translation>
+<translation id="3348973040180736882">กำลังแตกไฟล์</translation>
 <translation id="3349933790966648062">หน่วยความจำที่ใช้</translation>
 <translation id="3350450887151703713">เล่นซ้ำ 10 วินาที</translation>
 <translation id="3351472127384196879">เพิ่มหรือค้นหาปุ่มบนปากกา</translation>
@@ -11753,6 +11755,7 @@
 <translation id="9173063514323762371">ซ่อนแถบบุ๊กมาร์ก</translation>
 <translation id="917350715406657904">คุณใช้งาน <ph name="APP_NAME" /> ถึงขีดจำกัดเวลาที่ผู้ปกครองตั้งไว้แล้ว พรุ่งนี้คุณจะใช้แอปได้ <ph name="TIME_LIMIT" /></translation>
 <translation id="9174401638287877180">ส่งข้อมูลการใช้งานและการวินิจฉัย ช่วยปรับปรุงประสบการณ์การใช้งาน Android ของบุตรหลานให้ดีขึ้นด้วยการส่งข้อมูลการวินิจฉัย อุปกรณ์ และการใช้งานแอปไปยัง Google โดยอัตโนมัติ โดยจะไม่มีการใช้ข้อมูลนี้ในการระบุชื่อบุตรหลานของคุณ และจะช่วยให้แอปและระบบมีความเสถียร พร้อมทั้งปรับปรุงด้านอื่นๆ ข้อมูลที่รวบรวมมาบางส่วนจะมีประโยชน์ต่อแอปและพาร์ทเนอร์ของ Google ด้วย เช่น นักพัฒนาแอป Android หากเปิดการตั้งค่ากิจกรรมเพิ่มเติมบนเว็บและแอปสำหรับบุตรหลาน ระบบอาจบันทึกข้อมูลนี้ไว้ในบัญชี Google ของบุตรหลาน</translation>
+<translation id="9174854240439014335">อนุญาตให้ลากและวางในมุมมองแบบแยกที่ขอบด้านซ้ายหรือขวาของหน้าต่าง</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - เชื่อมต่ออุปกรณ์บลูทูธแล้ว</translation>
 <translation id="9177859716483578738">หากต้องการดำเนินการต่อ <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> จะแชร์<ph name="FIELDS_STRING" />ของคุณกับเว็บไซต์นี้ ดู<ph name="BEGIN_LINK" />นโยบายความเป็นส่วนตัว<ph name="END_LINK" />ของเว็บไซต์นี้</translation>
 <translation id="9178061802301856367">ลบข้อมูลการลงชื่อเข้าใช้</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index e727714..3fbe55ae 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -3250,6 +3250,7 @@
 <translation id="3226487301970807183">Показати чи сховати бічну панель зліва</translation>
 <translation id="322708765617468434">Після налаштування ви зможете будь-коли додати на пристрій іншого користувача. Кожен користувач матиме змогу персоналізувати взаємодію і забезпечити конфіденційність своїх даних.</translation>
 <translation id="3227137524299004712">Мікрофон</translation>
+<translation id="3227701057281907159">Виправлення</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Видаліть або замініть його схожим розширенням із <ph name="BEGIN_LINK" />Вебмагазину Chrome<ph name="END_LINK" />.}one{Видаліть або замініть їх схожими розширеннями з <ph name="BEGIN_LINK" />Вебмагазину Chrome<ph name="END_LINK" />}few{Видаліть або замініть їх схожими розширеннями з <ph name="BEGIN_LINK" />Вебмагазину Chrome<ph name="END_LINK" />}many{Видаліть або замініть їх схожими розширеннями з <ph name="BEGIN_LINK" />Вебмагазину Chrome<ph name="END_LINK" />}other{Видаліть або замініть їх схожими розширеннями з <ph name="BEGIN_LINK" />Вебмагазину Chrome<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">Перевірте дату</translation>
 <translation id="3230539834943294477">Переглянути довідкові статті або зв’язатися зі службою підтримки пристрою</translation>
@@ -3414,6 +3415,7 @@
 <translation id="3347086966102161372">Копіювати адресу зображення</translation>
 <translation id="3348038390189153836">Виявлено знімний пристрій</translation>
 <translation id="3348131053948466246">Запропоновано смайли. Щоб переходити між ними, натискайте стрілки вгору або вниз. Щоб вставити смайл, натисніть Enter.</translation>
+<translation id="3348973040180736882">Розпакування</translation>
 <translation id="3349933790966648062">Використання пам’яті</translation>
 <translation id="3350450887151703713">Повторно відтворити останні 10 секунд</translation>
 <translation id="3351472127384196879">Додати або знайти кнопки на стилусі</translation>
@@ -11780,6 +11782,7 @@
 <translation id="9173063514323762371">Сховати панель закладок</translation>
 <translation id="917350715406657904">Досягнено ліміту часу використання, який батьки встановили для додатка <ph name="APP_NAME" />. Завтра ти зможеш користуватися ним <ph name="TIME_LIMIT" />.</translation>
 <translation id="9174401638287877180">Надсилати дані про використання й діагностику. Допоможіть покращити роботу Android для вашої дитини, автоматично надсилаючи в Google дані про діагностику та використання пристрою й додатків. Ця інформація не використовуватиметься для встановлення особи вашої дитини, а допоможе підвищити стабільність системи, додатків тощо. Деякі зведені дані також корисні для додатків і партнерів Google, як-от розробників Android. Якщо ввімкнено також запис Історії додатків і вебпошуку, ці дані зберігаються в обліковому записі Google дитини.</translation>
+<translation id="9174854240439014335">Дозволити перетягування на лівий або правий край вікна в режимі розділення екрана</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – під’єднано пристрій Bluetooth</translation>
 <translation id="9177859716483578738">Щоб продовжити, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> надасть цьому сайту таку інформацію: <ph name="FIELDS_STRING" />. Перегляньте <ph name="BEGIN_LINK" />політику конфіденційності<ph name="END_LINK" /> цього сайту.</translation>
 <translation id="9178061802301856367">Видалити дані для входу</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index df7551b..64f72dd 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -3231,6 +3231,7 @@
 <translation id="3226487301970807183">切換靠左對齊側邊面板</translation>
 <translation id="322708765617468434">設定完成後,你隨時可以在裝置中新增其他使用者。每位使用者都可以建立個人專屬的體驗,並維護資料的私密性。</translation>
 <translation id="3227137524299004712">麥克風</translation>
+<translation id="3227701057281907159">正在套用修補檔案</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{請移除這項擴充功能,或前往 <ph name="BEGIN_LINK" />Chrome 線上應用程式商店<ph name="END_LINK" />尋找可替代的類似擴充功能。}other{請移除這些擴充功能,或前往 <ph name="BEGIN_LINK" />Chrome 線上應用程式商店<ph name="END_LINK" />尋找可替代的類似擴充功能。}}</translation>
 <translation id="3229254977651514276">檢查日期</translation>
 <translation id="3230539834943294477">查看說明文章或尋找裝置支援</translation>
@@ -3395,6 +3396,7 @@
 <translation id="3347086966102161372">複製圖片網址(&amp;O)</translation>
 <translation id="3348038390189153836">偵測到卸除式裝置</translation>
 <translation id="3348131053948466246">已提供表情符號建議。使用向上鍵或向下鍵進行瀏覽,按下 Enter 鍵即可插入表情符號。</translation>
+<translation id="3348973040180736882">解壓縮</translation>
 <translation id="3349933790966648062">記憶體使用量</translation>
 <translation id="3350450887151703713">重播 10 秒</translation>
 <translation id="3351472127384196879">新增或點選觸控筆按鈕</translation>
@@ -11747,6 +11749,7 @@
 <translation id="9173063514323762371">隱藏書籤列(&amp;H)</translation>
 <translation id="917350715406657904">你已達到貴家長為「<ph name="APP_NAME" />」設定的使用時間限制。你明天可以使用 <ph name="TIME_LIMIT" />。</translation>
 <translation id="9174401638287877180">傳送使用狀況與診斷資料。讓系統自動將診斷資料、裝置和應用程式的使用資料傳送給 Google,協助改善貴子女的 Android 使用體驗。這些資料將有助於改善系統和應用程式的穩定性與其他功能,並不會用於識別貴子女的身分。此外,部分匯總資料還能協助 Google 應用程式和合作夥伴 (例如 Android 開發人員) 改善自己的產品和服務。如果貴子女的「其他網路和應用程式活動」設定為開啟,這些資料可能會儲存在他們的 Google 帳戶中。</translation>
+<translation id="9174854240439014335">分割檢視畫面可拖曳到視窗左側或右側</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - 已連上藍牙裝置</translation>
 <translation id="9177859716483578738">如要繼續,<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> 會將你的<ph name="FIELDS_STRING" />提供給這個網站。詳情查看這個網站的《<ph name="BEGIN_LINK" />隱私權政策<ph name="END_LINK" />》。</translation>
 <translation id="9178061802301856367">刪除登入資料</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index 199b9b20..b7ef1ca6 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -3248,6 +3248,7 @@
 <translation id="3226487301970807183">Guqula ukuqondanisa ngakwesobunxele iphaneli eseceleni</translation>
 <translation id="322708765617468434">Ungakwazi ukwengeza omunye umuntu kudivayisi ngemva kokusetha. Umuntu ngamunye angaqondanisa i-akhawunti yakhe nomuntu siqu futhi agcine idatha iyimfihlo.</translation>
 <translation id="3227137524299004712">Imakrofoni</translation>
+<translation id="3227701057281907159">Ukupesha</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Isuse noma ishintshe nezandiso ezifanayo ezivela <ph name="BEGIN_LINK" />ku-Chrome Web Store<ph name="END_LINK" />.}one{Zisuse noma zishintshe nezandiso ezifanayo ezivela <ph name="BEGIN_LINK" />ku-Chrome Web Store<ph name="END_LINK" />}other{Zisuse noma zishintshe nezandiso ezifanayo ezivela <ph name="BEGIN_LINK" />ku-Chrome Web Store<ph name="END_LINK" />}}</translation>
 <translation id="3229254977651514276">Hlola usuku</translation>
 <translation id="3230539834943294477">Bheka izihloko zosizo noma uthole ukwesekwa kwedivayisi</translation>
@@ -3412,6 +3413,7 @@
 <translation id="3347086966102161372">K&amp;opisha ikheli lesithombe</translation>
 <translation id="3348038390189153836">Kutholwe idivayisi engasuseka</translation>
 <translation id="3348131053948466246">I-emoji iphakanyisiwe. Cindezela umcibisholo waphezulu noma waphansi ukuze uzulazule kanye no-enter ukuze ufake.</translation>
+<translation id="3348973040180736882">Ukuminyanisa</translation>
 <translation id="3349933790966648062">I-Footprint yememori</translation>
 <translation id="3350450887151703713">Dlala futhi imizuzwana engu-10</translation>
 <translation id="3351472127384196879">Yengeza noma thola izinkinobho kupeni lakho</translation>
@@ -11775,6 +11777,7 @@
 <translation id="9173063514323762371">&amp;Fihla Ibha Yamabhukhimakhi</translation>
 <translation id="917350715406657904">Ufinyelele umkhawulo wesikhathi sakho osibekelwe ngumzali se-<ph name="APP_NAME" />. Ungalisebenzisa ngokungu-<ph name="TIME_LIMIT" /> kusasa.</translation>
 <translation id="9174401638287877180">Thumela idatha yokusetshenziswa neyokuxilonga. Siza ukuthuthukisa umuzwa we-Android wengane yakho ngokuthumela ngokuzenzakalela idatha yokuxilonga, yedivayisi, neyokusetshenziswa ku-app kuGoogle. Lokhu ngeke kusetshenziselwe ukukhomba ingane yakho futhi kuzosiza ukuzinza kwesistimu noku-app nokunye ukuthuthukiswa. Enye idatha izophinda isize ama-app eGoogle nozakwethu, abafana nonjiniyela be-Android. Uma isethingi eyengeziwe sewebhu nese-app ivulelwe ingane yakho, le datha ingalondolozwa ku-akhawunti yakhe yeGoogle.</translation>
+<translation id="9174854240439014335">Vumela ukuhudula udedele kokubuka okuhlukanisiwe emaphethelweni ngakwesokunxele noma ngakwesokudla kwewindi</translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - Idivayisi ye-Bluetooth ixhunyiwe</translation>
 <translation id="9177859716483578738">Ukuze uqhubeke, i-<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> izokwabelana nge-<ph name="FIELDS_STRING" /> yakho nale sayithi. Bheka <ph name="BEGIN_LINK" />inqubomgomo yobumfihlo<ph name="END_LINK" /> yale sayithi.</translation>
 <translation id="9178061802301856367">Sula idatha yokungena ngemvume</translation>
diff --git a/chrome/app/resources/google_chrome_strings_af.xtb b/chrome/app/resources/google_chrome_strings_af.xtb
index 40b3672..50344a59 100644
--- a/chrome/app/resources/google_chrome_strings_af.xtb
+++ b/chrome/app/resources/google_chrome_strings_af.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">Meer oor ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Maak in Chrome oop</translation>
 <translation id="1157985233335035034">Onlangse tale</translation>
+<translation id="1158134713295836892">Gemini in Chrome</translation>
 <translation id="1184145431117212167">Installering het misluk omdat jou weergawe van Windows nie gesteun word nie.</translation>
 <translation id="1194807384646768652">Chrome het hierdie aflaai geblokkeer omdat die lêertipe nie algemeen afgelaai word nie en dit gevaarlik kan wees</translation>
 <translation id="1203500561924088507">Dankie dat jy geïnstalleer het. Jy moet jou blaaier herbegin voordat jy <ph name="BUNDLE_NAME" /> gebruik.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb
index 9b062f9..c3c9a48 100644
--- a/chrome/app/resources/google_chrome_strings_am.xtb
+++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ስለ ChromeOS</translation>
 <translation id="1154147086299354128">&amp;በChrome ውስጥ ክፈት</translation>
 <translation id="1157985233335035034">የቅርብ ጊዜ ቋንቋዎች</translation>
+<translation id="1158134713295836892">Gemini በChrome ውስጥ</translation>
 <translation id="1184145431117212167">የእርስዎ የመስኮቶች ሥሪት ስለማይደገፍ ጭነቱ ተሰናክሏል።</translation>
 <translation id="1194807384646768652">የፋይል ዓይነቱ በተለምዶ ስላማይወርድ እና አደገኛ ሊሆን ስለሚችል Chrome ይህን ውርድ አግዷል</translation>
 <translation id="1203500561924088507">ሰለተጫኑ እናመሰግናለን። <ph name="BUNDLE_NAME" />ን ከመጠቀምዎ በፊት አሳሽዎን እንደገና ማስጀመር አለብዎት።</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb
index b2fb9738..cfaeca5 100644
--- a/chrome/app/resources/google_chrome_strings_ar.xtb
+++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">‏لمحة عن ChromeOS</translation>
 <translation id="1154147086299354128">‏&amp;فتح في Chrome</translation>
 <translation id="1157985233335035034">أحدث اللغات</translation>
+<translation id="1158134713295836892">‏‫Gemini في Chrome</translation>
 <translation id="1184145431117212167">‏تعذَّر التثبيت بسبب عدم توافُق الإصدار الذي تستخدمه من نظام التشغيل Windows.</translation>
 <translation id="1194807384646768652">‏حَظَر Chrome عملية التنزيل هذه لأنّ نوع الملف لا يتم تنزيله عادةً، وقد يكون خطيرًا.</translation>
 <translation id="1203500561924088507">شكرًا على التثبيت. عليك إعادة تشغيل المتصفِّح قبل استخدام <ph name="BUNDLE_NAME" />.</translation>
@@ -70,7 +71,7 @@
 <translation id="1838374766361614909">محو البحث</translation>
 <translation id="1849248141818021764">‏لا يمكن لأحد الوصول إلى بياناتك المشفّرة بدون استخدام عبارة المرور. ولا تحصل Google على عبارة المرور هذه أو تخزّنها. وفي حال نسيتها أو أردت تغيير هذه الإعدادات، يجب <ph name="BEGIN_LINK" />حذف بيانات Chrome في حسابك<ph name="END_LINK" />.</translation>
 <translation id="1860536484129686729">‏يحتاج Chrome إلى إذن للوصول إلى الكاميرا من أجل الموقع الإلكتروني هذا.</translation>
-<translation id="1873233029667955273">‏Google Chrome ليس متصفحك التلقائي.</translation>
+<translation id="1873233029667955273">‏‫Google Chrome ليس متصفحك التلقائي.</translation>
 <translation id="1874309113135274312">‏الإصدار التجريبي من Google Chrome‏ (mDNS-In)</translation>
 <translation id="1877026089748256423">‏إصدار Chrome قديم</translation>
 <translation id="1880677175115548835">اختيار نص</translation>
@@ -86,11 +87,11 @@
 <translation id="207902854391093810">‏عندما تكون التجارب مفعَّلة، تسمح ميزة "قياس أداء الإعلانات" للمواقع الإلكترونية التي تزورها بطلب معلومات من Chrome تساعد الموقع الإلكتروني في قياس أداء الإعلانات التي يعرضها. وتحدّ هذه الميزة من عملية تتبّع البيانات ونشاط التصفّح على المواقع الإلكترونية، وذلك من خلال نقل أقل قدر ممكن من المعلومات بينها.</translation>
 <translation id="2091012649849228750">‏للحصول على تحديثات Google Chrome في المستقبل، يجب استخدام كمبيوتر يعمل بنظام التشغيل Windows 10 أو إصدار أحدث. يعمل هذا الكمبيوتر بنظام التشغيل Windows 8.</translation>
 <translation id="2094648590148273905">‏أحكام نظام التشغيل ChromeOS Flex</translation>
-<translation id="2094919256425865063">‏هل تريد الخروج من Chrome على أي حال؟</translation>
+<translation id="2094919256425865063">‏الخروج من Chrome على أي حال؟</translation>
 <translation id="2096213354152647998">‏لم تتم زيارة هذا الموقع الإلكتروني مؤخرًا، لذلك أزال Chrome إذن <ph name="PERMISSION" />.</translation>
 <translation id="2106831557840787829">‏أصبح نظام التشغيل ChromeOS Flex متاحًا من خلال <ph name="BEGIN_LINK_CROS_OSS" />برنامج إضافي مفتوح المصدر<ph name="END_LINK_CROS_OSS" />، كما هو الحال في <ph name="BEGIN_LINK_LINUX_OSS" />بيئة تطوير نظام التشغيل Linux<ph name="END_LINK_LINUX_OSS" />.</translation>
 <translation id="2108778574543343055">‏إيقاف تشغيل Chrome في الخلفية أثناء عمل التطبيقات</translation>
-<translation id="2120620239521071941">‏سيعمل هذا على حذف <ph name="ITEMS_COUNT" /> من العناصر من هذا الجهاز. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome كـ <ph name="USER_EMAIL" />.</translation>
+<translation id="2120620239521071941">‏سيعمل هذا على حذف <ph name="ITEMS_COUNT" /> من العناصر من هذا الجهاز. لاسترداد بياناتك لاحقًا، يرجى تسجيل الدخول إلى Chrome كـ <ph name="USER_EMAIL" />.</translation>
 <translation id="2121284319307530122">‏إعادة تشغيل متصفِّح Chrome لتحديثه</translation>
 <translation id="2123055963409958220">‏يمكنك المساعدة في تحسين Chrome بالإبلاغ عن <ph name="BEGIN_LINK" />الإعدادات الحالية<ph name="END_LINK" /></translation>
 <translation id="2126108037660393668">تعذَّر التحقق من الملف الذي تم تنزيله.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_as.xtb b/chrome/app/resources/google_chrome_strings_as.xtb
index 460c99dc..bbe5715 100644
--- a/chrome/app/resources/google_chrome_strings_as.xtb
+++ b/chrome/app/resources/google_chrome_strings_as.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ChromeOSৰ বিষয়ে</translation>
 <translation id="1154147086299354128">Chromeত &amp;খোলক</translation>
 <translation id="1157985233335035034">শেহতীয়া ভাষা</translation>
+<translation id="1158134713295836892">Chromeত Gemini</translation>
 <translation id="1184145431117212167">ইনষ্টল কৰিব পৰা নগ’ল কাৰণ আপোনাৰ Windowsৰ সংস্কৰণটো সমৰ্থিত নহয়।</translation>
 <translation id="1194807384646768652">এই ফাইলৰ প্ৰকাৰটো সাধাৰণতে ডাউনল’ড কৰা নহয় আৰু ই বিপজ্জনক হ’ব পাৰে বাবে Chromeএ এই ডাউনল’ডটো অৱৰোধ কৰিছে</translation>
 <translation id="1203500561924088507">ইনষ্টল কৰাৰ বাবে ধন্যবাদ। আপুনি <ph name="BUNDLE_NAME" /> ব্যৱহাৰ কৰাৰ পূৰ্বে আপোনাৰ ব্ৰাউজাৰটো ৰিষ্টাৰ্ট কৰিবই লাগিব।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb
index 316de4db..22ff3f98 100644
--- a/chrome/app/resources/google_chrome_strings_az.xtb
+++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ChromeOS haqqında</translation>
 <translation id="1154147086299354128">&amp;Chrome'da açın</translation>
 <translation id="1157985233335035034">Son dillər</translation>
+<translation id="1158134713295836892">Gemini Chrome-da</translation>
 <translation id="1184145431117212167">Windows versiyanız dəstəklənmədiyi üçün quraşdırma alınmadı.</translation>
 <translation id="1194807384646768652">Bu fayl növü adətən endirilmədiyi və təhlükəli ola biləcəyi üçün Chrome endirməni blokladı</translation>
 <translation id="1203500561924088507">Quraşdırdığınız üçün təşəkkür edirik. <ph name="BUNDLE_NAME" /> istifadə etməzdən əvvəl brauzerinizi yenidən başlatmalısınız.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_be.xtb b/chrome/app/resources/google_chrome_strings_be.xtb
index fe0e489..4031c2d1 100644
--- a/chrome/app/resources/google_chrome_strings_be.xtb
+++ b/chrome/app/resources/google_chrome_strings_be.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">Пра ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Адкрыць у браўзеры Chrome</translation>
 <translation id="1157985233335035034">Нядаўна выкарыстаныя мовы</translation>
+<translation id="1158134713295836892">Gemini ў Chrome</translation>
 <translation id="1184145431117212167">Не ўдалося выканаць усталяванне, бо гэта версія Windows не падтрымліваецца.</translation>
 <translation id="1194807384646768652">Браўзер Chrome заблакіраваў спампоўку, бо гэты тып файлаў спампоўваюць рэдка і ён можа быць небяспечным</translation>
 <translation id="1203500561924088507">Дзякуй, што ўсталявалі <ph name="BUNDLE_NAME" />. Каб завяршыць усталяванне, перазапусціце браўзер.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb
index 025b75c..fc8a7bf 100644
--- a/chrome/app/resources/google_chrome_strings_bg.xtb
+++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Всичко за ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Отваряне в Chrome</translation>
 <translation id="1157985233335035034">Скорошни езици</translation>
+<translation id="1158134713295836892">Gemini в Chrome</translation>
 <translation id="1184145431117212167">Инсталирането не бе успешно, защото използваната от вас версия на Windows не се поддържа.</translation>
 <translation id="1194807384646768652">Chrome блокира това изтегляне, защото файловият тип не се изтегля често и може да е опасен</translation>
 <translation id="1203500561924088507">Благодарим ви, че инсталирахте <ph name="BUNDLE_NAME" />. Трябва да рестартирате браузъра си, преди да използвате това приложение.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb
index d6f905ac..55e2baa 100644
--- a/chrome/app/resources/google_chrome_strings_bn.xtb
+++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">ChromeOS সম্পর্কে</translation>
 <translation id="1154147086299354128">&amp;Chrome এ খুলুন</translation>
 <translation id="1157985233335035034">সাম্প্রতিক ভাষা</translation>
+<translation id="1158134713295836892">Chrome-এ Gemini</translation>
 <translation id="1184145431117212167">আপনার Windows-এর ভার্সনে কাজ করছে না তাই ইনস্টল করা যায়নি।</translation>
 <translation id="1194807384646768652">এই ধরনের ফাইল সাধারণত ডাউনলোড করা হয় না এবং এটি বিপজ্জনক হতে পারে, তাই Chrome এই ডাউনলোডটি ব্লক করে দিয়েছে</translation>
 <translation id="1203500561924088507">ইনস্টল করার জন্য ধন্যবাদ। <ph name="BUNDLE_NAME" /> ব্যবহার করার আগে আপনাকে অবশ্যই ব্রাউজার রিস্টার্ট করতে হবে।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bs.xtb b/chrome/app/resources/google_chrome_strings_bs.xtb
index a6289bf..7aee35e 100644
--- a/chrome/app/resources/google_chrome_strings_bs.xtb
+++ b/chrome/app/resources/google_chrome_strings_bs.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">O ChromeOS-u</translation>
 <translation id="1154147086299354128">&amp;Otvori u Chromeu</translation>
 <translation id="1157985233335035034">Nedavni jezici</translation>
+<translation id="1158134713295836892">Gemini u Chromeu</translation>
 <translation id="1184145431117212167">Instalacija nije uspjela jer vaša verzija Windowsa nije podržana.</translation>
 <translation id="1194807384646768652">Chrome je blokirao ovo preuzimanje jer se ta vrsta fajla ne preuzima često i fajl je možda opasan</translation>
 <translation id="1203500561924088507">Hvala što ste instalirali. Morate ponovo pokrenuti preglednik prije nego što možete koristiti <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb
index 82aa0b7..90a4c91 100644
--- a/chrome/app/resources/google_chrome_strings_ca.xtb
+++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Sobre ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Obre a Chrome</translation>
 <translation id="1157985233335035034">Idiomes recents</translation>
+<translation id="1158134713295836892">Gemini a Chrome</translation>
 <translation id="1184145431117212167">La instal·lació ha fallat perquè la versió de Windows del dispositiu no s'admet.</translation>
 <translation id="1194807384646768652">Chrome ha bloquejat aquesta baixada perquè el tipus de fitxer no se sol baixar i pot ser perillós</translation>
 <translation id="1203500561924088507">T'agraïm la instal·lació. Has de reiniciar el navegador abans d'utilitzar <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb
index 98e28bd..c3efec2 100644
--- a/chrome/app/resources/google_chrome_strings_cs.xtb
+++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">O systému ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Otevřít v Chromu</translation>
 <translation id="1157985233335035034">Poslední jazyky</translation>
+<translation id="1158134713295836892">Gemini v Chromu</translation>
 <translation id="1184145431117212167">Instalace se nezdařila, protože vaše verze systému Windows není podporována.</translation>
 <translation id="1194807384646768652">Chrome toto stahování zablokoval, protože tento typ souboru se běžně nestahuje a může být nebezpečný</translation>
 <translation id="1203500561924088507">Děkujeme za instalaci aplikace <ph name="BUNDLE_NAME" />. Před jejím použitím je potřeba restartovat prohlížeč.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cy.xtb b/chrome/app/resources/google_chrome_strings_cy.xtb
index 7f09d37..3ca0b7d6 100644
--- a/chrome/app/resources/google_chrome_strings_cy.xtb
+++ b/chrome/app/resources/google_chrome_strings_cy.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">Ynghylch ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Agor yn Chrome</translation>
 <translation id="1157985233335035034">Ieithoedd diweddar</translation>
+<translation id="1158134713295836892">Gemini yn Chrome</translation>
 <translation id="1184145431117212167">Methodd y gosodiad oherwydd ni chefnogir eich fersiwn chi o Windows.</translation>
 <translation id="1194807384646768652">Gwnaeth Chrome rwystro'r lawrlwythiad hwn oherwydd nid yw'r math o ffeil yn cael ei lawrlwytho'n aml a gall fod yn beryglus</translation>
 <translation id="1203500561924088507">Diolch am osod. Rhaid i chi ailgychwyn eich porwr cyn defnyddio <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb
index 95fc5f4..5be53be 100644
--- a/chrome/app/resources/google_chrome_strings_da.xtb
+++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Om ChromeOS</translation>
 <translation id="1154147086299354128">Åbn i Chr&amp;ome</translation>
 <translation id="1157985233335035034">Seneste sprog</translation>
+<translation id="1158134713295836892">Gemini i Chrome</translation>
 <translation id="1184145431117212167">Installationen mislykkedes, da din version af Windows ikke understøttes.</translation>
 <translation id="1194807384646768652">Chrome har blokeret denne download, fordi filtypen normalt ikke downloades og kan være skadelig</translation>
 <translation id="1203500561924088507">Tak for installationen. Du skal genstarte browseren, før du bruger <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb
index 4b57f83..b0d07967 100644
--- a/chrome/app/resources/google_chrome_strings_de.xtb
+++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Über ChromeOS</translation>
 <translation id="1154147086299354128">In Chr&amp;ome öffnen</translation>
 <translation id="1157985233335035034">Zuletzt verwendete Sprachen</translation>
+<translation id="1158134713295836892">Gemini in Chrome</translation>
 <translation id="1184145431117212167">Die Installation ist fehlgeschlagen, weil deine Windows-Version nicht unterstützt wird.</translation>
 <translation id="1194807384646768652">Chrome hat diesen Download blockiert, weil der Dateityp normalerweise nicht heruntergeladen wird und gefährlich sein könnte</translation>
 <translation id="1203500561924088507">Vielen Dank für die Installation. Du musst deinen Browser neu starten, bevor du <ph name="BUNDLE_NAME" /> verwenden kannst.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb
index ecf041c..92b81535 100644
--- a/chrome/app/resources/google_chrome_strings_el.xtb
+++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Σχετικά με το ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Άνοιγμα στο Chrome</translation>
 <translation id="1157985233335035034">Πρόσφατες γλώσσες</translation>
+<translation id="1158134713295836892">Gemini στο Chrome</translation>
 <translation id="1184145431117212167">Η εγκατάσταση απέτυχε επειδή η έκδοση των Windows που χρησιμοποιείτε δεν υποστηρίζεται.</translation>
 <translation id="1194807384646768652">Το Chrome απέκλεισε αυτή τη λήψη επειδή δεν πραγματοποιείται συχνά λήψη αυτού του τύπου αρχείου και ενδέχεται να είναι επικίνδυνος</translation>
 <translation id="1203500561924088507">Ευχαριστούμε για την εγκατάσταση. Πρέπει να επανεκκινήσετε το πρόγραμμα περιήγησής σας πριν από τη χρήση του <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb
index 3e1c3329..dec5a1ef 100644
--- a/chrome/app/resources/google_chrome_strings_en-GB.xtb
+++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">About ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Open in Chrome</translation>
 <translation id="1157985233335035034">Recent languages</translation>
+<translation id="1158134713295836892">Gemini in Chrome</translation>
 <translation id="1184145431117212167">Installation failed because your version of Windows is not supported.</translation>
 <translation id="1194807384646768652">Chrome blocked this download because the file type isn't commonly downloaded and it may be dangerous</translation>
 <translation id="1203500561924088507">Thanks for installing. You must restart your browser before using <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb
index 00b8f59..5ab75b5 100644
--- a/chrome/app/resources/google_chrome_strings_es-419.xtb
+++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Acerca de ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Abrir en Chrome</translation>
 <translation id="1157985233335035034">Idiomas recientes</translation>
+<translation id="1158134713295836892">Gemini en Chrome</translation>
 <translation id="1184145431117212167">Se produjo un error en la instalación porque tu versión de Windows no es compatible.</translation>
 <translation id="1194807384646768652">Chrome bloqueó esta descarga porque el tipo de archivo no se descarga con frecuencia y puede ser peligroso</translation>
 <translation id="1203500561924088507">Gracias por instalar <ph name="BUNDLE_NAME" />. Debes reiniciar tu navegador antes de usarlo.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb
index f5d5ff1..1f26a46f 100644
--- a/chrome/app/resources/google_chrome_strings_es.xtb
+++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">Información de ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Abrir en Chrome</translation>
 <translation id="1157985233335035034">Idiomas recientes</translation>
+<translation id="1158134713295836892">Gemini en Chrome</translation>
 <translation id="1184145431117212167">No se ha podido realizar la instalación porque no es compatible con tu versión de Windows.</translation>
 <translation id="1194807384646768652">Chrome ha bloqueado esta descarga porque el tipo de archivo no se descarga habitualmente y podría ser peligroso</translation>
 <translation id="1203500561924088507">Gracias por realizar la instalación. Debes reiniciar tu navegador para poder usar <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb
index c4a3e47..654f98db 100644
--- a/chrome/app/resources/google_chrome_strings_et.xtb
+++ b/chrome/app/resources/google_chrome_strings_et.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Teave ChromeOS-i kohta</translation>
 <translation id="1154147086299354128">&amp;Ava Chrome'is</translation>
 <translation id="1157985233335035034">Hiljutised keeled</translation>
+<translation id="1158134713295836892">Gemini Chrome'is</translation>
 <translation id="1184145431117212167">Installimine ebaõnnestus, kuna teie Windowsi versiooni ei toetata.</translation>
 <translation id="1194807384646768652">Chrome blokeeris selle allalaadimise, kuna seda faili tüüpi ei laadita sageli alla ja see võib olla ohtlik</translation>
 <translation id="1203500561924088507">Täname teid installimise eest. Enne brauseri <ph name="BUNDLE_NAME" /> kasutamist peate selle taaskäivitama.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb
index 63df3bd..a1e1b48 100644
--- a/chrome/app/resources/google_chrome_strings_eu.xtb
+++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ChromeOS-i buruz</translation>
 <translation id="1154147086299354128">&amp;Ireki Chrome-n</translation>
 <translation id="1157985233335035034">Azkenaldian erabilitako hizkuntzak</translation>
+<translation id="1158134713295836892">Chrome-ko Gemini</translation>
 <translation id="1184145431117212167">Ezin izan da instalatu, Windows-en bertsio hau ez delako bateragarria.</translation>
 <translation id="1194807384646768652">Chrome-k deskarga hau blokeatu du, fitxategi mota normalean deskargatzen ez delako eta agian arriskutsua delako</translation>
 <translation id="1203500561924088507">Eskerrik asko instalatzeagatik. <ph name="BUNDLE_NAME" /> erabiltzeko, arakatzailea berrabiarazi behar duzu.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb
index ca177ba..aff0c6b3 100644
--- a/chrome/app/resources/google_chrome_strings_fa.xtb
+++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">‏درباره ChromeOS</translation>
 <translation id="1154147086299354128">‏&amp;باز کردن در Chrome</translation>
 <translation id="1157985233335035034">زبان‌های اخیر</translation>
+<translation id="1158134713295836892">‏‫Gemini در Chrome</translation>
 <translation id="1184145431117212167">‏نصب انجام نشد چون از نسخه Windows شما پشتیبانی نمی‌شود.</translation>
 <translation id="1194807384646768652">‏‫Chrome این بارگیری را مسدود کرد زیرا این نوع فایل معمولاً بارگیری نمی‌شود و ممکن است خطرناک باشد</translation>
 <translation id="1203500561924088507">بابت نصب از شما سپاس‌گزاریم. قبل‌از استفاده از <ph name="BUNDLE_NAME" />، باید مرورگر را بازراه‌اندازی کنید.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb
index ba71ca6..53c3b7d 100644
--- a/chrome/app/resources/google_chrome_strings_fi.xtb
+++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">ChromeOS</translation>
 <translation id="1154147086299354128">Avaa Chr&amp;omessa</translation>
 <translation id="1157985233335035034">Viimeksi käytetyt kielet</translation>
+<translation id="1158134713295836892">Gemini in Chrome</translation>
 <translation id="1184145431117212167">Asennus epäonnistui, koska käyttämääsi Windows-versiota ei tueta.</translation>
 <translation id="1194807384646768652">Chrome on estänyt tämän latauksen, koska tiedostotyyppiä ei ladata usein, ja se saattaa olla haitallinen</translation>
 <translation id="1203500561924088507">Kiitos asennuksesta. Selain pitää käynnistää uudelleen ennen kuin <ph name="BUNDLE_NAME" /> otetaan käyttöön.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb
index d3ac85bb8..34a1411 100644
--- a/chrome/app/resources/google_chrome_strings_fil.xtb
+++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">Tungkol sa ChromeOS</translation>
 <translation id="1154147086299354128">Buksan sa Chr&amp;ome</translation>
 <translation id="1157985233335035034">Mga kamakailang wika</translation>
+<translation id="1158134713295836892">Gemini sa Chrome</translation>
 <translation id="1184145431117212167">Hindi na-install dahil hindi sinusuportahan ang iyong bersyon ng Windows.</translation>
 <translation id="1194807384646768652">Na-block ng Chrome ang pag-download na ito dahil hindi karaniwang dina-download ang uri ng file at posibleng mapanganib ito</translation>
 <translation id="1203500561924088507">Salamat sa pag-install. Dapat mong i-restart ang iyong browser bago gamitin ang <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr-CA.xtb b/chrome/app/resources/google_chrome_strings_fr-CA.xtb
index 754a02c..7ab78724 100644
--- a/chrome/app/resources/google_chrome_strings_fr-CA.xtb
+++ b/chrome/app/resources/google_chrome_strings_fr-CA.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">À propos de ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Ouvrir dans Chrome</translation>
 <translation id="1157985233335035034">Langues récemment sélectionnées</translation>
+<translation id="1158134713295836892">Gemini dans Chrome</translation>
 <translation id="1184145431117212167">L'installation a échoué, car votre version de Windows n'est pas prise en charge.</translation>
 <translation id="1194807384646768652">Chrome a bloqué ce téléchargement, car le type de fichier n'est pas souvent téléchargé et pourrait être dangereux</translation>
 <translation id="1203500561924088507">Merci pour l'installation. Vous devez redémarrer votre navigateur avant d'utiliser <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb
index 1ba592c..cac5ad7 100644
--- a/chrome/app/resources/google_chrome_strings_fr.xtb
+++ b/chrome/app/resources/google_chrome_strings_fr.xtb
@@ -20,6 +20,7 @@
 <translation id="1152920704813762236">À propos de ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Ouvrir dans Chrome</translation>
 <translation id="1157985233335035034">Langues récentes</translation>
+<translation id="1158134713295836892">Gemini dans Chrome</translation>
 <translation id="1184145431117212167">Échec de l'installation en raison d'une incompatibilité avec votre version de Windows.</translation>
 <translation id="1194807384646768652">Chrome a bloqué ce téléchargement, car ce type de fichier n'est pas souvent téléchargé et peut être dangereux</translation>
 <translation id="1203500561924088507">Merci d'avoir installé notre produit. Vous devez redémarrer votre navigateur avant d'utiliser <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gl.xtb b/chrome/app/resources/google_chrome_strings_gl.xtb
index 361c102d..e496a00 100644
--- a/chrome/app/resources/google_chrome_strings_gl.xtb
+++ b/chrome/app/resources/google_chrome_strings_gl.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">Acerca de ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Abrir en Chrome</translation>
 <translation id="1157985233335035034">Idiomas recentes</translation>
+<translation id="1158134713295836892">Gemini en Chrome</translation>
 <translation id="1184145431117212167">Produciuse un erro durante a instalación porque a versión de Windows non é compatible.</translation>
 <translation id="1194807384646768652">Chrome bloqueou esta descarga porque este tipo de ficheiro non se descarga con frecuencia e pode ser perigoso</translation>
 <translation id="1203500561924088507">Grazas por levar a cabo a instalación. Para utilizar <ph name="BUNDLE_NAME" />, debes reiniciar o navegador.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb
index ca204bb..b95523f 100644
--- a/chrome/app/resources/google_chrome_strings_gu.xtb
+++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ChromeOS વિશે</translation>
 <translation id="1154147086299354128">&amp;Chromeમાં ખોલો</translation>
 <translation id="1157985233335035034">તાજેતરની ભાષાઓ</translation>
+<translation id="1158134713295836892">Gemini in Chrome</translation>
 <translation id="1184145431117212167">Windowsનું તમારું વર્ઝન સપોર્ટેડ ન હોવાને કારણે આ ઇન્સ્ટૉલેશન નિષ્ફળ રહ્યું.</translation>
 <translation id="1194807384646768652">Chrome દ્વારા આ ડાઉનલોડ બ્લૉક કરવામાં આવ્યું કારણ કે સામાન્ય રીતે આ પ્રકારની ફાઇલ ડાઉનલોડ કરવામાં આવતી નથી અને તે જોખમી હોઈ શકે છે</translation>
 <translation id="1203500561924088507">ઇન્સ્ટૉલ કરવા બદલ આભાર. <ph name="BUNDLE_NAME" />નો ઉપયોગ કરતા પહેલાં તમારે તમારું બ્રાઉઝર ફરી શરૂ કરવું આવશ્યક છે.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb
index c890eed..303e00f0 100644
--- a/chrome/app/resources/google_chrome_strings_hi.xtb
+++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">ChromeOS के बारे में जानकारी</translation>
 <translation id="1154147086299354128">Chrome में &amp;खोलें</translation>
 <translation id="1157985233335035034">हाल ही की भाषाएं</translation>
+<translation id="1158134713295836892">Chrome में Gemini</translation>
 <translation id="1184145431117212167">इंस्टॉल नहीं किया जा सका, क्योंकि Windows के आपके वर्शन पर यह काम नहीं करता.</translation>
 <translation id="1194807384646768652">Chromium ने इस डाउनलोड को ब्लॉक किया है, क्योंकि इस तरह की फ़ाइल आम तौर पर डाउनलोड नहीं की जाती और यह खतरनाक हो सकती है</translation>
 <translation id="1203500561924088507">इंस्टॉल करने के लिए धन्यवाद. <ph name="BUNDLE_NAME" /> का इस्तेमाल करने से पहले, ब्राउज़र को रीस्टार्ट करना ज़रूरी है.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb
index 11e85d4..bf769c73 100644
--- a/chrome/app/resources/google_chrome_strings_hr.xtb
+++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">O ChromeOS-u</translation>
 <translation id="1154147086299354128">&amp;Otvori u Chromeu</translation>
 <translation id="1157985233335035034">Nedavni jezici</translation>
+<translation id="1158134713295836892">Gemini u Chromeu</translation>
 <translation id="1184145431117212167">Instaliranje nije uspjelo jer vaša verzija Windowsa nije podržana.</translation>
 <translation id="1194807384646768652">Chrome je blokirao ovo preuzimanje jer se ova vrsta datoteke obično ne preuzima i mogla bi biti opasna</translation>
 <translation id="1203500561924088507">Zahvaljujemo što ste izvršili instaliranje. Da biste mogli koristiti <ph name="BUNDLE_NAME" />, morate ponovno pokrenuti preglednik.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb
index 692d385c2..e715c9f 100644
--- a/chrome/app/resources/google_chrome_strings_hu.xtb
+++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">A ChromeOS névjegye</translation>
 <translation id="1154147086299354128">&amp;Megnyitás Chrome-ban</translation>
 <translation id="1157985233335035034">A legutóbbi nyelvek</translation>
+<translation id="1158134713295836892">Gemini a Chrome-ban</translation>
 <translation id="1184145431117212167">A telepítés meghiúsult, mert az Ön által használt Windows-verzió nem támogatott.</translation>
 <translation id="1194807384646768652">A Chrome letiltotta ezt a letöltést, mert ezt a fájltípust nem töltik le gyakran, és veszélyes lehet</translation>
 <translation id="1203500561924088507">Köszönjük, hogy elvégezte a telepítést. A(z) <ph name="BUNDLE_NAME" /> használata előtt újra kell indítania a böngészőt.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hy.xtb b/chrome/app/resources/google_chrome_strings_hy.xtb
index ad7117e..2aa6489 100644
--- a/chrome/app/resources/google_chrome_strings_hy.xtb
+++ b/chrome/app/resources/google_chrome_strings_hy.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ChromeOS-ի մասին</translation>
 <translation id="1154147086299354128">&amp;Բացել Chrome-ում</translation>
 <translation id="1157985233335035034">Վերջերս ընտրված լեզուներ</translation>
+<translation id="1158134713295836892">Gemini-ը Chrome-ում</translation>
 <translation id="1184145431117212167">Տեղադրումը ձախողվեց, քանի որ Windows-ի ձեր տարբերակը չի աջակցվում։</translation>
 <translation id="1194807384646768652">Chrome-ն արգելափակել է այս ներբեռնումը, քանի որ ֆայլի այս տեսակը հազվադեպ է ներբեռնվում, և այն կարող է վտանգավոր լինել</translation>
 <translation id="1203500561924088507">Շնորհակալություն տեղադրելու համար։ Նախքան <ph name="BUNDLE_NAME" />-ն օգտագործելը դուք պետք է վերագործարկեք ձեր դիտարկիչը։</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb
index 1ea1d58e..99c2ad6 100644
--- a/chrome/app/resources/google_chrome_strings_id.xtb
+++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Tentang ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Buka di Chrome</translation>
 <translation id="1157985233335035034">Bahasa yang baru-baru ini digunakan</translation>
+<translation id="1158134713295836892">Gemini di Chrome</translation>
 <translation id="1184145431117212167">Penginstalan gagal karena versi Windows Anda tidak didukung.</translation>
 <translation id="1194807384646768652">Chrome memblokir download ini karena jenis file tersebut tidak biasa didownload dan mungkin berbahaya</translation>
 <translation id="1203500561924088507">Terima kasih telah menginstal. Anda harus memulai ulang browser sebelum menggunakan <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_is.xtb b/chrome/app/resources/google_chrome_strings_is.xtb
index baeb42a..8c99d6f 100644
--- a/chrome/app/resources/google_chrome_strings_is.xtb
+++ b/chrome/app/resources/google_chrome_strings_is.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">Um ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Opna í Chrome</translation>
 <translation id="1157985233335035034">Nýleg tungumál</translation>
+<translation id="1158134713295836892">Gemini í Chrome</translation>
 <translation id="1184145431117212167">Uppsetning mistókst því að þín útgáfa af Windows er ekki studd.</translation>
 <translation id="1194807384646768652">Chrome lokaði á þetta niðurhal vegna þess að skráargerðin er ekki sótt oft og gæti verið hættuleg</translation>
 <translation id="1203500561924088507">Takk fyrir að setja upp. Þú þarft að endurræsa vafrann áður en þú getur notað <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb
index fd126b1..1bb3955 100644
--- a/chrome/app/resources/google_chrome_strings_it.xtb
+++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Informazioni su ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Apri in Chrome</translation>
 <translation id="1157985233335035034">Lingue recenti</translation>
+<translation id="1158134713295836892">Gemini in Chrome</translation>
 <translation id="1184145431117212167">Installazione non riuscita perché la versione di Windows non è supportata.</translation>
 <translation id="1194807384646768652">Chrome ha bloccato questo download perché il tipo di file non viene scaricato comunemente e potrebbe essere pericoloso</translation>
 <translation id="1203500561924088507">L'installazione è terminata. Dovrai riavviare il browser per poter utilizzare <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb
index a18e8709..096d979f8 100644
--- a/chrome/app/resources/google_chrome_strings_iw.xtb
+++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">‏מידע על ChromeOS</translation>
 <translation id="1154147086299354128">‏&amp;פתיחה ב-Chrome</translation>
 <translation id="1157985233335035034">שפות אחרונות</translation>
+<translation id="1158134713295836892">‏‫Gemini ב-Chrome</translation>
 <translation id="1184145431117212167">‏ההתקנה נכשלה כי הגרסה של Windows לא נתמכת.</translation>
 <translation id="1194807384646768652">‏Chrome חסם את ההורדה הזאת כי לרוב לא מתבצעת הורדה של קבצים מהסוג הזה ויכול להיות שהקובץ מסוכן</translation>
 <translation id="1203500561924088507">תודה שהתקנת. עליך להפעיל מחדש את הדפדפן לפני השימוש ב-<ph name="BUNDLE_NAME" />.</translation>
@@ -393,7 +394,7 @@
 <translation id="5824893331272123205">לא הצלחנו לטעון את החלונית, אפשר לנסות שוב</translation>
 <translation id="5825922397106002626">‏הסרה של <ph name="EXTENSION_NAME" /> מ-Chrome</translation>
 <translation id="58431560289969279">‏כשמחוברים לחשבון, אפשר להשתמש בסיסמאות ובפרטים נוספים מחשבון Google ב-Chrome. אפשר לשנות את זה בכל שלב ב'הגדרות'.</translation>
-<translation id="5858486459377137936">‏אם סוגרים את כל החלונות של Chrome, מתבצעת יציאה מהחשבון ברוב האתרים, אבל לא מחשבון Google, אם נכנסת אליו ב-Chromium. כדי לאפשר לאתרים לזכור אותך, <ph name="SETTINGS_LINK" />.</translation>
+<translation id="5858486459377137936">‏אם כל החלונות של Chrome נסגרים מתבצעת יציאה מהחשבון ברוב האתרים, אבל לא מהחשבון שלך ב-Google (אם נכנסת אליו דרך הדפדפן). רוצה שהאתרים יזכרו אותך? <ph name="SETTINGS_LINK" />.</translation>
 <translation id="586971344380992563">‏<ph name="BEGIN_LINK" />ב-Chrome מוצגות אזהרות<ph name="END_LINK" /> מפני הורדות ואתרים לא בטוחים</translation>
 <translation id="5895138241574237353">הפעלה מחדש</translation>
 <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> – כניסה לרשת</translation>
@@ -506,7 +507,7 @@
 <translation id="7106741999175697885">‏מנהל המשימות - Google Chrome</translation>
 <translation id="7140653346177713799">{COUNT,plural, =0{‏יש עדכון חדש בשביל Chrome והמערכת תחיל אותו ברגע שתבוצע הפעלה מחדש.}=1{‏יש עדכון חדש בשביל Chrome והמערכת תחיל אותו ברגע שתבוצע הפעלה מחדש. החלון האנונימי הפרטי לא ייפתח מחדש.}one{‏יש עדכון חדש בשביל Chrome והמערכת תחיל אותו ברגע שתבוצע הפעלה מחדש. # החלונות הפרטיים לא ייפתחו מחדש.}two{‏יש עדכון חדש בשביל Chrome והמערכת תחיל אותו ברגע שתבוצע הפעלה מחדש. # החלונות הפרטיים לא ייפתחו מחדש.}other{‏יש עדכון חדש בשביל Chrome והמערכת תחיל אותו ברגע שתבוצע הפעלה מחדש. # החלונות הפרטיים לא ייפתחו מחדש.}}</translation>
 <translation id="7155997830309522122">‏אם שינית את הסיסמה הזו, יש לערוך את הסיסמה השמורה ב-Chrome כך שהיא תתאים לסיסמה החדשה שלך.</translation>
-<translation id="7161904924553537242">‏ברוך הבא ל-Google Chrome</translation>
+<translation id="7161904924553537242">‏איזה כיף שבחרת ב-Google Chrome</translation>
 <translation id="7193885263065350793">‏לפי הגדרת הארגון שלכם, Chrome נסגר אוטומטית כשלא משתמשים בו במשך <ph name="TIMEOUT_DURATION" />.</translation>
 <translation id="7242029209006116544">‏נכנסת עם חשבון מנוהל שנותן לאדמין שלו שליטה על הפרופיל שלך ב-Google Chrome. הנתונים שלך ב-Chrome, כמו אפליקציות, סימניות, היסטוריה, סיסמאות והגדרות אחרות יקושרו באופן קבוע ל-<ph name="USER_NAME" />. אפשר למחוק את הנתונים האלה דרך לוח הבקרה של חשבונות Google, אבל אי אפשר לשייך אותם לחשבון אחר. לחלופין, יש לך אפשרות ליצור פרופיל חדש כדי לשמור את הנתונים הקיימים שלך ב-Chrome בנפרד.<ph name="LEARN_MORE" /></translation>
 <translation id="7285616922384953075">‏הארגון '<ph name="MANAGER" />' מנהל את Chrome</translation>
@@ -570,7 +571,7 @@
 <translation id="7849037457735762883">‏רוצה להמשיך מהמקום שבו הפסקת? Chrome יכול לשחזר את הכרטיסיות שלך בכל הפעלה מחדש. כדי להפעיל את האפשרות הזו, צריך לעבור אל</translation>
 <translation id="7872446069773932638">מתבצעת הורדה… יש עוד <ph name="SECONDS" /> שנ'</translation>
 <translation id="7886087451482920026">‏בחירה של טקסט באמצעות Google Lens</translation>
-<translation id="7890208801193284374">‏כשמשתפים מחשב, חברים ובני משפחה יכולים לגלוש בנפרד ולהגדיר את Chrome בדיוק כפי שהם רוצים.</translation>
+<translation id="7890208801193284374">‏אם כמה חברים או בני משפחה משתמשים באותו מחשב, הם יכולים לגלוש בנפרד ולהגדיר את Chrome בדיוק כמו שהם רוצים.</translation>
 <translation id="7896673875602241923">‏מישהו נכנס בעבר ל-Chrome מהמחשב הזה כ-<ph name="ACCOUNT_EMAIL_LAST" />. צריך ליצור משתמש חדש ל-Chrome כדי שהמידע שלכם לא יתערבב.</translation>
 <translation id="7917876797003313048">‏יש לך אפשרות לנהל את חשבונות Google שאליהם נכנסת. כדי ליהנות מחיבור לחשבון בדפדפן Chrome, בחנות Play, ב-‏Gmail ובשירותים נוספים, עליך להיכנס עם חשבונות Google שלך. כדי להוסיף חשבון של מישהו אחר, כמו חבר/ה בקבוצה המשפחתית, יש להוסיף משתמש חדש ל-<ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
 <translation id="7936702483636872823">‏Chrome חסם את ההורדה הזאת כי הקובץ מטעה ועשוי לבצע שינויים לא צפויים במכשיר שלך</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb
index ba24cb21..3fc0750 100644
--- a/chrome/app/resources/google_chrome_strings_ja.xtb
+++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">ChromeOS について</translation>
 <translation id="1154147086299354128">Chrome で開く(&amp;O)</translation>
 <translation id="1157985233335035034">最近使用した言語</translation>
+<translation id="1158134713295836892">Gemini in Chrome</translation>
 <translation id="1184145431117212167">Windows のバージョンがサポートされていないためインストールできませんでした。</translation>
 <translation id="1194807384646768652">このダウンロードは Chrome でブロックされました。ファイル形式が一般的にダウンロードされるものではなく、危害を及ぼす可能性があります</translation>
 <translation id="1203500561924088507">インストールいただきありがとうございます。<ph name="BUNDLE_NAME" /> を使用するにはブラウザを再起動してください。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ka.xtb b/chrome/app/resources/google_chrome_strings_ka.xtb
index 3c49d0ea..7af3ecd 100644
--- a/chrome/app/resources/google_chrome_strings_ka.xtb
+++ b/chrome/app/resources/google_chrome_strings_ka.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ChromeOS-ის შესახებ</translation>
 <translation id="1154147086299354128">Chrome-ში &amp;გახსნა</translation>
 <translation id="1157985233335035034">ბოლოდროინდელი ენები</translation>
+<translation id="1158134713295836892">Gemini Chrome-ში</translation>
 <translation id="1184145431117212167">ინსტალაცია ვერ მოხერხდა, რადგან Windows-ის თქვენი ვერსია არ არის მხარდაჭერილი.</translation>
 <translation id="1194807384646768652">Chrome-მა დაბლოკა ეს ჩამოტვირთვა, რადგან ამ ტიპის ფაილს, როგორც წესი, არ ტვირთავენ ხოლმე და ის, შესაძლოა, სახიფათო იყოს</translation>
 <translation id="1203500561924088507">გმადლობთ დაინსტალირებისთვის. <ph name="BUNDLE_NAME" />-ის გამოყენებამდე თქვენი ბრაუზერი უნდა გადატვირთოთ.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kk.xtb b/chrome/app/resources/google_chrome_strings_kk.xtb
index 72c1dce5..5f0f26d 100644
--- a/chrome/app/resources/google_chrome_strings_kk.xtb
+++ b/chrome/app/resources/google_chrome_strings_kk.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ChromeOS туралы</translation>
 <translation id="1154147086299354128">&amp;Chrome браузерінде ашу</translation>
 <translation id="1157985233335035034">Жақында таңдалған тілдер</translation>
+<translation id="1158134713295836892">Chrome-дағы Gemini</translation>
 <translation id="1184145431117212167">Орнатылмады, себебі сіздегі Windows нұсқасына қолдау көрсетілмейді.</translation>
 <translation id="1194807384646768652">Chrome жүктеп алуды блоктады, себебі бұл файл түрі әдетте жүктеп алынбайды және ол қауіпті болуы мүмкін.</translation>
 <translation id="1203500561924088507">Орнатқаныңыз үшін рақмет. <ph name="BUNDLE_NAME" /> пайдаланбас бұрын браузерді жауып, қайта ашуыңыз керек.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_km.xtb b/chrome/app/resources/google_chrome_strings_km.xtb
index ff03436..7cc9b80 100644
--- a/chrome/app/resources/google_chrome_strings_km.xtb
+++ b/chrome/app/resources/google_chrome_strings_km.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">អំពី ChromeOS</translation>
 <translation id="1154147086299354128">&amp;​បើក​នៅក្នុង Chrome</translation>
 <translation id="1157985233335035034">ភាសា​ថ្មីៗ</translation>
+<translation id="1158134713295836892">Gemini ក្នុង Chrome</translation>
 <translation id="1184145431117212167">ការដំឡើងមិនបានសម្រេចទេ ដោយសារកំណែ Windows របស់អ្នកមិនអាចប្រើបាន។</translation>
 <translation id="1194807384646768652">Chrome បានទប់ស្កាត់​ការទាញយកនេះ ដោយសារ​ប្រភេទ​ឯកសារនេះ​មិនត្រូវបាន​ទាញយក​ជាទូទៅទេ ហើយវាអាច​បង្កគ្រោះថ្នាក់</translation>
 <translation id="1203500561924088507">សូមអរគុណសម្រាប់ការដំឡើង។ អ្នកត្រូវតែចាប់ផ្ដើមកម្មវិធីរុករកតាមអ៊ីនធឺណិតរបស់អ្នកឡើងវិញ មុនពេលប្រើ <ph name="BUNDLE_NAME" />។</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kn.xtb b/chrome/app/resources/google_chrome_strings_kn.xtb
index bd109be..aa7fa288 100644
--- a/chrome/app/resources/google_chrome_strings_kn.xtb
+++ b/chrome/app/resources/google_chrome_strings_kn.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">ChromeOS ಕುರಿತು</translation>
 <translation id="1154147086299354128">ಮತ್ತು Chrome ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation>
 <translation id="1157985233335035034">ಇತ್ತೀಚಿನ ಭಾಷೆಗಳು</translation>
+<translation id="1158134713295836892">Chrome ನಲ್ಲಿ Gemini</translation>
 <translation id="1184145431117212167">ನಿಮ್ಮ Windows ಆವೃತ್ತಿಯನ್ನು ಬೆಂಬಲಿಸದ ಕಾರಣ ಇನ್‌ಸ್ಟಾಲೇಶನ್ ವಿಫಲವಾಗಿದೆ.</translation>
 <translation id="1194807384646768652">ಈ ಫೈಲ್ ಪ್ರಕಾರವನ್ನು ಸಾಮಾನ್ಯ ರೀತಿಯಲ್ಲಿ ಡೌನ್‌ಲೋಡ್ ಮಾಡದ ಕಾರಣ Chrome ಈ ಡೌನ್‌ಲೋಡ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಿದೆ ಹಾಗೂ ಇದು ಅಪಾಯಕಾರಿಯಾಗಿರಬಹುದು</translation>
 <translation id="1203500561924088507">ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿದಕ್ಕಾಗಿ ಧನ್ಯವಾದಗಳು. <ph name="BUNDLE_NAME" /> ಅನ್ನು ಬಳಸುವ ಮೊದಲು ನೀವು ನಿಮ್ಮ ಬ್ರೌಸರ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕು.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb
index 6172a8c..721b6bc 100644
--- a/chrome/app/resources/google_chrome_strings_ko.xtb
+++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ChromeOS 정보</translation>
 <translation id="1154147086299354128">Chrome에서 열기(&amp;O)</translation>
 <translation id="1157985233335035034">최근에 사용한 언어</translation>
+<translation id="1158134713295836892">Chrome의 Gemini</translation>
 <translation id="1184145431117212167">지원되지 않는 Windows 버전으로 인해 설치할 수 없습니다.</translation>
 <translation id="1194807384646768652">일반적으로 다운로드하지 않는 파일 형식이며 위험할 가능성이 있기 때문에 Chrome에서 이 다운로드를 차단했습니다.</translation>
 <translation id="1203500561924088507">설치해 주셔서 감사합니다. <ph name="BUNDLE_NAME" />을(를) 사용하려면 브라우저를 다시 시작해야 합니다.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ky.xtb b/chrome/app/resources/google_chrome_strings_ky.xtb
index 5e8feb2..a3d17a5 100644
--- a/chrome/app/resources/google_chrome_strings_ky.xtb
+++ b/chrome/app/resources/google_chrome_strings_ky.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ChromeOS жөнүндө</translation>
 <translation id="1154147086299354128">&amp;Chrome'до ачуу</translation>
 <translation id="1157985233335035034">Жакында колдонулган тилдер</translation>
+<translation id="1158134713295836892">Chrome'догу Gemini</translation>
 <translation id="1184145431117212167">Орнотулган жок, анткени Windows версияңыз колдоого алынбайт.</translation>
 <translation id="1194807384646768652">Файл түрү аз жүктөлүп алынып, кооптуу болушу мүмкүн болгондуктан, Chrome бул жүктөп алууну бөгөттөдү</translation>
 <translation id="1203500561924088507">Орнотуп алганыңыз үчүн рахмат. <ph name="BUNDLE_NAME" /> топтомун колдонуп баштоодон мурда серепчини өчүрүп күйгүзүңүз.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lo.xtb b/chrome/app/resources/google_chrome_strings_lo.xtb
index 1229b6c..8c18def 100644
--- a/chrome/app/resources/google_chrome_strings_lo.xtb
+++ b/chrome/app/resources/google_chrome_strings_lo.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ກ່ຽວກັບ ChromeOS</translation>
 <translation id="1154147086299354128">&amp;ເປີດໃນ Chrome</translation>
 <translation id="1157985233335035034">ພາສາຫຼ້າສຸດ</translation>
+<translation id="1158134713295836892">Gemini ໃນ Chrome</translation>
 <translation id="1184145431117212167">ການຕິດຕັ້ງບໍ່ສຳເລັດເນື່ອງຈາກລະບົບບໍ່ຮອງຮັບ Windows ເວີຊັນທີ່ທ່ານໃຊ້.</translation>
 <translation id="1194807384646768652">Chrome ບລັອກການດາວໂຫຼດນີ້ ເນື່ອງຈາກໄຟລ໌ປະເພດນີ້ບໍ່ໄດ້ມີການດາວໂຫຼດໂດຍທົ່ວໄປ ແລະ ອາດເປັນອັນຕະລາຍ</translation>
 <translation id="1203500561924088507">ຂໍຂອບໃຈສຳລັບການຕິດຕັ້ງ. ທ່ານຈະຕ້ອງຣີສະຕາດໂປຣແກຣມທ່ອງເວັບຂອງທ່ານກ່ອນການໃຊ້ <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb
index 881a024..6238ebfa 100644
--- a/chrome/app/resources/google_chrome_strings_lt.xtb
+++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">Apie „ChromeOS“</translation>
 <translation id="1154147086299354128">&amp;Atidaryti naudojant „Chrome“</translation>
 <translation id="1157985233335035034">Naujausios kalbos</translation>
+<translation id="1158134713295836892">„Gemini“ narš. „Chrome“</translation>
 <translation id="1184145431117212167">Įdiegti nepavyko, nes jūsų „Windows“ versija nepalaikoma.</translation>
 <translation id="1194807384646768652">„Chrome“ užblokavo šį atsisiuntimą, nes šio tipo failas nėra dažnai atsisiunčiamas ir jis gali būti pavojingas</translation>
 <translation id="1203500561924088507">Dėkojame už diegimą. Turite iš naujo paleisti naršyklę, prieš naudodami „<ph name="BUNDLE_NAME" />“.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lv.xtb b/chrome/app/resources/google_chrome_strings_lv.xtb
index bcf4533..bfe73d1 100644
--- a/chrome/app/resources/google_chrome_strings_lv.xtb
+++ b/chrome/app/resources/google_chrome_strings_lv.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Par ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Atvērt pārlūkā Chrome</translation>
 <translation id="1157985233335035034">Nesen izmantotās valodas</translation>
+<translation id="1158134713295836892">Gemini pārlūkā Chrome</translation>
 <translation id="1184145431117212167">Instalēšana neizdevās, jo jūsu izmantotā Windows versija netiek atbalstīta.</translation>
 <translation id="1194807384646768652">Pārlūkā Chrome šī lejupielāde tika bloķēta, jo šī tipa faili parasti netiek lejupielādēti un var būt bīstami.</translation>
 <translation id="1203500561924088507">Pateicamies, ka veicāt instalēšanu. Pirms <ph name="BUNDLE_NAME" /> izmantošanas ir jārestartē pārlūkprogramma.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mk.xtb b/chrome/app/resources/google_chrome_strings_mk.xtb
index 655b28ad..5ed76d7 100644
--- a/chrome/app/resources/google_chrome_strings_mk.xtb
+++ b/chrome/app/resources/google_chrome_strings_mk.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">Повеќе за ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Отвори во Chrome</translation>
 <translation id="1157985233335035034">Неодамнешни јазици</translation>
+<translation id="1158134713295836892">Gemini во Chrome</translation>
 <translation id="1184145431117212167">Инсталирањето не успеа бидејќи вашата верзија на Windows не е поддржана.</translation>
 <translation id="1194807384646768652">Chrome го блокираше преземањево затоа што видот датотека не се презема често и можеби е опасен</translation>
 <translation id="1203500561924088507">Фала за инсталирањето. Мора да го рестартирате прелистувачот пред да користите <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb
index 12b5cf7e..51f8cdb5 100644
--- a/chrome/app/resources/google_chrome_strings_ml.xtb
+++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ChromeOS-നെ കുറിച്ച്</translation>
 <translation id="1154147086299354128">&amp;Chrome-ൽ തുറക്കുക</translation>
 <translation id="1157985233335035034">അടുത്തിടെ ഉപയോഗിച്ച ഭാഷകൾ</translation>
+<translation id="1158134713295836892">Chrome-ലെ Gemini</translation>
 <translation id="1184145431117212167">നിങ്ങളുടെ Windows പതിപ്പിന് പിന്തുണയില്ലാത്തതിനാൽ ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല.</translation>
 <translation id="1194807384646768652">ഈ ഫയൽ തരം സാധാരണയായി ഡൗൺലോഡ് ചെയ്യാത്തതിനാലും ഇത് അപകടകരമായേക്കാം എന്നതിനാലും Chrome ഈ ഡൗൺലോഡ് ബ്ലോക്ക് ചെയ്തു</translation>
 <translation id="1203500561924088507">ഇൻസ്റ്റാൾ ചെയ്തതിന് നന്ദി. <ph name="BUNDLE_NAME" /> ഉപയോഗിക്കും മുമ്പ് നിങ്ങളുടെ ബ്രൗസർ റീസ്റ്റാർട്ട് ചെയ്യേണ്ടതുണ്ട്.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mn.xtb b/chrome/app/resources/google_chrome_strings_mn.xtb
index ac48cd67..5030edd 100644
--- a/chrome/app/resources/google_chrome_strings_mn.xtb
+++ b/chrome/app/resources/google_chrome_strings_mn.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ChromeOS-н тухай</translation>
 <translation id="1154147086299354128">&amp;Chrome-д нээх</translation>
 <translation id="1157985233335035034">Саяхан сонгосон хэлнүүд</translation>
+<translation id="1158134713295836892">Chrome дахь Gemini</translation>
 <translation id="1184145431117212167">Таны Windows-н хувилбарыг дэмждэггүй тул суулгаж чадсангүй.</translation>
 <translation id="1194807384646768652">Файлын төрлийг ихэвчлэн татдаггүй бөгөөд энэ нь аюултай байж магадгүй тул Chrome энэ таталтыг блоклосон</translation>
 <translation id="1203500561924088507">Суулгасанд баярлалаа. Та <ph name="BUNDLE_NAME" />-г ашиглахаасаа өмнө хөтчөө дахин эхлүүлэх ёстой.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb
index 4a2224d..1b2ecff3 100644
--- a/chrome/app/resources/google_chrome_strings_mr.xtb
+++ b/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -20,6 +20,7 @@
 <translation id="1152920704813762236">ChromeOS बद्दल</translation>
 <translation id="1154147086299354128">Chrome मध्‍ये &amp;उघडा</translation>
 <translation id="1157985233335035034">अलीकडील भाषा</translation>
+<translation id="1158134713295836892">Chrome मधील Gemini</translation>
 <translation id="1184145431117212167">तुमच्या Windows च्या आवृत्तीला सपोर्ट नसल्यामुळे इंस्टॉलेशन करता आले नाही.</translation>
 <translation id="1194807384646768652">फाइल प्रकार सामान्यतः डाउनलोड केला जात नसल्याने Chrome ने हे डाउनलोड ब्लॉक केले आहे आणि तो धोकादायक असू शकतो</translation>
 <translation id="1203500561924088507">इंस्टॉल केल्याबद्दल धन्यवाद. तुम्ही <ph name="BUNDLE_NAME" /> वापरण्यापूर्वी तुमचा ब्राउझर रीस्टार्ट करणे आवश्यक आहे.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb
index 93284f8bd..e5981d5 100644
--- a/chrome/app/resources/google_chrome_strings_ms.xtb
+++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Perihal ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Buka dalam Chrome</translation>
 <translation id="1157985233335035034">Bahasa baru-baru ini</translation>
+<translation id="1158134713295836892">Gemini dalam Chrome</translation>
 <translation id="1184145431117212167">Pemasangan gagal kerana versi Windows anda tidak disokong.</translation>
 <translation id="1194807384646768652">Chrome menyekat muat turun ini kerana jenis fail jarang dimuat turun dan mungkin berbahaya</translation>
 <translation id="1203500561924088507">Terima kasih kerana memasang. Anda perlu memulakan semula penyemak imbas anda sebelum menggunakan <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_my.xtb b/chrome/app/resources/google_chrome_strings_my.xtb
index 13b00be..0c2616f 100644
--- a/chrome/app/resources/google_chrome_strings_my.xtb
+++ b/chrome/app/resources/google_chrome_strings_my.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ChromeOS အကြောင်း</translation>
 <translation id="1154147086299354128">&amp;Chrome တွင် ဖွင့်ရန်</translation>
 <translation id="1157985233335035034">မကြာသေးမီက ဘာသာစကားများ</translation>
+<translation id="1158134713295836892">Chrome ရှိ Gemini</translation>
 <translation id="1184145431117212167">သင်၏ Windows ဗားရှင်းကို ပံ့ပိုးမထားသောကြောင့် ထည့်သွင်း၍ မရလိုက်ပါ။</translation>
 <translation id="1194807384646768652">ဤဖိုင်အမျိုးအစားကို ဒေါင်းလုဒ်လုပ်လေ့မရှိသည့်အပြင် အန္တရာယ်ရှိနိုင်သဖြင့် Chrome က ဤဒေါင်းလုဒ်ကို ပိတ်ထားသည်</translation>
 <translation id="1203500561924088507">ထည့်သွင်းသည့်အတွက် ကျေးဇူးတင်ပါသည်။ <ph name="BUNDLE_NAME" /> အသုံးမပြုမီ သင့်ဘရောင်ဇာကို ပြန်စရမည်။</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ne.xtb b/chrome/app/resources/google_chrome_strings_ne.xtb
index 0da5f89a..150ffdab 100644
--- a/chrome/app/resources/google_chrome_strings_ne.xtb
+++ b/chrome/app/resources/google_chrome_strings_ne.xtb
@@ -20,6 +20,7 @@
 <translation id="1152920704813762236">ChromeOS का बारेमा</translation>
 <translation id="1154147086299354128">Chrome मा खोल्नुहोस्</translation>
 <translation id="1157985233335035034">हालसालै चयन गरिएका भाषाहरू</translation>
+<translation id="1158134713295836892">Chrome मा उपलब्ध Gemini</translation>
 <translation id="1184145431117212167">तपाईंको डिभाइसमा भएको Windows को संस्करणमा नचल्ने भएकाले इन्स्टल गर्न सकिएन।</translation>
 <translation id="1194807384646768652">यस प्रकारको फाइल सामान्यतया डाउनलोड नगरिने र खतरनाक हुन सक्ने भएकाले Chrome ले उक्त प्रकारको फाइल डाउनलोड गर्ने कार्य ब्लक गरेको छ</translation>
 <translation id="1203500561924088507">इन्स्टल गर्नुभएकोमा धन्यवाद। <ph name="BUNDLE_NAME" /> प्रयोग गर्नुअघि तपाईंले अनिवार्य रूपमा आफ्नो ब्राउजर रिस्टार्ट गर्नु पर्छ।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb
index 99a25fc..9735c7c 100644
--- a/chrome/app/resources/google_chrome_strings_nl.xtb
+++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">Over ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Openen in Chrome</translation>
 <translation id="1157985233335035034">Recente talen</translation>
+<translation id="1158134713295836892">Gemini in Chrome</translation>
 <translation id="1184145431117212167">De installatie is mislukt omdat je versie van Windows niet wordt ondersteund.</translation>
 <translation id="1194807384646768652">Chrome heeft deze download geblokkeerd, omdat het bestandstype niet vaak wordt gedownload en misschien gevaarlijk is</translation>
 <translation id="1203500561924088507">Bedankt voor het installeren. Je moet de browser opnieuw opstarten voordat je <ph name="BUNDLE_NAME" /> kunt gebruiken.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb
index bf8efbe0..6ab6e0a2 100644
--- a/chrome/app/resources/google_chrome_strings_no.xtb
+++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Om ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Åpne i Chrome</translation>
 <translation id="1157985233335035034">Nylig brukte språk</translation>
+<translation id="1158134713295836892">Gemini i Chrome</translation>
 <translation id="1184145431117212167">Installasjonen mislyktes fordi du bruker en Windows-versjon som ikke støttes.</translation>
 <translation id="1194807384646768652">Chrome har blokkert denne nedlastingen fordi filtypen ikke lastes ned ofte, så den kan være farlig</translation>
 <translation id="1203500561924088507">Installasjonen er fullført. Start nettleseren på nytt før du tar i bruk <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_or.xtb b/chrome/app/resources/google_chrome_strings_or.xtb
index 1aa683b6..ebb0b37 100644
--- a/chrome/app/resources/google_chrome_strings_or.xtb
+++ b/chrome/app/resources/google_chrome_strings_or.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ChromeOS ବିଷୟରେ</translation>
 <translation id="1154147086299354128">&amp;Chromeରେ ଖୋଲନ୍ତୁ</translation>
 <translation id="1157985233335035034">ବର୍ତ୍ତମାନର ଭାଷାଗୁଡ଼ିକ</translation>
+<translation id="1158134713295836892">Chromeରେ Gemini</translation>
 <translation id="1184145431117212167">ଆପଣଙ୍କ Windows ଭର୍ସନ ସପୋର୍ଟ କରୁନଥିବା ଯୋଗୁଁ ଇନଷ୍ଟଲେସନ ବିଫଳ ହୋଇଛି।</translation>
 <translation id="1194807384646768652">Chrome ଏହି ଡାଉନଲୋଡକୁ ବ୍ଲକ କରିଛି କାରଣ ଏହି ଫାଇଲ ପ୍ରକାରକୁ ସାଧାରଣତଃ ଡାଉନଲୋଡ କରାଯାଇନଥାଏ ଏବଂ ଏହା ବିପଦଜନକ ହୋଇପାରେ</translation>
 <translation id="1203500561924088507">ଇନଷ୍ଟଲ କରିଥିବା ଯୋଗୁଁ ଧନ୍ୟବାଦ। ଆପଣ <ph name="BUNDLE_NAME" /> ବ୍ୟବହାର କରିବା ପୂର୍ବରୁ ଆପଣଙ୍କ ବ୍ରାଉଜରକୁ ରିଷ୍ଟାର୍ଟ କରିବା ଆବଶ୍ୟକ।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pa.xtb b/chrome/app/resources/google_chrome_strings_pa.xtb
index be88ff78..bac6fe6af 100644
--- a/chrome/app/resources/google_chrome_strings_pa.xtb
+++ b/chrome/app/resources/google_chrome_strings_pa.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ChromeOS ਬਾਰੇ</translation>
 <translation id="1154147086299354128">&amp;Chrome ਵਿੱਚ ਖੋਲ੍ਹੋ</translation>
 <translation id="1157985233335035034">ਹਾਲੀਆ ਭਾਸ਼ਾਵਾਂ</translation>
+<translation id="1158134713295836892">Chrome ਵਿੱਚ Gemini</translation>
 <translation id="1184145431117212167">Windows ਦਾ ਤੁਹਾਡਾ ਵਰਜਨ ਸਮਰਥਿਤ ਨਾ ਹੋਣ ਕਰਕੇ ਸਥਾਪਨਾ ਅਸਫਲ ਰਹੀ।</translation>
 <translation id="1194807384646768652">Chrome ਨੇ ਇਸ ਡਾਊਨਲੋਡ ਨੂੰ ਬਲਾਕ ਕਰ ਦਿੱਤਾ ਹੈ ਕਿਉਂਕਿ ਫ਼ਾਈਲ ਦੀ ਕਿਸਮ ਨੂੰ ਆਮ ਤੌਰ 'ਤੇ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ ਅਤੇ ਇਹ ਖਤਰਨਾਕ ਹੋ ਸਕਦੀ ਹੈ</translation>
 <translation id="1203500561924088507">ਸਥਾਪਨਾ ਕਰਨ ਲਈ ਧੰਨਵਾਦ। <ph name="BUNDLE_NAME" /> ਦੀ ਵਰਤੋਂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਆਪਣੇ ਬ੍ਰਾਊਜ਼ਰ ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb
index 4f7453e..3ebd30a8 100644
--- a/chrome/app/resources/google_chrome_strings_pl.xtb
+++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">ChromeOS – informacje</translation>
 <translation id="1154147086299354128">&amp;Otwórz w Chrome</translation>
 <translation id="1157985233335035034">Ostatnio wybierane języki</translation>
+<translation id="1158134713295836892">Gemini w Chrome</translation>
 <translation id="1184145431117212167">Instalacja się nie udała, ponieważ Twoja wersja systemu Windows nie jest obsługiwana.</translation>
 <translation id="1194807384646768652">Pobieranie zostało zablokowane przez Chrome, ponieważ ten typ pliku nie jest często pobierany i może być niebezpieczny</translation>
 <translation id="1203500561924088507">Dziękujemy za instalację. Przed rozpoczęciem korzystania z programu <ph name="BUNDLE_NAME" /> musisz ponownie uruchomić przeglądarkę.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
index 8190b55..0a11fc6 100644
--- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Sobre o ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Abrir no Chrome</translation>
 <translation id="1157985233335035034">Idiomas recentes</translation>
+<translation id="1158134713295836892">Gemini no Chrome</translation>
 <translation id="1184145431117212167">A instalação falhou porque sua versão do Windows não é compatível.</translation>
 <translation id="1194807384646768652">O Chrome bloqueou o download porque o tipo de arquivo não é transferido com frequência e pode ser perigoso</translation>
 <translation id="1203500561924088507">Agradecemos por fazer a instalação. É necessário reiniciar o navegador antes de utilizar o <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
index 9b3adddb..478d2386 100644
--- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Acerca do ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Abrir no Chrome</translation>
 <translation id="1157985233335035034">Idiomas recentes</translation>
+<translation id="1158134713295836892">Gemini no Chrome</translation>
 <translation id="1184145431117212167">A instalação falhou porque a sua versão do Windows não é suportada.</translation>
 <translation id="1194807384646768652">O Chrome bloqueou esta transferência porque o tipo de ficheiro não é habitualmente transferido e pode ser perigoso</translation>
 <translation id="1203500561924088507">Agradecemos a instalação. Tem de reiniciar o navegador antes de utilizar o <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb
index b6482f29..ef5cd21 100644
--- a/chrome/app/resources/google_chrome_strings_ro.xtb
+++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Despre ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Deschide în Chrome</translation>
 <translation id="1157985233335035034">Limbi recente</translation>
+<translation id="1158134713295836892">Gemini în Chrome</translation>
 <translation id="1184145431117212167">Instalarea nu a reușit, deoarece versiunea ta de Windows nu este acceptată.</translation>
 <translation id="1194807384646768652">Chrome a blocat descărcarea, deoarece tipul de fișier nu este descărcat frecvent și ar putea fi periculos</translation>
 <translation id="1203500561924088507">Mulțumim pentru instalare. Înainte să folosești <ph name="BUNDLE_NAME" /> trebuie să repornești browserul.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb
index 66999b4c..683ec3ab 100644
--- a/chrome/app/resources/google_chrome_strings_ru.xtb
+++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Подробнее о ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Открыть в Chrome</translation>
 <translation id="1157985233335035034">Недавние языки</translation>
+<translation id="1158134713295836892">Gemini в Chrome</translation>
 <translation id="1184145431117212167">Не удалось выполнить установку, так как эта версия Windows не поддерживается.</translation>
 <translation id="1194807384646768652">Chrome заблокировал скачивание, поскольку этот тип файлов скачивают редко и он может быть опасен</translation>
 <translation id="1203500561924088507">Спасибо, что установили <ph name="BUNDLE_NAME" />. Чтобы изменения вступили в силу, перезапустите браузер.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_si.xtb b/chrome/app/resources/google_chrome_strings_si.xtb
index 72a508c7e2..7d69f91 100644
--- a/chrome/app/resources/google_chrome_strings_si.xtb
+++ b/chrome/app/resources/google_chrome_strings_si.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">ChromeOS ගැන</translation>
 <translation id="1154147086299354128">&amp;Chrome තුළ විවෘත කරන්න</translation>
 <translation id="1157985233335035034">මෑත භාෂා</translation>
+<translation id="1158134713295836892">Chrome හි Gemini</translation>
 <translation id="1184145431117212167">ඔබේ Windows අනුවාදය සඳහා සහය නොදක්වන නිසා ස්ථාපනය අසමත් විය.</translation>
 <translation id="1194807384646768652">ගොනු වර්ගය සාමාන්‍යයෙන් බාගත නොවන නිසා සහ එය භයානක විය හැකි නිසා Chrome මෙම බාගැනීම අවහිර කර ඇත</translation>
 <translation id="1203500561924088507">ස්ථාපනය කිරීම වෙනුවෙන් ස්තුතියි. ඔබ <ph name="BUNDLE_NAME" /> භාවිත කිරීමට පෙර ඔබගේ බ්‍රවුසරය යළි ඇරඹිය යුතුය.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb
index f218e5a3..727ff74f23 100644
--- a/chrome/app/resources/google_chrome_strings_sk.xtb
+++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">O systéme ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Otvoriť v Chrome</translation>
 <translation id="1157985233335035034">Nedávne jazyky</translation>
+<translation id="1158134713295836892">Gemini v Chrome</translation>
 <translation id="1184145431117212167">Nepodarilo sa nainštalovať, pretože vaša verzia systému Windows nie je podporovaná.</translation>
 <translation id="1194807384646768652">Chrome toto sťahovanie zablokoval, pretože používatelia tento typ súboru bežne nesťahujú a môže byť nebezpečný</translation>
 <translation id="1203500561924088507">Ďakujeme za inštaláciu. Než začnete aplikáciu <ph name="BUNDLE_NAME" /> používať, musíte reštartovať prehliadač.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb
index 76f9744fd9..86bfde2 100644
--- a/chrome/app/resources/google_chrome_strings_sl.xtb
+++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">O sistemu ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Odpri v Chromu</translation>
 <translation id="1157985233335035034">Nedavni jeziki</translation>
+<translation id="1158134713295836892">Gemini v Chromu</translation>
 <translation id="1184145431117212167">Namestitev ni uspela, ker vaša različica sistema Windows ni podprta.</translation>
 <translation id="1194807384646768652">Chrome je blokiral ta prenos, ker se vrsta datoteke ne prenaša pogosto in je morda nevarna</translation>
 <translation id="1203500561924088507">Hvala, ker ste se odločili za namestitev. Preden uporabite <ph name="BUNDLE_NAME" />, morate znova zagnati brskalnik.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sq.xtb b/chrome/app/resources/google_chrome_strings_sq.xtb
index bcc4587..1edb5d0 100644
--- a/chrome/app/resources/google_chrome_strings_sq.xtb
+++ b/chrome/app/resources/google_chrome_strings_sq.xtb
@@ -20,6 +20,7 @@
 <translation id="1152920704813762236">Rreth ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Hape në Chrome</translation>
 <translation id="1157985233335035034">Gjuhët e fundit</translation>
+<translation id="1158134713295836892">Gemini në Chrome</translation>
 <translation id="1184145431117212167">Instalimi dështoi pasi versioni yt i Windows nuk mbështetet.</translation>
 <translation id="1194807384646768652">Chrome e bllokoi këtë shkarkim sepse lloji i skedarit nuk është shkarkuar zakonisht dhe mund të jetë i rrezikshëm</translation>
 <translation id="1203500561924088507">Faleminderit që e instalove. Duhet të rinisësh shfletuesin përpara se të përdorësh <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
index 9b475cd..d015ac1 100644
--- a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
+++ b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">O ChromeOS-u</translation>
 <translation id="1154147086299354128">&amp;Otvori u Chrome-u</translation>
 <translation id="1157985233335035034">Nedavni jezici</translation>
+<translation id="1158134713295836892">Gemini u Chrome-u</translation>
 <translation id="1184145431117212167">Instalacija nije uspela jer vaša verzija Windows-a nije podržana.</translation>
 <translation id="1194807384646768652">Chrome je blokirao ovo preuzimanje jer se ovaj tip fajl ne preuzima često i može da bude opasan</translation>
 <translation id="1203500561924088507">Hvala vam na instalaciji. Potrebno je da restartujete pregledač pre nego što počnete da koristite <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb
index c35bd718..c511586 100644
--- a/chrome/app/resources/google_chrome_strings_sr.xtb
+++ b/chrome/app/resources/google_chrome_strings_sr.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">О ChromeOS-у</translation>
 <translation id="1154147086299354128">&amp;Отвори у Chrome-у</translation>
 <translation id="1157985233335035034">Недавни језици</translation>
+<translation id="1158134713295836892">Gemini у Chrome-у</translation>
 <translation id="1184145431117212167">Инсталација није успела јер ваша верзија Windows-а није подржана.</translation>
 <translation id="1194807384646768652">Chrome је блокирао ово преузимање јер се овај тип фајл не преузима често и може да буде опасан</translation>
 <translation id="1203500561924088507">Хвала вам на инсталацији. Потребно је да рестартујете прегледач пре него што почнете да користите <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb
index 896487d..09f12fb6 100644
--- a/chrome/app/resources/google_chrome_strings_sv.xtb
+++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">Om ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Öppna i Chrome</translation>
 <translation id="1157985233335035034">Nyligen använda språk</translation>
+<translation id="1158134713295836892">Gemini i Chrome</translation>
 <translation id="1184145431117212167">Installationen misslyckades eftersom du använder en version av Windows som inte stöds.</translation>
 <translation id="1194807384646768652">Den här nedladdningen blockerades av Chrome eftersom filtypen inte brukar laddas ned och den kan vara farlig</translation>
 <translation id="1203500561924088507">Tack för att du installerat programmet. Du måste starta om webbläsaren innan du använder <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb
index 1a18e42..32f50f6 100644
--- a/chrome/app/resources/google_chrome_strings_sw.xtb
+++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">Kuhusu ChromeOS</translation>
 <translation id="1154147086299354128">na Fungua katika Chrome</translation>
 <translation id="1157985233335035034">Lugha ulizotumia hivi majuzi</translation>
+<translation id="1158134713295836892">Gemini kwenye Chrome</translation>
 <translation id="1184145431117212167">Imeshindwa kuweka kwenye kifaa kwa sababu toleo la Windows ulilonalo halitumiki.</translation>
 <translation id="1194807384646768652">Chrome imezuia upakuaji huu kwa sababu aina hii ya faili kwa kawaida haipakuliwi na huenda si salama</translation>
 <translation id="1203500561924088507">Asante kwa kusakinisha. Ni lazima uzime kisha uwashe tena kivinjari chako kabla ya kutumia <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb
index ee188b14..b90c2536 100644
--- a/chrome/app/resources/google_chrome_strings_ta.xtb
+++ b/chrome/app/resources/google_chrome_strings_ta.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">ChromeOS - ஓர் அறிமுகம்</translation>
 <translation id="1154147086299354128">&amp;Chrome இல் திற</translation>
 <translation id="1157985233335035034">சமீபத்திய மொழிகள்</translation>
+<translation id="1158134713295836892">Chromeமில் Gemini</translation>
 <translation id="1184145431117212167">ஆதரிக்கப்படாத Windows பதிப்பை நீங்கள் பயன்படுத்துவதால் நிறுவ முடியவில்லை.</translation>
 <translation id="1194807384646768652">இந்த ஃபைல் வகை பொதுவாகப் பதிவிறக்கப்படுவதில்லை என்பதுடன் ஆபத்தானதாகவும் இருக்கலாம் என்பதால் இந்தப் பதிவிறக்கத்தை Chrome தடுத்துள்ளது</translation>
 <translation id="1203500561924088507">நிறுவியதற்கு நன்றி. <ph name="BUNDLE_NAME" /> ஐப் பயன்படுத்துவதற்கு முன் உலாவியை மீண்டும் தொடங்க வேண்டும்.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb
index 961faea..ce81f47 100644
--- a/chrome/app/resources/google_chrome_strings_te.xtb
+++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">ChromeOS గురించి</translation>
 <translation id="1154147086299354128">&amp;Chromeలో తెరువు</translation>
 <translation id="1157985233335035034">ఇటీవలి భాషలు</translation>
+<translation id="1158134713295836892">Chromeలో Gemini</translation>
 <translation id="1184145431117212167">మీ Windows వెర్షన్‌ సపోర్ట్ చేయనందున ఇన్‌స్టాలేషన్ విఫలమైంది.</translation>
 <translation id="1194807384646768652">ఫైల్ రకం సాధారణంగా డౌన్‌లోడ్ అవ్వదు, అలాగే ఇది ప్రమాదకరమైనది అయినందున Chrome ఈ డౌన్‌లోడ్‌ను బ్లాక్ చేసింది</translation>
 <translation id="1203500561924088507">ఇన్‌స్టాల్ చేసినందుకు ధన్యవాదాలు. <ph name="BUNDLE_NAME" />‌ను ఉపయోగించడానికి ముందు మీరు బ్రౌజర్‌ను తప్పకుండా రీస్టార్ట్ చేయాలి.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb
index 8bcae5a..1d38cbbc 100644
--- a/chrome/app/resources/google_chrome_strings_th.xtb
+++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">เกี่ยวกับ ChromeOS</translation>
 <translation id="1154147086299354128">เ&amp;ปิดใน Chrome</translation>
 <translation id="1157985233335035034">ภาษาล่าสุด</translation>
+<translation id="1158134713295836892">Gemini ใน Chrome</translation>
 <translation id="1184145431117212167">ติดตั้งไม่สำเร็จเนื่องจากระบบไม่รองรับ Windows เวอร์ชันที่คุณใช้</translation>
 <translation id="1194807384646768652">Chrome บล็อกการดาวน์โหลดนี้เนื่องจากไฟล์ประเภทนี้ไม่ได้มีการดาวน์โหลดกันโดยทั่วไปและอาจเป็นอันตราย</translation>
 <translation id="1203500561924088507">ขอขอบคุณที่ติดตั้ง คุณต้องรีสตาร์ทเบราว์เซอร์ก่อนใช้ <ph name="BUNDLE_NAME" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb
index 829bc5c9..587d8b1d 100644
--- a/chrome/app/resources/google_chrome_strings_tr.xtb
+++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">ChromeOS hakkında</translation>
 <translation id="1154147086299354128">&amp;Chrome'da aç</translation>
 <translation id="1157985233335035034">Son kullanılan diller</translation>
+<translation id="1158134713295836892">Chrome'da Gemini</translation>
 <translation id="1184145431117212167">Windows sürümünüz desteklenmediğinden yükleme işlemi başarısız oldu.</translation>
 <translation id="1194807384646768652">Dosya türü çok indirilmediği ve tehlikeli olabileceği için Chrome bu indirme işlemini engelledi</translation>
 <translation id="1203500561924088507">Yüklediğiniz için teşekkürler. <ph name="BUNDLE_NAME" /> uygulamasını kullanmadan önce tarayıcınızı yeniden başlatmanız gerekir.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb
index 052ae1a..165ac47d 100644
--- a/chrome/app/resources/google_chrome_strings_uk.xtb
+++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Про ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Відкрити в Chrome</translation>
 <translation id="1157985233335035034">Останні мови</translation>
+<translation id="1158134713295836892">Gemini у Chrome</translation>
 <translation id="1184145431117212167">Не вдалося встановити, оскільки ваша версія ОС Windows не підтримується.</translation>
 <translation id="1194807384646768652">Веб-переглядач Chrome заблокував завантаження, оскільки файли цього типу зазвичай не завантажують і вони можуть бути небезпечними</translation>
 <translation id="1203500561924088507">Дякуємо за встановлення. Щоб почати використовувати пакет <ph name="BUNDLE_NAME" />, потрібно перезапустити веб-переглядач.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ur.xtb b/chrome/app/resources/google_chrome_strings_ur.xtb
index ca250e6..32233ecf 100644
--- a/chrome/app/resources/google_chrome_strings_ur.xtb
+++ b/chrome/app/resources/google_chrome_strings_ur.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">‏ChromeOS کے بارے میں</translation>
 <translation id="1154147086299354128">‏Chrome میں &amp;کھولیں</translation>
 <translation id="1157985233335035034">حالیہ زبانیں</translation>
+<translation id="1158134713295836892">‏‫Chrome میں Gemini</translation>
 <translation id="1184145431117212167">‏انسٹالیشن ناکام ہوگئی کیونکہ Windows کا آپ کا ورژن تعاون یافتہ نہیں ہے۔</translation>
 <translation id="1194807384646768652">‏Chrome نے اس ڈاؤن لوڈ کو مسدود کر دیا کیونکہ فائل کی یہ قسم عام طور پر ڈاؤن لوڈ نہیں ہوتی ہے اور یہ خطرناک ہو سکتی ہے</translation>
 <translation id="1203500561924088507">انسٹال کرنے کا شکریہ۔ آپ کو <ph name="BUNDLE_NAME" /> استعمال کرنے سے پہلے اپنا براؤزر لازمی طور سے ری اسٹارٹ کرنا چاہیے۔</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uz.xtb b/chrome/app/resources/google_chrome_strings_uz.xtb
index 561d403a..033374c3 100644
--- a/chrome/app/resources/google_chrome_strings_uz.xtb
+++ b/chrome/app/resources/google_chrome_strings_uz.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">ChromeOS haqida</translation>
 <translation id="1154147086299354128">Chrome brauzerida &amp;ochish</translation>
 <translation id="1157985233335035034">Oxirgi tillar</translation>
+<translation id="1158134713295836892">Chrome ichida Gemini</translation>
 <translation id="1184145431117212167">Windows versiyasi mos emasligi uchun oʻrnatilmadi.</translation>
 <translation id="1194807384646768652">Chrome bu yuklamani blokladi, chunki bunday turdagi fayl odatda yuklab olinmaydi va xavfli boʻlishi mumkin</translation>
 <translation id="1203500561924088507">Oʻrnatganingiz uchun tashakkur! <ph name="BUNDLE_NAME" />ni ishlatishdan oldin brauzerni qayta ishga tushirishingiz lozim.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb
index 871a9b1b..fbc52a5 100644
--- a/chrome/app/resources/google_chrome_strings_vi.xtb
+++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">Giới thiệu về ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Mở trong Chrome</translation>
 <translation id="1157985233335035034">Ngôn ngữ gần đây</translation>
+<translation id="1158134713295836892">Gemini trong Chrome</translation>
 <translation id="1184145431117212167">Không cài đặt được vì phiên bản Windows bạn đang sử dụng chưa được hỗ trợ.</translation>
 <translation id="1194807384646768652">Chrome đã chặn tệp tải xuống này vì loại tệp này ít được tải xuống và có thể nguy hiểm</translation>
 <translation id="1203500561924088507">Cảm ơn bạn đã cài đặt. Bạn phải khởi động lại trình duyệt trước khi sử dụng <ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
index e9d2ab9a..3da469c 100644
--- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">关于 ChromeOS</translation>
 <translation id="1154147086299354128">在 Chrome 中打开(&amp;O)</translation>
 <translation id="1157985233335035034">最近选择过的语言</translation>
+<translation id="1158134713295836892">Chrome 中的 Gemini</translation>
 <translation id="1184145431117212167">安装失败,因为您的 Windows 版本不受支持。</translation>
 <translation id="1194807384646768652">Chrome 阻止了此项下载操作,因为这不是常下载的文件类型,可能具有危险性</translation>
 <translation id="1203500561924088507">感谢您完成安装。您必须重启浏览器才能使用 <ph name="BUNDLE_NAME" />。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
index 75d090c..cdc6da7 100644
--- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">關於 ChromeOS</translation>
 <translation id="1154147086299354128">在 Chrome 中開啟(&amp;O)</translation>
 <translation id="1157985233335035034">最近使用過的語言</translation>
+<translation id="1158134713295836892">Chrome 版 Gemini</translation>
 <translation id="1184145431117212167">你的 Windows 版本不受支援,因此無法安裝。</translation>
 <translation id="1194807384646768652">由於此檔案類型不是常見的下載項目,可能含有危險內容,因此 Chrome 已禁止下載</translation>
 <translation id="1203500561924088507">多謝安裝。您必須先重新啟動瀏覽器,才能使用 <ph name="BUNDLE_NAME" />。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
index 9c714a4..1e775c7 100644
--- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -19,6 +19,7 @@
 <translation id="1152920704813762236">關於 ChromeOS</translation>
 <translation id="1154147086299354128">在 Chrome 中開啟(&amp;O)</translation>
 <translation id="1157985233335035034">最近使用過的語言</translation>
+<translation id="1158134713295836892">Gemini 版 Chrome</translation>
 <translation id="1184145431117212167">Windows 版本不受支援,因此無法安裝</translation>
 <translation id="1194807384646768652">這不是其他人經常下載的檔案類型,可能有危險,因此 Chrome 已禁止下載</translation>
 <translation id="1203500561924088507">感謝你安裝本服務。你必須重新啟動瀏覽器,才能使用 <ph name="BUNDLE_NAME" />。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zu.xtb b/chrome/app/resources/google_chrome_strings_zu.xtb
index a19f174d..a246077 100644
--- a/chrome/app/resources/google_chrome_strings_zu.xtb
+++ b/chrome/app/resources/google_chrome_strings_zu.xtb
@@ -21,6 +21,7 @@
 <translation id="1152920704813762236">Mayelana ne-ChromeOS</translation>
 <translation id="1154147086299354128">&amp;Vula ku-Chrome</translation>
 <translation id="1157985233335035034">Izilimi zakamuva</translation>
+<translation id="1158134713295836892">IGemini kuChrome</translation>
 <translation id="1184145431117212167">Ukufaka kwehlulekile ngoba uhlobo lweWindows yakho alusekelwa.</translation>
 <translation id="1194807384646768652">I-Chrome ivimbele lokhu kudawunilodwa ngoba uhlobo lwefayela alivamile ukudawunilodwa futhi lingase libe yingozi</translation>
 <translation id="1203500561924088507">Siyabonga ngokufaka. Kufanele uqale kabusha ibhrawuza yakho ngaphambi kokusebenzisa i-<ph name="BUNDLE_NAME" />.</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 0574e96..ce53100 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1204,6 +1204,8 @@
 
 const FeatureEntry::FeatureParam kPageActionsMigrationParams[] = {
     {"autofill_address", "true"},
+    {"click_to_call", "true"},
+    {"collaboration_messaging", "true"},
     {"discounts", "true"},
     {"file_system_access", "true"},
     {"find", "true"},
diff --git a/chrome/browser/ash/app_mode/test/kiosk_mixin.h b/chrome/browser/ash/app_mode/test/kiosk_mixin.h
index 3e2bf879..0d0e9a4 100644
--- a/chrome/browser/ash/app_mode/test/kiosk_mixin.h
+++ b/chrome/browser/ash/app_mode/test/kiosk_mixin.h
@@ -34,9 +34,9 @@
 // the device and can set policies in Kiosk device local accounts based on a
 // `Config`.
 //
-// Prefer this mixin over `WebKioskBaseTest` when writing Kiosk browser tests
-// because its set up is more realistic, and the mixin allows tests for Kiosk
-// web apps and Chrome apps in the same fixture.
+// Prefer this mixin when writing Kiosk browser tests because its set up is the
+// most realistic, and allows tests for web apps and Chrome apps in the same
+// fixture.
 class KioskMixin : public InProcessBrowserTestMixin {
  public:
   // Option for a web app configured to use `web_server_`. `url_path` should
diff --git a/chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler_user_service.h b/chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler_user_service.h
index 75ad325..91f9bd9 100644
--- a/chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler_user_service.h
+++ b/chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler_user_service.h
@@ -39,9 +39,8 @@
   CertProvisioningSchedulerUserServiceFactory();
   ~CertProvisioningSchedulerUserServiceFactory() override = default;
 
-  // BrowserStateKeyedServiceFactory implementation.
+  // BrowserContextKeyedServiceFactory implementation.
   bool ServiceIsCreatedWithBrowserContext() const override;
-  // BrowserStateKeyedServiceFactory implementation.
   std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext(
       content::BrowserContext* context) const override;
 };
diff --git a/chrome/browser/ash/crosapi/keystore_service_factory_ash.h b/chrome/browser/ash/crosapi/keystore_service_factory_ash.h
index edb674b..b24d57b 100644
--- a/chrome/browser/ash/crosapi/keystore_service_factory_ash.h
+++ b/chrome/browser/ash/crosapi/keystore_service_factory_ash.h
@@ -29,7 +29,7 @@
   KeystoreServiceFactoryAsh();
   ~KeystoreServiceFactoryAsh() override = default;
 
-  // BrowserStateKeyedServiceFactory implementation.
+  // BrowserContextKeyedServiceFactory implementation.
   std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext(
       content::BrowserContext* context) const override;
 };
diff --git a/chrome/browser/ash/kcer/nssdb_migration/pkcs12_migrator.h b/chrome/browser/ash/kcer/nssdb_migration/pkcs12_migrator.h
index 71619477..449106a9 100644
--- a/chrome/browser/ash/kcer/nssdb_migration/pkcs12_migrator.h
+++ b/chrome/browser/ash/kcer/nssdb_migration/pkcs12_migrator.h
@@ -50,7 +50,7 @@
   Pkcs12MigratorFactory();
   ~Pkcs12MigratorFactory() override = default;
 
-  // Implements BrowserStateKeyedServiceFactory.
+  // Implements BrowserContextKeyedServiceFactory.
   bool ServiceIsCreatedWithBrowserContext() const override;
   std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext(
       content::BrowserContext* context) const override;
diff --git a/chrome/browser/ash/login/app_mode/test/BUILD.gn b/chrome/browser/ash/login/app_mode/test/BUILD.gn
index 801d552..583e346 100644
--- a/chrome/browser/ash/login/app_mode/test/BUILD.gn
+++ b/chrome/browser/ash/login/app_mode/test/BUILD.gn
@@ -19,8 +19,6 @@
     "new_aura_window_watcher.h",
     "test_app_data_load_waiter.cc",
     "test_app_data_load_waiter.h",
-    "web_kiosk_base_test.cc",
-    "web_kiosk_base_test.h",
   ]
 
   public_deps = [
diff --git a/chrome/browser/ash/login/app_mode/test/web_kiosk_base_test.cc b/chrome/browser/ash/login/app_mode/test/web_kiosk_base_test.cc
deleted file mode 100644
index b05188b8..0000000
--- a/chrome/browser/ash/login/app_mode/test/web_kiosk_base_test.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ash/login/app_mode/test/web_kiosk_base_test.h"
-
-#include <memory>
-#include <string_view>
-#include <vector>
-
-#include "ash/public/cpp/login_screen_test_api.h"
-#include "base/check.h"
-#include "chrome/browser/ash/app_mode/kiosk_controller.h"
-#include "chrome/browser/ash/app_mode/kiosk_system_session.h"
-#include "chrome/browser/ash/app_mode/kiosk_test_helper.h"
-#include "chrome/browser/ash/app_mode/test/kiosk_test_utils.h"
-#include "chrome/browser/ash/app_mode/test/scoped_device_settings.h"
-#include "chrome/browser/ash/login/test/oobe_base_test.h"
-#include "chrome/browser/ash/ownership/fake_owner_settings_service.h"  // IWYU pragma: keep
-#include "chrome/browser/ash/policy/core/device_local_account.h"
-#include "chrome/browser/ui/browser_list.h"
-#include "chromeos/ash/components/policy/device_local_account/device_local_account_type.h"
-#include "components/account_id/account_id.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "url/gurl.h"
-
-namespace ash {
-
-using kiosk::test::WaitKioskLaunched;
-
-namespace {
-
-constexpr std::string_view kDefaultInstallUrl = "https://app.com/install";
-
-AccountId ToWebKioskAccountId(const GURL& app_install_url) {
-  return AccountId(
-      AccountId::FromUserEmail(policy::GenerateDeviceLocalAccountUserId(
-          app_install_url.spec(),
-          policy::DeviceLocalAccountType::kWebKioskApp)));
-}
-
-}  // anonymous namespace
-
-WebKioskBaseTest::WebKioskBaseTest()
-    : app_install_url_(kDefaultInstallUrl),
-      account_id_(ToWebKioskAccountId(app_install_url_)) {
-  set_exit_when_last_browser_closes(false);
-  needs_background_networking_ = true;
-  skip_splash_wait_override_ = KioskTestHelper::SkipSplashScreenWait();
-}
-
-WebKioskBaseTest::~WebKioskBaseTest() = default;
-
-Profile* WebKioskBaseTest::profile() const {
-  return kiosk_app_browser()->profile();
-}
-
-Browser* WebKioskBaseTest::kiosk_app_browser() const {
-  Browser* kiosk_app_browser = BrowserList::GetInstance()->get(0);
-  CHECK(kiosk_app_browser);
-  return kiosk_app_browser;
-}
-
-KioskSystemSession* WebKioskBaseTest::kiosk_system_session() const {
-  return KioskController::Get().GetKioskSystemSession();
-}
-
-void WebKioskBaseTest::TearDownOnMainThread() {
-  settings_.reset();
-  OobeBaseTest::TearDownOnMainThread();
-}
-
-void WebKioskBaseTest::SetOnline(bool online) {
-  online ? network_mixin_.SimulateOnline() : network_mixin_.SimulateOffline();
-}
-
-void WebKioskBaseTest::PrepareAppLaunch() {
-  std::vector<policy::DeviceLocalAccount> device_local_accounts = {
-      policy::DeviceLocalAccount(
-          policy::DeviceLocalAccount::EphemeralMode::kUnset,
-          policy::WebKioskAppBasicInfo(app_install_url_.spec(), "", ""),
-          app_install_url_.spec())};
-
-  settings_ = std::make_unique<ScopedDeviceSettings>();
-  int ui_update_count = LoginScreenTestApi::GetUiUpdateCount();
-  policy::SetDeviceLocalAccountsForTesting(settings_->owner_settings_service(),
-                                           device_local_accounts);
-  // Wait for the Kiosk App configuration to reload.
-  LoginScreenTestApi::WaitForUiUpdate(ui_update_count);
-}
-
-bool WebKioskBaseTest::LaunchApp() {
-  return LoginScreenTestApi::LaunchApp(account_id());
-}
-
-void WebKioskBaseTest::InitializeRegularOnlineKiosk(bool simulate_online) {
-  if (simulate_online) {
-    SetOnline(true);
-  }
-  PrepareAppLaunch();
-  LaunchApp();
-  ASSERT_TRUE(WaitKioskLaunched());
-}
-
-void WebKioskBaseTest::SetAppInstallUrl(const GURL& app_install_url) {
-  app_install_url_ = GURL(app_install_url);
-  account_id_ = ToWebKioskAccountId(app_install_url);
-}
-
-}  // namespace ash
diff --git a/chrome/browser/ash/login/app_mode/test/web_kiosk_base_test.h b/chrome/browser/ash/login/app_mode/test/web_kiosk_base_test.h
deleted file mode 100644
index fb656e9..0000000
--- a/chrome/browser/ash/login/app_mode/test/web_kiosk_base_test.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_ASH_LOGIN_APP_MODE_TEST_WEB_KIOSK_BASE_TEST_H_
-#define CHROME_BROWSER_ASH_LOGIN_APP_MODE_TEST_WEB_KIOSK_BASE_TEST_H_
-
-#include <memory>
-#include <optional>
-
-#include "base/auto_reset.h"
-#include "chrome/browser/ash/app_mode/kiosk_system_session.h"
-#include "chrome/browser/ash/app_mode/kiosk_test_helper.h"
-#include "chrome/browser/ash/app_mode/test/network_state_mixin.h"
-#include "chrome/browser/ash/login/app_mode/network_ui_controller.h"
-#include "chrome/browser/ash/login/test/device_state_mixin.h"
-#include "chrome/browser/ash/login/test/oobe_base_test.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser.h"
-#include "chromeos/ash/components/network/network_state_test_helper.h"
-#include "components/account_id/account_id.h"
-#include "url/gurl.h"
-
-namespace ash {
-
-class ScopedDeviceSettings;
-
-// DEPRECATED: New tests should use `KioskMixin` instead.
-//
-// Base class for web kiosk browser tests.
-class WebKioskBaseTest : public OobeBaseTest {
- public:
-  WebKioskBaseTest();
-
-  WebKioskBaseTest(const WebKioskBaseTest&) = delete;
-  WebKioskBaseTest& operator=(const WebKioskBaseTest&) = delete;
-  ~WebKioskBaseTest() override;
-
-  Profile* profile() const;
-
-  Browser* kiosk_app_browser() const;
-
-  KioskSystemSession* kiosk_system_session() const;
-
- protected:
-  // OobeBaseTest overrides:
-  void TearDownOnMainThread() override;
-
-  // Sets the state of the default network.
-  // If not called, there is no configured network.
-  void SetOnline(bool online);
-
-  void PrepareAppLaunch();
-
-  bool LaunchApp();
-
-  // Initializes a regular online web kiosk.
-  // If `simulate_online` is false, the caller should set up the network by
-  // itself before calling this function.
-  // This function should be sufficient for testing non-kiosk specific features
-  // in web kiosk.
-  void InitializeRegularOnlineKiosk(bool simulate_online = true);
-
-  void SetAppInstallUrl(const GURL& app_install_url);
-
-  const GURL& app_install_url() const { return app_install_url_; }
-
-  const AccountId& account_id() const { return account_id_; }
-
-  NetworkStateTestHelper& network_state_test_helper() {
-    return network_mixin_.network_state_test_helper();
-  }
-
- private:
-  NetworkStateMixin network_mixin_{&mixin_host_};
-
-  DeviceStateMixin device_state_mixin_{
-      &mixin_host_, DeviceStateMixin::State::OOBE_COMPLETED_CLOUD_ENROLLED};
-
-  GURL app_install_url_;
-  AccountId account_id_;
-
-  std::unique_ptr<ScopedDeviceSettings> settings_;
-
-  base::AutoReset<bool> skip_splash_wait_override_ =
-      KioskTestHelper::SkipSplashScreenWait();
-
-  base::AutoReset<std::optional<bool>> can_configure_network_override_ =
-      NetworkUiController::SetCanConfigureNetworkForTesting(true);
-};
-
-}  // namespace ash
-
-#endif  // CHROME_BROWSER_ASH_LOGIN_APP_MODE_TEST_WEB_KIOSK_BASE_TEST_H_
diff --git a/chrome/browser/ash/platform_keys/key_permissions/key_permissions_service_factory.h b/chrome/browser/ash/platform_keys/key_permissions/key_permissions_service_factory.h
index 3d41afd..efc28941 100644
--- a/chrome/browser/ash/platform_keys/key_permissions/key_permissions_service_factory.h
+++ b/chrome/browser/ash/platform_keys/key_permissions/key_permissions_service_factory.h
@@ -39,7 +39,7 @@
   KeyPermissionsServiceFactory();
   ~KeyPermissionsServiceFactory() override = default;
 
-  // BrowserStateKeyedServiceFactory.
+  // BrowserContextKeyedServiceFactory.
   std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext(
       content::BrowserContext* context) const override;
   void RegisterProfilePrefs(
diff --git a/chrome/browser/bookmarks/bookmark_merged_surface_service_factory.h b/chrome/browser/bookmarks/bookmark_merged_surface_service_factory.h
index c888a73..d7a68e8 100644
--- a/chrome/browser/bookmarks/bookmark_merged_surface_service_factory.h
+++ b/chrome/browser/bookmarks/bookmark_merged_surface_service_factory.h
@@ -37,7 +37,7 @@
   BookmarkMergedSurfaceServiceFactory();
   ~BookmarkMergedSurfaceServiceFactory() override;
 
-  // BrowserStateKeyedServiceFactory implementation.
+  // BrowserContextKeyedServiceFactory implementation.
   std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext(
       content::BrowserContext* context) const override;
   bool ServiceIsNULLWhileTesting() const override;
diff --git a/chrome/browser/bookmarks/managed_bookmark_service_factory.h b/chrome/browser/bookmarks/managed_bookmark_service_factory.h
index 92fcffd..98264bd7 100644
--- a/chrome/browser/bookmarks/managed_bookmark_service_factory.h
+++ b/chrome/browser/bookmarks/managed_bookmark_service_factory.h
@@ -41,7 +41,7 @@
   ManagedBookmarkServiceFactory();
   ~ManagedBookmarkServiceFactory() override;
 
-  // BrowserStateKeyedServiceFactory implementation.
+  // BrowserContextKeyedServiceFactory implementation.
   std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext(
       content::BrowserContext* context) const override;
   bool ServiceIsNULLWhileTesting() const override;
diff --git a/chrome/browser/chrome_content_browser_client_browsertest.cc b/chrome/browser/chrome_content_browser_client_browsertest.cc
index cba4dc1..74f957b 100644
--- a/chrome/browser/chrome_content_browser_client_browsertest.cc
+++ b/chrome/browser/chrome_content_browser_client_browsertest.cc
@@ -1131,8 +1131,7 @@
   void SetUpOnMainThread() override {
     InProcessBrowserTest::SetUpOnMainThread();
     client_ = static_cast<ChromeContentBrowserClient*>(
-        content::SetBrowserClientForTesting(nullptr));
-    content::SetBrowserClientForTesting(client_);
+        content::GetContentClientForTesting()->browser());
   }
 
   void TearDownOnMainThread() override {
@@ -1263,8 +1262,7 @@
             /*dm_token=*/std::string()));
 
     client_ = static_cast<ChromeContentBrowserClient*>(
-        content::SetBrowserClientForTesting(nullptr));
-    content::SetBrowserClientForTesting(client_);
+        content::GetContentClientForTesting()->browser());
   }
 
   void TearDownOnMainThread() override {
@@ -1983,8 +1981,7 @@
   void SetUpOnMainThread() override {
     ChromeContentBrowserClientBrowserTest::SetUpOnMainThread();
     client_ = static_cast<ChromeContentBrowserClient*>(
-        content::SetBrowserClientForTesting(nullptr));
-    content::SetBrowserClientForTesting(client_);
+        content::GetContentClientForTesting()->browser());
   }
 
   ChromeContentBrowserClient* client() { return client_; }
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.h b/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.h
index 4aa709f7a5..6591171 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.h
+++ b/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.h
@@ -26,7 +26,7 @@
   DlpRulesManagerFactory();
   ~DlpRulesManagerFactory() override = default;
 
-  // BrowserStateKeyedServiceFactory overrides:
+  // BrowserContextKeyedServiceFactory overrides:
   bool ServiceIsCreatedWithBrowserContext() const override;
   std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext(
       content::BrowserContext* context) const override;
diff --git a/chrome/browser/content_settings/content_settings_default_provider_unittest.cc b/chrome/browser/content_settings/content_settings_default_provider_unittest.cc
index b195210..a7a5b80 100644
--- a/chrome/browser/content_settings/content_settings_default_provider_unittest.cc
+++ b/chrome/browser/content_settings/content_settings_default_provider_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/common/pref_names.h"
@@ -18,6 +19,7 @@
 #include "components/content_settings/core/browser/website_settings_registry.h"
 #include "components/content_settings/core/common/content_settings.h"
 #include "components/content_settings/core/common/content_settings_types.h"
+#include "components/content_settings/core/common/features.h"
 #include "components/content_settings/core/test/content_settings_test_utils.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
@@ -30,6 +32,11 @@
 
 namespace content_settings {
 
+namespace {
+constexpr char kGeolocationMigrateDefaultValue[] =
+    "profile.default_content_setting_values.migrate_geolocation";
+}
+
 class ContentSettingsDefaultProviderTest : public testing::Test {
  public:
   ContentSettingsDefaultProviderTest()
@@ -90,7 +97,7 @@
 
   base::Value block_setting = PermissionSettingToValue(
       info,
-      GeolocationSetting{PermissionOption::kAsk, PermissionOption::kDenied});
+      GeolocationSetting{PermissionOption::kDenied, PermissionOption::kDenied});
   provider_.SetWebsiteSetting(
       ContentSettingsPattern::Wildcard(), ContentSettingsPattern::Wildcard(),
       ContentSettingsType::GEOLOCATION_WITH_OPTIONS, block_setting.Clone(),
@@ -292,4 +299,49 @@
   otr_provider2.ShutdownOnUIThread();
 }
 
+TEST_F(ContentSettingsDefaultProviderTest,
+       MigrateGeolocationDisabledToEnabled) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(
+      features::kApproximateGeolocationPermission);
+  auto* prefs = profile_.GetPrefs();
+  prefs->SetBoolean(kGeolocationMigrateDefaultValue, false);
+  prefs->SetInteger("profile.default_content_setting_values.geolocation",
+                    CONTENT_SETTING_BLOCK);
+
+  DefaultProvider provider(prefs, false, false);
+
+  GeolocationSetting expected_setting{PermissionOption::kDenied,
+                                      PermissionOption::kDenied};
+  EXPECT_EQ(PermissionSetting{expected_setting},
+            *TestUtils::GetPermissionSetting(
+                &provider, GURL(), GURL(),
+                ContentSettingsType::GEOLOCATION_WITH_OPTIONS, false));
+  EXPECT_TRUE(prefs->GetBoolean(kGeolocationMigrateDefaultValue));
+}
+
+TEST_F(ContentSettingsDefaultProviderTest,
+       MigrateGeolocationEnabledToDisabled) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndDisableFeature(
+      features::kApproximateGeolocationPermission);
+  auto* prefs = profile_.GetPrefs();
+  prefs->SetBoolean(kGeolocationMigrateDefaultValue, true);
+  auto* info = PermissionSettingsRegistry::GetInstance()->Get(
+      ContentSettingsType::GEOLOCATION_WITH_OPTIONS);
+  base::Value geolocation_with_options_value = PermissionSettingToValue(
+      info,
+      GeolocationSetting{PermissionOption::kDenied, PermissionOption::kDenied});
+  prefs->Set("profile.default_content_setting_values.geolocation_with_options",
+             geolocation_with_options_value);
+
+  DefaultProvider provider(prefs, false, false);
+
+  EXPECT_EQ(
+      CONTENT_SETTING_BLOCK,
+      TestUtils::GetContentSetting(&provider, GURL(), GURL(),
+                                   ContentSettingsType::GEOLOCATION, false));
+  EXPECT_FALSE(prefs->GetBoolean(kGeolocationMigrateDefaultValue));
+}
+
 }  // namespace content_settings
diff --git a/chrome/browser/devtools/protocol/autofill_handler.cc b/chrome/browser/devtools/protocol/autofill_handler.cc
index 2ac960a..3444472 100644
--- a/chrome/browser/devtools/protocol/autofill_handler.cc
+++ b/chrome/browser/devtools/protocol/autofill_handler.cc
@@ -20,7 +20,6 @@
 #include "components/autofill/content/browser/scoped_autofill_managers_observation.h"
 #include "components/autofill/core/browser/data_model/addresses/autofill_profile.h"
 #include "components/autofill/core/browser/data_model/payments/credit_card.h"
-#include "components/autofill/core/browser/field_type_utils.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/filling/addresses/field_filling_address_util.h"
 #include "components/autofill/core/browser/form_structure.h"
@@ -90,8 +89,7 @@
 protocol::Response AutofillHandler::Trigger(
     int field_id,
     std::optional<String> frame_id,
-    std::unique_ptr<protocol::Autofill::CreditCard> card,
-    std::unique_ptr<protocol::Autofill::Address> address) {
+    std::unique_ptr<protocol::Autofill::CreditCard> card) {
   auto host = content::DevToolsAgentHost::GetForId(target_id_);
   if (!host) {
     return Response::ServerError("Target not found");
@@ -145,64 +143,23 @@
     return Response::ServerError("RenderFrameHost is being destroyed");
   }
 
-  // Validate that card and address are mutually exclusive.
-  if (card && address) {
-    return Response::InvalidRequest("Card and address cannot both be provided");
-  }
+  autofill::CreditCard tmp_autofill_card;
+  tmp_autofill_card.SetRawInfo(autofill::CREDIT_CARD_NUMBER,
+                               base::UTF8ToUTF16(card->GetNumber()));
+  tmp_autofill_card.SetRawInfo(autofill::CREDIT_CARD_NAME_FULL,
+                               base::UTF8ToUTF16(card->GetName()));
+  tmp_autofill_card.SetRawInfo(autofill::CREDIT_CARD_EXP_MONTH,
+                               base::UTF8ToUTF16(card->GetExpiryMonth()));
+  tmp_autofill_card.SetRawInfo(autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR,
+                               base::UTF8ToUTF16(card->GetExpiryYear()));
+  tmp_autofill_card.SetRawInfo(autofill::CREDIT_CARD_VERIFICATION_CODE,
+                               base::UTF8ToUTF16(card->GetCvc()));
 
-  if (!card && !address) {
-    return Response::InvalidRequest("Either card or address must be provided");
-  }
-
-  if (card) {
-    autofill::CreditCard tmp_autofill_card;
-    tmp_autofill_card.SetRawInfo(autofill::CREDIT_CARD_NUMBER,
-                                 base::UTF8ToUTF16(card->GetNumber()));
-    tmp_autofill_card.SetRawInfo(autofill::CREDIT_CARD_NAME_FULL,
-                                 base::UTF8ToUTF16(card->GetName()));
-    tmp_autofill_card.SetRawInfo(autofill::CREDIT_CARD_EXP_MONTH,
-                                 base::UTF8ToUTF16(card->GetExpiryMonth()));
-    tmp_autofill_card.SetRawInfo(autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR,
-                                 base::UTF8ToUTF16(card->GetExpiryYear()));
-    tmp_autofill_card.SetRawInfo(autofill::CREDIT_CARD_VERIFICATION_CODE,
-                                 base::UTF8ToUTF16(card->GetCvc()));
-    static_cast<autofill::BrowserAutofillManager&>(
-        autofill_driver->GetAutofillManager())
-        .FillOrPreviewForm(autofill::mojom::ActionPersistence::kFill, *form,
-                           global_field_id, &tmp_autofill_card,
-                           autofill::AutofillTriggerSource::kDevtools);
-  }
-  if (address) {
-    std::string country_code =
-        autofill::i18n_model_definition::kLegacyHierarchyCountryCodeString;
-    for (const auto& field : *address->GetFields()) {
-      if (field->GetName() == "ADDRESS_HOME_COUNTRY") {
-        country_code = field->GetValue();
-        break;
-      }
-    }
-    autofill::AddressCountryCode address_country_code(country_code);
-    autofill::AutofillProfile tmp_autofill_profile(address_country_code);
-    for (const auto& field : *address->GetFields()) {
-      std::string field_name = field->GetName();
-      std::string field_value = field->GetValue();
-
-      // Map field names to FieldType and set them.
-      autofill::FieldType field_type =
-          autofill::TypeNameToFieldType(field_name);
-      if (!IsAddressType(field_type)) {
-        return Response::InvalidRequest("Unsupported field type: " +
-                                        field_name);
-      }
-      tmp_autofill_profile.SetRawInfo(field_type,
-                                      base::UTF8ToUTF16(field_value));
-    }
-    static_cast<autofill::BrowserAutofillManager&>(
-        autofill_driver->GetAutofillManager())
-        .FillOrPreviewForm(autofill::mojom::ActionPersistence::kFill, *form,
-                           global_field_id, &tmp_autofill_profile,
-                           autofill::AutofillTriggerSource::kDevtools);
-  }
+  static_cast<autofill::BrowserAutofillManager&>(
+      autofill_driver->GetAutofillManager())
+      .FillOrPreviewForm(autofill::mojom::ActionPersistence::kFill, *form,
+                         global_field_id, &tmp_autofill_card,
+                         autofill::AutofillTriggerSource::kDevtools);
 
   return Response::Success();
 }
diff --git a/chrome/browser/devtools/protocol/autofill_handler.h b/chrome/browser/devtools/protocol/autofill_handler.h
index 6ea84462..35a2807 100644
--- a/chrome/browser/devtools/protocol/autofill_handler.h
+++ b/chrome/browser/devtools/protocol/autofill_handler.h
@@ -39,8 +39,7 @@
   protocol::Response Trigger(
       int field_id,
       std::optional<String> frame_id,
-      std::unique_ptr<protocol::Autofill::CreditCard> card,
-      std::unique_ptr<protocol::Autofill::Address> address) override;
+      std::unique_ptr<protocol::Autofill::CreditCard> card) override;
   // Sets a list of addresses inside `AutofillManager`, used to provide
   // developers addresses from different countries so that they can be used for
   // testing their form.
diff --git a/chrome/browser/devtools/protocol/devtools_autofill_browsertest.cc b/chrome/browser/devtools/protocol/devtools_autofill_browsertest.cc
index 6d5c58b..ac80447 100644
--- a/chrome/browser/devtools/protocol/devtools_autofill_browsertest.cc
+++ b/chrome/browser/devtools/protocol/devtools_autofill_browsertest.cc
@@ -693,277 +693,5 @@
   WaitForNotification("Autofill.addressFormFilled", /*allow_existing=*/true);
 }
 
-IN_PROC_BROWSER_TEST_F(DevToolsAutofillTest, TriggerAddressAutofill) {
-  embedded_test_server()->ServeFilesFromSourceDirectory(
-      "chrome/test/data/autofill");
-  ASSERT_TRUE(embedded_test_server()->Start());
-
-  const GURL url =
-      embedded_test_server()->GetURL("/autofill_address_enabled.html");
-  ASSERT_TRUE(content::NavigateToURL(web_contents(), url));
-
-  Attach();
-  SendCommandSync("Autofill.enable");
-
-  EXPECT_TRUE(main_autofill_manager().WaitForFormsSeen(1));
-
-  int backend_node_id = GetBackendNodeIdByIdAttribute("street-address");
-
-  auto address_fields = base::Value::List()
-                            .Append(base::Value::Dict()
-                                        .Set("name", "ADDRESS_HOME_LINE1")
-                                        .Set("value", "123 Main Street"))
-                            .Append(base::Value::Dict()
-                                        .Set("name", "ADDRESS_HOME_CITY")
-                                        .Set("value", "New York"))
-                            .Append(base::Value::Dict()
-                                        .Set("name", "ADDRESS_HOME_STATE")
-                                        .Set("value", "NY"))
-                            .Append(base::Value::Dict()
-                                        .Set("name", "ADDRESS_HOME_ZIP")
-                                        .Set("value", "10001"))
-                            .Append(base::Value::Dict()
-                                        .Set("name", "ADDRESS_HOME_COUNTRY")
-                                        .Set("value", "US"));
-
-  auto address = base::Value::Dict().Set("fields", std::move(address_fields));
-
-  base::Value::Dict params;
-  params.Set("fieldId", backend_node_id);
-  params.Set("address", std::move(address));
-
-  SendCommandSync("Autofill.trigger", std::move(params));
-
-  if (error()) {
-    FAIL() << "Autofill trigger failed with error: "
-           << *error()->FindString("message");
-  } else {
-    // Verify the field was filled
-    content::EvalJsResult street_address = content::EvalJs(
-        web_contents(), "document.getElementById('street-address').value");
-    EXPECT_EQ("123 Main Street", street_address.ExtractString());
-    content::EvalJsResult city = content::EvalJs(
-        web_contents(), "document.getElementById('city').value");
-    EXPECT_EQ("New York", city.ExtractString());
-    content::EvalJsResult zip = content::EvalJs(
-        web_contents(), "document.getElementById('postal-code').value");
-    EXPECT_EQ("10001", zip.ExtractString());
-    content::EvalJsResult state = content::EvalJs(
-        web_contents(), "document.getElementById('state').value");
-    EXPECT_EQ("NY", state.ExtractString());
-    content::EvalJsResult country = content::EvalJs(
-        web_contents(), "document.getElementById('country').value");
-    EXPECT_EQ("US", country.ExtractString());
-  }
-}
-
-IN_PROC_BROWSER_TEST_F(DevToolsAutofillTest, TriggerWithInvalidFieldId) {
-  embedded_test_server()->ServeFilesFromSourceDirectory(
-      "chrome/test/data/autofill");
-  ASSERT_TRUE(embedded_test_server()->Start());
-  const GURL url(
-      embedded_test_server()->GetURL("/autofill_creditcard_form.html"));
-  ASSERT_TRUE(content::NavigateToURL(web_contents(), url));
-
-  Attach();
-  SendCommandSync("Autofill.enable");
-
-  base::Value::Dict params;
-  params.Set("fieldId", 99999);  // Invalid field ID
-  params.Set("card", GetTestCreditCard());
-
-  SendCommandSync("Autofill.trigger", std::move(params));
-
-  EXPECT_TRUE(error());
-  EXPECT_EQ(*error()->FindString("message"), "Field not found");
-}
-
-IN_PROC_BROWSER_TEST_F(DevToolsAutofillTest,
-                       TriggerAddressWithUnsupportedFieldType) {
-  embedded_test_server()->ServeFilesFromSourceDirectory(
-      "chrome/test/data/autofill");
-  ASSERT_TRUE(embedded_test_server()->Start());
-
-  const GURL url =
-      embedded_test_server()->GetURL("/autofill_address_enabled.html");
-  ASSERT_TRUE(content::NavigateToURL(web_contents(), url));
-
-  Attach();
-  SendCommandSync("Autofill.enable");
-
-  int backend_node_id = GetBackendNodeIdByIdAttribute("street-address");
-
-  // Use an invalid/unsupported field type
-  auto address_fields =
-      base::Value::List().Append(base::Value::Dict()
-                                     .Set("name", "INVALID_FIELD_TYPE")
-                                     .Set("value", "123 Main Street"));
-
-  auto address = base::Value::Dict().Set("fields", std::move(address_fields));
-
-  base::Value::Dict params;
-  params.Set("fieldId", backend_node_id);
-  params.Set("address", std::move(address));
-
-  SendCommandSync("Autofill.trigger", std::move(params));
-
-  EXPECT_TRUE(error());
-  EXPECT_EQ(*error()->FindString("message"),
-            "Unsupported field type: INVALID_FIELD_TYPE");
-
-  address_fields =
-      base::Value::List().Append(base::Value::Dict()
-                                     .Set("name", "LOYALTY_MEMBERSHIP_ID")
-                                     .Set("value", "1234567890"));
-
-  address = base::Value::Dict().Set("fields", std::move(address_fields));
-
-  params.Set("fieldId", backend_node_id);
-  params.Set("address", std::move(address));
-
-  SendCommandSync("Autofill.trigger", std::move(params));
-
-  EXPECT_TRUE(error());
-  EXPECT_EQ(*error()->FindString("message"),
-            "Unsupported field type: LOYALTY_MEMBERSHIP_ID");
-}
-
-IN_PROC_BROWSER_TEST_F(DevToolsAutofillTest, TriggerAddressAutofillInIframe) {
-  embedded_test_server()->ServeFilesFromSourceDirectory(
-      "chrome/test/data/autofill");
-  ASSERT_TRUE(embedded_test_server()->Start());
-  const GURL url(embedded_test_server()->GetURL(
-      "/autofill_address_multi_form_in_oopif.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-  ASSERT_TRUE(content::WaitForLoadStop(web_contents()));
-  Attach();
-
-  EXPECT_TRUE(main_autofill_manager().WaitForFormsSeen(1));
-
-  std::string frame_id;
-  {
-    const base::Value::Dict* result = SendCommandSync("Page.getFrameTree");
-    const base::Value::List* frames =
-        result->FindListByDottedPath("frameTree.childFrames");
-    const base::Value::Dict* frame_dict = frames->front().GetIfDict();
-    frame_id = *frame_dict->FindStringByDottedPath("frame.id");
-  }
-
-  std::string unique_context_id;
-  {
-    base::Value::Dict command_params;
-    SendCommandSync("Runtime.enable");
-    base::Value::Dict params;
-    for (int context_count = 1; true; context_count++) {
-      params = WaitForNotification("Runtime.executionContextCreated", true);
-      if (*params.FindStringByDottedPath("context.auxData.frameId") ==
-          frame_id) {
-        unique_context_id = *params.FindStringByDottedPath("context.uniqueId");
-        break;
-      }
-      ASSERT_LT(context_count, 2);
-    }
-  }
-
-  int backend_node_id =
-      GetBackendNodeIdByIdAttribute("street-address", unique_context_id);
-
-  // Use valid address field types
-  auto address_fields = base::Value::List()
-                            .Append(base::Value::Dict()
-                                        .Set("name", "ADDRESS_HOME_LINE1")
-                                        .Set("value", "123 Main Street"))
-                            .Append(base::Value::Dict()
-                                        .Set("name", "ADDRESS_HOME_CITY")
-                                        .Set("value", "New York"));
-
-  auto address = base::Value::Dict().Set("fields", std::move(address_fields));
-
-  base::Value::Dict params;
-  params.Set("fieldId", backend_node_id);
-  params.Set("address", std::move(address));
-  params.Set("frameId", frame_id);
-
-  SendCommandSync("Autofill.trigger", std::move(params));
-
-  if (error()) {
-    FAIL() << "Autofill trigger failed with error: "
-           << *error()->FindString("message");
-  } else {
-    // Verify the fields were filled in the iframe
-    content::EvalJsResult street_address =
-        content::EvalJs(web_contents(),
-                        "document.querySelector('iframe').contentDocument."
-                        "getElementById('street-address').value");
-    EXPECT_EQ("123 Main Street", street_address.ExtractString());
-
-    content::EvalJsResult city =
-        content::EvalJs(web_contents(),
-                        "document.querySelector('iframe').contentDocument."
-                        "getElementById('city').value");
-    EXPECT_EQ("New York", city.ExtractString());
-  }
-}
-
-IN_PROC_BROWSER_TEST_F(DevToolsAutofillTest, TriggerWithBothCardAndAddress) {
-  embedded_test_server()->ServeFilesFromSourceDirectory(
-      "chrome/test/data/autofill");
-  ASSERT_TRUE(embedded_test_server()->Start());
-  const GURL url(
-      embedded_test_server()->GetURL("/autofill_creditcard_form.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-  ASSERT_TRUE(content::WaitForLoadStop(web_contents()));
-  Attach();
-
-  EXPECT_TRUE(main_autofill_manager().WaitForFormsSeen(1));
-
-  int backend_node_id = GetBackendNodeIdByIdAttribute("CREDIT_CARD_NUMBER");
-
-  auto address_fields = base::Value::List()
-                            .Append(base::Value::Dict()
-                                        .Set("name", "ADDRESS_HOME_LINE1")
-                                        .Set("value", "123 Main Street"))
-                            .Append(base::Value::Dict()
-                                        .Set("name", "ADDRESS_HOME_COUNTRY")
-                                        .Set("value", "US"));
-
-  base::Value::Dict params;
-  params.Set("fieldId", backend_node_id);
-  params.Set("card", GetTestCreditCard());
-  params.Set("address",
-             base::Value::Dict().Set("fields", std::move(address_fields)));
-
-  SendCommandSync("Autofill.trigger", std::move(params));
-
-  EXPECT_TRUE(error());
-  EXPECT_EQ(*error()->FindString("message"),
-            "Card and address cannot both be provided");
-}
-
-IN_PROC_BROWSER_TEST_F(DevToolsAutofillTest, TriggerWithNeitherCardNorAddress) {
-  embedded_test_server()->ServeFilesFromSourceDirectory(
-      "chrome/test/data/autofill");
-  ASSERT_TRUE(embedded_test_server()->Start());
-  const GURL url(
-      embedded_test_server()->GetURL("/autofill_creditcard_form.html"));
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-  ASSERT_TRUE(content::WaitForLoadStop(web_contents()));
-  Attach();
-
-  EXPECT_TRUE(main_autofill_manager().WaitForFormsSeen(1));
-
-  int backend_node_id = GetBackendNodeIdByIdAttribute("CREDIT_CARD_NUMBER");
-
-  base::Value::Dict params;
-  params.Set("fieldId", backend_node_id);
-  // Neither card nor address provided
-
-  SendCommandSync("Autofill.trigger", std::move(params));
-
-  EXPECT_TRUE(error());
-  EXPECT_EQ(*error()->FindString("message"),
-            "Either card or address must be provided");
-}
-
 }  // namespace
 }  // namespace autofill
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 95f025a..8cd505ee 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1936,11 +1936,6 @@
     "expiry_milestone": 145
   },
   {
-    "name": "cpe-automatic-passkey-upgrade",
-    "owners": ["sugoi@chromium.org", "bling-transactions-eng@google.com"],
-    "expiry_milestone": 145
-  },
-  {
     "name": "cpe-passkey-largeblob-support",
     "owners": ["rgod@google.com", "ambikaraj@google.com", "bling-transactions-eng@google.com"],
     "expiry_milestone": 145
diff --git a/chrome/browser/media/webrtc/get_all_screens_media_browsertest.cc b/chrome/browser/media/webrtc/get_all_screens_media_browsertest.cc
index 1937c21..c8974bb9 100644
--- a/chrome/browser/media/webrtc/get_all_screens_media_browsertest.cc
+++ b/chrome/browser/media/webrtc/get_all_screens_media_browsertest.cc
@@ -511,8 +511,7 @@
   void SetUpOnMainThread() override {
     GetAllScreensMediaBrowserTestBase::SetUpOnMainThread();
     client_ = static_cast<ChromeContentBrowserClient*>(
-        content::SetBrowserClientForTesting(nullptr));
-    content::SetBrowserClientForTesting(client_);
+        content::GetContentClientForTesting()->browser());
   }
 
   void TearDownOnMainThread() override {
diff --git a/chrome/browser/page_content_annotations/multi_source_page_context_fetcher_browsertest.cc b/chrome/browser/page_content_annotations/multi_source_page_context_fetcher_browsertest.cc
index 0ff388a6..8927a6e 100644
--- a/chrome/browser/page_content_annotations/multi_source_page_context_fetcher_browsertest.cc
+++ b/chrome/browser/page_content_annotations/multi_source_page_context_fetcher_browsertest.cc
@@ -33,37 +33,86 @@
 using testing::Le;
 using testing::ResultOf;
 
-uint32_t Red(SkColor color) {
+constexpr std::string_view kHostA = "a.test";
+constexpr std::string_view kHostASubdomain = "foo.a.test";
+constexpr std::string_view kHostB = "b.test";
+
+int64_t Red(SkColor color) {
   return SkColorGetR(color);
 }
-uint32_t Green(SkColor color) {
+int64_t Green(SkColor color) {
   return SkColorGetG(color);
 }
-uint32_t Blue(SkColor color) {
+int64_t Blue(SkColor color) {
   return SkColorGetB(color);
 }
 
 // Matches a Skia color, within a given tolerance.
-MATCHER_P2(IsColorWithinTolerance, color, tolerance, "") {
-  int64_t expected_red = SkColorGetR(color);
-  int64_t expected_green = SkColorGetG(color);
-  int64_t expected_blue = SkColorGetB(color);
-
+MATCHER_P2(IsColorWithinTolerance, expected_color, tolerance, "") {
   return testing::ExplainMatchResult(
       AllOf(ResultOf("red component", &Red,
-                     DistanceFrom(expected_red, Le(tolerance))),
+                     DistanceFrom(Red(expected_color), Le(tolerance))),
             ResultOf("green component", &Green,
-                     DistanceFrom(expected_green, Le(tolerance))),
+                     DistanceFrom(Green(expected_color), Le(tolerance))),
             ResultOf("blue component", &Blue,
-                     DistanceFrom(expected_blue, Le(tolerance)))),
+                     DistanceFrom(Blue(expected_color), Le(tolerance)))),
       arg, result_listener);
 }
 
-class MultiSourcePageContextFetcherBrowserTest
-    : public InProcessBrowserTest,
+class MultiSourcePageContextFetcherBrowserTest : public InProcessBrowserTest {
+ public:
+  MultiSourcePageContextFetcherBrowserTest() = default;
+
+  ~MultiSourcePageContextFetcherBrowserTest() override = default;
+
+  void SetUpOnMainThread() override {
+    InProcessBrowserTest::SetUpOnMainThread();
+
+    host_resolver()->AddRule("*", "127.0.0.1");
+    base::FilePath test_data_dir;
+    base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
+    embedded_https_test_server().ServeFilesFromDirectory(test_data_dir);
+    embedded_https_test_server().SetSSLConfig(
+        net::EmbeddedTestServer::CERT_TEST_NAMES);
+    ASSERT_TRUE(embedded_https_test_server().Start());
+  }
+
+  content::WebContents* web_contents() const {
+    return browser()->tab_strip_model()->GetActiveWebContents();
+  }
+
+  GURL GetURL(std::string_view host, std::string_view path = "/") const {
+    return embedded_https_test_server().GetURL(host, path);
+  }
+
+  content::RenderFrameHost* GetPrimaryMainFrame() const {
+    return browser()
+        ->tab_strip_model()
+        ->GetActiveWebContents()
+        ->GetPrimaryMainFrame();
+  }
+
+  content::RenderFrameHost* GetSubframe() const {
+    auto* frame = ChildFrameAt(GetPrimaryMainFrame(), 0);
+    CHECK(frame);
+    return frame;
+  }
+
+  void SetBackground(content::RenderFrameHost* frame, std::string_view color) {
+    ASSERT_TRUE(content::ExecJs(
+        frame, base::StrCat({
+                   R"(document.body.setAttribute("style", "background-color:)",
+                   color,
+                   R"(");)",
+               })));
+  }
+};
+
+class ScreenshotBackendMultiSourcePageContextFetcherBrowserTest
+    : public MultiSourcePageContextFetcherBrowserTest,
       public testing::WithParamInterface<bool> {
  public:
-  MultiSourcePageContextFetcherBrowserTest() {
+  ScreenshotBackendMultiSourcePageContextFetcherBrowserTest() {
     std::vector<base::test::FeatureRefAndParams> enabled_features{
         {kGlicTabScreenshotExperiment,
          {
@@ -84,44 +133,30 @@
                                             disabled_features);
   }
 
-  ~MultiSourcePageContextFetcherBrowserTest() override = default;
-
-  void SetUpOnMainThread() override {
-    InProcessBrowserTest::SetUpOnMainThread();
-
-    host_resolver()->AddRule("*", "127.0.0.1");
-    base::FilePath test_data_dir;
-    base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
-    embedded_https_test_server().ServeFilesFromDirectory(test_data_dir);
-    ASSERT_TRUE(embedded_https_test_server().Start());
-  }
-
   bool use_paint_preview_screenshot_backend() const { return GetParam(); }
 
  private:
   base::test::ScopedFeatureList features_;
 };
 
-INSTANTIATE_TEST_SUITE_P(,
-                         MultiSourcePageContextFetcherBrowserTest,
-                         testing::Bool());
+INSTANTIATE_TEST_SUITE_P(
+    ,
+    ScreenshotBackendMultiSourcePageContextFetcherBrowserTest,
+    testing::Bool());
 
-IN_PROC_BROWSER_TEST_P(MultiSourcePageContextFetcherBrowserTest,
-                       TakesScreenshot) {
+IN_PROC_BROWSER_TEST_P(
+    ScreenshotBackendMultiSourcePageContextFetcherBrowserTest,
+    TakesScreenshot) {
   GURL url = embedded_https_test_server().GetURL("/empty.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
 
-  ASSERT_TRUE(content::ExecJs(
-      web_contents,
-      R"(document.body.setAttribute("style", "background-color:red");)"));
+  SetBackground(web_contents()->GetPrimaryMainFrame(), "red");
 
   base::test::TestFuture<FetchPageContextResultCallbackArg> future;
 
   FetchPageContextOptions options;
   options.include_viewport_screenshot = true;
-  FetchPageContext(*web_contents, options, future.GetCallback());
+  FetchPageContext(*web_contents(), options, future.GetCallback());
 
   ASSERT_OK_AND_ASSIGN(std::unique_ptr<FetchPageContextResult> result,
                        future.Take());
@@ -149,4 +184,140 @@
                           _));
 }
 
+class RedactingMultiSourcePageContextFetcherBrowserTest
+    : public MultiSourcePageContextFetcherBrowserTest {
+ public:
+  RedactingMultiSourcePageContextFetcherBrowserTest() {
+    std::vector<base::test::FeatureRefAndParams> enabled_features{
+        {kGlicTabScreenshotExperiment,
+         {
+             {"max_screenshot_width", "0"},
+             {"max_screenshot_height", "0"},
+             {"screenshot_jpeg_quality", "100"},
+             {"screenshot_timeout_ms", "10s"},
+         }},
+        {kGlicTabScreenshotPaintPreviewBackend,
+         {
+             {"screenshot_iframe_redaction", "cross-site"},
+         }},
+    };
+    features_.InitWithFeaturesAndParameters(enabled_features,
+                                            /*disabled_features=*/{});
+  }
+
+  ~RedactingMultiSourcePageContextFetcherBrowserTest() override = default;
+
+ private:
+  base::test::ScopedFeatureList features_;
+};
+
+IN_PROC_BROWSER_TEST_F(RedactingMultiSourcePageContextFetcherBrowserTest,
+                       TakesScreenshot_SameOriginIframeNoRedaction) {
+  ASSERT_TRUE(
+      ui_test_utils::NavigateToURL(browser(), GetURL(kHostA, "/iframe.html")));
+
+  ASSERT_TRUE(
+      content::NavigateIframeToURL(web_contents(), "test", GetURL(kHostA)));
+  SetBackground(web_contents()->GetPrimaryMainFrame(), "white");
+  // Remove the 8px margin applied by the user agent's stylesheet.
+  EXPECT_TRUE(
+      content::ExecJs(web_contents(), "document.body.style.margin = '0px';"));
+  SetBackground(GetSubframe(), "red");
+
+  base::test::TestFuture<FetchPageContextResultCallbackArg> future;
+  FetchPageContextOptions options;
+  options.include_viewport_screenshot = true;
+  FetchPageContext(*web_contents(), options, future.GetCallback());
+
+  ASSERT_OK_AND_ASSIGN(std::unique_ptr<FetchPageContextResult> result,
+                       future.Take());
+
+  ASSERT_TRUE(result);
+  ASSERT_TRUE(result->screenshot_result.has_value());
+
+  ScreenshotResult& screenshot = result->screenshot_result.value();
+
+  EXPECT_FALSE(screenshot.dimensions.IsZero());
+  ASSERT_GT(screenshot.jpeg_data.size(), 0);
+
+  SkBitmap bitmap = gfx::JPEGCodec::Decode(screenshot.jpeg_data);
+
+  EXPECT_FALSE(bitmap.isNull());
+  EXPECT_FALSE(bitmap.empty());
+  EXPECT_THAT(bitmap.getColor(10, 10), IsColorWithinTolerance(SK_ColorRED, 10));
+}
+
+IN_PROC_BROWSER_TEST_F(RedactingMultiSourcePageContextFetcherBrowserTest,
+                       TakesScreenshot_CrossOriginSameSiteIframeNoRedaction) {
+  ASSERT_TRUE(
+      ui_test_utils::NavigateToURL(browser(), GetURL(kHostA, "/iframe.html")));
+
+  ASSERT_TRUE(content::NavigateIframeToURL(web_contents(), "test",
+                                           GetURL(kHostASubdomain)));
+  SetBackground(web_contents()->GetPrimaryMainFrame(), "white");
+  // Remove the 8px margin applied by the user agent's stylesheet.
+  EXPECT_TRUE(
+      content::ExecJs(web_contents(), "document.body.style.margin = '0px';"));
+  SetBackground(GetSubframe(), "red");
+
+  base::test::TestFuture<FetchPageContextResultCallbackArg> future;
+  FetchPageContextOptions options;
+  options.include_viewport_screenshot = true;
+  FetchPageContext(*web_contents(), options, future.GetCallback());
+
+  ASSERT_OK_AND_ASSIGN(std::unique_ptr<FetchPageContextResult> result,
+                       future.Take());
+
+  ASSERT_TRUE(result);
+  ASSERT_TRUE(result->screenshot_result.has_value());
+
+  ScreenshotResult& screenshot = result->screenshot_result.value();
+
+  EXPECT_FALSE(screenshot.dimensions.IsZero());
+  ASSERT_GT(screenshot.jpeg_data.size(), 0);
+
+  SkBitmap bitmap = gfx::JPEGCodec::Decode(screenshot.jpeg_data);
+
+  EXPECT_FALSE(bitmap.isNull());
+  EXPECT_FALSE(bitmap.empty());
+  EXPECT_THAT(bitmap.getColor(10, 10), IsColorWithinTolerance(SK_ColorRED, 10));
+}
+
+IN_PROC_BROWSER_TEST_F(RedactingMultiSourcePageContextFetcherBrowserTest,
+                       TakesScreenshot_CrossSiteIframeRedacted) {
+  ASSERT_TRUE(
+      ui_test_utils::NavigateToURL(browser(), GetURL(kHostA, "/iframe.html")));
+
+  ASSERT_TRUE(
+      content::NavigateIframeToURL(web_contents(), "test", GetURL(kHostB)));
+  SetBackground(web_contents()->GetPrimaryMainFrame(), "white");
+  // Remove the 8px margin applied by the user agent's stylesheet.
+  EXPECT_TRUE(
+      content::ExecJs(web_contents(), "document.body.style.margin = '0px';"));
+  SetBackground(GetSubframe(), "red");
+
+  base::test::TestFuture<FetchPageContextResultCallbackArg> future;
+  FetchPageContextOptions options;
+  options.include_viewport_screenshot = true;
+  FetchPageContext(*web_contents(), options, future.GetCallback());
+
+  ASSERT_OK_AND_ASSIGN(std::unique_ptr<FetchPageContextResult> result,
+                       future.Take());
+
+  ASSERT_TRUE(result);
+  ASSERT_TRUE(result->screenshot_result.has_value());
+
+  ScreenshotResult& screenshot = result->screenshot_result.value();
+
+  EXPECT_FALSE(screenshot.dimensions.IsZero());
+  ASSERT_GT(screenshot.jpeg_data.size(), 0);
+
+  SkBitmap bitmap = gfx::JPEGCodec::Decode(screenshot.jpeg_data);
+
+  EXPECT_FALSE(bitmap.isNull());
+  EXPECT_FALSE(bitmap.empty());
+  EXPECT_THAT(bitmap.getColor(10, 10),
+              IsColorWithinTolerance(SK_ColorBLACK, 10));
+}
+
 }  // namespace page_content_annotations
diff --git a/chrome/browser/password_manager/password_change/change_password_form_filling_submission_helper_unittest.cc b/chrome/browser/password_manager/password_change/change_password_form_filling_submission_helper_unittest.cc
index 4b58317..0b36edd 100644
--- a/chrome/browser/password_manager/password_change/change_password_form_filling_submission_helper_unittest.cc
+++ b/chrome/browser/password_manager/password_change/change_password_form_filling_submission_helper_unittest.cc
@@ -194,7 +194,8 @@
     ON_CALL(client_, GetProfilePasswordStore)
         .WillByDefault(testing::Return(password_store_.get()));
 
-    logs_uploader_ = std::make_unique<ModelQualityLogsUploader>(web_contents());
+    logs_uploader_ =
+        std::make_unique<ModelQualityLogsUploader>(web_contents(), GURL());
 
     existing_credential_.username_value = kUsername;
     existing_credential_.password_value = kOldPassword;
diff --git a/chrome/browser/password_manager/password_change/change_password_form_finder_unittest.cc b/chrome/browser/password_manager/password_change/change_password_form_finder_unittest.cc
index d58d65ba..cbbeb478 100644
--- a/chrome/browser/password_manager/password_change/change_password_form_finder_unittest.cc
+++ b/chrome/browser/password_manager/password_change/change_password_form_finder_unittest.cc
@@ -198,7 +198,7 @@
 
 TEST_F(ChangePasswordFormFinderTest, PasswordChangeFormFound) {
   auto form_manager = CreateFormManager();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(), GURL());
   base::MockOnceCallback<void(password_manager::PasswordFormManager*)>
       completion_callback;
   base::MockCallback<
@@ -220,7 +220,7 @@
        InitialFormWaiter_InvisiblePasswordChangeFormIgnored) {
   auto invisible_form = CreateHiddenFormData();
   auto form_manager = CreateFormManager(invisible_form);
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(), GURL());
   base::MockOnceCallback<void(password_manager::PasswordFormManager*)>
       completion_callback;
   base::MockCallback<
@@ -243,7 +243,7 @@
   base::MockCallback<
       base::OnceCallback<void(optimization_guide::OnAIPageContentDone)>>
       capture_annotated_page_content;
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(), GURL());
   auto form_finder = std::make_unique<ChangePasswordFormFinder>(
       pass_key(), web_contents(), client(), &logs_uploader,
       completion_callback.Get(), capture_annotated_page_content.Get());
@@ -275,7 +275,7 @@
   base::MockCallback<
       base::OnceCallback<void(optimization_guide::OnAIPageContentDone)>>
       capture_annotated_page_content;
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(), GURL());
   auto form_finder = std::make_unique<ChangePasswordFormFinder>(
       pass_key(), web_contents(), client(), &logs_uploader,
       completion_callback.Get(), capture_annotated_page_content.Get());
@@ -328,7 +328,7 @@
   base::MockCallback<
       base::OnceCallback<void(optimization_guide::OnAIPageContentDone)>>
       capture_annotated_page_content;
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(), GURL());
   auto form_finder = std::make_unique<ChangePasswordFormFinder>(
       pass_key(), web_contents(), client(), &logs_uploader,
       completion_callback.Get(), capture_annotated_page_content.Get());
@@ -363,7 +363,7 @@
   base::HistogramTester histogram_tester;
   base::MockOnceCallback<void(password_manager::PasswordFormManager*)>
       completion_callback;
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(), GURL());
   base::MockCallback<
       base::OnceCallback<void(optimization_guide::OnAIPageContentDone)>>
       capture_annotated_page_content;
@@ -392,7 +392,7 @@
   base::MockCallback<
       base::OnceCallback<void(optimization_guide::OnAIPageContentDone)>>
       capture_annotated_page_content;
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(), GURL());
   auto form_finder = std::make_unique<ChangePasswordFormFinder>(
       pass_key(), web_contents(), client(), &logs_uploader,
       completion_callback.Get(), capture_annotated_page_content.Get());
@@ -441,7 +441,7 @@
   base::MockCallback<
       base::OnceCallback<void(optimization_guide::OnAIPageContentDone)>>
       capture_annotated_page_content;
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(), GURL());
   auto form_finder = std::make_unique<ChangePasswordFormFinder>(
       pass_key(), web_contents(), client(), &logs_uploader,
       completion_callback.Get(), capture_annotated_page_content.Get());
@@ -491,7 +491,7 @@
   base::MockCallback<
       base::OnceCallback<void(optimization_guide::OnAIPageContentDone)>>
       capture_annotated_page_content;
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(), GURL());
   auto form_finder = std::make_unique<ChangePasswordFormFinder>(
       pass_key(), web_contents(), client(), &logs_uploader,
       completion_callback.GetCallback(), capture_annotated_page_content.Get());
diff --git a/chrome/browser/password_manager/password_change/login_state_checker.cc b/chrome/browser/password_manager/password_change/login_state_checker.cc
index 4eaa8f4..d6624eb 100644
--- a/chrome/browser/password_manager/password_change/login_state_checker.cc
+++ b/chrome/browser/password_manager/password_change/login_state_checker.cc
@@ -4,9 +4,11 @@
 
 #include "chrome/browser/password_manager/password_change/login_state_checker.h"
 
+#include "base/check_deref.h"
 #include "base/functional/bind.h"
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
 #include "chrome/browser/password_manager/password_change/annotated_page_content_capturer.h"
+#include "chrome/browser/password_manager/password_change/model_quality_logs_uploader.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
 #include "components/autofill/core/common/save_password_progress_logger.h"
@@ -50,9 +52,11 @@
 
 LoginStateChecker::LoginStateChecker(
     content::WebContents* web_contents,
+    ModelQualityLogsUploader* logs_uploader,
     password_manager::PasswordManagerClient* client,
     LoginStateResultCallback callback)
     : content::WebContentsObserver(web_contents),
+      logs_uploader_(CHECK_DEREF(logs_uploader)),
       client_(client),
       result_check_callback_(std::move(callback)) {
   CheckLoginState();
@@ -71,6 +75,7 @@
 }
 
 void LoginStateChecker::TerminateLoginChecks() {
+  logs_uploader_->SetLoggedInCheckQuality(state_checks_count_);
   state_checks_count_ = kMaxLoginChecks;
   result_check_callback_.Run(false);
 }
@@ -163,6 +168,7 @@
   }
 
   bool is_logged_in = response->is_logged_in_data().is_logged_in();
+  logs_uploader_->SetLoggedInCheckQuality(state_checks_count_);
   LogBoolean(client_,
              SavePasswordProgressLogger::STRING_LOGIN_STATE_CHECK_RESULT,
              is_logged_in);
diff --git a/chrome/browser/password_manager/password_change/login_state_checker.h b/chrome/browser/password_manager/password_change/login_state_checker.h
index 05c91a58..2c54ac16 100644
--- a/chrome/browser/password_manager/password_change/login_state_checker.h
+++ b/chrome/browser/password_manager/password_change/login_state_checker.h
@@ -12,6 +12,7 @@
 #include "content/public/browser/web_contents_observer.h"
 
 class AnnotatedPageContentCapturer;
+class ModelQualityLogsUploader;
 class OptimizationGuideKeyedService;
 
 namespace content {
@@ -34,6 +35,7 @@
   using LoginStateResultCallback = base::RepeatingCallback<void(bool)>;
 
   LoginStateChecker(content::WebContents* web_contents,
+                    ModelQualityLogsUploader* logs_uploader,
                     password_manager::PasswordManagerClient* client,
                     LoginStateResultCallback callback);
 
@@ -80,6 +82,7 @@
   // Whether a server request is ongoing.
   bool is_request_in_flight_ = false;
   std::optional<optimization_guide::AIPageContentResult> cached_page_content_;
+  const raw_ref<ModelQualityLogsUploader> logs_uploader_;
 
   raw_ptr<password_manager::PasswordManagerClient> client_ = nullptr;
 
diff --git a/chrome/browser/password_manager/password_change/login_state_checker_unittest.cc b/chrome/browser/password_manager/password_change/login_state_checker_unittest.cc
index dd013bc..942c4812 100644
--- a/chrome/browser/password_manager/password_change/login_state_checker_unittest.cc
+++ b/chrome/browser/password_manager/password_change/login_state_checker_unittest.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
 #include "chrome/browser/password_manager/password_change/annotated_page_content_capturer.h"
+#include "chrome/browser/password_manager/password_change/model_quality_logs_uploader.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "components/optimization_guide/core/optimization_guide_proto_util.h"
 #include "content/public/test/web_contents_tester.h"
@@ -44,6 +45,15 @@
                                 /*log_entry=*/nullptr));
 }
 
+void VerifyRetryCount(const optimization_guide::proto::LogAiDataRequest& log,
+                      const int expected_retry_count) {
+  EXPECT_EQ(log.password_change_submission()
+                .quality()
+                .logged_in_check()
+                .retry_count(),
+            expected_retry_count);
+}
+
 }  // namespace
 
 class LoginStateCheckerTest : public ChromeRenderViewHostTestHarness {
@@ -58,18 +68,32 @@
     OptimizationGuideKeyedServiceFactory::GetInstance()
         ->SetTestingFactoryAndUse(
             profile(), base::BindRepeating(&CreateOptimizationService));
+    logs_uploader_ =
+        std::make_unique<ModelQualityLogsUploader>(web_contents(), GURL());
+  }
+
+  void TearDown() override {
+    logs_uploader_.reset();
+    ChromeRenderViewHostTestHarness::TearDown();
   }
 
   std::unique_ptr<LoginStateChecker> CreateChecker(
       LoginStateChecker::LoginStateResultCallback callback) {
-    return std::make_unique<LoginStateChecker>(web_contents(), nullptr,
-                                               std::move(callback));
+    return std::make_unique<LoginStateChecker>(
+        web_contents(), logs_uploader_.get(), nullptr, std::move(callback));
+  }
+
+  const std::unique_ptr<ModelQualityLogsUploader>& logs_uploader() {
+    return logs_uploader_;
   }
 
   MockOptimizationGuideKeyedService* optimization_service() {
     return static_cast<MockOptimizationGuideKeyedService*>(
         OptimizationGuideKeyedServiceFactory::GetForProfile(profile()));
   }
+
+ private:
+  std::unique_ptr<ModelQualityLogsUploader> logs_uploader_;
 };
 
 TEST_F(LoginStateCheckerTest, UserIsLoggedInOnFirstAttempt) {
@@ -82,6 +106,7 @@
   checker->capturer()->ReplyWithContent(
       optimization_guide::AIPageContentResult());
   EXPECT_TRUE(future.Take());
+  VerifyRetryCount(logs_uploader()->GetFinalLog(), 0);
 }
 
 TEST_F(LoginStateCheckerTest, UserIsLoggedInOnSecondAttempt) {
@@ -107,6 +132,7 @@
   checker->capturer()->ReplyWithContent(
       optimization_guide::AIPageContentResult());
   EXPECT_TRUE(future.Take());
+  VerifyRetryCount(logs_uploader()->GetFinalLog(), 1);
 }
 
 TEST_F(LoginStateCheckerTest, FailsAfterPageContentCaptureFailure) {
@@ -115,6 +141,7 @@
   ASSERT_TRUE(checker->capturer());
   checker->capturer()->ReplyWithContent(std::nullopt);
   EXPECT_FALSE(future.Take());
+  VerifyRetryCount(logs_uploader()->GetFinalLog(), 0);
 }
 
 TEST_F(LoginStateCheckerTest, ExceedsMaxLoginChecksAndFails) {
@@ -141,6 +168,8 @@
   static_cast<content::WebContentsObserver*>(checker.get())
       ->DidFinishNavigation(nullptr);
   EXPECT_FALSE(future.Take());
+  VerifyRetryCount(logs_uploader()->GetFinalLog(),
+                   LoginStateChecker::kMaxLoginChecks - 1);
 }
 
 TEST_F(LoginStateCheckerTest, CachesPageContentIfRequestInFlight) {
diff --git a/chrome/browser/password_manager/password_change/model_quality_logs_uploader.cc b/chrome/browser/password_manager/password_change/model_quality_logs_uploader.cc
index ec1cfca2..6fcd884 100644
--- a/chrome/browser/password_manager/password_change/model_quality_logs_uploader.cc
+++ b/chrome/browser/password_manager/password_change/model_quality_logs_uploader.cc
@@ -178,27 +178,27 @@
 }  // namespace
 
 ModelQualityLogsUploader::ModelQualityLogsUploader(
-    content::WebContents* web_contents) {
+    content::WebContents* web_contents,
+    const GURL& change_password_url) {
   CHECK(web_contents);
   profile_ = Profile::FromBrowserContext(web_contents->GetBrowserContext());
-  SetCommonInformationQuality(web_contents);
+
+  auto* quality =
+      final_log_data_.mutable_password_change_submission()->mutable_quality();
+  quality->set_domain(GetPageDomain(change_password_url));
+  quality->set_location(GetLocation());
+  quality->set_language(GetPageLanguage(web_contents));
 }
 ModelQualityLogsUploader::~ModelQualityLogsUploader() = default;
 
-void ModelQualityLogsUploader::SetCommonInformationQuality(
-    content::WebContents* web_contents) {
-  CHECK(web_contents);
-  const GURL& page_url =
-      web_contents->GetPrimaryMainFrame()->GetLastCommittedURL();
+void ModelQualityLogsUploader::SetLoggedInCheckQuality(int state_checks_count) {
+  // If the initial login check wasn't performed because the page content failed
+  // to be requested, the state_checks_count can be 0.
+  const int retry_count = std::max(0, state_checks_count - 1);
   final_log_data_.mutable_password_change_submission()
       ->mutable_quality()
-      ->set_domain(GetPageDomain(page_url));
-  final_log_data_.mutable_password_change_submission()
-      ->mutable_quality()
-      ->set_location(GetLocation());
-  final_log_data_.mutable_password_change_submission()
-      ->mutable_quality()
-      ->set_language(GetPageLanguage(web_contents));
+      ->mutable_logged_in_check()
+      ->set_retry_count(retry_count);
 }
 
 void ModelQualityLogsUploader::SetOpenFormQuality(
diff --git a/chrome/browser/password_manager/password_change/model_quality_logs_uploader.h b/chrome/browser/password_manager/password_change/model_quality_logs_uploader.h
index b0539a8..cb0be49 100644
--- a/chrome/browser/password_manager/password_change/model_quality_logs_uploader.h
+++ b/chrome/browser/password_manager/password_change/model_quality_logs_uploader.h
@@ -28,7 +28,8 @@
       PasswordChangeQuality_StepQuality_SubmissionStatus;
   using FlowStep = optimization_guide::proto::PasswordChangeRequest::FlowStep;
 
-  explicit ModelQualityLogsUploader(content::WebContents* web_contents);
+  ModelQualityLogsUploader(content::WebContents* web_contents,
+                           const GURL& change_password_url);
   ~ModelQualityLogsUploader();
   ModelQualityLogsUploader(const ModelQualityLogsUploader&) = delete;
   ModelQualityLogsUploader& operator=(const ModelQualityLogsUploader&) = delete;
@@ -38,6 +39,9 @@
   // log entry to the model quality logging service.
   void UploadFinalLog();
 
+  // Sets quality data for Step=LOGGED_IN_CHECK.
+  void SetLoggedInCheckQuality(int retry_count);
+
   // Sets quality data for Step=OPEN_FORM_STEP.
   void SetOpenFormQuality(
       const std::optional<optimization_guide::proto::PasswordChangeResponse>&
@@ -119,8 +123,6 @@
 #endif
 
  private:
-  void SetCommonInformationQuality(content::WebContents* web_contents);
-
   optimization_guide::proto::LogAiDataRequest final_log_data_;
   raw_ptr<Profile> profile_;
   base::WeakPtrFactory<ModelQualityLogsUploader> weak_ptr_factory_{this};
diff --git a/chrome/browser/password_manager/password_change/model_quality_logs_uploader_unittest.cc b/chrome/browser/password_manager/password_change/model_quality_logs_uploader_unittest.cc
index 8172040..7b109a0 100644
--- a/chrome/browser/password_manager/password_change/model_quality_logs_uploader_unittest.cc
+++ b/chrome/browser/password_manager/password_change/model_quality_logs_uploader_unittest.cc
@@ -40,6 +40,19 @@
 using ::optimization_guide::TestModelQualityLogsUploaderService;
 
 namespace {
+
+constexpr char kChangePasswordURL[] = "https://example.com/password/";
+
+void VerifyRetryCountForLoginCheck(
+    const optimization_guide::proto::LogAiDataRequest& log,
+    const int expected_retry_count) {
+  EXPECT_EQ(log.password_change_submission()
+                .quality()
+                .logged_in_check()
+                .retry_count(),
+            expected_retry_count);
+}
+
 void CheckOpenFormStatus(const optimization_guide::proto::LogAiDataRequest& log,
                          const QualityStatus& expected_status) {
   EXPECT_EQ(log.password_change_submission().quality().open_form().status(),
@@ -172,7 +185,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, VerifySubmissionSucessLog) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   optimization_guide::proto::PasswordChangeResponse response;
   response.mutable_outcome_data()->set_submission_outcome(
       PasswordChangeOutcome::
@@ -188,7 +202,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, OpenFormSuccessLog) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   optimization_guide::proto::PasswordChangeResponse response;
   response.mutable_open_form_data()->set_page_type(
       PageType::OpenFormResponseData_PageType_SETTINGS_PAGE);
@@ -204,7 +219,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, OpenFormElementNotFoundLog) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   optimization_guide::proto::PasswordChangeResponse response;
   response.mutable_open_form_data()->set_page_type(
       PageType::OpenFormResponseData_PageType_SETTINGS_PAGE);
@@ -218,7 +234,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, OpenFormUnexpectedStateLog) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   optimization_guide::proto::PasswordChangeResponse response;
   response.mutable_open_form_data()->set_page_type(
       PageType::OpenFormResponseData_PageType_LOG_IN_PAGE);
@@ -232,7 +249,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, SubmitFormSuccessLog) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   optimization_guide::proto::PasswordChangeResponse response;
   response.mutable_submit_form_data()->set_dom_node_id_to_click(123);
   logs_uploader.SetSubmitFormQuality(std::optional(response),
@@ -245,7 +263,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, SubmitFormElementNotFoundLog) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   optimization_guide::proto::PasswordChangeResponse response;
   logs_uploader.SetSubmitFormQuality(std::optional(response),
                                      CreateLoggingData(), fake_start_time);
@@ -257,7 +276,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, MergeLogsDoesNotOverwrite) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   // Set open form data.
   optimization_guide::proto::PasswordChangeResponse open_form_response;
   open_form_response.mutable_open_form_data()->set_page_type(
@@ -299,7 +319,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, LatencyRecordedForAllSteps) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   constexpr int64_t expected_latency_ms = 2;
   constexpr base::TimeDelta latency = base::Milliseconds(expected_latency_ms);
 
@@ -341,7 +362,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, OpenFormTargetElementNotFound) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   // Set initial open form data for ACTION_SUCCESS status.
   optimization_guide::proto::PasswordChangeResponse open_form_response;
   open_form_response.mutable_open_form_data()->set_page_type(
@@ -366,9 +388,24 @@
           PasswordChangeQuality_StepQuality_SubmissionStatus_ELEMENT_NOT_FOUND);
 }
 
+TEST_F(ModelQualityLogsUploaderTest, LoginCheckRetryCountSet) {
+  const int login_state_checks = 3;
+  ModelQualityLogsUploader logs_uploader(web_contents(), GURL());
+  logs_uploader.SetLoggedInCheckQuality(login_state_checks);
+  VerifyRetryCountForLoginCheck(logs_uploader.GetFinalLog(),
+                                login_state_checks - 1);
+}
+
+TEST_F(ModelQualityLogsUploaderTest, NoLoginCheckPerformed) {
+  ModelQualityLogsUploader logs_uploader(web_contents(), GURL());
+  logs_uploader.SetLoggedInCheckQuality(0);
+  VerifyRetryCountForLoginCheck(logs_uploader.GetFinalLog(), 0);
+}
+
 TEST_F(ModelQualityLogsUploaderTest, OpenFormFlowInterrupted) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   // Set initial open form data for ACTION_SUCCESS status.
   optimization_guide::proto::PasswordChangeResponse open_form_response;
   open_form_response.mutable_open_form_data()->set_page_type(
@@ -398,7 +435,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, SubmitFormFlowInterrupted) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   // Set open form data.
   optimization_guide::proto::PasswordChangeResponse open_form_response;
   open_form_response.mutable_open_form_data()->set_page_type(
@@ -436,7 +474,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, OpenFormOtpDetected) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   // Set initial open form data for ACTION_SUCCESS status.
   optimization_guide::proto::PasswordChangeResponse open_form_response;
   open_form_response.mutable_open_form_data()->set_page_type(
@@ -466,7 +505,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, SubmitFormOtpDetected) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   // Set open form data.
   optimization_guide::proto::PasswordChangeResponse open_form_response;
   open_form_response.mutable_open_form_data()->set_page_type(
@@ -504,7 +544,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, OpenFormSkipped) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   // Set initial open form data for ACTION_SUCCESS status.
   optimization_guide::proto::PasswordChangeResponse open_form_response;
   open_form_response.mutable_open_form_data()->set_page_type(
@@ -531,7 +572,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, SubmitFormSkipped) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   // Set initial submit form data for ACTION_SUCCESS status.
   optimization_guide::proto::PasswordChangeResponse submit_form_response;
   submit_form_response.mutable_submit_form_data()->set_dom_node_id_to_click(
@@ -557,7 +599,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, SubmitFormTargetElementNotFound) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   // Set initial submit form data for ACTION_SUCCESS status.
   optimization_guide::proto::PasswordChangeResponse submit_form_response;
   submit_form_response.mutable_submit_form_data()->set_dom_node_id_to_click(-5);
@@ -582,7 +625,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, FormNotDetectedAfterOpening) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   // Set initial open form data for ACTION_SUCCESS status.
   optimization_guide::proto::PasswordChangeResponse open_form_response;
   open_form_response.mutable_open_form_data()->set_page_type(
@@ -609,7 +653,8 @@
 
 TEST_F(ModelQualityLogsUploaderTest, OpenFormUnexpectedFailure) {
   const base::Time fake_start_time = base::Time::Now();
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
   // Set initial open form data for ACTION_SUCCESS status.
   optimization_guide::proto::PasswordChangeResponse open_form_response;
   open_form_response.mutable_open_form_data()->set_page_type(
@@ -635,31 +680,29 @@
 }
 
 TEST_F(ModelQualityLogsUploaderTest, LogGeneralInformationSetOnCreation) {
-  const GURL url("http://www.url.com");
-  NavigateAndCommit(url);
   ChromeTranslateClient::CreateForWebContents(web_contents());
   const std::string expected_language = "pt-br";
   const std::string expected_country = "US";
   SetLanguageForClient(expected_language);
   SetCountryCode(expected_country);
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
 
   const optimization_guide::proto::LogAiDataRequest final_log =
       logs_uploader.GetFinalLog();
-  CheckCommonQualityLogFields(final_log, "url.com", expected_language,
+  CheckCommonQualityLogFields(final_log, "example.com", expected_language,
                               expected_country);
 }
 
 TEST_F(ModelQualityLogsUploaderTest, CompleteLogWithGeneralInformation) {
   const base::Time fake_start_time = base::Time::Now();
-  const GURL url("http://www.url.com");
-  NavigateAndCommit(url);
   ChromeTranslateClient::CreateForWebContents(web_contents());
   const std::string expected_language = "bd";
   const std::string expected_country = "PE";
   SetLanguageForClient(expected_language);
   SetCountryCode(expected_country);
-  ModelQualityLogsUploader logs_uploader(web_contents());
+  ModelQualityLogsUploader logs_uploader(web_contents(),
+                                         GURL(kChangePasswordURL));
 
   optimization_guide::proto::PasswordChangeResponse open_form_response;
   open_form_response.mutable_open_form_data()->set_page_type(
@@ -674,7 +717,7 @@
       final_log,
       QualityStatus::
           PasswordChangeQuality_StepQuality_SubmissionStatus_ACTION_SUCCESS);
-  CheckCommonQualityLogFields(final_log, "url.com", expected_language,
+  CheckCommonQualityLogFields(final_log, "example.com", expected_language,
                               expected_country);
 }
 
diff --git a/chrome/browser/password_manager/password_change/password_change_submission_verifier_unittest.cc b/chrome/browser/password_manager/password_change/password_change_submission_verifier_unittest.cc
index 5678b079..5cb2a22 100644
--- a/chrome/browser/password_manager/password_change/password_change_submission_verifier_unittest.cc
+++ b/chrome/browser/password_manager/password_change/password_change_submission_verifier_unittest.cc
@@ -71,7 +71,8 @@
     OptimizationGuideKeyedServiceFactory::GetInstance()
         ->SetTestingFactoryAndUse(
             profile(), base::BindRepeating(&CreateOptimizationService));
-    logs_uploader_ = std::make_unique<ModelQualityLogsUploader>(web_contents());
+    logs_uploader_ =
+        std::make_unique<ModelQualityLogsUploader>(web_contents(), GURL());
   }
 
   void TearDown() override {
diff --git a/chrome/browser/password_manager/password_change_delegate_impl.cc b/chrome/browser/password_manager/password_change_delegate_impl.cc
index c49d595..1f558f2 100644
--- a/chrome/browser/password_manager/password_change_delegate_impl.cc
+++ b/chrome/browser/password_manager/password_change_delegate_impl.cc
@@ -307,11 +307,12 @@
                          flow_start_time_ - leak_dialog_display_time_);
   LogPasswordSavedOnStart(originator_);
   UpdateState(State::kWaitingForChangePasswordForm);
-
+  logs_uploader_ = std::make_unique<ModelQualityLogsUploader>(
+      originator_.get(), change_password_url_);
   if (base::FeatureList::IsEnabled(
           password_manager::features::kCheckLoginStateBeforePasswordChange)) {
     login_state_checker_ = std::make_unique<LoginStateChecker>(
-        originator_.get(),
+        originator_.get(), logs_uploader_.get(),
         ChromePasswordManagerClient::FromWebContents(originator_),
         base::BindRepeating(
             &PasswordChangeDelegateImpl::OnLoginStateCheckResult,
@@ -358,7 +359,6 @@
       base::BindOnce(
           &PasswordChangeDelegateImpl::OnCrossOriginNavigationDetected,
           weak_ptr_factory_.GetWeakPtr()));
-  logs_uploader_ = std::make_unique<ModelQualityLogsUploader>(executor_.get());
   form_finder_ = std::make_unique<ChangePasswordFormFinder>(
       executor_.get(), client, logs_uploader_.get(),
       base::BindOnce(&PasswordChangeDelegateImpl::OnPasswordChangeFormFound,
diff --git a/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc b/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc
index cb6027a..1833a21 100644
--- a/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc
+++ b/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "chrome/browser/printing/pdf_to_emf_converter.h"
 
 #include <windows.h>
@@ -112,9 +107,8 @@
   EXPECT_EQ(expected_header.bOpenGL, actual_header.bOpenGL);
 }
 
-std::string HashData(const char* data, size_t len) {
-  return base::HexEncode(
-      base::SHA1Hash(base::span(reinterpret_cast<const uint8_t*>(data), len)));
+std::string HashData(base::span<const uint8_t> data) {
+  return base::HexEncode(base::SHA1Hash(data));
 }
 
 class PdfToEmfConverterBrowserTest
@@ -215,9 +209,10 @@
     ASSERT_EQ(expected_current_emf_data_.size(),
               actual_current_emf_data_.size());
     ASSERT_GT(expected_current_emf_data_.size(), kHeaderSize);
-    size_t size = expected_current_emf_data_.size() - kHeaderSize;
-    EXPECT_EQ(HashData(expected_current_emf_data_.data() + kHeaderSize, size),
-              HashData(actual_current_emf_data_.data() + kHeaderSize, size));
+    auto expected_span = base::as_byte_span(expected_current_emf_data_);
+    auto actual_span = base::as_byte_span(actual_current_emf_data_);
+    EXPECT_EQ(HashData(expected_span.subspan(kHeaderSize)),
+              HashData(actual_span.subspan(kHeaderSize)));
   }
 
  private:
diff --git a/chrome/browser/privacy_sandbox/notice/desktop_entrypoint_handlers_browsertest.cc b/chrome/browser/privacy_sandbox/notice/desktop_entrypoint_handlers_browsertest.cc
index 39808c9..f585bec 100644
--- a/chrome/browser/privacy_sandbox/notice/desktop_entrypoint_handlers_browsertest.cc
+++ b/chrome/browser/privacy_sandbox/notice/desktop_entrypoint_handlers_browsertest.cc
@@ -141,8 +141,14 @@
   Mock::VerifyAndClearExpectations(mock_view_manager());
 }
 
+#if BUILDFLAG(IS_LINUX)
+#define MAYBE_NoPromptInSmallBrowser DISABLED_NoPromptInSmallBrowser
+#else
+#define MAYBE_NoPromptInSmallBrowser NoPromptInSmallBrowser
+#endif
+// TODO(crbug.com/427760680): Re-enable once flakiness on Wayland is addressed.
 IN_PROC_BROWSER_TEST_F(PrivacySandboxNoticeEntryPointHandlersTest,
-                       NoPromptInSmallBrowser) {
+                       MAYBE_NoPromptInSmallBrowser) {
   EXPECT_CALL(*mock_view_manager(), HandleChromeOwnedPageNavigation).Times(0);
 
   ui_test_utils::SetAndWaitForBounds(*browser(), gfx::Rect(0, 0, 50, 50));
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ar.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ar.xtb
index a7929ea9..e52e517 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ar.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ar.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">ناعم</translation>
 <translation id="7237590978482584900">مبتهج</translation>
 <translation id="7282547042039404307">سلسة</translation>
+<translation id="7514257690823355037">الانتقال إلى التالي</translation>
 <translation id="8004767876552422827">حقل</translation>
 <translation id="8136852699834914183">تعذّرت قراءة محتوى هذه الصفحة بصوت عالٍ.</translation>
 <translation id="8198036737896977997">هواء</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">المحتوى يتضمّن معلومات غير صحيحة</translation>
 <translation id="8953618380150219653">تم فتح مشغِّل خيار "الاستماع إلى هذه الصفحة" بطول الشاشة.</translation>
 <translation id="9087782179025630211">شريط التحكّم: تم تشغيل <ph name="ELAPSED" /> من إجمالي <ph name="TOTAL" /></translation>
+<translation id="9193673272519126093">الانتقال إلى السابق</translation>
 <translation id="978117257931832348">حدّة صوت منخفضة</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_as.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_as.xtb
index 9025c32..f9a217af 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_as.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_as.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">সাধাৰণ</translation>
 <translation id="7237590978482584900">আনন্দময়</translation>
 <translation id="7282547042039404307">মসৃণ</translation>
+<translation id="7514257690823355037">পৰৱৰ্তীটোলৈ যাওক</translation>
 <translation id="8004767876552422827">পথাৰ</translation>
 <translation id="8136852699834914183">এই পৃষ্ঠাখনৰ বাবে প্লে’বেক উপলব্ধ নহয়।</translation>
 <translation id="8198036737896977997">বায়ু</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">তথ্যগতভাৱে শুদ্ধ নহয়</translation>
 <translation id="8953618380150219653">“এই পৃষ্ঠাখন শুনক” প্লে’য়াৰ পূৰ্ণ উচ্চতাত খোলা হৈছে</translation>
 <translation id="9087782179025630211">নিয়ন্ত্ৰণ বিচাৰক। <ph name="TOTAL" />ৰ <ph name="ELAPSED" /> গৈছে।</translation>
+<translation id="9193673272519126093">পূৰ্বৱৰ্তীটোলৈ যাওক</translation>
 <translation id="978117257931832348">নিম্নস্বৰীয়</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_bs.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_bs.xtb
index 732f0be..6d8989a 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_bs.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_bs.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">Nježno</translation>
 <translation id="7237590978482584900">Živahno</translation>
 <translation id="7282547042039404307">Glatko</translation>
+<translation id="7514257690823355037">Prijeđi na sljedeće</translation>
 <translation id="8004767876552422827">Polje</translation>
 <translation id="8136852699834914183">Reprodukcija nije dostupna za ovu stranicu.</translation>
 <translation id="8198036737896977997">Zrak</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">Nije činjenično tačno</translation>
 <translation id="8953618380150219653">Plejer "Poslušajte ovu stranicu" je otvoren u punoj visini.</translation>
 <translation id="9087782179025630211">Kontrola pomicanja. Proteklo je <ph name="ELAPSED" /> od <ph name="TOTAL" />.</translation>
+<translation id="9193673272519126093">Prijeđi na prethodno</translation>
 <translation id="978117257931832348">Nizak ton</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ca.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ca.xtb
index a76fad27..dd76354 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ca.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ca.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">Agradable</translation>
 <translation id="7237590978482584900">Despreocupada</translation>
 <translation id="7282547042039404307">Suau</translation>
+<translation id="7514257690823355037">Ves al següent</translation>
 <translation id="8004767876552422827">Camp</translation>
 <translation id="8136852699834914183">La reproducció no està disponible per a aquesta pàgina.</translation>
 <translation id="8198036737896977997">Aire</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">Informació objectivament incorrecta</translation>
 <translation id="8953618380150219653">El reproductor "Escolta aquesta pàgina" s'ha obert a alçada completa.</translation>
 <translation id="9087782179025630211">Control de cerca. Han transcorregut <ph name="ELAPSED" /> de <ph name="TOTAL" />.</translation>
+<translation id="9193673272519126093">Ves a l'anterior</translation>
 <translation id="978117257931832348">Greu</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_el.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_el.xtb
index 2a2425e3..1fca6be 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_el.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_el.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">Ήπια</translation>
 <translation id="7237590978482584900">Ανάλαφρη</translation>
 <translation id="7282547042039404307">Ομαλή</translation>
+<translation id="7514257690823355037">Μετάβαση στο επόμενο</translation>
 <translation id="8004767876552422827">Λιβάδι</translation>
 <translation id="8136852699834914183">Η αναπαραγωγή δεν είναι διαθέσιμη για αυτή τη σελίδα.</translation>
 <translation id="8198036737896977997">Αέρας</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">Δεν είναι σωστό βάσει στοιχείων</translation>
 <translation id="8953618380150219653">Το πρόγραμμα αναπαραγωγής "Ακρόαση αυτής της σελίδας" άνοιξε σε πλήρες ύψος.</translation>
 <translation id="9087782179025630211">Στοιχείο ελέγχου αναζήτησης. Παρήλθαν <ph name="ELAPSED" /> από <ph name="TOTAL" />.</translation>
+<translation id="9193673272519126093">Μετάβαση στο προηγούμενο</translation>
 <translation id="978117257931832348">Χαμηλός τόνος</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es.xtb
index e76c649..8058d326 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">Amable</translation>
 <translation id="7237590978482584900">Jovial</translation>
 <translation id="7282547042039404307">Fluido</translation>
+<translation id="7514257690823355037">Ir al siguiente</translation>
 <translation id="8004767876552422827">Field</translation>
 <translation id="8136852699834914183">La reproducción no está disponible para esta página.</translation>
 <translation id="8198036737896977997">Air</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">Incluía información incorrecta</translation>
 <translation id="8953618380150219653">El reproductor "Escuchar esta página" está abierto a altura completa.</translation>
 <translation id="9087782179025630211">Control deslizante. Tiempo transcurrido: <ph name="ELAPSED" /> de <ph name="TOTAL" />.</translation>
+<translation id="9193673272519126093">Ir al anterior</translation>
 <translation id="978117257931832348">Grave</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_hr.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_hr.xtb
index 390e6b9..fc2de2b 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_hr.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_hr.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">Blag</translation>
 <translation id="7237590978482584900">Bezbrižan</translation>
 <translation id="7282547042039404307">Glatko</translation>
+<translation id="7514257690823355037">Prijeđi na sljedeće</translation>
 <translation id="8004767876552422827">Polje</translation>
 <translation id="8136852699834914183">Reprodukcija nije dostupna za ovu stranicu.</translation>
 <translation id="8198036737896977997">Zrak</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">Nije činjenično točan</translation>
 <translation id="8953618380150219653">Player Poslušajte ovu stranicu otvoren je u punoj visini.</translation>
 <translation id="9087782179025630211">Klizač. Isteklo je <ph name="ELAPSED" /> od <ph name="TOTAL" />.</translation>
+<translation id="9193673272519126093">Prijeđi na prethodno</translation>
 <translation id="978117257931832348">Nizak</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_it.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_it.xtb
index 13769273..69635ba 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_it.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_it.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">Dolce</translation>
 <translation id="7237590978482584900">Vivace</translation>
 <translation id="7282547042039404307">Fluido</translation>
+<translation id="7514257690823355037">Vai al successivo</translation>
 <translation id="8004767876552422827">Campo</translation>
 <translation id="8136852699834914183">Riproduzione non disponibile per questa pagina.</translation>
 <translation id="8198036737896977997">Aria</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">Contiene informazioni errate</translation>
 <translation id="8953618380150219653">Player "Ascolta questa pagina" aperto a schermo intero.</translation>
 <translation id="9087782179025630211">Cursore. Tempo trascorso: <ph name="ELAPSED" /> su <ph name="TOTAL" />.</translation>
+<translation id="9193673272519126093">Vai al precedente</translation>
 <translation id="978117257931832348">Tonalità bassa</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_iw.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_iw.xtb
index ca2f5af..23ead96 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_iw.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_iw.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">עדין</translation>
 <translation id="7237590978482584900">קליל</translation>
 <translation id="7282547042039404307">חלקה</translation>
+<translation id="7514257690823355037">הבא</translation>
 <translation id="8004767876552422827">פילד</translation>
 <translation id="8136852699834914183">ההפעלה לא זמינה בדף הזה.</translation>
 <translation id="8198036737896977997">אייר</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">העובדות שגויות</translation>
 <translation id="8953618380150219653">הנגן 'האזנה לדף הזה' נפתח בגובה מלא.</translation>
 <translation id="9087782179025630211">מחוון שליטה. חלפו <ph name="ELAPSED" /> מתוך <ph name="TOTAL" />.</translation>
+<translation id="9193673272519126093">הקודם</translation>
 <translation id="978117257931832348">נמוך</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ka.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ka.xtb
index 9726552e..29bdb78 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ka.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ka.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">მსუბუქი</translation>
 <translation id="7237590978482584900">ცოცხალი</translation>
 <translation id="7282547042039404307">გლუვი</translation>
+<translation id="7514257690823355037">შემდეგზე გადასვლა</translation>
 <translation id="8004767876552422827">Field</translation>
 <translation id="8136852699834914183">დაკვრა მიუწვდომელია ამ გვერდისთვის.</translation>
 <translation id="8198036737896977997">Air</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">ფაქტობრივად არ არის სწორი</translation>
 <translation id="8953618380150219653">„ამ გვერდის მოსმენის“ დამკვრელი გახსნილია სრულ სიმაღლეზე.</translation>
 <translation id="9087782179025630211">ცოცია. <ph name="TOTAL" />-დან გავიდა <ph name="ELAPSED" />.</translation>
+<translation id="9193673272519126093">წინაზე გადასვლა</translation>
 <translation id="978117257931832348">დაბალი ტონი</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_kk.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_kk.xtb
index faba51e..bf5cdb1 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_kk.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_kk.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">Нәзік</translation>
 <translation id="7237590978482584900">Көңілді</translation>
 <translation id="7282547042039404307">Тегіc</translation>
+<translation id="7514257690823355037">Келесі мақалаға өту</translation>
 <translation id="8004767876552422827">Өріс</translation>
 <translation id="8136852699834914183">Бұл бетте ойнату функциясы қолжетімді емес.</translation>
 <translation id="8198036737896977997">Ауа</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">Мәліметтері қате</translation>
 <translation id="8953618380150219653">"Осы бетті тыңдау" ойнатқышы толығымен ашылды.</translation>
 <translation id="9087782179025630211">Іздеу жолағы. <ph name="TOTAL" /> ішінен <ph name="ELAPSED" /> өтті.</translation>
+<translation id="9193673272519126093">Алдыңғы мақалаға өту</translation>
 <translation id="978117257931832348">Төмен</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_km.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_km.xtb
index db5370a..b3cd80e 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_km.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_km.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">ស្រទន់</translation>
 <translation id="7237590978482584900">រីករាយ</translation>
 <translation id="7282547042039404307">រលូន</translation>
+<translation id="7514257690823355037">ផ្លាស់ទីទៅ​អត្ថបទ​បន្ទាប់</translation>
 <translation id="8004767876552422827">ទីវាល</translation>
 <translation id="8136852699834914183">មិនអាចចាក់សម្រាប់ទំព័រនេះបានទេ។</translation>
 <translation id="8198036737896977997">ខ្យល់</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">មិនត្រឹមត្រូវតាមការពិត</translation>
 <translation id="8953618380150219653">កម្មវិធីចាក់ “ស្ដាប់​ទំព័រ​នេះ” បានបើក​ពេញ​អេក្រង់។</translation>
 <translation id="9087782179025630211">របាររាវរក។ បានចាក់​រយៈពេល <ph name="ELAPSED" /> នៃ <ph name="TOTAL" />។</translation>
+<translation id="9193673272519126093">ផ្លាស់ទីទៅ​អត្ថបទមុន</translation>
 <translation id="978117257931832348">សំឡេងទាប</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_lo.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_lo.xtb
index 75e6ed74..4a82d4c6 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_lo.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_lo.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">ອ່ອນໂຍນ</translation>
 <translation id="7237590978482584900">ສົດຊື່ນ</translation>
 <translation id="7282547042039404307">ຄ່ອງແຄ້ວ</translation>
+<translation id="7514257690823355037">ຍ້າຍໄປຫາລາຍການຕໍ່ໄປ</translation>
 <translation id="8004767876552422827">ສະໜາມ</translation>
 <translation id="8136852699834914183">ບໍ່ສາມາດໃຊ້ການຫຼິ້ນສຳລັບໜ້ານີ້ໄດ້.</translation>
 <translation id="8198036737896977997">ອາກາດ</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">ບໍ່ຖືກຕ້ອງຕາມຂໍ້ເທັດຈິງ</translation>
 <translation id="8953618380150219653">ເປີດຕົວຫຼິ້ນ “ຟັງໜ້ານີ້” ແບບເຕັມຄວາມສູງແລ້ວ.</translation>
 <translation id="9087782179025630211">ຕົວຄວບຄຸມການຫຼິ້ນ. ຜ່ານໄປແລ້ວ <ph name="ELAPSED" /> ຈາກທັງໝົດ <ph name="TOTAL" />.</translation>
+<translation id="9193673272519126093">ຍ້າຍໄປຫາລາຍການກ່ອນໜ້າ</translation>
 <translation id="978117257931832348">ສຽງຕ່ຳ</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_lt.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_lt.xtb
index a9d5708..0bc2acc 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_lt.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_lt.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">Švelnus</translation>
 <translation id="7237590978482584900">Linksmas</translation>
 <translation id="7282547042039404307">Leidžiama sklandžiai</translation>
+<translation id="7514257690823355037">Pereiti prie kito</translation>
 <translation id="8004767876552422827">Laukas</translation>
 <translation id="8136852699834914183">Šio puslapio negalima atkurti.</translation>
 <translation id="8198036737896977997">Oras</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">Netikslūs faktai</translation>
 <translation id="8953618380150219653">Leistuvė „Klausytis šio puslapio“ atidaryta per visą ekrano aukštį.</translation>
 <translation id="9087782179025630211">Paieškos valdiklis. Praėjo <ph name="ELAPSED" /> iš <ph name="TOTAL" />.</translation>
+<translation id="9193673272519126093">Pereiti prie ankstesnio</translation>
 <translation id="978117257931832348">Žemas tonas</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_nl.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_nl.xtb
index 8a8aa8a..c150885 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_nl.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_nl.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">Vriendelijk</translation>
 <translation id="7237590978482584900">Vrolijk</translation>
 <translation id="7282547042039404307">Vloeiend</translation>
+<translation id="7514257690823355037">Naar volgende gaan</translation>
 <translation id="8004767876552422827">Veld</translation>
 <translation id="8136852699834914183">Afspelen is niet beschikbaar voor deze pagina.</translation>
 <translation id="8198036737896977997">Lucht</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">Niet feitelijk juist</translation>
 <translation id="8953618380150219653">De speler 'Deze pagina beluisteren' is op volledige hoogte geopend.</translation>
 <translation id="9087782179025630211">Schuifbalk. <ph name="ELAPSED" /> van <ph name="TOTAL" /> verstreken.</translation>
+<translation id="9193673272519126093">Naar vorige gaan</translation>
 <translation id="978117257931832348">Lage toonhoogte</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_pt-PT.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_pt-PT.xtb
index f933a9e8..0de61f70 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_pt-PT.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_pt-PT.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">Suave</translation>
 <translation id="7237590978482584900">Animado</translation>
 <translation id="7282547042039404307">Suave</translation>
+<translation id="7514257690823355037">Ir para o seguinte</translation>
 <translation id="8004767876552422827">Campo</translation>
 <translation id="8136852699834914183">A reprodução não está disponível para esta página.</translation>
 <translation id="8198036737896977997">Ar</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">Incorreto do ponto de vista factual</translation>
 <translation id="8953618380150219653">Leitor "Ouvir esta página" aberto à altura total.</translation>
 <translation id="9087782179025630211">Controlo de deslize. <ph name="ELAPSED" /> decorrido(s) de <ph name="TOTAL" />.</translation>
+<translation id="9193673272519126093">Ir para o anterior</translation>
 <translation id="978117257931832348">Tom grave</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr-Latn.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr-Latn.xtb
index fd526cff..1844a8d4 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr-Latn.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr-Latn.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">Diskretno</translation>
 <translation id="7237590978482584900">Sa slabim vetrom</translation>
 <translation id="7282547042039404307">Bez prekida</translation>
+<translation id="7514257690823355037">Pređite na sledeće</translation>
 <translation id="8004767876552422827">Polje</translation>
 <translation id="8136852699834914183">Reprodukcija nije dostupna za ovu stranicu.</translation>
 <translation id="8198036737896977997">Vazduh</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">Podaci nisu tačni</translation>
 <translation id="8953618380150219653">Plejer Slušajte ovu stranicu je otvoren u punoj visini.</translation>
 <translation id="9087782179025630211">Kontrola za traženje. Proteklo je <ph name="ELAPSED" /> od <ph name="TOTAL" />.</translation>
+<translation id="9193673272519126093">Pređite na prethodno</translation>
 <translation id="978117257931832348">Dubok</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr.xtb
index 0ae61207..b49c2b8 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">Дискретно</translation>
 <translation id="7237590978482584900">Са слабим ветром</translation>
 <translation id="7282547042039404307">Без прекида</translation>
+<translation id="7514257690823355037">Пређите на следеће</translation>
 <translation id="8004767876552422827">Поље</translation>
 <translation id="8136852699834914183">Репродукција није доступна за ову страницу.</translation>
 <translation id="8198036737896977997">Ваздух</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">Подаци нису тачни</translation>
 <translation id="8953618380150219653">Плејер Слушајте ову страницу је отворен у пуној висини.</translation>
 <translation id="9087782179025630211">Контрола за тражење. Протекло је <ph name="ELAPSED" /> од <ph name="TOTAL" />.</translation>
+<translation id="9193673272519126093">Пређите на претходно</translation>
 <translation id="978117257931832348">Дубок</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ta.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ta.xtb
index bb3d66c..394f985 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ta.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ta.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">மென்மை</translation>
 <translation id="7237590978482584900">சுகம்</translation>
 <translation id="7282547042039404307">சீரானது</translation>
+<translation id="7514257690823355037">அடுத்ததற்குச் செல்லும்</translation>
 <translation id="8004767876552422827">வயல்</translation>
 <translation id="8136852699834914183">இந்தப் பக்கத்தில் பிளேபேக் வசதி கிடைக்காது.</translation>
 <translation id="8198036737896977997">காற்று</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">உண்மை இல்லை</translation>
 <translation id="8953618380150219653">“இந்தப் பக்கத்தைப் படி” பிளேயர் முழு உயரத்தில் திறக்கப்பட்டது.</translation>
 <translation id="9087782179025630211">நகர்தல் கட்டுப்பாடு. <ph name="TOTAL" /> இல் <ph name="ELAPSED" /> முடிந்துவிட்டது.</translation>
+<translation id="9193673272519126093">முந்தையதற்குச் செல்லும்</translation>
 <translation id="978117257931832348">லோ பிட்ச்</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_uz.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_uz.xtb
index a696f3ae..c8bf03a1 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_uz.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_uz.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">Tovushsiz</translation>
 <translation id="7237590978482584900">Yaxna</translation>
 <translation id="7282547042039404307">Ravon</translation>
+<translation id="7514257690823355037">Keyingisiga oʻtish</translation>
 <translation id="8004767876552422827">Dala</translation>
 <translation id="8136852699834914183">Bu sahifada ijro etish imkonsiz.</translation>
 <translation id="8198036737896977997">Havo</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">Faktlar asosida emas</translation>
 <translation id="8953618380150219653">“Bu sahifani tinglash” pleyeri toʻliq hajmda ochildi.</translation>
 <translation id="9087782179025630211">Qidiruv paneli. Joriy vaqt: <ph name="ELAPSED" />/<ph name="TOTAL" />.</translation>
+<translation id="9193673272519126093">Avvalgisiga oʻtish</translation>
 <translation id="978117257931832348">Past ohang</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-CN.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-CN.xtb
index 76821fe4..6203f5a 100644
--- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-CN.xtb
+++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-CN.xtb
@@ -57,6 +57,7 @@
 <translation id="7221920857098237570">柔和</translation>
 <translation id="7237590978482584900">轻松</translation>
 <translation id="7282547042039404307">流畅</translation>
+<translation id="7514257690823355037">跳转到下一篇</translation>
 <translation id="8004767876552422827">田野</translation>
 <translation id="8136852699834914183">无法播放此网页中的内容。</translation>
 <translation id="8198036737896977997">空气</translation>
@@ -68,5 +69,6 @@
 <translation id="8756370108715456837">与事实不符</translation>
 <translation id="8953618380150219653">“读出此网页的内容”播放器已全屏打开。</translation>
 <translation id="9087782179025630211">拖动条控件。已过去 <ph name="ELAPSED" />,共 <ph name="TOTAL" />。</translation>
+<translation id="9193673272519126093">跳转到上一篇</translation>
 <translation id="978117257931832348">低音</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ar.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ar.xtb
index f5e00067..46673ed3 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ar.xtb
@@ -346,7 +346,7 @@
 <translation id="3104705064753753826">alrt dlg</translation>
 <translation id="3109724472072898302">مصغّر</translation>
 <translation id="311015743332597320">مرِّر سريعًا بأربعة أصابع إلى يسار الشاشة.</translation>
-<translation id="3112457281078985179">‏لتفعيل ChromeVox أو إيقاف تشغيله، استخدم Control+Alt+Z.</translation>
+<translation id="3112457281078985179">‏لتفعيل ChromeVox أو إيقاف تشغيله، يرجى استخدام Control+Alt+Z.</translation>
 <translation id="3115800313647508384">هل تريد إيقاف الشاشة؟</translation>
 <translation id="3131002934070407451">طريقة قراءة الأرقام:</translation>
 <translation id="3134461040845705080">rdonly</translation>
@@ -394,7 +394,7 @@
 <translation id="335581015389089642">الحديث</translation>
 <translation id="3356951775008366684">الإعلان عن النطق الصوتي للكلمة</translation>
 <translation id="3359142382821736686">seprtr</translation>
-<translation id="3363015957057974366">‏يمكنك أيضًا استخدام مفتاح التبويب (Tab) للانتقال إلى العنصر التفاعلي التالي على الشاشة. ابحث عن مفتاح التبويب (Tab) الموجود فوق مفتاح البحث مباشرةً. للمواصلة، اضغط على مفتاح التبويب (Tab).</translation>
+<translation id="3363015957057974366">‏يمكنك أيضًا استخدام مفتاح التبويب (Tab) للانتقال إلى العنصر التفاعلي التالي على الشاشة. يرجى البحث عن مفتاح التبويب (Tab) الموجود فوق مفتاح البحث مباشرةً. للمواصلة، يمكنك الضغط على مفتاح التبويب (Tab).</translation>
 <translation id="3366946046494222386">برنامج <ph name="TOPIC" /> التعليمي، <ph name="LESSONS" /> درس</translation>
 <translation id="338583716107319301">فاصل</translation>
 <translation id="3389259863310851658">حقل النموذج السابق</translation>
@@ -430,7 +430,7 @@
 <translation id="3594207934078151302">أخضر بحري متوسط</translation>
 <translation id="3599054940393788245">ليس داخل الرياضيات</translation>
 <translation id="360241989769010433">شكر وتقدير</translation>
-<translation id="3616016838842055984">إذا وصلت إلى عنصر وتريد النقر عليه، اضغط على مفتاح البحث + مفتاح المسافة. جرِّب الضغط عليهما الآن للمواصلة.</translation>
+<translation id="3616016838842055984">إذا وصلت إلى عنصر وأردت النقر عليه، يرجى الضغط على مفتاح البحث + مفتاح المسافة. يرجى محاولة الضغط عليهما الآن للمواصلة.</translation>
 <translation id="3616113530831147358">المقاطع الصوتية</translation>
 <translation id="3622350485154495700">النقر مرَّتين بإصبع واحد</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
@@ -526,7 +526,7 @@
 <translation id="4253168017788158739">ملاحظة</translation>
 <translation id="4254798249533888099">متفرع</translation>
 <translation id="4255016471934258618">فتح الفم</translation>
-<translation id="4259220820964911921">‏هل تريد تفعيل التحكّم في ميزة FaceGaze؟</translation>
+<translation id="4259220820964911921">تفعيل ميزة "التحكّم بالوجه"؟</translation>
 <translation id="4271220233568730077">التعبير الرياضي التالي</translation>
 <translation id="4275397969489577657">تفعيل ميزة تسجيل بث الحدث</translation>
 <translation id="4278486392851938658">ليس هناك رابط سابق تم الانتقال إليه.</translation>
@@ -668,7 +668,7 @@
 <translation id="5263034204789987535">أصفر باهت</translation>
 <translation id="5263344797180442561">h2</translation>
 <translation id="528468243742722775">إنهاء</translation>
-<translation id="5290220123487191192">لنبدأ ببعض الإيماءات التي ستستخدمها بانتظام. إذا وصلت إلى عنصر تريد تفعيله، انقر مرّتين على الشاشة بإصبع واحد. للمتابعة، انقر مرّتين الآن.</translation>
+<translation id="5290220123487191192">لنبدأ ببعض الإيماءات التي يتمّ استخدامها بانتظام. لتفعيل أيّ عنصر، عليك النقر مرّتين على الشاشة بإصبع واحد. للمتابعة، يُرجى النقر مرّتين الآن.</translation>
 <translation id="5291860916305032607">استئناف ميزة "التحكّم بالوجه"</translation>
 <translation id="5302089807023311274">مرجع قائمة مراجع</translation>
 <translation id="530391007967514163">يمكنك الانتقال بسرعة بين العناوين للتنقُّل بين النصوص أدناه.</translation>
@@ -735,7 +735,7 @@
 <translation id="5655682562155942719">أوامر الانتقال السريع</translation>
 <translation id="56637627897541303">منطقة النص</translation>
 <translation id="5666746275818170484">اضغط على مفتاح السهم المتّجه لليسار</translation>
-<translation id="5669637233317991674">للتنقّل في هذا الدرس، اضغط على مفتاح البحث + مفتاح السهم المتّجه لليمين أو لليسار.</translation>
+<translation id="5669637233317991674">للتنقّل في هذا الدرس، عليك الضغط على مفتاح البحث + مفتاح السهم المتّجه لليمين أو لليسار.</translation>
 <translation id="5677240841070992068">الموقع الحالي</translation>
 <translation id="5678161956734658133">mled</translation>
 <translation id="5678971933640285754">.input {$$COUNT :number} .match $$COUNT 1{{right brace}} *{{{$$COUNT} right braces}}</translation>
diff --git a/chrome/browser/resources/password_manager/passwords_importer.ts b/chrome/browser/resources/password_manager/passwords_importer.ts
index af92607..f4bb580 100644
--- a/chrome/browser/resources/password_manager/passwords_importer.ts
+++ b/chrome/browser/resources/password_manager/passwords_importer.ts
@@ -2,6 +2,44 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+/**
+ * @fileoverview 'passwords-importer' is a component for importing passwords
+ * from a .csv file. It is a state machine that transitions through several
+ * states, managed by the `dialogState_` property.
+ *
+ * The user initiates the import process, but the initial interaction differs
+ * based on their account type:
+ *
+ * - For "Account Store" users: The user
+ *   clicks on the entire "Import passwords" row. This action transitions the
+ *   state to `STORE_PICKER`, where they can choose to save passwords to their
+ *   account or the local device. After making a selection, they click the
+ *   "Select file" button to continue.
+ * - For other users: A "Select file" button is displayed directly on the
+ *   row. Clicking this button bypasses the store picker and immediately
+ *   transitions the state to `IN_PROGRESS`, starting the file selection
+ *   process.
+ *
+ * The rest of the flow is as follows:
+ *
+ * 1.  File Processing (`IN_PROGRESS`): The user is prompted to select a
+ *     `.csv` file. While the file is being read and processed, a spinner is
+ *     shown.
+ *
+ * 2.  Resolution: After processing, the machine transitions to one of the
+ *     following terminal states:
+ *     - `SUCCESS`: The passwords were imported successfully.
+ *     - `CONFLICTS`: The file contained passwords that already exist. The
+ *       user is prompted to select which ones to overwrite.
+ *     - `ERROR`: An error occurred (e.g., bad file format, file too
+ *       large).
+ *     - `ALREADY_ACTIVE`: Another import process was already in progress in
+ *       another window.
+ *
+ * 3.  Completion (`NO_DIALOG`): From any of the resolution states, closing
+ *     the dialog resets the state machine back to `NO_DIALOG`.
+ */
+
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import 'chrome://resources/cr_elements/cr_icon/cr_icon.js';
 import 'chrome://resources/cr_elements/cr_link_row/cr_link_row.js';
@@ -29,6 +67,38 @@
   };
 }
 
+/**
+ * The states of the importer. See the file-level comment for more details on
+ * the state machine.
+ *
+ *                 +------------------+
+ *                 |    NO_DIALOG     |
+ *                 +------------------+
+ *                        |
+ *                        v
+ *                 +------------------+
+ *                 |   STORE_PICKER   | (If isAccountStoreUser)
+ *                 +------------------+
+ *                        |
+ *                        v (file selection)
+ *                 +------------------+
+ *                 |   IN_PROGRESS    |
+ *                 +------------------+
+ *                        |
+ *     +------------------+------------------+------------------+
+ *     |                  |                  |                  |
+ *     v                  v                  v                  v
+ * +-------+      +-----------+      +-----------+      +----------------+
+ * | ERROR |      | CONFLICTS |      |  SUCCESS  |      | ALREADY_ACTIVE |
+ * +-------+      +-----------+      +-----------+      +----------------+
+ *     |                  |                  |                  |
+ *     +------------------+------------------+------------------+
+ *                        |
+ *                        v
+ *                 +------------------+
+ *                 |    NO_DIALOG     |
+ *                 +------------------+
+ */
 enum DialogState {
   NO_DIALOG,
   IN_PROGRESS,
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn
index 29d8ac5..b6449ee 100644
--- a/chrome/browser/resources/settings/BUILD.gn
+++ b/chrome/browser/resources/settings/BUILD.gn
@@ -189,15 +189,19 @@
     "simple_confirmation_dialog.ts",
     "site_favicon.ts",
     "site_settings/add_site_dialog.ts",
+    "site_settings/ads_page.ts",
     "site_settings/all_sites.ts",
     "site_settings/ar_page.ts",
+    "site_settings/automatic_downloads_page.ts",
     "site_settings/automatic_full_screen_page.ts",
     "site_settings/auto_picture_in_picture_page.ts",
+    "site_settings/background_sync_page.ts",
     "site_settings/bluetooth_scanning_page.ts",
     "site_settings/captured_surface_control_page.ts",
     "site_settings/category_setting_exceptions.ts",
     "site_settings/chooser_exception_list_entry.ts",
     "site_settings/chooser_exception_list.ts",
+    "site_settings/clipboard_page.ts",
     "site_settings/edit_exception_dialog.ts",
     "site_settings/file_system_site_details.ts",
     "site_settings/file_system_site_entry_item.ts",
@@ -206,14 +210,19 @@
     "site_settings/geolocation_page.ts",
     "site_settings/hand_tracking_page.ts",
     "site_settings/idle_detection_page.ts",
+    "site_settings/javascript_page.ts",
     "site_settings/keyboard_lock_page.ts",
     "site_settings/local_fonts_page.ts",
     "site_settings/local_network_access_page.ts",
     "site_settings/media_picker.ts",
+    "site_settings/midi_devices_page.ts",
     "site_settings/notifications_page.ts",
+    "site_settings/payment_handler_page.ts",
     "site_settings/pdf_documents_page.ts",
+    "site_settings/popups_page.ts",
     "site_settings/protected_content_page.ts",
     "site_settings/protocol_handlers.ts",
+    "site_settings/sensors_page.ts",
     "site_settings/settings_category_default_radio_group.ts",
     "site_settings/site_data.ts",
     "site_settings/site_details_permission_device_entry.ts",
@@ -227,8 +236,10 @@
     "site_settings/storage_access_site_list_entry.ts",
     "site_settings/storage_access_site_list.ts",
     "site_settings/storage_access_static_site_list_entry.ts",
+    "site_settings/v8_page.ts",
     "site_settings/vr_page.ts",
     "site_settings/web_applications_page.ts",
+    "site_settings/web_printing_page.ts",
     "site_settings/window_management_page.ts",
     "site_settings/zoom_levels.ts",
     "site_settings_page/recent_site_permissions.ts",
diff --git a/chrome/browser/resources/settings/lazy_load.ts b/chrome/browser/resources/settings/lazy_load.ts
index f3fef7c..1dff9db 100644
--- a/chrome/browser/resources/settings/lazy_load.ts
+++ b/chrome/browser/resources/settings/lazy_load.ts
@@ -37,14 +37,18 @@
 import './privacy_page/security_page.js';
 import './safety_hub/safety_hub_page.js';
 import './safety_hub/safety_hub_entry_point.js';
+import './site_settings/ads_page.js';
 import './site_settings/all_sites.js';
 import './site_settings/ar_page.js';
+import './site_settings/automatic_downloads_page.js';
 import './site_settings/automatic_full_screen_page.js';
 import './site_settings/auto_picture_in_picture_page.js';
+import './site_settings/background_sync_page.js';
 import './site_settings/bluetooth_scanning_page.js';
 import './site_settings/captured_surface_control_page.js';
 import './site_settings/category_setting_exceptions.js';
 import './site_settings/chooser_exception_list.js';
+import './site_settings/clipboard_page.js';
 import './site_settings/file_system_site_details.js';
 import './site_settings/file_system_site_entry_item.js';
 import './site_settings/file_system_site_entry.js';
@@ -52,23 +56,30 @@
 import './site_settings/geolocation_page.js';
 import './site_settings/hand_tracking_page.js';
 import './site_settings/idle_detection_page.js';
+import './site_settings/javascript_page.js';
 import './site_settings/keyboard_lock_page.js';
 import './site_settings/local_fonts_page.js';
 import './site_settings/local_network_access_page.js';
 import './site_settings/media_picker.js';
+import './site_settings/midi_devices_page.js';
 import './site_settings/notifications_page.js';
 import './site_settings_page/site_settings_page.js';
+import './site_settings/payment_handler_page.js';
 import './site_settings/pdf_documents_page.js';
+import './site_settings/popups_page.js';
 import './site_settings/protected_content_page.js';
 import './site_settings/protocol_handlers.js';
+import './site_settings/sensors_page.js';
 import './site_settings/settings_category_default_radio_group.js';
 import './site_settings/site_data.js';
 import './site_settings/site_details.js';
 import './site_settings/site_details_permission_device_entry.js';
 import './site_settings/storage_access_page.js';
+import './site_settings/v8_page.js';
 import './site_settings/vr_page.js';
-import './site_settings/window_management_page.js';
 import './site_settings/web_applications_page.js';
+import './site_settings/web_printing_page.js';
+import './site_settings/window_management_page.js';
 import './site_settings/zoom_levels.js';
 // <if expr="not is_chromeos">
 import './a11y_page/live_caption_section.js';
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html
index e8e57eac..d7c4d4c 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -102,25 +102,8 @@
             page-title="$i18n{siteSettingsCategoryJavascriptOptimizer}"
             search-label="$i18n{siteSettingsAllSitesSearch}"
             search-term="{{searchFilter_}}">
-          <div class="content-settings-header secondary">
-            $i18n{siteSettingsJavascriptOptimizerDescription}
-          </div>
-          <settings-category-default-radio-group
-              category="[[contentSettingsTypesEnum_.JAVASCRIPT_OPTIMIZER]]"
-              allow-option-label=
-                  "$i18n{siteSettingsJavascriptOptimizerAllowed}"
-              allow-option-sub-label=
-                  "$i18n{siteSettingsJavascriptOptimizerAllowedSubLabel}"
-              block-option-label="$i18n{siteSettingsJavascriptOptimizerBlocked}"
-              block-option-sub-label=
-                  "$i18n{siteSettingsJavascriptOptimizerBlockedSubLabel}">
-          </settings-category-default-radio-group>
-          <category-setting-exceptions
-              category="[[contentSettingsTypesEnum_.JAVASCRIPT_OPTIMIZER]]"
-              allow-header="$i18n{siteSettingsJavascriptOptimizerAllowedExceptions}"
-              block-header="$i18n{siteSettingsJavascriptOptimizerBlockedExceptions}"
-              search-filter="[[searchFilter_]]">
-          </category-setting-exceptions>
+          <settings-v8-page search-term="[[searchFilter_]]">
+          </settings-v8-page>
         </settings-subpage>
       </template>
 
@@ -152,26 +135,8 @@
         <settings-subpage page-title="$i18n{siteSettingsAutomaticDownloads}"
             search-label="$i18n{siteSettingsAllSitesSearch}"
             search-term="{{searchFilter_}}">
-          <div class="content-settings-header secondary">
-              $i18n{siteSettingsAutomaticDownloadsDescription}
-          </div>
-          <settings-category-default-radio-group
-              category="[[contentSettingsTypesEnum_.AUTOMATIC_DOWNLOADS]]"
-              allow-option-label=
-                      "$i18n{siteSettingsAutomaticDownloadsAllowed}"
-              allow-option-icon="cr:file-download"
-              block-option-label
-                  ="$i18n{siteSettingsAutomaticDownloadsBlocked}"
-              block-option-icon="privacy:file-download-off">
-          </settings-category-default-radio-group>
-          <category-setting-exceptions
-              category="[[contentSettingsTypesEnum_.AUTOMATIC_DOWNLOADS]]"
-              allow-header=
-                  "$i18n{siteSettingsAutomaticDownloadsAllowedExceptions}"
-              block-header=
-                  "$i18n{siteSettingsAutomaticDownloadsBlockedExceptions}"
-              search-filter="[[searchFilter_]]">
-          </category-setting-exceptions>
+          <settings-automatic-downloads-page search-term="[[searchFilter_]]">
+          </settings-automatic-downloads-page>
         </settings-subpage>
       </template>
       <template is="dom-if" if="[[enableWebPrintingContentSetting_]]">
@@ -179,26 +144,8 @@
           <settings-subpage page-title="$i18n{siteSettingsWebPrinting}"
               search-label="$i18n{siteSettingsAllSitesSearch}"
               search-term="{{searchFilter_}}">
-            <div class="content-settings-header secondary">
-                $i18n{siteSettingsWebPrintingDescription}
-            </div>
-            <settings-category-default-radio-group
-                category="[[contentSettingsTypesEnum_.WEB_PRINTING]]"
-                allow-option-label=
-                        "$i18n{siteSettingsWebPrintingAsk}"
-                allow-option-icon="settings:printer"
-                block-option-label
-                    ="$i18n{siteSettingsWebPrintingBlock}"
-                block-option-icon="settings:printer-off">
-            </settings-category-default-radio-group>
-            <category-setting-exceptions
-                category="[[contentSettingsTypesEnum_.WEB_PRINTING]]"
-                allow-header=
-                    "$i18n{siteSettingsWebPrintingAllowedExceptions}"
-                block-header=
-                    "$i18n{siteSettingsWebPrintingBlockedExceptions}"
-                search-filter="[[searchFilter_]]">
-            </category-setting-exceptions>
+            <settings-web-printing-page search-term="[[searchFilter_]]">
+            </settings-web-printing-page>
           </settings-subpage>
         </template>
       </template>
@@ -206,27 +153,8 @@
         <settings-subpage page-title="$i18n{siteSettingsBackgroundSync}"
             search-label="$i18n{siteSettingsAllSitesSearch}"
             search-term="{{searchFilter_}}">
-          <div class="content-settings-header secondary">
-            $i18n{siteSettingsBackgroundSyncDescription}
-          </div>
-          <settings-category-default-radio-group
-              category="[[contentSettingsTypesEnum_.BACKGROUND_SYNC]]"
-              allow-option-label=
-                  "$i18n{siteSettingsBackgroundSyncAllowed}"
-              allow-option-icon="cr:sync"
-              block-option-label="$i18n{siteSettingsBackgroundSyncBlocked}"
-              block-option-sub-label=
-                  "$i18n{siteSettingsBackgroundSyncBlockedSubLabel}"
-              block-option-icon="privacy:sync-off">
-          </settings-category-default-radio-group>
-          <category-setting-exceptions
-              category="[[contentSettingsTypesEnum_.BACKGROUND_SYNC]]"
-              allow-header=
-                  "$i18n{siteSettingsBackgroundSyncAllowedExceptions}"
-              block-header=
-                  "$i18n{siteSettingsBackgroundSyncBlockedExceptions}"
-              search-filter="[[searchFilter_]]">
-          </category-setting-exceptions>
+          <settings-background-sync-page search-term="[[searchFilter_]]">
+          </settings-background-sync-page>
         </settings-subpage>
       </template>
       <template is="dom-if" route-path="/content/camera" no-search>
@@ -335,22 +263,8 @@
         <settings-subpage page-title="$i18n{siteSettingsCategoryJavascript}"
             search-label="$i18n{siteSettingsAllSitesSearch}"
             search-term="{{searchFilter_}}">
-          <div class="content-settings-header secondary">
-            $i18n{siteSettingsJavascriptDescription}
-          </div>
-          <settings-category-default-radio-group
-              category="[[contentSettingsTypesEnum_.JAVASCRIPT]]"
-              allow-option-label="$i18n{siteSettingsJavascriptAllowed}"
-              allow-option-icon="privacy:code"
-              block-option-label="$i18n{siteSettingsJavascriptBlocked}"
-              block-option-icon="privacy:code-off">
-          </settings-category-default-radio-group>
-          <category-setting-exceptions
-              category="[[contentSettingsTypesEnum_.JAVASCRIPT]]"
-              allow-header="$i18n{siteSettingsJavascriptAllowedExceptions}"
-              block-header="$i18n{siteSettingsJavascriptBlockedExceptions}"
-              search-filter="[[searchFilter_]]">
-          </category-setting-exceptions>
+          <settings-javascript-page search-term="[[searchFilter_]]">
+          </settings-javascript-page>
         </settings-subpage>
       </template>
       <template is="dom-if" route-path="/content/sound" no-search>
@@ -421,46 +335,16 @@
         <settings-subpage page-title="$i18n{siteSettingsSensors}"
             search-label="$i18n{siteSettingsAllSitesSearch}"
             search-term="{{searchFilter_}}">
-          <div class="content-settings-header secondary">
-            $i18n{siteSettingsMotionSensorsDescription}
-          </div>
-          <settings-category-default-radio-group
-              category="[[contentSettingsTypesEnum_.SENSORS]]"
-              allow-option-label="$i18n{siteSettingsMotionSensorsAllowed}"
-              allow-option-icon="privacy:sensors"
-              block-option-label="$i18n{siteSettingsMotionSensorsBlocked}"
-              block-option-sub-label=
-                  "$i18n{siteSettingsMotionSensorsBlockedSubLabel}"
-              block-option-icon="privacy:sensors-off">
-          </settings-category-default-radio-group>
-          <category-setting-exceptions
-              category="[[contentSettingsTypesEnum_.SENSORS]]" read-only-list
-              allow-header="$i18n{siteSettingsMotionSensorsAllowedExceptions}"
-              block-header="$i18n{siteSettingsMotionSensorsBlockedExceptions}"
-              search-filter="[[searchFilter_]]">
-          </category-setting-exceptions>
+          <settings-sensors-page search-term="[[searchFilter_]]">
+          </settings-sensors-page>
         </settings-subpage>
       </template>
       <template is="dom-if" route-path="/content/popups" no-search>
         <settings-subpage page-title="$i18n{siteSettingsCategoryPopups}"
             search-label="$i18n{siteSettingsAllSitesSearch}"
             search-term="{{searchFilter_}}">
-          <div class="content-settings-header secondary">
-            $i18n{siteSettingsPopupsDescription}
-          </div>
-          <settings-category-default-radio-group
-              category="[[contentSettingsTypesEnum_.POPUPS]]"
-              allow-option-label="$i18n{siteSettingsPopupsAllowed}"
-              allow-option-icon="cr:open-in-new"
-              block-option-label="$i18n{siteSettingsPopupsBlocked}"
-              block-option-icon="privacy:open-in-new-off">
-          </settings-category-default-radio-group>
-          <category-setting-exceptions
-              category="[[contentSettingsTypesEnum_.POPUPS]]"
-              allow-header="$i18n{siteSettingsPopupsAllowedExceptions}"
-              block-header="$i18n{siteSettingsPopupsBlockedExceptions}"
-              search-filter="[[searchFilter_]]">
-          </category-setting-exceptions>
+          <settings-popups-page search-term="[[searchFilter_]]">
+          </settings-popups-page>
         </settings-subpage>
       </template>
       <template is="dom-if" if="[[enableSafeBrowsingSubresourceFilter_]]"
@@ -469,23 +353,8 @@
           <settings-subpage page-title="$i18n{siteSettingsAds}"
               search-label="$i18n{siteSettingsAllSitesSearch}"
               search-term="{{searchFilter_}}">
-            <div class="content-settings-header secondary">
-              $i18n{siteSettingsAdsDescription}
-            </div>
-            <settings-category-default-radio-group
-                category="[[contentSettingsTypesEnum_.ADS]]"
-                allow-option-label="$i18n{siteSettingsAdsAllowed}"
-                allow-option-icon="privacy:web-asset"
-                block-option-label="$i18n{siteSettingsAdsBlocked}"
-                block-option-icon="privacy:web-asset-off">
-            </settings-category-default-radio-group>
-            <category-setting-exceptions
-                category="[[contentSettingsTypesEnum_.ADS]]"
-                read-only-list
-                allow-header="$i18n{siteSettingsAdsAllowedExceptions}"
-                block-header="$i18n{siteSettingsAdsBlockedExceptions}"
-                search-filter="[[searchFilter_]]">
-            </category-setting-exceptions>
+            <settings-ads-page search-term="[[searchFilter_]]">
+            </settings-ads-page>
           </settings-subpage>
        </template>
      </template>
@@ -493,24 +362,8 @@
         <settings-subpage page-title="$i18n{siteSettingsMidiDevices}"
             search-label="$i18n{siteSettingsAllSitesSearch}"
             search-term="{{searchFilter_}}">
-          <div class="content-settings-header secondary">
-            $i18n{siteSettingsMidiDescription}
-          </div>
-          <settings-category-default-radio-group
-              category="[[contentSettingsTypesEnum_.MIDI_DEVICES]]"
-              allow-option-label=
-                  "$i18n{siteSettingsMidiAllowed}"
-              allow-option-icon="privacy:piano"
-              block-option-label="$i18n{siteSettingsMidiBlocked}"
-              block-option-icon="privacy:piano-off">
-          </settings-category-default-radio-group>
-          <category-setting-exceptions
-              category="[[contentSettingsTypesEnum_.MIDI_DEVICES]]"
-              read-only-list
-              allow-header="$i18n{siteSettingsMidiAllowedExceptions}"
-              block-header="$i18n{siteSettingsMidiBlockedExceptions}"
-              search-filter="[[searchFilter_]]">
-          </category-setting-exceptions>
+          <settings-midi-devices-page search-term="[[searchFilter_]]">
+          </settings-midi-devices-page>
         </settings-subpage>
       </template>
       <template is="dom-if" route-path="/content/usbDevices" no-search>
@@ -656,22 +509,8 @@
         <settings-subpage page-title="$i18n{siteSettingsClipboard}"
             search-label="$i18n{siteSettingsAllSitesSearch}"
             search-term="{{searchFilter_}}">
-          <div class="content-settings-header secondary">
-            $i18n{siteSettingsClipboardDescription}
-          </div>
-          <settings-category-default-radio-group
-              category="[[contentSettingsTypesEnum_.CLIPBOARD]]"
-              allow-option-label="$i18n{siteSettingsClipboardAllowed}"
-              allow-option-icon="privacy:content-paste"
-              block-option-label="$i18n{siteSettingsClipboardBlocked}"
-              block-option-icon="privacy:content-paste-off">
-          </settings-category-default-radio-group>
-          <category-setting-exceptions
-              category="[[contentSettingsTypesEnum_.CLIPBOARD]]"
-              allow-header="$i18n{siteSettingsClipboardAllowedExceptions}"
-              block-header="$i18n{siteSettingsClipboardBlockedExceptions}"
-              search-filter="[[searchFilter_]]">
-          </category-setting-exceptions>
+          <settings-clipboard-page search-term="[[searchFilter_]]">
+          </settings-clipboard-page>
         </settings-subpage>
       </template>
       <template is="dom-if" if="[[enablePaymentHandlerContentSetting_]]">
@@ -679,25 +518,8 @@
           <settings-subpage page-title="$i18n{siteSettingsPaymentHandler}"
               search-label="$i18n{siteSettingsAllSitesSearch}"
               search-term="{{searchFilter_}}">
-            <div class="content-settings-header secondary">
-              $i18n{siteSettingsPaymentHandlersDescription}
-            </div>
-            <settings-category-default-radio-group
-                category="[[contentSettingsTypesEnum_.PAYMENT_HANDLER]]"
-                allow-option-label=
-                    "$i18n{siteSettingsPaymentHandlersAllowed}"
-                allow-option-icon="privacy:credit-card"
-                block-option-label="$i18n{siteSettingsPaymentHandlersBlocked}"
-                block-option-icon="privacy:credit-card-off">
-            </settings-category-default-radio-group>
-            <category-setting-exceptions
-                category="[[contentSettingsTypesEnum_.PAYMENT_HANDLER]]"
-                allow-header=
-                    "$i18n{siteSettingsPaymentHandlersAllowedExceptions}"
-                block-header=
-                    "$i18n{siteSettingsPaymentHandlersBlockedExceptions}"
-                search-filter="[[searchFilter_]]">
-            </category-setting-exceptions>
+            <settings-payment-handler-page search-term="[[searchFilter_]]">
+            </settings-payment-handler-page>
           </settings-subpage>
        </template>
       </template>
diff --git a/chrome/browser/resources/settings/site_settings/ads_page.html b/chrome/browser/resources/settings/site_settings/ads_page.html
new file mode 100644
index 0000000..d69fab3b
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/ads_page.html
@@ -0,0 +1,18 @@
+  <style include="settings-shared site-settings-shared"></style>
+  <div class="content-settings-header secondary">
+    $i18n{siteSettingsAdsDescription}
+  </div>
+  <settings-category-default-radio-group
+      category="[[contentSettingsTypesEnum_.ADS]]"
+      allow-option-label="$i18n{siteSettingsAdsAllowed}"
+      allow-option-icon="privacy:web-asset"
+      block-option-label="$i18n{siteSettingsAdsBlocked}"
+      block-option-icon="privacy:web-asset-off">
+  </settings-category-default-radio-group>
+  <category-setting-exceptions
+      category="[[contentSettingsTypesEnum_.ADS]]"
+      read-only-list
+      allow-header="$i18n{siteSettingsAdsAllowedExceptions}"
+      block-header="$i18n{siteSettingsAdsBlockedExceptions}"
+      search-filter="[[searchTerm]]">
+  </category-setting-exceptions>
diff --git a/chrome/browser/resources/settings/site_settings/ads_page.ts b/chrome/browser/resources/settings/site_settings/ads_page.ts
new file mode 100644
index 0000000..e5ec5024b
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/ads_page.ts
@@ -0,0 +1,46 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './category_setting_exceptions.js';
+import './settings_category_default_radio_group.js';
+import './site_settings_shared.css.js';
+import '../settings_shared.css.js';
+
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {ContentSettingsTypes} from '../site_settings/constants.js';
+
+import {getTemplate} from './ads_page.html.js';
+
+export class AdsPageElement extends PolymerElement {
+  static get is() {
+    return 'settings-ads-page';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      searchTerm: String,
+
+      // Expose ContentSettingsTypes enum to the HTML template.
+      contentSettingsTypesEnum_: {
+        type: Object,
+        value: ContentSettingsTypes,
+      },
+    };
+  }
+
+  declare searchTerm: string;
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'settings-ads-page': AdsPageElement;
+  }
+}
+
+customElements.define(AdsPageElement.is, AdsPageElement);
diff --git a/chrome/browser/resources/settings/site_settings/automatic_downloads_page.html b/chrome/browser/resources/settings/site_settings/automatic_downloads_page.html
new file mode 100644
index 0000000..c029df3
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/automatic_downloads_page.html
@@ -0,0 +1,17 @@
+  <style include="settings-shared site-settings-shared"></style>
+  <div class="content-settings-header secondary">
+      $i18n{siteSettingsAutomaticDownloadsDescription}
+  </div>
+  <settings-category-default-radio-group
+      category="[[contentSettingsTypesEnum_.AUTOMATIC_DOWNLOADS]]"
+      allow-option-label="$i18n{siteSettingsAutomaticDownloadsAllowed}"
+      allow-option-icon="cr:file-download"
+      block-option-label="$i18n{siteSettingsAutomaticDownloadsBlocked}"
+      block-option-icon="privacy:file-download-off">
+  </settings-category-default-radio-group>
+  <category-setting-exceptions
+      category="[[contentSettingsTypesEnum_.AUTOMATIC_DOWNLOADS]]"
+      allow-header="$i18n{siteSettingsAutomaticDownloadsAllowedExceptions}"
+      block-header="$i18n{siteSettingsAutomaticDownloadsBlockedExceptions}"
+      search-filter="[[searchFilter_]]">
+  </category-setting-exceptions>
diff --git a/chrome/browser/resources/settings/site_settings/automatic_downloads_page.ts b/chrome/browser/resources/settings/site_settings/automatic_downloads_page.ts
new file mode 100644
index 0000000..a1bc3496
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/automatic_downloads_page.ts
@@ -0,0 +1,47 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './category_setting_exceptions.js';
+import './settings_category_default_radio_group.js';
+import './site_settings_shared.css.js';
+import '../settings_shared.css.js';
+
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {ContentSettingsTypes} from '../site_settings/constants.js';
+
+import {getTemplate} from './automatic_downloads_page.html.js';
+
+export class AutomaticDownloadsPageElement extends PolymerElement {
+  static get is() {
+    return 'settings-automatic-downloads-page';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      searchTerm: String,
+
+      // Expose ContentSettingsTypes enum to the HTML template.
+      contentSettingsTypesEnum_: {
+        type: Object,
+        value: ContentSettingsTypes,
+      },
+    };
+  }
+
+  declare searchTerm: string;
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'settings-automatic-downloads-page': AutomaticDownloadsPageElement;
+  }
+}
+
+customElements.define(
+    AutomaticDownloadsPageElement.is, AutomaticDownloadsPageElement);
diff --git a/chrome/browser/resources/settings/site_settings/background_sync_page.html b/chrome/browser/resources/settings/site_settings/background_sync_page.html
new file mode 100644
index 0000000..98c8714c
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/background_sync_page.html
@@ -0,0 +1,18 @@
+  <style include="settings-shared site-settings-shared"></style>
+  <div class="content-settings-header secondary">
+    $i18n{siteSettingsBackgroundSyncDescription}
+  </div>
+  <settings-category-default-radio-group
+      category="[[contentSettingsTypesEnum_.BACKGROUND_SYNC]]"
+      allow-option-label="$i18n{siteSettingsBackgroundSyncAllowed}"
+      allow-option-icon="cr:sync"
+      block-option-label="$i18n{siteSettingsBackgroundSyncBlocked}"
+      block-option-sub-label="$i18n{siteSettingsBackgroundSyncBlockedSubLabel}"
+      block-option-icon="privacy:sync-off">
+  </settings-category-default-radio-group>
+  <category-setting-exceptions
+      category="[[contentSettingsTypesEnum_.BACKGROUND_SYNC]]"
+      allow-header="$i18n{siteSettingsBackgroundSyncAllowedExceptions}"
+      block-header="$i18n{siteSettingsBackgroundSyncBlockedExceptions}"
+      search-filter="[[searchFilter_]]">
+  </category-setting-exceptions>
diff --git a/chrome/browser/resources/settings/site_settings/background_sync_page.ts b/chrome/browser/resources/settings/site_settings/background_sync_page.ts
new file mode 100644
index 0000000..951d2ae0
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/background_sync_page.ts
@@ -0,0 +1,46 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './category_setting_exceptions.js';
+import './settings_category_default_radio_group.js';
+import './site_settings_shared.css.js';
+import '../settings_shared.css.js';
+
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {ContentSettingsTypes} from '../site_settings/constants.js';
+
+import {getTemplate} from './background_sync_page.html.js';
+
+export class BackgroundSyncPageElement extends PolymerElement {
+  static get is() {
+    return 'settings-background-sync-page';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      searchTerm: String,
+
+      // Expose ContentSettingsTypes enum to the HTML template.
+      contentSettingsTypesEnum_: {
+        type: Object,
+        value: ContentSettingsTypes,
+      },
+    };
+  }
+
+  declare searchTerm: string;
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'settings-background-sync-page': BackgroundSyncPageElement;
+  }
+}
+
+customElements.define(BackgroundSyncPageElement.is, BackgroundSyncPageElement);
diff --git a/chrome/browser/resources/settings/site_settings/clipboard_page.html b/chrome/browser/resources/settings/site_settings/clipboard_page.html
new file mode 100644
index 0000000..d0b2978
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/clipboard_page.html
@@ -0,0 +1,17 @@
+  <style include="settings-shared site-settings-shared"></style>
+  <div class="content-settings-header secondary">
+    $i18n{siteSettingsClipboardDescription}
+  </div>
+  <settings-category-default-radio-group
+      category="[[contentSettingsTypesEnum_.CLIPBOARD]]"
+      allow-option-label="$i18n{siteSettingsClipboardAllowed}"
+      allow-option-icon="privacy:content-paste"
+      block-option-label="$i18n{siteSettingsClipboardBlocked}"
+      block-option-icon="privacy:content-paste-off">
+  </settings-category-default-radio-group>
+  <category-setting-exceptions
+      category="[[contentSettingsTypesEnum_.CLIPBOARD]]"
+      allow-header="$i18n{siteSettingsClipboardAllowedExceptions}"
+      block-header="$i18n{siteSettingsClipboardBlockedExceptions}"
+      search-filter="[[searchTerm]]">
+  </category-setting-exceptions>
diff --git a/chrome/browser/resources/settings/site_settings/clipboard_page.ts b/chrome/browser/resources/settings/site_settings/clipboard_page.ts
new file mode 100644
index 0000000..b58b6ae
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/clipboard_page.ts
@@ -0,0 +1,46 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './category_setting_exceptions.js';
+import './settings_category_default_radio_group.js';
+import './site_settings_shared.css.js';
+import '../settings_shared.css.js';
+
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {ContentSettingsTypes} from '../site_settings/constants.js';
+
+import {getTemplate} from './clipboard_page.html.js';
+
+export class ClipboardPageElement extends PolymerElement {
+  static get is() {
+    return 'settings-clipboard-page';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      searchTerm: String,
+
+      // Expose ContentSettingsTypes enum to the HTML template.
+      contentSettingsTypesEnum_: {
+        type: Object,
+        value: ContentSettingsTypes,
+      },
+    };
+  }
+
+  declare searchTerm: string;
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'settings-clipboard-page': ClipboardPageElement;
+  }
+}
+
+customElements.define(ClipboardPageElement.is, ClipboardPageElement);
diff --git a/chrome/browser/resources/settings/site_settings/javascript_page.html b/chrome/browser/resources/settings/site_settings/javascript_page.html
new file mode 100644
index 0000000..3b56e54
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/javascript_page.html
@@ -0,0 +1,17 @@
+  <style include="settings-shared site-settings-shared"></style>
+  <div class="content-settings-header secondary">
+    $i18n{siteSettingsJavascriptDescription}
+  </div>
+  <settings-category-default-radio-group
+      category="[[contentSettingsTypesEnum_.JAVASCRIPT]]"
+      allow-option-label="$i18n{siteSettingsJavascriptAllowed}"
+      allow-option-icon="privacy:code"
+      block-option-label="$i18n{siteSettingsJavascriptBlocked}"
+      block-option-icon="privacy:code-off">
+  </settings-category-default-radio-group>
+  <category-setting-exceptions
+      category="[[contentSettingsTypesEnum_.JAVASCRIPT]]"
+      allow-header="$i18n{siteSettingsJavascriptAllowedExceptions}"
+      block-header="$i18n{siteSettingsJavascriptBlockedExceptions}"
+      search-filter="[[searchTerm]]">
+  </category-setting-exceptions>
diff --git a/chrome/browser/resources/settings/site_settings/javascript_page.ts b/chrome/browser/resources/settings/site_settings/javascript_page.ts
new file mode 100644
index 0000000..45bd7d6
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/javascript_page.ts
@@ -0,0 +1,46 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './category_setting_exceptions.js';
+import './settings_category_default_radio_group.js';
+import './site_settings_shared.css.js';
+import '../settings_shared.css.js';
+
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {ContentSettingsTypes} from '../site_settings/constants.js';
+
+import {getTemplate} from './javascript_page.html.js';
+
+export class JavascriptPageElement extends PolymerElement {
+  static get is() {
+    return 'settings-javascript-page';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      searchTerm: String,
+
+      // Expose ContentSettingsTypes enum to the HTML template.
+      contentSettingsTypesEnum_: {
+        type: Object,
+        value: ContentSettingsTypes,
+      },
+    };
+  }
+
+  declare searchTerm: string;
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'settings-javascript-page': JavascriptPageElement;
+  }
+}
+
+customElements.define(JavascriptPageElement.is, JavascriptPageElement);
diff --git a/chrome/browser/resources/settings/site_settings/midi_devices_page.html b/chrome/browser/resources/settings/site_settings/midi_devices_page.html
new file mode 100644
index 0000000..c45e3e8
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/midi_devices_page.html
@@ -0,0 +1,19 @@
+  <style include="settings-shared site-settings-shared"></style>
+  <div class="content-settings-header secondary">
+    $i18n{siteSettingsMidiDescription}
+  </div>
+  <settings-category-default-radio-group
+      category="[[contentSettingsTypesEnum_.MIDI_DEVICES]]"
+      allow-option-label=
+          "$i18n{siteSettingsMidiAllowed}"
+      allow-option-icon="privacy:piano"
+      block-option-label="$i18n{siteSettingsMidiBlocked}"
+      block-option-icon="privacy:piano-off">
+  </settings-category-default-radio-group>
+  <category-setting-exceptions
+      category="[[contentSettingsTypesEnum_.MIDI_DEVICES]]"
+      read-only-list
+      allow-header="$i18n{siteSettingsMidiAllowedExceptions}"
+      block-header="$i18n{siteSettingsMidiBlockedExceptions}"
+      search-filter="[[searchTerm]]">
+  </category-setting-exceptions>
diff --git a/chrome/browser/resources/settings/site_settings/midi_devices_page.ts b/chrome/browser/resources/settings/site_settings/midi_devices_page.ts
new file mode 100644
index 0000000..0edd45e
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/midi_devices_page.ts
@@ -0,0 +1,46 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './category_setting_exceptions.js';
+import './settings_category_default_radio_group.js';
+import './site_settings_shared.css.js';
+import '../settings_shared.css.js';
+
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {ContentSettingsTypes} from '../site_settings/constants.js';
+
+import {getTemplate} from './midi_devices_page.html.js';
+
+export class MidiDevicesPageElement extends PolymerElement {
+  static get is() {
+    return 'settings-midi-devices-page';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      searchTerm: String,
+
+      // Expose ContentSettingsTypes enum to the HTML template.
+      contentSettingsTypesEnum_: {
+        type: Object,
+        value: ContentSettingsTypes,
+      },
+    };
+  }
+
+  declare searchTerm: string;
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'settings-midi-devices-page': MidiDevicesPageElement;
+  }
+}
+
+customElements.define(MidiDevicesPageElement.is, MidiDevicesPageElement);
diff --git a/chrome/browser/resources/settings/site_settings/payment_handler_page.html b/chrome/browser/resources/settings/site_settings/payment_handler_page.html
new file mode 100644
index 0000000..e6aedab
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/payment_handler_page.html
@@ -0,0 +1,20 @@
+  <style include="settings-shared site-settings-shared"></style>
+  <div class="content-settings-header secondary">
+    $i18n{siteSettingsPaymentHandlersDescription}
+  </div>
+  <settings-category-default-radio-group
+      category="[[contentSettingsTypesEnum_.PAYMENT_HANDLER]]"
+      allow-option-label=
+          "$i18n{siteSettingsPaymentHandlersAllowed}"
+      allow-option-icon="privacy:credit-card"
+      block-option-label="$i18n{siteSettingsPaymentHandlersBlocked}"
+      block-option-icon="privacy:credit-card-off">
+  </settings-category-default-radio-group>
+  <category-setting-exceptions
+      category="[[contentSettingsTypesEnum_.PAYMENT_HANDLER]]"
+      allow-header=
+          "$i18n{siteSettingsPaymentHandlersAllowedExceptions}"
+      block-header=
+          "$i18n{siteSettingsPaymentHandlersBlockedExceptions}"
+      search-filter="[[searchTerm]]">
+  </category-setting-exceptions>
diff --git a/chrome/browser/resources/settings/site_settings/payment_handler_page.ts b/chrome/browser/resources/settings/site_settings/payment_handler_page.ts
new file mode 100644
index 0000000..edf7d10
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/payment_handler_page.ts
@@ -0,0 +1,46 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './category_setting_exceptions.js';
+import './settings_category_default_radio_group.js';
+import './site_settings_shared.css.js';
+import '../settings_shared.css.js';
+
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {ContentSettingsTypes} from '../site_settings/constants.js';
+
+import {getTemplate} from './payment_handler_page.html.js';
+
+export class PaymentHandlerPageElement extends PolymerElement {
+  static get is() {
+    return 'settings-payment-handler-page';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      searchTerm: String,
+
+      // Expose ContentSettingsTypes enum to the HTML template.
+      contentSettingsTypesEnum_: {
+        type: Object,
+        value: ContentSettingsTypes,
+      },
+    };
+  }
+
+  declare searchTerm: string;
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'settings-payment-handler-page': PaymentHandlerPageElement;
+  }
+}
+
+customElements.define(PaymentHandlerPageElement.is, PaymentHandlerPageElement);
diff --git a/chrome/browser/resources/settings/site_settings/popups_page.html b/chrome/browser/resources/settings/site_settings/popups_page.html
new file mode 100644
index 0000000..18f2c083
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/popups_page.html
@@ -0,0 +1,17 @@
+  <style include="settings-shared site-settings-shared"></style>
+  <div class="content-settings-header secondary">
+    $i18n{siteSettingsPopupsDescription}
+  </div>
+  <settings-category-default-radio-group
+      category="[[contentSettingsTypesEnum_.POPUPS]]"
+      allow-option-label="$i18n{siteSettingsPopupsAllowed}"
+      allow-option-icon="cr:open-in-new"
+      block-option-label="$i18n{siteSettingsPopupsBlocked}"
+      block-option-icon="privacy:open-in-new-off">
+  </settings-category-default-radio-group>
+  <category-setting-exceptions
+      category="[[contentSettingsTypesEnum_.POPUPS]]"
+      allow-header="$i18n{siteSettingsPopupsAllowedExceptions}"
+      block-header="$i18n{siteSettingsPopupsBlockedExceptions}"
+      search-filter="[[searchTerm]]">
+  </category-setting-exceptions>
diff --git a/chrome/browser/resources/settings/site_settings/popups_page.ts b/chrome/browser/resources/settings/site_settings/popups_page.ts
new file mode 100644
index 0000000..9a2fee68
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/popups_page.ts
@@ -0,0 +1,46 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './category_setting_exceptions.js';
+import './settings_category_default_radio_group.js';
+import './site_settings_shared.css.js';
+import '../settings_shared.css.js';
+
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {ContentSettingsTypes} from '../site_settings/constants.js';
+
+import {getTemplate} from './popups_page.html.js';
+
+export class PopupsPageElement extends PolymerElement {
+  static get is() {
+    return 'settings-popups-page';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      searchTerm: String,
+
+      // Expose ContentSettingsTypes enum to the HTML template.
+      contentSettingsTypesEnum_: {
+        type: Object,
+        value: ContentSettingsTypes,
+      },
+    };
+  }
+
+  declare searchTerm: string;
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'settings-popups-page': PopupsPageElement;
+  }
+}
+
+customElements.define(PopupsPageElement.is, PopupsPageElement);
diff --git a/chrome/browser/resources/settings/site_settings/sensors_page.html b/chrome/browser/resources/settings/site_settings/sensors_page.html
new file mode 100644
index 0000000..7825b45
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/sensors_page.html
@@ -0,0 +1,19 @@
+  <style include="settings-shared site-settings-shared"></style>
+  <div class="content-settings-header secondary">
+    $i18n{siteSettingsMotionSensorsDescription}
+  </div>
+  <settings-category-default-radio-group
+      category="[[contentSettingsTypesEnum_.SENSORS]]"
+      allow-option-label="$i18n{siteSettingsMotionSensorsAllowed}"
+      allow-option-icon="privacy:sensors"
+      block-option-label="$i18n{siteSettingsMotionSensorsBlocked}"
+      block-option-sub-label=
+          "$i18n{siteSettingsMotionSensorsBlockedSubLabel}"
+      block-option-icon="privacy:sensors-off">
+  </settings-category-default-radio-group>
+  <category-setting-exceptions
+      category="[[contentSettingsTypesEnum_.SENSORS]]" read-only-list
+      allow-header="$i18n{siteSettingsMotionSensorsAllowedExceptions}"
+      block-header="$i18n{siteSettingsMotionSensorsBlockedExceptions}"
+      search-filter="[[searchTerm]]">
+  </category-setting-exceptions>
diff --git a/chrome/browser/resources/settings/site_settings/sensors_page.ts b/chrome/browser/resources/settings/site_settings/sensors_page.ts
new file mode 100644
index 0000000..6c52358
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/sensors_page.ts
@@ -0,0 +1,46 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './category_setting_exceptions.js';
+import './settings_category_default_radio_group.js';
+import './site_settings_shared.css.js';
+import '../settings_shared.css.js';
+
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {ContentSettingsTypes} from '../site_settings/constants.js';
+
+import {getTemplate} from './sensors_page.html.js';
+
+export class SensorsPageElement extends PolymerElement {
+  static get is() {
+    return 'settings-sensors-page';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      searchTerm: String,
+
+      // Expose ContentSettingsTypes enum to the HTML template.
+      contentSettingsTypesEnum_: {
+        type: Object,
+        value: ContentSettingsTypes,
+      },
+    };
+  }
+
+  declare searchTerm: string;
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'settings-sensors-page': SensorsPageElement;
+  }
+}
+
+customElements.define(SensorsPageElement.is, SensorsPageElement);
diff --git a/chrome/browser/resources/settings/site_settings/v8_page.html b/chrome/browser/resources/settings/site_settings/v8_page.html
new file mode 100644
index 0000000..4fe6a86
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/v8_page.html
@@ -0,0 +1,19 @@
+  <style include="settings-shared site-settings-shared"></style>
+  <div class="content-settings-header secondary">
+    $i18n{siteSettingsJavascriptOptimizerDescription}
+  </div>
+  <settings-category-default-radio-group
+      category="[[contentSettingsTypesEnum_.JAVASCRIPT_OPTIMIZER]]"
+      allow-option-label="$i18n{siteSettingsJavascriptOptimizerAllowed}"
+      allow-option-sub-label=
+          "$i18n{siteSettingsJavascriptOptimizerAllowedSubLabel}"
+      block-option-label="$i18n{siteSettingsJavascriptOptimizerBlocked}"
+      block-option-sub-label=
+          "$i18n{siteSettingsJavascriptOptimizerBlockedSubLabel}">
+  </settings-category-default-radio-group>
+  <category-setting-exceptions
+      category="[[contentSettingsTypesEnum_.JAVASCRIPT_OPTIMIZER]]"
+      allow-header="$i18n{siteSettingsJavascriptOptimizerAllowedExceptions}"
+      block-header="$i18n{siteSettingsJavascriptOptimizerBlockedExceptions}"
+      search-filter="[[searchFilter_]]">
+  </category-setting-exceptions>
diff --git a/chrome/browser/resources/settings/site_settings/v8_page.ts b/chrome/browser/resources/settings/site_settings/v8_page.ts
new file mode 100644
index 0000000..837cf72
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/v8_page.ts
@@ -0,0 +1,46 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './category_setting_exceptions.js';
+import './settings_category_default_radio_group.js';
+import './site_settings_shared.css.js';
+import '../settings_shared.css.js';
+
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {ContentSettingsTypes} from '../site_settings/constants.js';
+
+import {getTemplate} from './v8_page.html.js';
+
+export class V8PageElement extends PolymerElement {
+  static get is() {
+    return 'settings-v8-page';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      searchTerm: String,
+
+      // Expose ContentSettingsTypes enum to the HTML template.
+      contentSettingsTypesEnum_: {
+        type: Object,
+        value: ContentSettingsTypes,
+      },
+    };
+  }
+
+  declare searchTerm: string;
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'settings-v8-page': V8PageElement;
+  }
+}
+
+customElements.define(V8PageElement.is, V8PageElement);
diff --git a/chrome/browser/resources/settings/site_settings/web_printing_page.html b/chrome/browser/resources/settings/site_settings/web_printing_page.html
new file mode 100644
index 0000000..0d12f3b
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/web_printing_page.html
@@ -0,0 +1,17 @@
+  <style include="settings-shared site-settings-shared"></style>
+  <div class="content-settings-header secondary">
+      $i18n{siteSettingsWebPrintingDescription}
+  </div>
+  <settings-category-default-radio-group
+      category="[[contentSettingsTypesEnum_.WEB_PRINTING]]"
+      allow-option-label="$i18n{siteSettingsWebPrintingAsk}"
+      allow-option-icon="settings:printer"
+      block-option-label="$i18n{siteSettingsWebPrintingBlock}"
+      block-option-icon="settings:printer-off">
+  </settings-category-default-radio-group>
+  <category-setting-exceptions
+      category="[[contentSettingsTypesEnum_.WEB_PRINTING]]"
+      allow-header="$i18n{siteSettingsWebPrintingAllowedExceptions}"
+      block-header="$i18n{siteSettingsWebPrintingBlockedExceptions}"
+      search-filter="[[searchFilter_]]">
+  </category-setting-exceptions>
diff --git a/chrome/browser/resources/settings/site_settings/web_printing_page.ts b/chrome/browser/resources/settings/site_settings/web_printing_page.ts
new file mode 100644
index 0000000..c44a75b
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings/web_printing_page.ts
@@ -0,0 +1,46 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './category_setting_exceptions.js';
+import './settings_category_default_radio_group.js';
+import './site_settings_shared.css.js';
+import '../settings_shared.css.js';
+
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {ContentSettingsTypes} from '../site_settings/constants.js';
+
+import {getTemplate} from './web_printing_page.html.js';
+
+export class WebPrintingPageElement extends PolymerElement {
+  static get is() {
+    return 'settings-web-printing-page';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      searchTerm: String,
+
+      // Expose ContentSettingsTypes enum to the HTML template.
+      contentSettingsTypesEnum_: {
+        type: Object,
+        value: ContentSettingsTypes,
+      },
+    };
+  }
+
+  declare searchTerm: string;
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'settings-web-printing-page': WebPrintingPageElement;
+  }
+}
+
+customElements.define(WebPrintingPageElement.is, WebPrintingPageElement);
diff --git a/chrome/browser/send_tab_to_self/send_tab_to_self_client_service_factory.cc b/chrome/browser/send_tab_to_self/send_tab_to_self_client_service_factory.cc
index aa9fe46..7399e6f4 100644
--- a/chrome/browser/send_tab_to_self/send_tab_to_self_client_service_factory.cc
+++ b/chrome/browser/send_tab_to_self/send_tab_to_self_client_service_factory.cc
@@ -61,7 +61,7 @@
 SendTabToSelfClientServiceFactory::~SendTabToSelfClientServiceFactory() =
     default;
 
-// BrowserStateKeyedServiceFactory implementation.
+// BrowserContextKeyedServiceFactory implementation.
 std::unique_ptr<KeyedService>
 SendTabToSelfClientServiceFactory::BuildServiceInstanceForBrowserContext(
     content::BrowserContext* context) const {
diff --git a/chrome/browser/send_tab_to_self/send_tab_to_self_client_service_factory.h b/chrome/browser/send_tab_to_self/send_tab_to_self_client_service_factory.h
index ba99e61..cb73029e 100644
--- a/chrome/browser/send_tab_to_self/send_tab_to_self_client_service_factory.h
+++ b/chrome/browser/send_tab_to_self/send_tab_to_self_client_service_factory.h
@@ -36,7 +36,7 @@
   SendTabToSelfClientServiceFactory();
   ~SendTabToSelfClientServiceFactory() override;
 
-  // BrowserStateKeyedServiceFactory implementation.
+  // BrowserContextKeyedServiceFactory implementation.
   std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext(
       content::BrowserContext* context) const override;
 
diff --git a/chrome/browser/signin/accounts_policy_manager.cc b/chrome/browser/signin/accounts_policy_manager.cc
index 7e02b18..0dd5f60 100644
--- a/chrome/browser/signin/accounts_policy_manager.cc
+++ b/chrome/browser/signin/accounts_policy_manager.cc
@@ -27,6 +27,8 @@
 #include "chrome/browser/ui/simple_message_box.h"
 #include "chrome/browser/ui/startup/startup_types.h"
 #include "chrome/browser/ui/webui/profile_helper.h"
+#include "chrome/browser/ui/webui/signin/signin_ui_error.h"
+#include "chrome/browser/ui/webui/signin/signin_utils_desktop.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/policy/core/common/features.h"
 #include "components/prefs/pref_service.h"
@@ -37,6 +39,7 @@
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/signin/public/identity_manager/identity_utils.h"
 #include "components/signin/public/identity_manager/primary_account_mutator.h"
+#include "components/sync/base/features.h"
 #include "google_apis/gaia/gaia_auth_util.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -234,16 +237,20 @@
 void AccountsPolicyManager::EnsurePrimaryAccountAllowedForProfile(
     Profile* profile,
     signin_metrics::ProfileSignout clear_primary_account_source) {
+  signin::ConsentLevel consent_level =
+      base::FeatureList::IsEnabled(syncer::kReplaceSyncPromosWithSignInPromos)
+          ? signin::ConsentLevel::kSignin
+          : signin::ConsentLevel::kSync;
   auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
-  if (!identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync)) {
+  if (!identity_manager->HasPrimaryAccount(consent_level)) {
     return;
   }
 
   CoreAccountInfo primary_account =
-      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSync);
-  if (profile->GetPrefs()->GetBoolean(prefs::kSigninAllowed) &&
-      signin::IsUsernameAllowedByPatternFromPrefs(
-          g_browser_process->local_state(), primary_account.email)) {
+      identity_manager->GetPrimaryAccountInfo(consent_level);
+  if (CanOfferSignin(profile, primary_account.gaia, primary_account.email,
+                     /*allow_account_from_other_profile=*/true)
+          .IsOk()) {
     return;
   }
 
diff --git a/chrome/browser/signin/bound_session_credentials/bound_session_cookie_refresh_service.h b/chrome/browser/signin/bound_session_credentials/bound_session_cookie_refresh_service.h
index 88cbc15..555e231a 100644
--- a/chrome/browser/signin/bound_session_credentials/bound_session_cookie_refresh_service.h
+++ b/chrome/browser/signin/bound_session_credentials/bound_session_cookie_refresh_service.h
@@ -100,6 +100,7 @@
  private:
   friend class RendererUpdater;
   friend class BoundSessionCookieRefreshServiceImplBrowserTest;
+  friend class BoundSessionOAuthMultiloginTest;
 
   // `RendererUpdater` class that is responsible for pushing updates to all
   // renderers calls this setter to subscribe for bound session throttler params
diff --git a/chrome/browser/signin/bound_session_oauth_multilogin_browsertest.cc b/chrome/browser/signin/bound_session_oauth_multilogin_browsertest.cc
new file mode 100644
index 0000000..182b62c
--- /dev/null
+++ b/chrome/browser/signin/bound_session_oauth_multilogin_browsertest.cc
@@ -0,0 +1,188 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <memory>
+
+#include "base/check_deref.h"
+#include "base/test/bind.h"
+#include "base/test/test_future.h"
+#include "chrome/browser/signin/bound_session_credentials/bound_session_cookie_refresh_service.h"
+#include "chrome/browser/signin/bound_session_credentials/bound_session_cookie_refresh_service_factory.h"
+#include "chrome/browser/signin/bound_session_credentials/unexportable_key_service_factory.h"
+#include "chrome/browser/signin/identity_manager_factory.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/test/base/fake_gaia_mixin.h"
+#include "components/signin/public/base/session_binding_test_utils.h"
+#include "components/signin/public/base/signin_switches.h"
+#include "components/signin/public/identity_manager/identity_manager.h"
+#include "components/signin/public/identity_manager/identity_test_utils.h"
+#include "components/signin/public/identity_manager/test_identity_manager_observer.h"
+#include "components/unexportable_keys/unexportable_key_service.h"
+#include "content/public/test/browser_test.h"
+#include "crypto/scoped_fake_unexportable_key_provider.h"
+#include "google_apis/gaia/bound_oauth_token.pb.h"
+#include "services/network/public/cpp/network_switches.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::AllOf;
+using ::testing::Contains;
+using ::testing::IsEmpty;
+using ::testing::Pair;
+using ::testing::SizeIs;
+
+constexpr crypto::SignatureVerifier::SignatureAlgorithm
+    kAcceptableAlgorithms[] = {crypto::SignatureVerifier::ECDSA_SHA256};
+constexpr unexportable_keys::BackgroundTaskPriority kTaskPriority =
+    unexportable_keys::BackgroundTaskPriority::kUserBlocking;
+
+class BoundSessionOAuthMultiloginTest : public MixinBasedInProcessBrowserTest {
+ public:
+  BoundSessionOAuthMultiloginTest() {
+    feature_list_.InitWithFeatures(
+        /*enabled_features=*/{switches::kEnableBoundSessionCredentials,
+                              switches::kEnableChromeRefreshTokenBinding,
+                              switches::kEnableOAuthMultiloginCookiesBinding},
+        /*disabled_features=*/{});
+  }
+
+  ~BoundSessionOAuthMultiloginTest() override = default;
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    MixinBasedInProcessBrowserTest::SetUpCommandLine(command_line);
+    // This is needed to properly resolve `accounts.google.com` to fake Gaia
+    // server.
+    command_line->AppendSwitchASCII(
+        network::switches::kHostResolverRules,
+        "MAP accounts.google.com " +
+            fake_gaia_mixin().gaia_server()->host_port_pair().ToString());
+  }
+
+  void SetUpOnMainThread() override {
+    fake_gaia_mixin().set_initialize_configuration(false);
+    MixinBasedInProcessBrowserTest::SetUpOnMainThread();
+  }
+
+ protected:
+  unexportable_keys::UnexportableKeyService& unexportable_key_service() {
+    return CHECK_DEREF(
+        UnexportableKeyServiceFactory::GetForProfile(browser()->profile()));
+  }
+
+  FakeGaia& fake_gaia() { return CHECK_DEREF(fake_gaia_.fake_gaia()); }
+
+  FakeGaiaMixin& fake_gaia_mixin() { return fake_gaia_; }
+
+  signin::IdentityManager& identity_manager() {
+    return CHECK_DEREF(
+        IdentityManagerFactory::GetForProfile(browser()->profile()));
+  }
+
+  BoundSessionCookieRefreshService& bound_session_cookie_refresh_service() {
+    return CHECK_DEREF(BoundSessionCookieRefreshServiceFactory::GetForProfile(
+        browser()->profile()));
+  }
+
+  unexportable_keys::UnexportableKeyId GenerateNewKey() {
+    base::test::TestFuture<
+        unexportable_keys::ServiceErrorOr<unexportable_keys::UnexportableKeyId>>
+        future;
+    unexportable_key_service().GenerateSigningKeySlowlyAsync(
+        kAcceptableAlgorithms, kTaskPriority, future.GetCallback());
+    const unexportable_keys::ServiceErrorOr<
+        unexportable_keys::UnexportableKeyId>
+        key_id = future.Get();
+    CHECK(key_id.has_value());
+    return *key_id;
+  }
+
+  std::vector<uint8_t> GetWrappedKey(
+      unexportable_keys::UnexportableKeyId key_id) {
+    const unexportable_keys::ServiceErrorOr<std::vector<uint8_t>> wrapped_key =
+        unexportable_key_service().GetWrappedKey(key_id);
+    CHECK(wrapped_key.has_value());
+    return *wrapped_key;
+  }
+
+  void SetBoundSessionParamsUpdatedCallback(base::RepeatingClosure callback) {
+    bound_session_cookie_refresh_service()
+        .SetBoundSessionParamsUpdatedCallbackForTesting(std::move(callback));
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+
+  crypto::ScopedFakeUnexportableKeyProvider scoped_key_provider_;
+  FakeGaiaMixin fake_gaia_{&mixin_host_};
+};
+
+IN_PROC_BROWSER_TEST_F(BoundSessionOAuthMultiloginTest, StartsNewBoundSession) {
+  const unexportable_keys::UnexportableKeyId key_id = GenerateNewKey();
+  const std::vector<uint8_t> wrapped_key = GetWrappedKey(key_id);
+  signin::MakeAccountAvailable(
+      &identity_manager(),
+      signin::AccountAvailabilityOptionsBuilder()
+          .AsPrimary(signin::ConsentLevel::kSignin)
+          .WithGaiaId(FakeGaiaMixin::kFakeUserGaiaId)
+          .WithRefreshToken(FakeGaiaMixin::kFakeRefreshToken)
+          .WithRefreshTokenBindingKey(wrapped_key)
+          .Build(FakeGaiaMixin::kFakeUserEmail));
+
+  ASSERT_TRUE(
+      identity_manager().HasPrimaryAccount(signin::ConsentLevel::kSignin));
+  ASSERT_EQ(identity_manager().GetWrappedBindingKey(), wrapped_key);
+  ASSERT_THAT(
+      bound_session_cookie_refresh_service().GetBoundSessionThrottlerParams(),
+      IsEmpty());
+
+  // This makes sure that eventually OAML will return bound cookies, at the same
+  // time `/ListAccounts` WON'T return primary account triggering OAML - it
+  // simulates similar scenario to cookies being cleared.
+  fake_gaia_mixin().SetupFakeGaiaForLoginWithDefaults();
+  FakeGaia::Configuration config;
+  config.session_sid_cookie = "fake_sid";
+  config.session_lsid_cookie = "fake_lsid";
+  config.session_1p_sidts_cookie = "fake_1p_sidts";
+  config.session_3p_sidts_cookie = "fake_3p_sidts";
+  fake_gaia().SetConfiguration(config);
+
+  base::RunLoop run_loop;
+  SetBoundSessionParamsUpdatedCallback(run_loop.QuitClosure());
+
+  // Enforce initial `/ListAccounts`.
+  signin::SetFreshnessOfAccountsInGaiaCookie(&identity_manager(),
+                                             /*accounts_are_fresh=*/false);
+
+  run_loop.Run();
+
+  base::queue<FakeGaia::MultiloginCall> multilogin_calls =
+      fake_gaia().GetAndResetMultiloginCalls();
+
+  ASSERT_THAT(multilogin_calls, SizeIs(2));
+
+  const auto& first_call = multilogin_calls.front();
+  // OAML first returns the challenge to sign.
+  ASSERT_EQ(first_call.action,
+            FakeGaia::MultiloginCall::Action::kReturnBindingChallenge);
+  multilogin_calls.pop();
+
+  // After the challenge is received and signed, OAML returns the bound cookies.
+  const auto& second_call = multilogin_calls.front();
+  ASSERT_EQ(second_call.action,
+            FakeGaia::MultiloginCall::Action::kReturnBoundCookies);
+
+  // Verify that the challenge was signed correctly.
+  const std::optional<gaia::MultiOAuthHeader> header = second_call.header;
+  ASSERT_TRUE(header.has_value());
+  ASSERT_THAT(header->account_requests(), SizeIs(1));
+  EXPECT_TRUE(signin::VerifyJwtSignature(
+      header->account_requests().at(0).token_binding_assertion(),
+      *unexportable_key_service().GetAlgorithm(key_id),
+      *unexportable_key_service().GetSubjectPublicKeyInfo(key_id)));
+
+  // Verify that the new bound session started.
+  EXPECT_THAT(
+      bound_session_cookie_refresh_service().GetBoundSessionThrottlerParams(),
+      SizeIs(1));
+}
diff --git a/chrome/browser/signin/signin_promo_util.cc b/chrome/browser/signin/signin_promo_util.cc
index 3ccd46d..d63b9b8 100644
--- a/chrome/browser/signin/signin_promo_util.cc
+++ b/chrome/browser/signin/signin_promo_util.cc
@@ -9,6 +9,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/signin/signin_promo.h"
+#include "chrome/browser/ui/webui/signin/signin_ui_error.h"
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "components/signin/public/base/consent_level.h"
@@ -24,6 +25,7 @@
 
 #if !BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/sync/sync_service_factory.h"
+#include "chrome/browser/ui/webui/signin/signin_utils_desktop.h"
 #include "components/sync/service/sync_prefs.h"
 #endif  // !BUILDFLAG(IS_ANDROID)
 
@@ -120,6 +122,10 @@
 // `ShouldShowAddressSignInPromo` and `ShouldShowPasswordSignInPromo`).
 // `profile` is the profile of the tab the promo would be shown on.
 bool ShouldShowSignInPromoCommon(Profile& profile, SignInPromoType type) {
+  if (profile.IsOffTheRecord()) {
+    return false;
+  }
+
   // Don't show the promo if it does not pass the sync base checks.
   if (!signin::ShouldShowSyncPromo(profile)) {
     return false;
@@ -133,7 +139,6 @@
   if (!sync_service) {
     return false;
   }
-  CHECK(!profile.IsOffTheRecord());
 
   syncer::DataType data_type = GetDataTypeFromSignInPromoType(type);
 
@@ -192,13 +197,19 @@
     return false;
   }
 
-  // Don't show if sign in is not allowed.
-  if (!original_profile->GetPrefs()->GetBoolean(prefs::kSigninAllowed)) {
-    return false;
-  }
-
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(original_profile);
+  AccountInfo promo_account =
+      profile.IsOffTheRecord()
+          ? AccountInfo()  // Incognito profiles do not personalize promos.
+          : signin_ui_util::GetSingleAccountForPromos(identity_manager);
+
+  // Don't show if sign in can't be offered (ex: signin disallowed).
+  if (!CanOfferSignin(original_profile, promo_account.gaia, promo_account.email,
+                      /*allow_account_from_other_profile=*/true)
+           .IsOk()) {
+    return false;
+  }
 
   // No promo if the user is already syncing.
   if (identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync)) {
diff --git a/chrome/browser/themes/theme_local_data_batch_uploader.cc b/chrome/browser/themes/theme_local_data_batch_uploader.cc
index ce20d6d..3a391ad 100644
--- a/chrome/browser/themes/theme_local_data_batch_uploader.cc
+++ b/chrome/browser/themes/theme_local_data_batch_uploader.cc
@@ -49,6 +49,19 @@
   }
   return l10n_util::GetStringUTF8(IDS_NTP_CUSTOMIZE_COLOR_PICKER_LABEL);
 }
+
+bool ShouldOfferBatchUpload(sync_pb::ThemeSpecifics specifics) {
+  // Do not offer batch upload for themes with only browser color scheme or
+  // only a user color theme. This is a good-enough trade-off to avoid showing
+  // batch upload dialog for auto-assigned theme upon new profile creation.
+  if (specifics.has_user_color_theme()) {
+    specifics.clear_user_color_theme();
+  } else {
+    specifics.clear_browser_color_scheme();
+  }
+  return ThemeSyncableService::HasNonDefaultTheme(specifics);
+}
+
 }  // namespace
 
 // static
@@ -110,11 +123,5 @@
   if (!specifics) {
     return std::nullopt;
   }
-  sync_pb::ThemeSpecifics specifics_without_browser_color_scheme = *specifics;
-  // Do not offer batch upload for themes with only browser color scheme.
-  specifics_without_browser_color_scheme.clear_browser_color_scheme();
-  return ThemeSyncableService::HasNonDefaultTheme(
-             specifics_without_browser_color_scheme)
-             ? specifics
-             : std::nullopt;
+  return ShouldOfferBatchUpload(*specifics) ? specifics : std::nullopt;
 }
diff --git a/chrome/browser/themes/theme_local_data_batch_uploader_unittest.cc b/chrome/browser/themes/theme_local_data_batch_uploader_unittest.cc
index 951857d..71c451e 100644
--- a/chrome/browser/themes/theme_local_data_batch_uploader_unittest.cc
+++ b/chrome/browser/themes/theme_local_data_batch_uploader_unittest.cc
@@ -317,10 +317,9 @@
 }
 
 TEST_F(ThemeLocalDataBatchUploaderTest, TriggerLocalDataMigrationForNoItem) {
-  // Local user color theme.
-  theme_service()->SetUserColorAndBrowserColorVariant(
-      SK_ColorBLUE, ui::mojom::BrowserColorVariant::kTonalSpot);
-  ASSERT_EQ(theme_service()->GetThemeID(), ThemeService::kUserColorThemeID);
+  // Local grayscale theme.
+  theme_service()->SetIsGrayscale(true);
+  ASSERT_TRUE(theme_service()->GetIsGrayscale());
 
   const sync_pb::ThemeSpecifics local_theme_specifics =
       theme_sync_service()->GetThemeSpecificsFromCurrentThemeForTesting();
@@ -336,32 +335,29 @@
   histogram_tester.ExpectUniqueSample("Theme.BatchUpload.HasLocalTheme", true,
                                       1);
 
-  ASSERT_NE(theme_service()->GetUserColor(), SK_ColorBLUE);
+  ASSERT_FALSE(theme_service()->GetIsGrayscale());
   EXPECT_THAT(
       theme_sync_service()->GetThemeSpecificsFromCurrentThemeForTesting(),
       EqualsProto(remote_theme_specifics));
 
   TriggerLocalDataMigrationForItems(/*items=*/{});
-  EXPECT_NE(theme_service()->GetThemeID(), ThemeService::kUserColorThemeID);
-  EXPECT_FALSE(theme_service()->GetUserColor());
+  EXPECT_FALSE(theme_service()->GetIsGrayscale());
   // Nothing is committed.
   EXPECT_THAT(fake_change_processor()->changes(), IsEmpty());
   histogram_tester.ExpectTotalCount(
       "Theme.BatchUpload.LocalThemeMigrationTriggered", 0);
 
   theme_sync_service()->StopSyncing(syncer::THEMES);
-  EXPECT_EQ(theme_service()->GetThemeID(), ThemeService::kUserColorThemeID);
-  EXPECT_EQ(theme_service()->GetUserColor(), SK_ColorBLUE);
+  EXPECT_TRUE(theme_service()->GetIsGrayscale());
   histogram_tester.ExpectUniqueSample("Theme.RestoredLocalThemeUponSignout",
                                       true, 1);
 }
 
 TEST_F(ThemeLocalDataBatchUploaderTest,
        TriggerLocalDataMigrationForItemsForCorrectItem) {
-  // Local user color theme.
-  theme_service()->SetUserColorAndBrowserColorVariant(
-      SK_ColorBLUE, ui::mojom::BrowserColorVariant::kTonalSpot);
-  ASSERT_EQ(theme_service()->GetThemeID(), ThemeService::kUserColorThemeID);
+  // Local grayscale theme.
+  theme_service()->SetIsGrayscale(true);
+  ASSERT_TRUE(theme_service()->GetIsGrayscale());
 
   const sync_pb::ThemeSpecifics local_theme_specifics =
       theme_sync_service()->GetThemeSpecificsFromCurrentThemeForTesting();
@@ -373,8 +369,7 @@
   base::HistogramTester histogram_tester;
   TriggerLocalDataMigrationForItems(
       /*items=*/{ThemeLocalDataBatchUploader::kThemesLocalDataItemModelId});
-  EXPECT_EQ(theme_service()->GetThemeID(), ThemeService::kUserColorThemeID);
-  EXPECT_EQ(theme_service()->GetUserColor(), SK_ColorBLUE);
+  EXPECT_TRUE(theme_service()->GetIsGrayscale());
   EXPECT_THAT(
       theme_sync_service()->GetThemeSpecificsFromCurrentThemeForTesting(),
       EqualsProto(local_theme_specifics));
@@ -390,7 +385,7 @@
                                       1);
 
   theme_sync_service()->StopSyncing(syncer::THEMES);
-  EXPECT_TRUE(theme_service()->UsingDefaultTheme());
+  EXPECT_FALSE(theme_service()->GetIsGrayscale());
   histogram_tester.ExpectUniqueSample("Theme.RestoredLocalThemeUponSignout",
                                       false, 1);
 }
@@ -487,6 +482,12 @@
   EXPECT_TRUE(theme_service()->UsingDefaultTheme());
 }
 
+// If only a user color theme is set, no batch upload is offered. This is to
+// catch cases where the color might have been set during profile creation and
+// might accidentally lead to overwriting the current theme. This is a good
+// enough trade-off to avoid the issue given that the user can easily set a user
+// color theme manually again if they want to. See crbug.com/433935323 for more
+// details.
 TEST_P(ThemeLocalDataBatchUploaderTest, LocalUserColorTheme) {
   // Local user color theme.
   theme_service()->SetUserColorAndBrowserColorVariant(
@@ -499,6 +500,46 @@
 
   StartSyncing(remote_theme_specifics);
 
+  EXPECT_THAT(GetLocalDataDescription(), IsEmptyLocalDataDescription());
+
+  ASSERT_NE(theme_service()->GetUserColor(), SK_ColorGREEN);
+  EXPECT_THAT(
+      theme_sync_service()->GetThemeSpecificsFromCurrentThemeForTesting(),
+      EqualsProto(remote_theme_specifics));
+
+  TriggerLocalDataMigration();
+  EXPECT_NE(theme_service()->GetUserColor(), SK_ColorGREEN);
+  EXPECT_THAT(
+      theme_sync_service()->GetThemeSpecificsFromCurrentThemeForTesting(),
+      EqualsProto(remote_theme_specifics));
+  // The local theme is not committed.
+  EXPECT_THAT(fake_change_processor()->changes(),
+              Not(HasThemeSpecifics(local_theme_specifics)));
+
+  theme_sync_service()->StopSyncing(syncer::THEMES);
+  // The pre-existing user color theme is restored.
+  EXPECT_EQ(theme_service()->GetThemeID(), ThemeService::kUserColorThemeID);
+  EXPECT_EQ(theme_service()->GetUserColor(), SK_ColorGREEN);
+}
+
+// If both a user color theme and a browser color scheme are set, the batch
+// upload dialog should still be offered, unlike the cases where only one of
+// these is set.
+TEST_P(ThemeLocalDataBatchUploaderTest,
+       LocalUserColorThemeAndBrowserColorScheme) {
+  // Local user color theme and browser color scheme.
+  theme_service()->SetUserColorAndBrowserColorVariant(
+      SK_ColorGREEN, ui::mojom::BrowserColorVariant::kTonalSpot);
+  theme_service()->SetBrowserColorScheme(
+      ThemeService::BrowserColorScheme::kLight);
+  ASSERT_EQ(theme_service()->GetThemeID(), ThemeService::kUserColorThemeID);
+
+  const sync_pb::ThemeSpecifics local_theme_specifics =
+      theme_sync_service()->GetThemeSpecificsFromCurrentThemeForTesting();
+  const sync_pb::ThemeSpecifics remote_theme_specifics = GetParam();
+
+  StartSyncing(remote_theme_specifics);
+
   EXPECT_THAT(GetLocalDataDescription(),
               MatchesLocalDataDescription(
                   syncer::DataType::THEMES,
@@ -517,6 +558,8 @@
   TriggerLocalDataMigration();
   EXPECT_EQ(theme_service()->GetThemeID(), ThemeService::kUserColorThemeID);
   EXPECT_EQ(theme_service()->GetUserColor(), SK_ColorGREEN);
+  EXPECT_EQ(theme_service()->GetBrowserColorScheme(),
+            ThemeService::BrowserColorScheme::kLight);
   EXPECT_THAT(
       theme_sync_service()->GetThemeSpecificsFromCurrentThemeForTesting(),
       EqualsProto(local_theme_specifics));
@@ -529,6 +572,10 @@
 
   theme_sync_service()->StopSyncing(syncer::THEMES);
   EXPECT_TRUE(theme_service()->UsingDefaultTheme());
+  EXPECT_NE(theme_service()->GetThemeID(), ThemeService::kUserColorThemeID);
+  EXPECT_NE(theme_service()->GetUserColor(), SK_ColorGREEN);
+  EXPECT_NE(theme_service()->GetBrowserColorScheme(),
+            ThemeService::BrowserColorScheme::kLight);
 }
 
 TEST_P(ThemeLocalDataBatchUploaderTest, LocalGrayscaleTheme) {
diff --git a/chrome/browser/themes/theme_syncable_service.cc b/chrome/browser/themes/theme_syncable_service.cc
index 45b676c..c1194c7 100644
--- a/chrome/browser/themes/theme_syncable_service.cc
+++ b/chrome/browser/themes/theme_syncable_service.cc
@@ -413,6 +413,12 @@
     base::UmaHistogramBoolean("Theme.RestoredLocalThemeUponSignout", result);
     if (!result) {
       theme_service_->UseDefaultTheme();
+      // Explicitly reset the browser color scheme to default because
+      // UseDefaultTheme() does not do it.
+      // TODO(crbug.com/442592525): Consider resetting the browser color scheme
+      // in UseDefaultTheme().
+      theme_service_->SetBrowserColorScheme(
+          ThemeService::BrowserColorScheme::kSystem);
     }
   }
 }
diff --git a/chrome/browser/themes/theme_syncable_service_unittest.cc b/chrome/browser/themes/theme_syncable_service_unittest.cc
index 9955528..4c39c621 100644
--- a/chrome/browser/themes/theme_syncable_service_unittest.cc
+++ b/chrome/browser/themes/theme_syncable_service_unittest.cc
@@ -212,6 +212,9 @@
     return ThemeService::BrowserColorScheme::kSystem;
   }
 
+  void SetBrowserColorScheme(
+      ThemeService::BrowserColorScheme color_scheme) override {}
+
   const extensions::Extension* theme_extension() const {
     return theme_extension_.get();
   }
@@ -3382,6 +3385,38 @@
 }
 
 TEST_F(ThemeSyncableServiceTestWithAccountThemesSeparation,
+       LoadsDefaultBrowserColorSchemeUponSyncStopIfNoLocalThemeExistedInPref) {
+  // Set remote browser color scheme.
+  sync_pb::ThemeSpecifics theme_specifics;
+  theme_specifics.set_browser_color_scheme(
+      sync_pb::ThemeSpecifics_BrowserColorScheme_LIGHT);
+
+  // Start syncing.
+  std::optional<syncer::ModelError> error =
+      theme_sync_service()->MergeDataAndStartSyncing(
+          syncer::THEMES, MakeThemeDataList(theme_specifics),
+          std::unique_ptr<syncer::SyncChangeProcessor>(
+              new syncer::SyncChangeProcessorWrapperForTest(
+                  fake_change_processor())));
+  ASSERT_FALSE(error.has_value()) << error->ToString();
+
+  ASSERT_EQ(theme_service()->GetBrowserColorScheme(),
+            ThemeService::BrowserColorScheme::kLight);
+
+  base::HistogramTester histogram_tester;
+  // No local theme pref is set.
+  ASSERT_FALSE(
+      profile()->GetPrefs()->GetUserPrefValue(prefs::kSavedLocalTheme));
+  // Stop syncing.
+  theme_sync_service()->StopSyncing(syncer::THEMES);
+  // Browser color scheme is reset to default.
+  EXPECT_EQ(theme_service()->GetBrowserColorScheme(),
+            ThemeService::BrowserColorScheme::kSystem);
+  histogram_tester.ExpectUniqueSample("Theme.RestoredLocalThemeUponSignout",
+                                      false, 1);
+}
+
+TEST_F(ThemeSyncableServiceTestWithAccountThemesSeparation,
        ShouldNotLoadLocalThemeFromPrefUponBrowserShutdown) {
   // Set remote extension theme.
   sync_pb::ThemeSpecifics theme_specifics;
diff --git a/chrome/browser/touch_to_fill/password_manager/android/internal/java/strings/translations/android_touch_to_fill_strings_ar.xtb b/chrome/browser/touch_to_fill/password_manager/android/internal/java/strings/translations/android_touch_to_fill_strings_ar.xtb
index 39f49417..588956c 100644
--- a/chrome/browser/touch_to_fill/password_manager/android/internal/java/strings/translations/android_touch_to_fill_strings_ar.xtb
+++ b/chrome/browser/touch_to_fill/password_manager/android/internal/java/strings/translations/android_touch_to_fill_strings_ar.xtb
@@ -6,7 +6,7 @@
 <translation id="1435940442311036198">استخدام مفتاح مرور على جهاز آخر</translation>
 <translation id="1717486229951421299">تم فتح قائمة بيانات الاعتماد التي يتم ملؤها باللمس على طول النصف السفلي من الشاشة.</translation>
 <translation id="2359808026110333948">متابعة</translation>
-<translation id="2364266287022099258">هل تريد استخدام مفتاح المرور المحفوظ؟</translation>
+<translation id="2364266287022099258">هل المطلوب استخدام مفتاح المرور المحفوظ؟</translation>
 <translation id="3399357656427473483">قائمة ببيانات الاعتماد التي يتم ملؤها باللمس</translation>
 <translation id="3653689374478248324">سيتم تسجيل دخولك إلى <ph name="SITE_NAME" />.</translation>
 <translation id="3950820424414687140">تسجيل الدخول</translation>
@@ -15,7 +15,7 @@
 <translation id="4722735765955348426">كلمة مرور <ph name="USERNAME" /></translation>
 <translation id="5012523644916800014">إدارة كلمات المرور ومفاتيح المرور</translation>
 <translation id="5441504010984421144">تم فتح قائمة بيانات الاعتماد التي يجب ملؤها باللمس على طول الشاشة.</translation>
-<translation id="5591247451101092906">هل تريد استخدام كلمة المرور أو مفتاح المرور المحفوظَين؟</translation>
+<translation id="5591247451101092906">استخدام كلمة المرور أو مفتاح المرور المحفوظَين؟</translation>
 <translation id="5624120631404540903">إدارة كلمات المرور</translation>
 <translation id="592182999816790476">تم حفظ كلمة المرور لحساب <ph name="USERNAME" /> على <ph name="WEBSITE" /></translation>
 <translation id="593924516471361340">تم حفظ كلمة المرور المؤقتة لاسترداد الحساب في حال حدوث مشكلة لحساب <ph name="USERNAME" /> على <ph name="WEBSITE" /></translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ar.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ar.xtb
index 212e310..7d2f951 100644
--- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ar.xtb
+++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ar.xtb
@@ -11,7 +11,7 @@
 <translation id="4401440167302712543">يمكنك ملء معلومات الشحن والدفع تلقائيًا أثناء إتمام الدفع.</translation>
 <translation id="4526274353008646337">إضافة عنوان جديد</translation>
 <translation id="5289073627190432393">اختَر طريقة الدفع. تتوفّر خيارات للتنقل.</translation>
-<translation id="551561471023477766">اختَر عنوان الشحن. تتوفّر خيارات للتنقل.</translation>
+<translation id="551561471023477766">يرجى اختيار عنوان الشحن. تتوفّر خيارات للتنقل.</translation>
 <translation id="567079066552447069">تم إغلاق قائمة العناوين وخيارات الدفع التي سيتم ملؤها أثناء عملية الدفع.</translation>
 <translation id="5747552184818312860">تاريخ انتهاء الصلاحية</translation>
 <translation id="6476284679642588870">إدارة طرق الدفع</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 e3143fc..3b33ede 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
@@ -93,7 +93,7 @@
 <translation id="1397811292916898096">البحث باستخدام "<ph name="PRODUCT_NAME" />"</translation>
 <translation id="1398057416966591719">‏يمكنك <ph name="BEGIN_LINK1" />إدارة بيانات Chrome التي يتم حفظها<ph name="END_LINK1" /> في حسابك على Google.
 
-وللوصول إلى الإعدادات الإضافية التي تستخدم البيانات لتحسين تجربة استخدام Chrome، انتقِل إلى <ph name="BEGIN_LINK2" />خدمات Google<ph name="END_LINK2" />.</translation>
+وللوصول إلى الإعدادات الإضافية التي تستخدم البيانات لتحسين تجربة استخدام Chrome، يرجى الانتقال إلى <ph name="BEGIN_LINK2" />خدمات Google<ph name="END_LINK2" />.</translation>
 <translation id="1407069428457324124">المظهر الداكن</translation>
 <translation id="1407135791313364759">فتح الكل</translation>
 <translation id="1409879593029778104">مُنع تنزيل الملف <ph name="FILE_NAME" /> لأنه موجود بالفعل.</translation>
@@ -250,7 +250,7 @@
 <translation id="2194856509914051091">ملاحظات مهمّة</translation>
 <translation id="22091350895006575">إضافة اسم مستخدِم</translation>
 <translation id="221494669172414749">‏سيؤدي فتح Chrome بدون قفل للملف الشخصي إلى إزالة كلمات المرور وطُرق الدفع المحفوظة من السيارة. ويؤدي استخدام قفل للملف الشخصي إلى الحفاظ على أمان هذه البيانات.</translation>
-<translation id="2227444325776770048">المتابعة بحساب "<ph name="USER_FULL_NAME" />"</translation>
+<translation id="2227444325776770048">المتابعة باسم <ph name="USER_FULL_NAME" /></translation>
 <translation id="2230777942707397948">نافذة فارغة</translation>
 <translation id="223356358902285214">النشاط على الويب وفي التطبيقات</translation>
 <translation id="2234827758954819389">دليل الخصوصية</translation>
@@ -360,7 +360,7 @@
 <translation id="2708226184420201102">فتح في متصفِّح <ph name="PRODUCT_NAME" /></translation>
 <translation id="271033894570825754">جديد</translation>
 <translation id="2718352093833049315">‏على Wi-Fi فقط</translation>
-<translation id="2718846868787000099">يمكن للمواقع التي تزورها الاطّلاع على إعداداتك المفضّلة لتتمكن من عرض المحتوى بلغاتك المفضّلة.</translation>
+<translation id="2718846868787000099">يمكن للمواقع التي تتم زيارتها الاطّلاع على إعداداتك المفضّلة لتتمكن من عرض المحتوى بلغاتك المفضّلة.</translation>
 <translation id="2723001399770238859">الصوت</translation>
 <translation id="2734335652257251631">عرض "وضع القراءة"</translation>
 <translation id="2739887572830526131">يمكنك الاحتفاظ بهذه المجموعة لإضافة علامات تبويب إليها لاحقًا، أو حذفها إذا لم تعُد بحاجة إليها.</translation>
@@ -576,7 +576,7 @@
 <translation id="3718765429352682176">‏قد يظهر لك السجلّ من خلال التطبيقات الأخرى التي تفتح الروابط في Chrome.</translation>
 <translation id="3721119614952978349">‏أنت وGoogle</translation>
 <translation id="3737319253362202215">إعدادات الترجمة</translation>
-<translation id="3738139272394829648">المس للبحث</translation>
+<translation id="3738139272394829648">النقر للبحث</translation>
 <translation id="3739455665973395693">‏ما مِن كلمات مرور معرّضة للاختراق في حسابك على Google</translation>
 <translation id="3739899004075612870">تمت إضافة إشارة مرجعية في <ph name="PRODUCT_NAME" /></translation>
 <translation id="3740525748616366977">لا يتوفر البحث الصوتي على هذا الجهاز.</translation>
@@ -722,7 +722,7 @@
 <translation id="442518031075347249">‏لن تتمكّن من استخدام بطاقتك الافتراضية هذه مجدّدًا مع خدمة Google Pay. <ph name="BEGIN_LINK1" />مزيد من المعلومات حول البطاقات الافتراضية<ph name="END_LINK1" /></translation>
 <translation id="442577985493096785">{TAB_COUNT,plural, =1{سيتم إغلاق "<ph name="TAB_TITLE" />" وعلامة تبويب واحدة أخرى (<ph name="TAB_COUNT_ONE" />)}zero{سيتم إغلاق "<ph name="TAB_TITLE" />" و<ph name="TAB_COUNT_MANY" /> علامة تبويب أخرى}two{سيتم إغلاق "<ph name="TAB_TITLE" />" وعلامتَي تبويب (<ph name="TAB_COUNT_MANY" />) أخريَين}few{سيتم إغلاق "<ph name="TAB_TITLE" />" و<ph name="TAB_COUNT_MANY" /> علامات تبويب أخرى}many{سيتم إغلاق "<ph name="TAB_TITLE" />" و<ph name="TAB_COUNT_MANY" /> علامة تبويب أخرى}other{سيتم إغلاق "<ph name="TAB_TITLE" />" و<ph name="TAB_COUNT_MANY" /> علامة تبويب أخرى}}</translation>
 <translation id="4426508677408162512">كل الإشارات المرجعية</translation>
-<translation id="4430277756566635951">الحساب الذي تم اختياره حاليًا هو <ph name="EMAIL" />. اختَر حسابًا.</translation>
+<translation id="4430277756566635951">الحساب الذي تم اختياره حاليًا هو <ph name="EMAIL" />. يُرجى اختيار حساب.</translation>
 <translation id="4452411734226507615">إغلاق علامة التبويب <ph name="TAB_TITLE" /></translation>
 <translation id="4452548195519783679">أُضيفَت إشارة مرجعية إلى <ph name="FOLDER_NAME" /></translation>
 <translation id="4460861538906892109">{ITEMS_COUNT,plural, =1{إشارة مرجعية واحدة}zero{‫# إشارة مرجعية}two{إشارتان مرجعيتان}few{‫# إشارات مرجعية}many{‫# إشارة مرجعية}other{‫# إشارة مرجعية}}</translation>
@@ -1010,7 +1010,7 @@
 <translation id="5754350196967618083">يتعذّر إعادة تحميل ميزة "اقتراحات"</translation>
 <translation id="5763382633136178763">علامات تبويب التصفح المتخفي</translation>
 <translation id="5763514718066511291">‏النقر لنسخ عنوان URL لهذا التطبيق</translation>
-<translation id="5765517223145864268">أخبِرنا عن تجربتك أو <ph name="BEGIN_LINK" />غيِّر إعداداتك<ph name="END_LINK" />.</translation>
+<translation id="5765517223145864268">يمكنك مشاركة تجربتك معنا أو <ph name="BEGIN_LINK" />تغيير إعداداتك<ph name="END_LINK" />.</translation>
 <translation id="5765780083710877561">الوصف:</translation>
 <translation id="5776970333778123608">بيانات غير مهمة</translation>
 <translation id="5793665092639000975">يتم استخدام <ph name="SPACE_USED" /> من أصل <ph name="SPACE_AVAILABLE" /></translation>
@@ -1190,7 +1190,7 @@
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{تم تنزيل ملف واحد.}zero{اكتملت # عملية تنزيل.}two{اكتملت عمليتا تنزيل.}few{اكتملت # عمليات تنزيل.}many{اكتملت # عملية تنزيل.}other{اكتملت # علمية تنزيل.}}</translation>
 <translation id="6508722015517270189">‏إعادة تشغيل Chrome</translation>
 <translation id="6513924416597632811">يؤدي النقر على الزرّ إلى نسخ رابط صفحة نتائج البحث عن "<ph name="SEARCH_QUERY" />". المصدر: <ph name="PAGE_URL" /></translation>
-<translation id="6518133107902771759">تحقق</translation>
+<translation id="6518133107902771759">تأكيد</translation>
 <translation id="6527303717912515753">مشاركة</translation>
 <translation id="652948702951888897">‏سجل Chrome</translation>
 <translation id="6532866250404780454">‏لن يتم عرض المواقع الإلكترونية التي تزورها في Chrome. سيتم حذف جميع موقِّتات الموقع الإلكتروني.</translation>
@@ -1365,7 +1365,7 @@
 <translation id="7182051712900867547">استخدام حساب مختلف</translation>
 <translation id="7183517696921903380">تم فتح ورقة بيانات فلتر التطبيقات.</translation>
 <translation id="7186568385131859684">‏التحكّم في كيفية استخدام سجلّ التصفّح مع بياناتك الأخرى في جميع خدمات Google</translation>
-<translation id="7190921792980745354">هل تريد حظر "<ph name="MEMBER_FULL_NAME" />"؟</translation>
+<translation id="7190921792980745354">هل مطلوب حظر "<ph name="MEMBER_FULL_NAME" />"؟</translation>
 <translation id="7191430249889272776">تم فتح علامة التبويب في الخلفية.</translation>
 <translation id="7192397795254933433">{NUM_PASSWORDS,plural, =1{يجب تغيير كلمة المرور هذه الآن}zero{يجب تغيير كلمات المرور هذه الآن}two{يجب تغيير كلمتَي المرور هاتين الآن}few{يجب تغيير كلمات المرور هذه الآن}many{يجب تغيير كلمات المرور هذه الآن}other{يجب تغيير كلمات المرور هذه الآن}}</translation>
 <translation id="7196215469483532480">تم فتح شرح دليل الخصوصية بطول الشاشة.</translation>
@@ -1379,7 +1379,7 @@
 <translation id="72415438529550637">تم إغلاق اقتراح كلمة المرور.</translation>
 <translation id="7248671827512403053">تطبيق</translation>
 <translation id="7253951228444156601">جارٍ التحقّق من كلمات المرور…</translation>
-<translation id="7260367682327802201">‏قد يتضمّن جهاز Android إعدادًا مشابهًا. في حال تفعيل الإعداد "قياس أداء الإعلانات" في Chrome وعلى جهاز Android، يمكن للشركات قياس مدى فعالية الإعلان المعروض على المواقع الإلكترونية التي تزورها والتطبيقات التي تستخدمها.</translation>
+<translation id="7260367682327802201">‏قد يتضمّن جهاز Android خيارًا مشابهًا. في حال تفعيل ميزة "قياس أداء الإعلانات" في Chrome وعلى جهاز Android، يمكن للشركة قياس مدى فاعلية الإعلان المعروض على المواقع الإلكترونية التي تتم زيارتها والتطبيقات المستخدَمة.</translation>
 <translation id="727288900855680735">يُرجى الموافقة على إرسال <ph name="ONE_TIME_CODE" /> إلى <ph name="ORIGIN" /></translation>
 <translation id="7274013316676448362">تم حظر الموقع.</translation>
 <translation id="7276868533747677875">‏إذا سبق لك تصدير كلمات المرور، يمكنك البحث عن ملف CSV على جهازك واستيرادها إلى مدير كلمات المرور المفضّل لديك.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
index 5300790..d8078811 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -241,7 +241,7 @@
 <translation id="2166228530126694506">גרסה <ph name="VERSION_NUMBER" /></translation>
 <translation id="2172688499998841696">התכונה 'תיאורי תמונות' מושבתת</translation>
 <translation id="2172905120685242547">לסגור את החלון?</translation>
-<translation id="2173302385160625112">יש לבדוק את החיבור לאינטרנט</translation>
+<translation id="2173302385160625112">צריך לבדוק את החיבור לאינטרנט</translation>
 <translation id="2175927920773552910">‏קוד QR</translation>
 <translation id="2184272387334793084">לאחר הכניסה לחשבון, הסיסמאות ונתונים נוספים יופיעו בכל המכשירים שלך</translation>
 <translation id="218608176142494674">שיתוף</translation>
@@ -322,7 +322,7 @@
 <translation id="253498598929009420">האתר יוכל לראות את תוכן המסך שלך</translation>
 <translation id="2535807170289627159">כל הכרטיסיות</translation>
 <translation id="2536728043171574184">מוצג העתק לא מקוון של עמוד זה</translation>
-<translation id="2539002604555291451">‏גופן Sans Serif</translation>
+<translation id="2539002604555291451">Sans Serif</translation>
 <translation id="2542548955756682219">‫<ph name="TAB_TITLE" />, כרטיסייה</translation>
 <translation id="2546283357679194313">‏קובצי Cookie ונתונים מאתרים</translation>
 <translation id="2547843573592965873">‏נעילת הפרופיל מאבטחת את המידע שלך ברכב, כולל סיסמאות, תשלומים ועוד מידע ששמור בחשבון שלך ב-Google.</translation>
@@ -392,7 +392,7 @@
 <translation id="2869430948265924908">כדי להגן על תוכן רגיש ברכב, עליך ליצור נעילת פרופיל ברכב.  אפשר לעשות זאת באמצעות קוד אימות, קוד או סיסמה.</translation>
 <translation id="2870560284913253234">אתר</translation>
 <translation id="2871733351037274014">טעינה מראש של דפים</translation>
-<translation id="2876136027428473467">נשלחה מ<ph name="CHILD_NAME" /> בקשה לאישור כדי לבקר באתר הבא:</translation>
+<translation id="2876136027428473467">‫<ph name="CHILD_NAME" /> רוצה את האישור שלך כדי לבקר באתר הבא:</translation>
 <translation id="2876628302275096482">‏<ph name="BEGIN_LINK" />מידע נוסף לגבי השמירה על פרטיות הנתונים ב-Chrome<ph name="END_LINK" /></translation>
 <translation id="2885355868600171871">מעבר לסרגל הכתובות</translation>
 <translation id="2888126860611144412">‏מידע כללי על Chrome</translation>
@@ -721,7 +721,7 @@
 <translation id="442577985493096785">{TAB_COUNT,plural, =1{הכרטיסייה <ph name="TAB_TITLE" /> וכרטיסייה אחת (<ph name="TAB_COUNT_ONE" />) נוספת ייסגרו}one{הכרטיסייה <ph name="TAB_TITLE" /> ו-<ph name="TAB_COUNT_MANY" /> כרטיסיות נוספות ייסגרו}two{הכרטיסייה <ph name="TAB_TITLE" /> ו-<ph name="TAB_COUNT_MANY" /> כרטיסיות נוספות ייסגרו}other{הכרטיסייה <ph name="TAB_TITLE" /> ו-<ph name="TAB_COUNT_MANY" /> כרטיסיות נוספות ייסגרו}}</translation>
 <translation id="4426508677408162512">כל הסימניות</translation>
 <translation id="4430277756566635951">החשבון הנוכחי: <ph name="EMAIL" />. עליך לבחור חשבון.</translation>
-<translation id="4452411734226507615">סגירת הכרטיסייה <ph name="TAB_TITLE" /></translation>
+<translation id="4452411734226507615">סגירת הכרטיסייה "<ph name="TAB_TITLE" />"</translation>
 <translation id="4452548195519783679">התווסף לסימניות ב-<ph name="FOLDER_NAME" /></translation>
 <translation id="4460861538906892109">{ITEMS_COUNT,plural, =1{סימנייה אחת}one{‫# סימניות}two{‫# סימניות}other{‫# סימניות}}</translation>
 <translation id="4478161224666880173">אפשר להשתמש בחשבון <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> באתר הזה. כדי להמשיך עליך להיכנס אל <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" />.</translation>
diff --git a/chrome/browser/ui/autofill/address_bubbles_controller.cc b/chrome/browser/ui/autofill/address_bubbles_controller.cc
index 9a959e4..5a12345 100644
--- a/chrome/browser/ui/autofill/address_bubbles_controller.cc
+++ b/chrome/browser/ui/autofill/address_bubbles_controller.cc
@@ -10,7 +10,6 @@
 #include <vector>
 
 #include "base/check.h"
-#include "base/feature_list.h"
 #include "base/memory/weak_ptr.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -24,7 +23,6 @@
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/signin/signin_promo_util.h"
 #include "chrome/browser/ui/autofill/autofill_bubble_handler.h"
-#include "chrome/browser/ui/autofill/bubble_manager.h"
 #include "chrome/browser/ui/autofill/chrome_autofill_client.h"
 #include "chrome/browser/ui/autofill/edit_address_profile_dialog_controller_impl.h"
 #include "chrome/browser/ui/autofill/save_address_bubble_controller.h"
@@ -222,7 +220,8 @@
                  std::nullopt);
 }
 
-PageActionIconType AddressBubblesController::GetPageActionIconType() {
+std::optional<PageActionIconType>
+AddressBubblesController::GetPageActionIconType() {
   return PageActionIconType::kAutofillAddress;
 }
 
@@ -253,26 +252,13 @@
     AutofillClient::AddressProfileSavePromptCallback
         address_profile_save_prompt_callback) {
   // Don't show the bubble if it's already visible, and inform the backend.
-  if (bubble_view()) {
+  if (bubble_view() || !MaySetUpBubble()) {
     std::move(address_profile_save_prompt_callback)
         .Run(AutofillClient::AddressPromptUserDecision::kAutoDeclined,
              std::nullopt);
     return;
   }
 
-  const bool bubble_manager_enabled = base::FeatureList::IsEnabled(
-      features::kAutofillShowBubblesBasedOnPriorities);
-
-  if (bubble_manager_enabled) {
-    auto* manager = BubbleManager::GetForWebContents(web_contents());
-    if (!manager || manager->HasPendingBubble(*this)) {
-      std::move(address_profile_save_prompt_callback)
-          .Run(AutofillClient::AddressPromptUserDecision::kAutoDeclined,
-               std::nullopt);
-      return;
-    }
-  }
-
   if (address_profile_save_prompt_callback_) {
     // If the user closed the bubble of the previous import process using the
     // "Close" button without making a decision to "Accept" or "Deny" the
@@ -291,13 +277,7 @@
               user_has_any_profile_saved,
               std::move(address_profile_save_prompt_callback));
 
-  if (bubble_manager_enabled) {
-    if (auto* manager = BubbleManager::GetForWebContents(web_contents())) {
-      manager->RequestShowController(*this);
-    }
-  } else {
-    ShowBubble();
-  }
+  QueueOrShowBubble();
 }
 
 void AddressBubblesController::SetUpBubble(
diff --git a/chrome/browser/ui/autofill/address_bubbles_controller.h b/chrome/browser/ui/autofill/address_bubbles_controller.h
index a4ce6b4..fd2e7d7 100644
--- a/chrome/browser/ui/autofill/address_bubbles_controller.h
+++ b/chrome/browser/ui/autofill/address_bubbles_controller.h
@@ -77,7 +77,7 @@
  protected:
   // AutofillBubbleControllerBase:
   void WebContentsDestroyed() override;
-  PageActionIconType GetPageActionIconType() override;
+  std::optional<PageActionIconType> GetPageActionIconType() override;
   void DoShowBubble() override;
 
  private:
diff --git a/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.cc b/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.cc
index a3a444e4..88c70df 100644
--- a/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.cc
+++ b/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.cc
@@ -6,7 +6,6 @@
 
 #include <algorithm>
 
-#include "base/feature_list.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/notreached.h"
@@ -16,7 +15,6 @@
 #include "chrome/browser/ui/autofill/autofill_bubble_base.h"
 #include "chrome/browser/ui/autofill/autofill_bubble_controller_base.h"
 #include "chrome/browser/ui/autofill/autofill_bubble_handler.h"
-#include "chrome/browser/ui/autofill/bubble_manager.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_window.h"
@@ -25,7 +23,6 @@
 #include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h"
 #include "components/autofill/core/browser/integrators/autofill_ai/autofill_ai_import_utils.h"
 #include "components/autofill/core/browser/integrators/autofill_ai/autofill_ai_manager.h"
-#include "components/autofill/core/common/autofill_features.h"
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/navigation_handle.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -122,31 +119,13 @@
     AutofillClient::EntitySaveOrUpdatePromptResultCallback
         save_prompt_acceptance_callback) {
   // Don't show the bubble if it's already visible.
-  if (bubble_view()) {
+  if (bubble_view() || !MaySetUpBubble()) {
     return;
   }
 
-  const bool bubble_manager_enabled = base::FeatureList::IsEnabled(
-      features::kAutofillShowBubblesBasedOnPriorities);
-
-  if (bubble_manager_enabled) {
-    auto* manager = BubbleManager::GetForWebContents(web_contents());
-    if (!manager || manager->HasPendingBubble(*this)) {
-      // Early return if a pre-existing of similar type is in the queue or the
-      // manager does not exist.
-      return;
-    }
-  }
-
   SetupPrompt(std::move(new_entity), std::move(old_entity),
               std::move(save_prompt_acceptance_callback));
-  if (bubble_manager_enabled) {
-    if (auto* manager = BubbleManager::GetForWebContents(web_contents())) {
-      manager->RequestShowController(*this);
-    }
-  } else {
-    DoShowBubble();
-  }
+  QueueOrShowBubble();
 }
 
 void SaveOrUpdateAutofillAiDataControllerImpl::SetupPrompt(
@@ -298,10 +277,9 @@
   }
 }
 
-PageActionIconType
+std::optional<PageActionIconType>
 SaveOrUpdateAutofillAiDataControllerImpl::GetPageActionIconType() {
-  // TODO(crbug.com/362227379): Update icon.
-  return PageActionIconType::kAutofillAddress;
+  return std::nullopt;
 }
 
 void SaveOrUpdateAutofillAiDataControllerImpl::DoShowBubble() {
diff --git a/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.h b/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.h
index 1a06511..7c0bee7e 100644
--- a/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.h
+++ b/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.h
@@ -65,7 +65,7 @@
       const std::string& app_locale);
 
   // AutofillBubbleControllerBase::
-  PageActionIconType GetPageActionIconType() override;
+  std::optional<PageActionIconType> GetPageActionIconType() override;
   void DoShowBubble() override;
 
  private:
diff --git a/chrome/browser/ui/autofill/autofill_bubble_controller_base.cc b/chrome/browser/ui/autofill/autofill_bubble_controller_base.cc
index 4a4e887..3ed9d8e 100644
--- a/chrome/browser/ui/autofill/autofill_bubble_controller_base.cc
+++ b/chrome/browser/ui/autofill/autofill_bubble_controller_base.cc
@@ -5,8 +5,10 @@
 #include "chrome/browser/ui/autofill/autofill_bubble_controller_base.h"
 
 #include "chrome/browser/ui/autofill/autofill_bubble_base.h"
+#include "chrome/browser/ui/autofill/bubble_manager.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "components/autofill/core/common/autofill_clock.h"
+#include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_payments_features.h"
 
 #if !BUILDFLAG(IS_ANDROID)
@@ -31,15 +33,20 @@
 }
 
 void AutofillBubbleControllerBase::WebContentsDestroyed() {
-  HideBubble();
+  if (IsShowingBubble()) {
+    bubble_view_->Hide();
+    bubble_view_ = nullptr;
+    // Bubble Manager might be already destroyed so no need to inform it.
+  }
 }
 
 void AutofillBubbleControllerBase::UpdatePageActionIcon() {
-// Page action icons do not exist for Android.
+  // Page action icons do not exist for Android.
 #if !BUILDFLAG(IS_ANDROID)
-  Browser* browser = chrome::FindBrowserWithTab(web_contents());
-  if (browser) {
-    browser->window()->UpdatePageActionIcon(GetPageActionIconType());
+  if (auto icon_type = GetPageActionIconType()) {
+    if (Browser* browser = chrome::FindBrowserWithTab(web_contents())) {
+      browser->window()->UpdatePageActionIcon(*icon_type);
+    }
   }
 #endif  // !BUILDFLAG(IS_ANDROID)
 }
@@ -54,6 +61,12 @@
   if (IsShowingBubble()) {
     bubble_view_->Hide();
     bubble_view_ = nullptr;
+    if (base::FeatureList::IsEnabled(
+            features::kAutofillShowBubblesBasedOnPriorities)) {
+      if (auto* manager = BubbleManager::GetForWebContents(web_contents())) {
+        manager->OnBubbleHiddenByController(*this);
+      }
+    }
   }
 }
 
@@ -65,4 +78,32 @@
   return IsShowingBubble() && bubble_view_->IsMouseHovered();
 }
 
+bool AutofillBubbleControllerBase::MaySetUpBubble() {
+#if BUILDFLAG(IS_ANDROID)
+  return true;
+#else  // BUILDFLAG(IS_ANDROID)
+  if (!base::FeatureList::IsEnabled(
+          features::kAutofillShowBubblesBasedOnPriorities)) {
+    return true;
+  }
+
+  auto* manager = BubbleManager::GetForWebContents(web_contents());
+  return manager && !manager->HasPendingBubble(*this);
+#endif
+}
+
+void AutofillBubbleControllerBase::QueueOrShowBubble() {
+#if !BUILDFLAG(IS_ANDROID)
+  if (base::FeatureList::IsEnabled(
+          features::kAutofillShowBubblesBasedOnPriorities)) {
+    if (auto* manager = BubbleManager::GetForWebContents(web_contents())) {
+      manager->RequestShowController(*this);
+    }
+    return;
+  }
+#endif
+
+  ShowBubble();
+}
+
 }  // namespace autofill
diff --git a/chrome/browser/ui/autofill/autofill_bubble_controller_base.h b/chrome/browser/ui/autofill/autofill_bubble_controller_base.h
index 7b3111e9..e8451b8 100644
--- a/chrome/browser/ui/autofill/autofill_bubble_controller_base.h
+++ b/chrome/browser/ui/autofill/autofill_bubble_controller_base.h
@@ -47,7 +47,7 @@
   void WebContentsDestroyed() override;
 
  protected:
-  virtual PageActionIconType GetPageActionIconType() = 0;
+  virtual std::optional<PageActionIconType> GetPageActionIconType() = 0;
 
   // Subclasses should implement this method to actually show the bubble and
   // potentially log metrics.
@@ -55,6 +55,14 @@
 
   virtual void UpdatePageActionIcon();
 
+  // If the BubbleManager feature is enabled, this returns `false` if a bubble
+  // is already queued to be shown.
+  [[nodiscard]] bool MaySetUpBubble();
+
+  // Calls the bubble manager to show the bubble if bubble manager is enabled.
+  // Otherwise just shows the bubble.
+  void QueueOrShowBubble();
+
   AutofillBubbleBase* bubble_view() const { return bubble_view_; }
   void set_bubble_view(AutofillBubbleBase* bubble_view) {
     bubble_view_ = bubble_view;
diff --git a/chrome/browser/ui/autofill/payments/filled_card_information_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/filled_card_information_bubble_controller_impl.cc
index 90ccfc3..3937d8b9 100644
--- a/chrome/browser/ui/autofill/payments/filled_card_information_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/payments/filled_card_information_bubble_controller_impl.cc
@@ -389,7 +389,7 @@
   }
 }
 
-PageActionIconType
+std::optional<PageActionIconType>
 FilledCardInformationBubbleControllerImpl::GetPageActionIconType() {
   return PageActionIconType::kFilledCardInformation;
 }
diff --git a/chrome/browser/ui/autofill/payments/filled_card_information_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/filled_card_information_bubble_controller_impl.h
index 3378a918..962294f 100644
--- a/chrome/browser/ui/autofill/payments/filled_card_information_bubble_controller_impl.h
+++ b/chrome/browser/ui/autofill/payments/filled_card_information_bubble_controller_impl.h
@@ -75,7 +75,7 @@
   // AutofillBubbleControllerBase:
   void PrimaryPageChanged(content::Page& page) override;
   void OnVisibilityChanged(content::Visibility visibility) override;
-  PageActionIconType GetPageActionIconType() override;
+  std::optional<PageActionIconType> GetPageActionIconType() override;
   void DoShowBubble() override;
 
  private:
diff --git a/chrome/browser/ui/autofill/payments/iban_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/iban_bubble_controller_impl.cc
index 19e3666..f12926b 100644
--- a/chrome/browser/ui/autofill/payments/iban_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/payments/iban_bubble_controller_impl.cc
@@ -7,13 +7,11 @@
 #include <string>
 #include <string_view>
 
-#include "base/feature_list.h"
 #include "chrome/browser/autofill/personal_data_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/ui/autofill/autofill_bubble_base.h"
 #include "chrome/browser/ui/autofill/autofill_bubble_handler.h"
-#include "chrome/browser/ui/autofill/bubble_manager.h"
 #include "chrome/browser/ui/autofill/payments/save_iban_ui.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
@@ -25,7 +23,6 @@
 #include "components/autofill/core/browser/data_manager/personal_data_manager.h"
 #include "components/autofill/core/browser/metrics/autofill_metrics.h"
 #include "components/autofill/core/browser/metrics/payments/iban_metrics.h"
-#include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/strings/grit/components_strings.h"
@@ -52,31 +49,13 @@
     payments::PaymentsAutofillClient::SaveIbanPromptCallback
         save_iban_prompt_callback) {
   // Don't show the bubble if it's already visible.
-  if (bubble_view()) {
+  if (bubble_view() || !MaySetUpBubble()) {
     return;
   }
 
-  const bool bubble_manager_enabled = base::FeatureList::IsEnabled(
-      features::kAutofillShowBubblesBasedOnPriorities);
-
-  if (bubble_manager_enabled) {
-    auto* manager = BubbleManager::GetForWebContents(web_contents());
-    if (!manager || manager->HasPendingBubble(*this)) {
-      // Early return if a pre-existing of similar type is in the queue or the
-      // manager does not exist.
-      return;
-    }
-  }
-
   SetupLocalSave(iban, std::move(save_iban_prompt_callback));
   if (should_show_prompt) {
-    if (bubble_manager_enabled) {
-      if (auto* manager = BubbleManager::GetForWebContents(web_contents())) {
-        manager->RequestShowController(*this);
-      }
-    } else {
-      ShowBubble();
-    }
+    QueueOrShowBubble();
   } else {
     ShowIconOnly();
   }
@@ -89,32 +68,14 @@
     payments::PaymentsAutofillClient::SaveIbanPromptCallback
         save_iban_prompt_callback) {
   // Don't show the bubble if it's already visible.
-  if (bubble_view()) {
+  if (bubble_view() || !MaySetUpBubble()) {
     return;
   }
 
-  const bool bubble_manager_enabled = base::FeatureList::IsEnabled(
-      features::kAutofillShowBubblesBasedOnPriorities);
-
-  if (bubble_manager_enabled) {
-    auto* manager = BubbleManager::GetForWebContents(web_contents());
-    if (!manager || manager->HasPendingBubble(*this)) {
-      // Early return if a pre-existing of similar type is in the queue or the
-      // manager does not exist.
-      return;
-    }
-  }
-
   SetupUploadSave(iban, std::move(legal_message_lines),
                   std::move(save_iban_prompt_callback));
   if (should_show_prompt) {
-    if (bubble_manager_enabled) {
-      if (auto* manager = BubbleManager::GetForWebContents(web_contents())) {
-        manager->RequestShowController(*this);
-      }
-    } else {
-      ShowBubble();
-    }
+    QueueOrShowBubble();
   } else {
     ShowIconOnly();
   }
@@ -478,7 +439,8 @@
   return confirmation_ui_params_.value();
 }
 
-PageActionIconType IbanBubbleControllerImpl::GetPageActionIconType() {
+std::optional<PageActionIconType>
+IbanBubbleControllerImpl::GetPageActionIconType() {
   return PageActionIconType::kSaveIban;
 }
 
diff --git a/chrome/browser/ui/autofill/payments/iban_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/iban_bubble_controller_impl.h
index 7264da9..7d5015d 100644
--- a/chrome/browser/ui/autofill/payments/iban_bubble_controller_impl.h
+++ b/chrome/browser/ui/autofill/payments/iban_bubble_controller_impl.h
@@ -114,7 +114,7 @@
   explicit IbanBubbleControllerImpl(content::WebContents* web_contents);
 
   // AutofillBubbleControllerBase:
-  PageActionIconType GetPageActionIconType() override;
+  std::optional<PageActionIconType> GetPageActionIconType() override;
   void DoShowBubble() override;
   using AutofillBubbleControllerBase::HideBubble;
 
diff --git a/chrome/browser/ui/autofill/payments/mandatory_reauth_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/mandatory_reauth_bubble_controller_impl.cc
index 7c164e75..98f1279 100644
--- a/chrome/browser/ui/autofill/payments/mandatory_reauth_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/payments/mandatory_reauth_bubble_controller_impl.cc
@@ -220,7 +220,7 @@
   return current_bubble_type_;
 }
 
-PageActionIconType
+std::optional<PageActionIconType>
 MandatoryReauthBubbleControllerImpl::GetPageActionIconType() {
   return PageActionIconType::kMandatoryReauth;
 }
diff --git a/chrome/browser/ui/autofill/payments/mandatory_reauth_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/mandatory_reauth_bubble_controller_impl.h
index 1d717fe..e954746 100644
--- a/chrome/browser/ui/autofill/payments/mandatory_reauth_bubble_controller_impl.h
+++ b/chrome/browser/ui/autofill/payments/mandatory_reauth_bubble_controller_impl.h
@@ -58,7 +58,7 @@
       content::WebContents* web_contents);
 
   // AutofillBubbleControllerBase:
-  PageActionIconType GetPageActionIconType() override;
+  std::optional<PageActionIconType> GetPageActionIconType() override;
   void DoShowBubble() override;
   void UpdatePageActionIcon() override;
 
diff --git a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc
index 846486c1..bf9bc458 100644
--- a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc
@@ -7,13 +7,11 @@
 #include <string>
 
 #include "base/check_deref.h"
-#include "base/feature_list.h"
 #include "base/metrics/histogram_functions.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/actions/chrome_action_id.h"
 #include "chrome/browser/ui/autofill/autofill_bubble_base.h"
 #include "chrome/browser/ui/autofill/autofill_bubble_handler.h"
-#include "chrome/browser/ui/autofill/bubble_manager.h"
 #include "chrome/browser/ui/autofill/payments/payments_ui_constants.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_actions.h"
@@ -25,7 +23,6 @@
 #include "components/autofill/core/browser/metrics/autofill_metrics.h"
 #include "components/autofill/core/browser/payments/offer_notification_options.h"
 #include "components/autofill/core/common/autofill_clock.h"
-#include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/commerce/core/commerce_feature_list.h"
 #include "components/strings/grit/components_strings.h"
@@ -144,16 +141,8 @@
     return;
   }
 
-  const bool bubble_manager_enabled = base::FeatureList::IsEnabled(
-      features::kAutofillShowBubblesBasedOnPriorities);
-
-  if (bubble_manager_enabled) {
-    auto* manager = BubbleManager::GetForWebContents(web_contents());
-    if (!manager || manager->HasPendingBubble(*this)) {
-      // Early return if a pre-existing of similar type is in the queue or the
-      // manager does not exist.
-      return;
-    }
+  if (!MaySetUpBubble()) {
+    return;
   }
 
   // Hides the old bubble. Sets bubble_state_ to show icon here since we are
@@ -163,13 +152,7 @@
   SetupOfferNotification(offer, card);
 
   if (options.show_notification_automatically) {
-    if (bubble_manager_enabled) {
-      if (auto* manager = BubbleManager::GetForWebContents(web_contents())) {
-        manager->RequestShowController(*this);
-      }
-    } else {
-      ShowBubble();
-    }
+    QueueOrShowBubble();
   } else {
     HideBubbleAndClearTimestamp(/*should_show_icon=*/true);
   }
@@ -214,7 +197,7 @@
   UpdatePageAction();
 }
 
-PageActionIconType
+std::optional<PageActionIconType>
 OfferNotificationBubbleControllerImpl::GetPageActionIconType() {
   return PageActionIconType::kPaymentsOfferNotification;
 }
diff --git a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.h
index 793df288..4d4380a 100644
--- a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.h
+++ b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.h
@@ -80,7 +80,7 @@
 
   // AutofillBubbleControllerBase:
   void OnVisibilityChanged(content::Visibility visibility) override;
-  PageActionIconType GetPageActionIconType() override;
+  std::optional<PageActionIconType> GetPageActionIconType() override;
   void DoShowBubble() override;
 
   // Returns whether the web content associated with this controller is active.
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
index da2a6e9..7bb19c8 100644
--- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
@@ -752,7 +752,8 @@
   }
 }
 
-PageActionIconType SaveCardBubbleControllerImpl::GetPageActionIconType() {
+std::optional<PageActionIconType>
+SaveCardBubbleControllerImpl::GetPageActionIconType() {
   return PageActionIconType::kSaveCard;
 }
 
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h
index a54a3708..75e179e3 100644
--- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h
+++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h
@@ -172,7 +172,7 @@
 
   // AutofillBubbleControllerBase::
   void OnVisibilityChanged(content::Visibility visibility) override;
-  PageActionIconType GetPageActionIconType() override;
+  std::optional<PageActionIconType> GetPageActionIconType() override;
   void DoShowBubble() override;
 
  private:
diff --git a/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.cc
index fcfc514..bbe213b0 100644
--- a/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.cc
@@ -53,10 +53,15 @@
     const VirtualCardEnrollmentFields& virtual_card_enrollment_fields,
     base::OnceClosure accept_virtual_card_callback,
     base::OnceClosure decline_virtual_card_callback) {
+  if (!MaySetUpBubble()) {
+    return;
+  }
+
   SetupBubble(virtual_card_enrollment_fields,
               std::move(accept_virtual_card_callback),
               std::move(decline_virtual_card_callback));
-  ShowBubble();
+
+  QueueOrShowBubble();
 
   VirtualCardEnrollMetricsLogger::OnCardArtAvailable(
       ui_model_->enrollment_fields().card_art_image,
@@ -106,7 +111,7 @@
                     /*card_label=*/ui_model_->enrollment_fields()
                         .credit_card.NetworkAndLastFourDigits());
   // Show enrollment confirmation bubble.
-  ShowBubble();
+  QueueOrShowBubble();
 #endif
 }
 
@@ -306,7 +311,7 @@
 #endif
 }
 
-PageActionIconType
+std::optional<PageActionIconType>
 VirtualCardEnrollBubbleControllerImpl::GetPageActionIconType() {
   return PageActionIconType::kVirtualCardEnroll;
 }
diff --git a/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.h
index 84da3f25..a730840 100644
--- a/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.h
+++ b/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl.h
@@ -88,7 +88,7 @@
 
   // AutofillBubbleControllerBase::
   void OnVisibilityChanged(content::Visibility visibility) override;
-  PageActionIconType GetPageActionIconType() override;
+  std::optional<PageActionIconType> GetPageActionIconType() override;
   void DoShowBubble() override;
 
  private:
diff --git a/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl_unittest.cc b/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl_unittest.cc
index 358fae84..9358f0c 100644
--- a/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl_unittest.cc
+++ b/chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/check_op.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/with_feature_override.h"
 #include "chrome/browser/ui/autofill/payments/virtual_card_enroll_bubble_controller_impl_test_api.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
@@ -14,6 +15,7 @@
 #include "components/autofill/core/browser/payments/virtual_card_enrollment_flow.h"
 #include "components/autofill/core/browser/payments/virtual_card_enrollment_manager.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
+#include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_payments_features.h"
 #include "content/public/browser/web_contents_user_data.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -138,15 +140,23 @@
 };
 
 class VirtualCardEnrollBubbleControllerImplBubbleViewTest
-    : public BrowserWithTestWindowTest {
+    : public base::test::WithFeatureOverride,
+      public BrowserWithTestWindowTest {
  public:
-  VirtualCardEnrollBubbleControllerImplBubbleViewTest() = default;
+  VirtualCardEnrollBubbleControllerImplBubbleViewTest()
+      : base::test::WithFeatureOverride(
+            features::kAutofillShowBubblesBasedOnPriorities) {}
   VirtualCardEnrollBubbleControllerImplBubbleViewTest(
       VirtualCardEnrollBubbleControllerImplBubbleViewTest&) = delete;
   VirtualCardEnrollBubbleControllerImplBubbleViewTest& operator=(
       VirtualCardEnrollBubbleControllerImplBubbleViewTest&) = delete;
 
   void SetUp() override {
+#if BUILDFLAG(IS_ANDROID)
+    if (GetParam()) {
+      GTEST_SKIP() << "Bubble Manager is not used on Android";
+    }
+#endif
     BrowserWithTestWindowTest::SetUp();
     AddTab(browser(), GURL("about:blank"));
     content::WebContents* web_contents =
@@ -183,7 +193,7 @@
 
 // Ensures that bubble acceptance and loading shown metrics are recorded after
 // bubble is shown and accepted .
-TEST_F(VirtualCardEnrollBubbleControllerImplBubbleViewTest, ShowBubble) {
+TEST_P(VirtualCardEnrollBubbleControllerImplBubbleViewTest, ShowBubble) {
   base::HistogramTester histogram_tester;
   ShowBubble();
   EXPECT_NE(GetBubbleViews(), nullptr);
@@ -206,7 +216,7 @@
 
 // Ensures that bubble acceptance, loading shown, and loading result metrics are
 // recorded when the bubble gets closed from the loading state.
-TEST_F(VirtualCardEnrollBubbleControllerImplBubbleViewTest,
+TEST_P(VirtualCardEnrollBubbleControllerImplBubbleViewTest,
        ShowBubbleInLoadingState) {
   base::HistogramTester histogram_tester;
   ShowBubble();
@@ -231,8 +241,9 @@
 }
 
 #if !BUILDFLAG(IS_ANDROID)
+
 // Tests virtual card enrollment flow with loading and confirmation.
-TEST_F(VirtualCardEnrollBubbleControllerImplBubbleViewTest,
+TEST_P(VirtualCardEnrollBubbleControllerImplBubbleViewTest,
        ShowBubbleInLoadingAndConfirmationState) {
   base::HistogramTester histogram_tester;
   ShowBubble();
@@ -278,7 +289,7 @@
 
 // Test that on getting client-side timeout, virtual card bubble is closed in
 // loading state and confirmation dialog is not shown.
-TEST_F(VirtualCardEnrollBubbleControllerImplBubbleViewTest,
+TEST_P(VirtualCardEnrollBubbleControllerImplBubbleViewTest,
        CloseBubbleInLoadingState_NoConfirmationBubble_ClientSideTimeout) {
   ShowBubble();
   EXPECT_NE(GetBubbleViews(), nullptr);
@@ -292,7 +303,7 @@
 
 // Tests that the correct confirmation result metric is logged when the
 // confirmation bubble is closed after the card is not enrolled.
-TEST_F(VirtualCardEnrollBubbleControllerImplBubbleViewTest,
+TEST_P(VirtualCardEnrollBubbleControllerImplBubbleViewTest,
        Metric_CloseConfirmationBubble_CardNotEnrolled) {
   base::HistogramTester histogram_tester;
 
@@ -307,6 +318,10 @@
       VirtualCardEnrollmentBubbleResult::VIRTUAL_CARD_ENROLLMENT_BUBBLE_CLOSED,
       1);
 }
+
 #endif  // !BUILDFLAG(IS_ANDROID)
+
+INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(
+    VirtualCardEnrollBubbleControllerImplBubbleViewTest);
 }  // namespace
 }  // namespace autofill
diff --git a/chrome/browser/ui/toolbar/BUILD.gn b/chrome/browser/ui/toolbar/BUILD.gn
index ccfdbaf..fab8e92 100644
--- a/chrome/browser/ui/toolbar/BUILD.gn
+++ b/chrome/browser/ui/toolbar/BUILD.gn
@@ -207,6 +207,11 @@
     ]
     if (is_chromeos) {
       deps += [ "//chrome/browser/policy:system_features_disable_list" ]
+    } else {
+      deps += [
+        "//chrome/browser/ui/webui/signin:signin_ui_error",
+        "//chrome/browser/ui/webui/signin:signin_utils",
+      ]
     }
     if (enable_glic) {
       deps += [
diff --git a/chrome/browser/ui/toolbar/app_menu_model.cc b/chrome/browser/ui/toolbar/app_menu_model.cc
index de6b83f1..b910149 100644
--- a/chrome/browser/ui/toolbar/app_menu_model.cc
+++ b/chrome/browser/ui/toolbar/app_menu_model.cc
@@ -80,6 +80,7 @@
 #include "chrome/browser/ui/web_applications/web_app_dialog_utils.h"
 #include "chrome/browser/ui/web_applications/web_app_launch_utils.h"
 #include "chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.h"
+#include "chrome/browser/ui/webui/signin/signin_utils_desktop.h"
 #include "chrome/browser/ui/webui/whats_new/whats_new_util.h"
 #include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
@@ -158,6 +159,9 @@
 #include "chrome/browser/policy/system_features_disable_list_policy_handler.h"
 #include "components/policy/core/common/policy_pref_names.h"
 #include "ui/display/screen.h"
+#else
+#include "chrome/browser/ui/webui/signin/signin_ui_error.h"
+#include "chrome/browser/ui/webui/signin/signin_utils_desktop.h"
 #endif
 
 #if BUILDFLAG(IS_WIN)
@@ -597,9 +601,14 @@
 }
 
 bool ProfileSubMenuModel::BuildSyncSection() {
-  if (!profile_->GetPrefs()->GetBoolean(prefs::kSigninAllowed)) {
+#if !BUILDFLAG(IS_CHROMEOS)
+  // TODO(crbug.com/440342282): Support personalized signin button.
+  if (!CanOfferSignin(profile_, GaiaId(), /*email=*/std::string(),
+                      /*allow_account_from_other_profile=*/true)
+           .IsOk()) {
     return false;
   }
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
   if (!SyncServiceFactory::IsSyncAllowed(profile_)) {
     return false;
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view.cc b/chrome/browser/ui/views/profiles/profile_menu_view.cc
index f2f489f..5bcf178 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view.cc
@@ -69,8 +69,9 @@
 #include "chrome/browser/ui/views/controls/hover_button.h"
 #include "chrome/browser/ui/views/profiles/badged_profile_photo.h"
 #include "chrome/browser/ui/web_applications/app_browser_controller.h"
+#include "chrome/browser/ui/webui/signin/signin_ui_error.h"
+#include "chrome/browser/ui/webui/signin/signin_utils_desktop.h"
 #include "chrome/common/pref_names.h"
-#include "chrome/common/url_constants.h"
 #include "chrome/grit/branded_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/grit/theme_resources.h"
@@ -683,10 +684,28 @@
       signin_metrics::AccessPoint::kAvatarBubbleSignIn;
   switch (signin_util::GetSignedInState(identity_manager)) {
     case signin_util::SignedInState::kSignedOut:
-      if (profile().GetPrefs()->GetBoolean(prefs::kSigninAllowed)) {
+    case signin_util::SignedInState::kWebOnlySignedIn: {
+      AccountInfo account_info_for_promos =
+          signin_ui_util::GetSingleAccountForPromos(identity_manager);
+      if (!CanOfferSignin(&profile(), account_info_for_promos.gaia,
+                          account_info_for_promos.email,
+                          /*allow_account_from_other_profile=*/true)
+               .IsOk()) {
+        break;
+      }
+
+      access_point =
+          signin_metrics::AccessPoint::kAvatarBubbleSignInWithSyncPromo;
+      signin_metrics::LogSignInOffered(
+          explicit_signin_access_point_.value_or(access_point),
+          account_info_for_promos.IsEmpty()
+              ? signin_metrics::PromoAction::
+                    PROMO_ACTION_NEW_ACCOUNT_NO_EXISTING_ACCOUNT
+              : signin_metrics::PromoAction::PROMO_ACTION_WITH_DEFAULT);
+
+      if (account_info_for_promos.IsEmpty()) {
+        // Non-personalized signin button.
         button_type = ActionableItem::kSigninButton;
-        access_point =
-            signin_metrics::AccessPoint::kAvatarBubbleSignInWithSyncPromo;
         params.subtitle = l10n_util::GetStringUTF16(
             base::FeatureList::IsEnabled(
                 syncer::kReplaceSyncPromosWithSignInPromos)
@@ -694,17 +713,9 @@
                 : IDS_PROFILE_MENU_SIGNIN_PROMO_DESCRIPTION);
         params.button_text =
             l10n_util::GetStringUTF16(IDS_PROFILE_MENU_SIGNIN_PROMO_BUTTON);
-        signin_metrics::LogSignInOffered(
-            explicit_signin_access_point_.value_or(access_point),
-            signin_metrics::PromoAction::
-                PROMO_ACTION_NEW_ACCOUNT_NO_EXISTING_ACCOUNT);
+        break;
       }
-      break;
-    case signin_util::SignedInState::kWebOnlySignedIn: {
-      access_point =
-          signin_metrics::AccessPoint::kAvatarBubbleSignInWithSyncPromo;
-      AccountInfo account_info_for_promos =
-          signin_ui_util::GetSingleAccountForPromos(identity_manager);
+      // "Continue as" signin button.
       account_info_for_signin_action = account_info_for_promos;
       params.subtitle = l10n_util::GetStringFUTF16(
           base::FeatureList::IsEnabled(
@@ -738,9 +749,6 @@
               account_image,
               /*width=*/kIdentityImageSizeForButton,
               /*height=*/kIdentityImageSizeForButton, profiles::SHAPE_CIRCLE));
-      signin_metrics::LogSignInOffered(
-          explicit_signin_access_point_.value_or(access_point),
-          signin_metrics::PromoAction::PROMO_ACTION_WITH_DEFAULT);
       break;
     }
     case signin_util::SignedInState::kSignedIn:
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
index e5e51fc..acaf091 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
@@ -97,7 +97,9 @@
 #include "components/signin/public/base/consent_level.h"
 #include "components/signin/public/base/signin_pref_names.h"
 #include "components/signin/public/base/signin_switches.h"
+#include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h"
 #include "components/signin/public/identity_manager/identity_test_utils.h"
+#include "components/signin/public/identity_manager/identity_utils.h"
 #include "components/signin/public/identity_manager/primary_account_mutator.h"
 #include "components/supervised_user/core/browser/family_link_user_capabilities.h"
 #include "components/supervised_user/test_support/supervised_user_signin_test_utils.h"
@@ -112,6 +114,7 @@
 #include "content/public/test/test_navigation_observer.h"
 #include "content/public/test/test_utils.h"
 #include "extensions/browser/extension_registry.h"
+#include "google_apis/gaia/gaia_auth_util.h"
 #include "google_apis/gaia/gaia_switches.h"
 #include "google_apis/gaia/gaia_urls.h"
 #include "google_apis/gaia/google_service_auth_error.h"
@@ -270,6 +273,11 @@
     ASSERT_TRUE(avatar_button);
     Click(avatar_button);
     ASSERT_NO_FATAL_FAILURE(WaitForMenuToBeActive(profile_menu_view()));
+
+    // A HoverButton may have focused itself if the mouse happened to be over it
+    // when it became visible. Clear the focus now to ensure that we advance to
+    // the right item.
+    profile_menu_view()->GetFocusManager()->ClearFocus();
   }
 
   ProfileMenuViewBase* profile_menu_view() {
@@ -809,6 +817,10 @@
 
     ASSERT_FALSE(
         identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin));
+    signin::AccountsInCookieJarInfo cookie_info =
+        identity_manager->GetAccountsInCookieJar();
+    ASSERT_EQ(cookie_info.GetAllAccounts().size(), 1u);
+
     ASSERT_EQ(identity_manager->GetAccountsWithRefreshTokens().size(), 1u);
   }
 
@@ -849,6 +861,10 @@
                        /*is_sync_promo=*/true,
                        /*user_already_signed_in=*/false));
   ClickSigninButton();
+  EXPECT_EQ(IdentityManagerFactory::GetForProfile(browser()->profile())
+                ->GetPrimaryAccountId(signin::ConsentLevel::kSignin),
+            account_info_.account_id);
+
   // `Signin.SyncOptIn.Offered` should NOT be recorded if the sync opt-in is
   // not directly offered from the profile menu.
   histogram_tester.ExpectUniqueSample("Signin.SyncOptIn.Offered",
@@ -864,6 +880,54 @@
                                       /*expected_bucket_count=*/1);
 }
 
+// The user has a primary web account that cannot be used to sign in due to a
+// policy pattern, but they have a secondary account that can be used. The
+// "Continue as" button is shown, and clicking it uses the secondary account.
+IN_PROC_BROWSER_TEST_F(ProfileMenuViewWebOnlyTest,
+                       SigninPatternDisallowedSecondaryAllowed) {
+  // Check that the setup was successful.
+  PrefService* local_state = g_browser_process->local_state();
+  constexpr char kAccountAllowed[] = "foo@signinallowed.com";
+  const CoreAccountInfo& disallowed_account = account_info_;
+  ASSERT_TRUE(signin::IsUsernameAllowedByPatternFromPrefs(local_state,
+                                                          kAccountAllowed));
+  ASSERT_FALSE(signin::IsUsernameAllowedByPatternFromPrefs(
+      local_state, disallowed_account.email));
+
+  // Add an account, not signed in, and allowed to sign in.
+  signin::IdentityManager* identity_manager =
+      IdentityManagerFactory::GetForProfile(browser()->profile());
+  AccountInfo allowed_account = signin::MakeAccountAvailable(
+      identity_manager,
+      signin::AccountAvailabilityOptionsBuilder()
+          .WithAccessPoint(signin_metrics::AccessPoint::kWebSignin)
+          .Build(kAccountAllowed));
+  signin::SetCookieAccounts(
+      identity_manager, test_url_loader_factory(),
+      {{disallowed_account.email, disallowed_account.gaia},
+       {allowed_account.email, allowed_account.gaia}});
+  ASSERT_FALSE(
+      identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin));
+  ASSERT_EQ(identity_manager->GetAccountsWithRefreshTokens().size(), 2u);
+  signin::AccountsInCookieJarInfo cookie_info =
+      identity_manager->GetAccountsInCookieJar();
+  ASSERT_EQ(cookie_info.GetAllAccounts().size(), 2u);
+  // Disallowed account is the first in cookies.
+  ASSERT_EQ(cookie_info.GetAllAccounts()[0].email, disallowed_account.email);
+
+  ClickSigninButton();
+
+  EXPECT_EQ(
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin),
+      allowed_account.account_id);
+}
+
+IN_PROC_BROWSER_TEST_F(ProfileMenuViewWebOnlyTest,
+                       PRE_SigninPatternDisallowedSecondaryAllowed) {
+  g_browser_process->local_state()->SetString(
+      prefs::kGoogleServicesUsernamePattern, "*@signinallowed.com");
+}
+
 class ProfileMenuViewSigninPendingTest : public ProfileMenuViewTestBase,
                                          public InProcessBrowserTest {
  public:
@@ -1036,11 +1100,6 @@
   void RunTest() {
     ASSERT_NO_FATAL_FAILURE(OpenProfileMenu());
 
-    // A HoverButton may have focused itself if the mouse happened to be over it
-    // when it became visible. Clear the focus now to ensure that we advance to
-    // the right item.
-    profile_menu_view()->GetFocusManager()->ClearFocus();
-
     // These tests don't care about performing the actual menu actions, only
     // about the histogram recorded.
     ASSERT_TRUE(profile_menu_view());
@@ -1228,6 +1287,8 @@
       identity_manager,
       builder.WithAccessPoint(signin_metrics::AccessPoint::kWebSignin)
           .Build(kTestEmail));
+  signin::SetCookieAccounts(identity_manager, &test_url_loader_factory_,
+                            {{account_info.email, account_info.gaia}});
   ASSERT_FALSE(
       identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin));
   ASSERT_EQ(identity_manager->GetAccountsWithRefreshTokens().size(), 1u);
@@ -1360,6 +1421,130 @@
       prefs::kSigninAllowedOnNextStartup, false);
 }
 
+// List of actionable items in the correct order as they appear in the menu when
+// the web account is disallowed by pattern. If a new button is added to the
+// menu, it should also be added to this list.
+constexpr std::array kActionableItems_SigninPatternDisallowed = {
+    // Non-personalized signin button.
+    ProfileMenuViewBase::ActionableItem::kSigninButton,
+    ProfileMenuViewBase::ActionableItem::kAutofillSettingsButton,
+    ProfileMenuViewBase::ActionableItem::kEditProfileButton,
+    ProfileMenuViewBase::ActionableItem::kSyncSettingsButton,
+    ProfileMenuViewBase::ActionableItem::kAddNewProfileButton,
+    ProfileMenuViewBase::ActionableItem::kGuestProfileButton,
+    ProfileMenuViewBase::ActionableItem::kManageProfilesButton,
+    // The first button is added again to finish the cycle and test that
+    // there are no other buttons at the end.
+    ProfileMenuViewBase::ActionableItem::kSigninButton};
+
+// In this test, the user has an account on the web, but this account is not
+// allowed to be signed in due to a pattern set by policy.
+// The test checks that a generic non-personalized button is shown in the menu
+// -- as opposed to a personalized "Continue as" button. This is checked by
+// verifying that the first item in the menu is `kSigninButton`, and not
+// `kSigninAccountButton`.
+PROFILE_MENU_CLICK_TEST(kActionableItems_SigninPatternDisallowed,
+                        ProfileMenuClickTest_SigninPatternDisallowed) {
+  // Check that the setup was successful.
+  PrefService* local_state = g_browser_process->local_state();
+  constexpr char kAccountNotAllowed[] = "foo@notallowed.com";
+  ASSERT_TRUE(signin::IsUsernameAllowedByPatternFromPrefs(
+      local_state, "foo@signinallowed.com"));
+  ASSERT_FALSE(signin::IsUsernameAllowedByPatternFromPrefs(local_state,
+                                                           kAccountNotAllowed));
+
+  // Add an account, not signed in.
+  signin::IdentityManager* identity_manager =
+      IdentityManagerFactory::GetForProfile(browser()->profile());
+  signin::AccountAvailabilityOptionsBuilder builder;
+  AccountInfo account_info = signin::MakeAccountAvailable(
+      identity_manager,
+      builder.WithAccessPoint(signin_metrics::AccessPoint::kWebSignin)
+          .Build(kAccountNotAllowed));
+  signin::SetCookieAccounts(identity_manager, &test_url_loader_factory_,
+                            {{account_info.email, account_info.gaia}});
+  ASSERT_FALSE(
+      identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin));
+  ASSERT_EQ(identity_manager->GetAccountsWithRefreshTokens().size(), 1u);
+
+  RunTest();
+}
+
+IN_PROC_BROWSER_TEST_P(ProfileMenuClickTest_SigninPatternDisallowed,
+                       PRE_ProfileMenuClickTest_SigninPatternDisallowed) {
+  g_browser_process->local_state()->SetString(
+      prefs::kGoogleServicesUsernamePattern, "*@signinallowed.com");
+}
+
+// List of actionable items in the correct order as they appear in the menu when
+// the web account is disallowed by pattern, but a secondary account is allowed.
+// If a new button is added to the menu, it should also be added to this list.
+constexpr std::array kActionableItems_SigninPatternDisallowedSecondaryAllowed =
+    {
+        // Personalized signin button.
+        ProfileMenuViewBase::ActionableItem::kSigninAccountButton,
+        ProfileMenuViewBase::ActionableItem::kAutofillSettingsButton,
+        ProfileMenuViewBase::ActionableItem::kEditProfileButton,
+        ProfileMenuViewBase::ActionableItem::kSyncSettingsButton,
+        ProfileMenuViewBase::ActionableItem::kAddNewProfileButton,
+        ProfileMenuViewBase::ActionableItem::kGuestProfileButton,
+        ProfileMenuViewBase::ActionableItem::kManageProfilesButton,
+        // The first button is added again to finish the cycle and test that
+        // there are no other buttons at the end.
+        ProfileMenuViewBase::ActionableItem::kSigninAccountButton};
+
+// This test is similar to the previous one, but the user has a secondary
+// account that is allowed. The first button is now `kSigninAccountButton` which
+// is "Continue as". Clicking the button would sign the user in with the allowed
+// account, but this test does not actually check that.
+PROFILE_MENU_CLICK_TEST(
+    kActionableItems_SigninPatternDisallowedSecondaryAllowed,
+    ProfileMenuClickTest_SigninPatternDisallowedSecondaryAllowed) {
+  // Check that the setup was successful.
+  PrefService* local_state = g_browser_process->local_state();
+  constexpr char kAccountNotAllowed[] = "foo@notallowed.com";
+  constexpr char kAccountAllowed[] = "foo@signinallowed.com";
+  ASSERT_TRUE(signin::IsUsernameAllowedByPatternFromPrefs(local_state,
+                                                          kAccountAllowed));
+  ASSERT_FALSE(signin::IsUsernameAllowedByPatternFromPrefs(local_state,
+                                                           kAccountNotAllowed));
+
+  // Add an account, not signed in.
+  signin::IdentityManager* identity_manager =
+      IdentityManagerFactory::GetForProfile(browser()->profile());
+  AccountInfo disallowed_account = signin::MakeAccountAvailable(
+      identity_manager,
+      signin::AccountAvailabilityOptionsBuilder()
+          .WithAccessPoint(signin_metrics::AccessPoint::kWebSignin)
+          .Build(kAccountNotAllowed));
+  AccountInfo allowed_account = signin::MakeAccountAvailable(
+      identity_manager,
+      signin::AccountAvailabilityOptionsBuilder()
+          .WithAccessPoint(signin_metrics::AccessPoint::kWebSignin)
+          .Build(kAccountAllowed));
+  signin::SetCookieAccounts(
+      identity_manager, &test_url_loader_factory_,
+      {{disallowed_account.email, disallowed_account.gaia},
+       {allowed_account.email, allowed_account.gaia}});
+  ASSERT_FALSE(
+      identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin));
+  ASSERT_EQ(identity_manager->GetAccountsWithRefreshTokens().size(), 2u);
+  signin::AccountsInCookieJarInfo cookie_info =
+      identity_manager->GetAccountsInCookieJar();
+  ASSERT_EQ(cookie_info.GetAllAccounts().size(), 2u);
+  // Disallowed account is the first in cookies.
+  ASSERT_EQ(cookie_info.GetAllAccounts()[0].email, kAccountNotAllowed);
+
+  RunTest();
+}
+
+IN_PROC_BROWSER_TEST_P(
+    ProfileMenuClickTest_SigninPatternDisallowedSecondaryAllowed,
+    PRE_ProfileMenuClickTest_SigninPatternDisallowedSecondaryAllowed) {
+  g_browser_process->local_state()->SetString(
+      prefs::kGoogleServicesUsernamePattern, "*@signinallowed.com");
+}
+
 // List of actionable items in the correct order as they appear in the menu. If
 // a new button is added to the menu, it should also be added to this list.
 constexpr std::array kActionableItems_WithUnconsentedPrimaryAccount = {
diff --git a/chrome/browser/ui/views/webauthn/combined_selector_views.cc b/chrome/browser/ui/views/webauthn/combined_selector_views.cc
index 17ce0fa..cba2343 100644
--- a/chrome/browser/ui/views/webauthn/combined_selector_views.cc
+++ b/chrome/browser/ui/views/webauthn/combined_selector_views.cc
@@ -263,6 +263,8 @@
         CombinedSelectorSheetModel::SelectionStatus::kSelected) {
       selected_view_ = row;
     }
+
+    SetOwnedGroup(kGroupId);
   }
 
   if (num_mechanisms > 1) {
diff --git a/chrome/browser/ui/webui/new_tab_page/webui_ntp_browsertest.cc b/chrome/browser/ui/webui/new_tab_page/webui_ntp_browsertest.cc
index e11054ae..4d773ae 100644
--- a/chrome/browser/ui/webui/new_tab_page/webui_ntp_browsertest.cc
+++ b/chrome/browser/ui/webui/new_tab_page/webui_ntp_browsertest.cc
@@ -274,8 +274,9 @@
   base::test::ScopedFeatureList feature_list_;
 };
 
+// TODO(crbug.com/442038064): Re-enable once flakiness is addressed.
 IN_PROC_BROWSER_TEST_P(WebUiNtpEnterpriseShortcutsBrowserTest,
-                       EnterpriseShortcuts) {
+                       DISABLED_EnterpriseShortcuts) {
   // 1. Set the user preference to use enterprise shortcuts.
   browser()->profile()->GetPrefs()->SetInteger(
       ntp_prefs::kNtpShortcutsType,
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler.cc b/chrome/browser/ui/webui/settings/site_settings_handler.cc
index f3dee34..be274ef 100644
--- a/chrome/browser/ui/webui/settings/site_settings_handler.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_handler.cc
@@ -1644,7 +1644,21 @@
       PermissionDecisionAutoBlockerFactory::GetForProfile(profile_)
           ->RemoveEmbargoAndResetCounts(origin, content_type);
     }
-    map->SetContentSettingDefaultScope(origin, origin, content_type, setting);
+
+    content_settings::ContentSettingConstraints constraints;
+
+    // Enable last-visit tracking for eligible permissions granted from
+    // Site Settings UI. This allows Safety Hub to auto-revoke the permission
+    // if the site is not visited for a finite amount of time.
+    if (base::FeatureList::IsEnabled(
+            features::kSafetyHubUnusedPermissionRevocationForAllSurfaces) &&
+        content_settings::CanBeAutoRevokedAsUnusedPermission(
+            content_type, content_settings::ContentSettingToValue(setting))) {
+      constraints.set_track_last_visit_for_autoexpiration(true);
+    }
+
+    map->SetContentSettingDefaultScope(origin, origin, content_type, setting,
+                                       constraints);
 
     const content_settings::WebsiteSettingsInfo::ScopingType scoping_type =
         content_settings::WebsiteSettingsRegistry::GetInstance()
@@ -1859,8 +1873,20 @@
           target_profile, primary_pattern, secondary_pattern, content_type,
           permissions::PermissionSourceUI::SITE_SETTINGS);
 
+  content_settings::ContentSettingConstraints constraints;
+
+  // Enable last-visit tracking for eligible permissions granted from
+  // Site Settings UI. This allows Safety Hub to auto-revoke the permission
+  // if the site is not visited for a finite amount of time.
+  if (base::FeatureList::IsEnabled(
+          features::kSafetyHubUnusedPermissionRevocationForAllSurfaces) &&
+      content_settings::CanBeAutoRevokedAsUnusedPermission(
+          content_type, content_settings::ContentSettingToValue(setting))) {
+    constraints.set_track_last_visit_for_autoexpiration(true);
+  }
+
   map->SetContentSettingCustomScope(primary_pattern, secondary_pattern,
-                                    content_type, setting);
+                                    content_type, setting, constraints);
 
   // Record which type of exception pattern was entered.
   if (primary_pattern == ContentSettingsPattern::Wildcard() ||
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
index aa5a236..5231ee9 100644
--- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -340,6 +340,9 @@
 
 class SiteSettingsHandlerBaseTest : public testing::Test {
  public:
+  // Defer any initialization and setup to SetUp(). This is done so that
+  // subclasses can configure feature flags in their constructor, before the
+  // test environment is fully established.
   SiteSettingsHandlerBaseTest() = default;
 
   void SetUp() override {
@@ -1018,6 +1021,9 @@
   const std::string_view kStorageAccess =
       site_settings::ContentSettingsTypeToGroupName(
           ContentSettingsType::STORAGE_ACCESS);
+  const std::string_view kGeolocation =
+      site_settings::ContentSettingsTypeToGroupName(
+          ContentSettingsType::GEOLOCATION);
 
   const ContentSettingsType kPermissionNotifications =
       ContentSettingsType::NOTIFICATIONS;
@@ -6671,4 +6677,244 @@
                     ContentSettingsType::GEOLOCATION));
 #endif
 
+// Test suite for verifying that permissions granted through Site Settings
+// surfaces are correctly marked as eligible for Safety Hub auto-revocation
+// when the kSafetyHubUnusedPermissionRevocationForAllSurfaces flag is enabled.
+//
+// Only permissions of certain `ContentSettingType` are eligible. They are
+// marked as such upon grant by initializing the `last_visited` timestamp from
+// a default null value to the (coarsened) current time. Once initialized, the
+// timestamp is updated on each navigation to the origin for which the
+// permission was granted. Then permissions with a `last_visited` timestamp
+// older than a certain threshold are eventually auto-revoked by Safety Hub.
+class SiteSettingsHandlerUnusedPermissionRevocationForAllSurfacesTest
+    : public SiteSettingsHandlerBaseTest {
+ public:
+  SiteSettingsHandlerUnusedPermissionRevocationForAllSurfacesTest() {
+    feature_list_.InitAndEnableFeature(
+        features::kSafetyHubUnusedPermissionRevocationForAllSurfaces);
+  }
+
+ protected:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+TEST_F(SiteSettingsHandlerUnusedPermissionRevocationForAllSurfacesTest,
+       SetOriginPermissions_LastVisitedTracked) {
+  const GURL primary_url("https://example.com");
+  const GURL secondary_url;
+  base::Time now = base::Time::Now();
+
+  // Allow GEOLOCATION for an origin from Site Settings UI.
+  base::Value::List reset_args;
+  reset_args.Append(primary_url.spec());
+  reset_args.Append(std::move(kGeolocation));
+  reset_args.Append(
+      content_settings::ContentSettingToString(CONTENT_SETTING_ALLOW));
+  handler()->HandleSetOriginPermissions(reset_args);
+
+  // Verify that 'last_visited` was recorded and lies within the past 7 days.
+  //
+  // The `last_visited` is coarsed by `GetCoarseVisitedTime` [1] due to privacy.
+  // It rounds given timestamp down to the nearest multiple of 7 in the past.
+  // [1] components/content_settings/core/browser/content_settings_utils.cc
+  content_settings::SettingInfo info;
+  HostContentSettingsMap* map =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+  map->GetWebsiteSetting(primary_url, secondary_url,
+                         ContentSettingsType::GEOLOCATION, &info);
+  EXPECT_GE(info.metadata.last_visited(), now - base::Days(7));
+  EXPECT_LE(info.metadata.last_visited(), now);
+}
+
+TEST_F(SiteSettingsHandlerUnusedPermissionRevocationForAllSurfacesTest,
+       SetOriginPermissions_LastVisitedNotTracked_WrongValue) {
+  const GURL primary_url("https://example.com");
+  const GURL secondary_url;
+
+  // Block GEOLOCATION for an origin from Site Settings UI.
+  base::Value::List reset_args;
+  reset_args.Append(primary_url.spec());
+  reset_args.Append(std::move(kGeolocation));
+  reset_args.Append(
+      content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
+  handler()->HandleSetOriginPermissions(reset_args);
+
+  // Verify that 'last_visited` is not recorded unless the value is ALLOW.
+  content_settings::SettingInfo info;
+  HostContentSettingsMap* map =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+  map->GetWebsiteSetting(primary_url, secondary_url,
+                         ContentSettingsType::GEOLOCATION, &info);
+  EXPECT_EQ(base::Time(), info.metadata.last_visited());
+}
+
+TEST_F(SiteSettingsHandlerUnusedPermissionRevocationForAllSurfacesTest,
+       SetOriginPermissions_LastVisitedNotTracked_WrongType) {
+  const GURL primary_url("https://example.com");
+  const GURL secondary_url;
+
+  // Allow NOTIFICATIONS an origin from Site Settings UI.
+  base::Value::List reset_args;
+  reset_args.Append(primary_url.spec());
+  reset_args.Append(std::move(kNotifications));
+  reset_args.Append(
+      content_settings::ContentSettingToString(CONTENT_SETTING_ALLOW));
+  handler()->HandleSetOriginPermissions(reset_args);
+
+  // Verify that 'last_visited` is not recorded for ineligible types
+  // (e.g. NOTIFICATIONS).
+  content_settings::SettingInfo info;
+  HostContentSettingsMap* map =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+  map->GetWebsiteSetting(primary_url, secondary_url,
+                         ContentSettingsType::NOTIFICATIONS, &info);
+  EXPECT_EQ(base::Time(), info.metadata.last_visited());
+}
+
+TEST_F(SiteSettingsHandlerUnusedPermissionRevocationForAllSurfacesTest,
+       SetOriginPermissions_LastVisitedNotTracked_FeatureOff) {
+  feature_list_.Reset();
+  feature_list_.InitAndDisableFeature(
+      features::kSafetyHubUnusedPermissionRevocationForAllSurfaces);
+
+  const GURL primary_url("https://example.com");
+  const GURL secondary_url;
+
+  // Allow GEOLOCATION an origin from Site Settings UI.
+  base::Value::List reset_args;
+  reset_args.Append(primary_url.spec());
+  reset_args.Append(std::move(kGeolocation));
+  reset_args.Append(
+      content_settings::ContentSettingToString(CONTENT_SETTING_ALLOW));
+  handler()->HandleSetOriginPermissions(reset_args);
+
+  // Verify that 'last_visited` is not recorded when the feature is off.
+  content_settings::SettingInfo info;
+  HostContentSettingsMap* map =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+  map->GetWebsiteSetting(primary_url, secondary_url,
+                         ContentSettingsType::GEOLOCATION, &info);
+  EXPECT_EQ(base::Time(), info.metadata.last_visited());
+}
+
+TEST_F(SiteSettingsHandlerUnusedPermissionRevocationForAllSurfacesTest,
+       SetCategoryPermissionForPattern_LastVisitedTracked) {
+  constexpr char kOrigin[] = "https://www.google.com";
+  const std::string primary_pattern(kOrigin);
+  const std::string secondary_pattern;
+  const GURL primary_url(kOrigin);
+  const GURL secondary_url;
+  base::Time now = base::Time::Now();
+
+  // Allow GEOLOCATION for a pattern from Site Settings UI.
+  base::Value::List set_args;
+  set_args.Append(primary_pattern);
+  set_args.Append(secondary_pattern);
+  set_args.Append(kGeolocation);
+  set_args.Append(
+      content_settings::ContentSettingToString(CONTENT_SETTING_ALLOW));
+  set_args.Append(false);  // Incognito.
+  handler()->HandleSetCategoryPermissionForPattern(set_args);
+
+  // Verify that 'last_visited` was recorded and lies within the past 7 days.
+  //
+  // The `last_visited` is coarsed by `GetCoarseVisitedTime` [1] due to privacy.
+  // It rounds given timestamp down to the nearest multiple of 7 in the past.
+  // [1] components/content_settings/core/browser/content_settings_utils.cc
+  content_settings::SettingInfo info;
+  HostContentSettingsMap* map =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+  map->GetWebsiteSetting(primary_url, secondary_url,
+                         ContentSettingsType::GEOLOCATION, &info);
+  EXPECT_GE(info.metadata.last_visited(), now - base::Days(7));
+  EXPECT_LE(info.metadata.last_visited(), now);
+}
+
+TEST_F(SiteSettingsHandlerUnusedPermissionRevocationForAllSurfacesTest,
+       SetCategoryPermissionForPattern_LastVisitedTracked_WrongValue) {
+  constexpr char kOrigin[] = "https://www.google.com";
+  const std::string primary_pattern(kOrigin);
+  const std::string secondary_pattern;
+  const GURL primary_url(kOrigin);
+  const GURL secondary_url;
+
+  // Block GEOLOCATION for a pattern from Site Settings UI.
+  base::Value::List set_args;
+  set_args.Append(primary_pattern);
+  set_args.Append(secondary_pattern);
+  set_args.Append(kGeolocation);
+  set_args.Append(
+      content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
+  set_args.Append(false);  // Incognito.
+  handler()->HandleSetCategoryPermissionForPattern(set_args);
+
+  // Verify that 'last_visited` is not recorded unless the value is ALLOW.
+  content_settings::SettingInfo info;
+  HostContentSettingsMap* map =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+  map->GetWebsiteSetting(primary_url, secondary_url,
+                         ContentSettingsType::GEOLOCATION, &info);
+  EXPECT_EQ(base::Time(), info.metadata.last_visited());
+}
+
+TEST_F(SiteSettingsHandlerUnusedPermissionRevocationForAllSurfacesTest,
+       SetCategoryPermissionForPattern_LastVisitedTracked_WrongType) {
+  constexpr char kOrigin[] = "https://www.google.com";
+  const std::string primary_pattern(kOrigin);
+  const std::string secondary_pattern;
+  const GURL primary_url(kOrigin);
+  const GURL secondary_url;
+
+  // Allow NOTIFICATIONS for a pattern from Site Settings UI.
+  base::Value::List set_args;
+  set_args.Append(primary_pattern);
+  set_args.Append(secondary_pattern);
+  set_args.Append(kNotifications);
+  set_args.Append(
+      content_settings::ContentSettingToString(CONTENT_SETTING_ALLOW));
+  set_args.Append(false);  // Incognito.
+  handler()->HandleSetCategoryPermissionForPattern(set_args);
+
+  // Verify that 'last_visited` is not recorded for ineligible types
+  // (e.g. NOTIFICATIONS).
+  content_settings::SettingInfo info;
+  HostContentSettingsMap* map =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+  map->GetWebsiteSetting(primary_url, secondary_url,
+                         ContentSettingsType::NOTIFICATIONS, &info);
+  EXPECT_EQ(base::Time(), info.metadata.last_visited());
+}
+
+TEST_F(SiteSettingsHandlerUnusedPermissionRevocationForAllSurfacesTest,
+       SetCategoryPermissionForPattern_LastVisitedTracked_FeatureOff) {
+  feature_list_.Reset();
+  feature_list_.InitAndDisableFeature(
+      features::kSafetyHubUnusedPermissionRevocationForAllSurfaces);
+
+  constexpr char kOrigin[] = "https://www.google.com";
+  const std::string primary_pattern(kOrigin);
+  const std::string secondary_pattern;
+  const GURL primary_url(kOrigin);
+  const GURL secondary_url;
+
+  // Allow GEOLOCATION for a pattern from Site Settings UI.
+  base::Value::List set_args;
+  set_args.Append(primary_pattern);
+  set_args.Append(secondary_pattern);
+  set_args.Append(kGeolocation);
+  set_args.Append(
+      content_settings::ContentSettingToString(CONTENT_SETTING_ALLOW));
+  set_args.Append(false);  // Incognito.
+  handler()->HandleSetCategoryPermissionForPattern(set_args);
+
+  // Verify that 'last_visited` is not recorded when the feature is off.
+  content_settings::SettingInfo info;
+  HostContentSettingsMap* map =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+  map->GetWebsiteSetting(primary_url, secondary_url,
+                         ContentSettingsType::GEOLOCATION, &info);
+  EXPECT_EQ(base::Time(), info.metadata.last_visited());
+}
+
 }  // namespace settings
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn
index c32e4cd..e9799ba2 100644
--- a/chrome/browser/web_applications/BUILD.gn
+++ b/chrome/browser/web_applications/BUILD.gn
@@ -890,6 +890,7 @@
     "isolated_web_apps/isolated_web_app_url_info_unittest.cc",
     "isolated_web_apps/isolated_web_app_url_loader_factory_unittest.cc",
     "isolated_web_apps/key_distribution/iwa_key_distribution_info_provider_unittest.cc",
+    "isolated_web_apps/manifest_update_unittest.cc",
     "isolated_web_apps/pending_install_info_unittest.cc",
     "isolated_web_apps/policy/isolated_web_app_external_install_options_unittest.cc",
     "isolated_web_apps/policy/isolated_web_app_installer_unittest.cc",
diff --git a/chrome/browser/web_applications/isolated_web_apps/manifest_update_unittest.cc b/chrome/browser/web_applications/isolated_web_apps/manifest_update_unittest.cc
new file mode 100644
index 0000000..cc59bb66
--- /dev/null
+++ b/chrome/browser/web_applications/isolated_web_apps/manifest_update_unittest.cc
@@ -0,0 +1,166 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <memory>
+#include <string_view>
+#include <vector>
+
+#include "base/check_deref.h"
+#include "base/test/task_environment.h"
+#include "base/time/time.h"
+#include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_discovery_task.h"
+#include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_manager.h"
+#include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_info.h"
+#include "chrome/browser/web_applications/isolated_web_apps/isolation_data.h"
+#include "chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.h"
+#include "chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_test.h"
+#include "chrome/browser/web_applications/isolated_web_apps/test/iwa_test_server_configurator.h"
+#include "chrome/browser/web_applications/isolated_web_apps/test/policy_test_utils.h"
+#include "chrome/browser/web_applications/test/fake_web_app_provider.h"
+#include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
+#include "chrome/browser/web_applications/test/web_app_test_observers.h"
+#include "chrome/browser/web_applications/web_app.h"
+#include "chrome/browser/web_applications/web_app_registrar.h"
+#include "components/web_package/signed_web_bundles/signed_web_bundle_id.h"
+#include "components/webapps/common/web_app_id.h"
+#include "components/webapps/isolated_web_apps/test_support/signing_keys.h"
+#include "components/webapps/isolated_web_apps/types/iwa_version.h"
+#include "components/webapps/isolated_web_apps/types/update_channel.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/safe_url_pattern.h"
+#include "third_party/liburlpattern/part.h"
+
+namespace web_app {
+
+using testing::ElementsAre;
+using testing::IsEmpty;
+
+namespace {
+
+// The update channel used in tests. Could be any channel.
+UpdateChannel StableChannel() {
+  return UpdateChannel::Create("stable").value();
+}
+
+web_package::SignedWebBundleId TestIwaWebBundleId() {
+  return test::GetDefaultEd25519WebBundleId();
+}
+
+webapps::AppId GetAppId(web_package::SignedWebBundleId web_bundle_id) {
+  return IsolatedWebAppUrlInfo::CreateFromSignedWebBundleId(web_bundle_id)
+      .app_id();
+}
+
+const WebApp& GetAppById(FakeWebAppProvider& provider,
+                         const web_package::SignedWebBundleId& bundle_id) {
+  return CHECK_DEREF(
+      provider.registrar_unsafe().GetAppById(GetAppId(bundle_id)));
+}
+
+std::unique_ptr<ScopedBundledIsolatedWebApp> CreateBundle(
+    Profile& profile,
+    ManifestBuilder& manifest) {
+  std::unique_ptr<ScopedBundledIsolatedWebApp> app =
+      IsolatedWebAppBuilder(manifest).BuildBundle(
+          test::GetDefaultEd25519KeyPair());
+  app->TrustSigningKey();
+  app->FakeInstallPageState(&profile);
+  return app;
+}
+
+// Matches a web app that has the given `version`.
+testing::Matcher<const WebApp&> HasVersion(std::string_view version) {
+  using testing::Optional;
+  using testing::Property;
+  auto iwa_version = IwaVersion::Create(version).value();
+  // Equivalent to `app->isolation_data()->version() == iwa_version`.
+  return Property(
+      "isolation_data", &WebApp::isolation_data,
+      Optional(Property("version", &IsolationData::version, iwa_version)));
+}
+
+// Returns a pattern to match the "/foo" pathname. Could be any pattern.
+blink::SafeUrlPattern FooPattern() {
+  blink::SafeUrlPattern pattern;
+  pattern.pathname = {liburlpattern::Part(liburlpattern::PartType::kFixed,
+                                          /*value=*/"/foo",
+                                          liburlpattern::Modifier::kNone)};
+  return pattern;
+}
+
+}  // namespace
+
+// Verifies manifest changes across IWA updates propagate correctly to `WebApp`.
+class ManifestUpdateTest : public IsolatedWebAppTest {
+ public:
+  ManifestUpdateTest()
+      : IsolatedWebAppTest(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
+  }
+  ~ManifestUpdateTest() override = default;
+
+ protected:
+  void SetUp() override {
+    IsolatedWebAppTest::SetUp();
+    provider().SetEnableAutomaticIwaUpdates(
+        FakeWebAppProvider::AutomaticIwaUpdateStrategy::kForceEnabled);
+
+    test::AwaitStartWebAppProviderAndSubsystems(profile());
+  }
+
+  // The test IWA used in tests. Must be called after `InstallInitialApp`.
+  const WebApp& TestIwa() {
+    return GetAppById(provider(), TestIwaWebBundleId());
+  }
+
+  // Creates version 1.0.0 of a fake test app with the given `manifest`, serves
+  // it in the test server, configures policy to force install it, and waits
+  // until it is installed.
+  void InstallInitialTestIwa(ManifestBuilder manifest = ManifestBuilder()) {
+    test_update_server().AddBundle(
+        CreateBundle(CHECK_DEREF(profile()), manifest.SetVersion("1.0.0")),
+        {{StableChannel()}});
+
+    test::AddForceInstalledIwaToPolicy(
+        profile()->GetPrefs(),
+        test_update_server().CreateForceInstallPolicyEntry(
+            TestIwaWebBundleId(),
+            /*update_channel=*/StableChannel()));
+
+    web_app::WebAppTestInstallObserver(profile()).BeginListeningAndWait(
+        {GetAppId(TestIwaWebBundleId())});
+
+    ASSERT_THAT(TestIwa(), HasVersion("1.0.0"));
+  }
+
+  // Updates the fake test app in the test server to version 2.0.0 with the
+  // given `manifest`, and waits until the update is installed.
+  //
+  // Must be called after `InstallInitialApp`.
+  void UpdateTestIwa(ManifestBuilder manifest = ManifestBuilder()) {
+    EXPECT_THAT(TestIwa(), HasVersion("1.0.0"));
+
+    test_update_server().AddBundle(
+        CreateBundle(CHECK_DEREF(profile()), manifest.SetVersion("2.0.0")),
+        {{StableChannel()}});
+
+    base::TimeTicks update_time = provider()
+                                      .iwa_update_manager()
+                                      .GetNextUpdateDiscoveryTimeForTesting()
+                                      .value();
+    task_environment().FastForwardBy(update_time - base::TimeTicks::Now());
+
+    ASSERT_THAT(TestIwa(), HasVersion("2.0.0"));
+  }
+};
+
+TEST_F(ManifestUpdateTest, BorderlessUrlPatterns) {
+  InstallInitialTestIwa();
+  EXPECT_THAT(TestIwa().borderless_url_patterns(), IsEmpty());
+
+  UpdateTestIwa(ManifestBuilder().AddBorderlessUrlPattern(FooPattern()));
+  EXPECT_THAT(TestIwa().borderless_url_patterns(), ElementsAre(FooPattern()));
+}
+
+}  // namespace web_app
diff --git a/chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.cc b/chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.cc
index 7b5c5ee..a031f9b3 100644
--- a/chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.cc
@@ -4,21 +4,33 @@
 
 #include "chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.h"
 
+#include <cstddef>
+#include <cstdint>
 #include <map>
 #include <memory>
+#include <optional>
+#include <sstream>
 #include <string>
 #include <string_view>
+#include <utility>
 #include <variant>
+#include <vector>
 
 #include "base/base_paths.h"
+#include "base/check.h"
+#include "base/containers/extend.h"
+#include "base/containers/fixed_flat_map.h"
+#include "base/containers/flat_map.h"
 #include "base/containers/to_value_list.h"
 #include "base/files/file_enumerator.h"
+#include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_file.h"
-#include "base/functional/function_ref.h"
+#include "base/functional/bind.h"
 #include "base/json/json_writer.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
@@ -26,7 +38,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/test_future.h"
 #include "base/threading/thread_restrictions.h"
-#include "base/types/optional_ref.h"
+#include "base/types/expected.h"
 #include "chrome/browser/web_applications/isolated_web_apps/commands/install_isolated_web_app_command.h"
 #include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_install_source.h"
 #include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_trust_checker.h"
@@ -37,32 +49,45 @@
 #include "chrome/browser/web_applications/web_app_command_scheduler.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "components/web_package/signed_web_bundles/signed_web_bundle_id.h"
+#include "components/web_package/test_support/signed_web_bundles/ed25519_key_pair.h"
+#include "components/web_package/test_support/signed_web_bundles/key_pair.h"
 #include "components/web_package/test_support/signed_web_bundles/web_bundle_signer.h"
 #include "components/web_package/web_bundle_builder.h"
+#include "components/webapps/browser/installable/installable_logging.h"
+#include "components/webapps/browser/web_contents/web_app_url_loader.h"
+#include "components/webapps/isolated_web_apps/types/iwa_version.h"
 #include "components/webapps/isolated_web_apps/types/source.h"
 #include "net/http/http_request_headers.h"
 #include "net/http/http_response_headers.h"
 #include "net/http/http_status_code.h"
 #include "net/http/http_util.h"
+#include "net/http/http_version.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
 #include "net/test/embedded_test_server/request_handler_util.h"
 #include "services/network/public/cpp/permissions_policy/origin_with_possible_wildcards.h"
 #include "services/network/public/cpp/permissions_policy/permissions_policy_declaration.h"
+#include "services/network/public/mojom/permissions_policy/permissions_policy_feature.mojom-data-view.h"
 #include "skia/ext/codec_utils.h"
 #include "third_party/abseil-cpp/absl/functional/overload.h"
 #include "third_party/blink/public/common/manifest/manifest.h"
 #include "third_party/blink/public/common/manifest/manifest_util.h"
 #include "third_party/blink/public/common/permissions_policy/policy_helper_public.h"
+#include "third_party/blink/public/common/safe_url_pattern.h"
+#include "third_party/blink/public/mojom/manifest/display_mode.mojom.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
+#include "third_party/liburlpattern/part.h"
 #include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkColor.h"
 #include "third_party/skia/include/core/SkData.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
 #include "ui/gfx/geometry/size.h"
 #include "url/gurl.h"
 #include "url/origin.h"
 
 namespace web_app {
+
 namespace {
 
 constexpr char kInstallPagePath[] = "/.well-known/_generated_install_page.html";
@@ -183,6 +208,49 @@
       key_pair);
 }
 
+std::string UrlPatternPartsToString(
+    const std::vector<liburlpattern::Part>& parts) {
+  std::stringstream ss;
+  for (const auto& part : parts) {
+    switch (part.type) {
+      case liburlpattern::PartType::kFullWildcard:
+        ss << part.prefix << "*";
+        break;
+      case liburlpattern::PartType::kSegmentWildcard:
+        ss << part.prefix << ":" << part.name;
+        break;
+      case liburlpattern::PartType::kRegex:
+      case liburlpattern::PartType::kFixed:
+        ss << part.value;
+        break;
+    }
+  }
+  return ss.str();
+}
+
+base::Value::Dict UrlPatternToValue(const blink::SafeUrlPattern& pattern) {
+  static constexpr auto kFields =
+      base::MakeFixedFlatMap<std::string_view, std::vector<liburlpattern::Part>
+                                                   blink::SafeUrlPattern::*>({
+          {"protocol", &blink::SafeUrlPattern::protocol},
+          {"username", &blink::SafeUrlPattern::username},
+          {"password", &blink::SafeUrlPattern::password},
+          {"hostname", &blink::SafeUrlPattern::hostname},
+          {"port", &blink::SafeUrlPattern::port},
+          {"pathname", &blink::SafeUrlPattern::pathname},
+          {"search", &blink::SafeUrlPattern::search},
+          {"hash", &blink::SafeUrlPattern::hash},
+      });
+
+  base::Value::Dict result;
+  for (const auto& [field, getter] : kFields) {
+    if (!(pattern.*getter).empty()) {
+      result.Set(field, UrlPatternPartsToString(pattern.*getter));
+    }
+  }
+  return result;
+}
+
 }  // namespace
 
 ManifestBuilder::PermissionsPolicy::PermissionsPolicy(
@@ -283,6 +351,12 @@
   return *this;
 }
 
+ManifestBuilder& ManifestBuilder::AddBorderlessUrlPattern(
+    blink::SafeUrlPattern pattern) {
+  borderless_url_patterns_.emplace_back(std::move(pattern));
+  return *this;
+}
+
 const std::string& ManifestBuilder::start_url() const {
   return start_url_;
 }
@@ -378,6 +452,11 @@
     json.Set("file_handlers", std::move(file_handlers));
   }
 
+  if (!borderless_url_patterns_.empty()) {
+    json.Set("borderless_url_patterns",
+             base::ToValueList(borderless_url_patterns_, &UrlPatternToValue));
+  }
+
   return base::WriteJsonWithOptions(json, base::OPTIONS_PRETTY_PRINT).value();
 }
 
@@ -445,6 +524,8 @@
     manifest->file_handlers.push_back(std::move(handler));
   }
 
+  base::Extend(manifest->borderless_url_patterns, borderless_url_patterns_);
+
   return manifest;
 }
 
@@ -713,7 +794,7 @@
     while (headers->EnumerateHeaderLines(&iterator, &name, &value)) {
       // Web Bundle header names must be lowercase.
       // See section 8.1.2 of [RFC7540].
-      bundle_headers.push_back({base::ToLowerASCII(name), value});
+      bundle_headers.emplace_back(base::ToLowerASCII(name), value);
     }
 
     builder.AddExchange(url, bundle_headers, resource.body());
diff --git a/chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.h b/chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.h
index b6b2134..ec8b4f3 100644
--- a/chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.h
+++ b/chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.h
@@ -5,14 +5,17 @@
 #ifndef CHROME_BROWSER_WEB_APPLICATIONS_ISOLATED_WEB_APPS_TEST_ISOLATED_WEB_APP_BUILDER_H_
 #define CHROME_BROWSER_WEB_APPLICATIONS_ISOLATED_WEB_APPS_TEST_ISOLATED_WEB_APP_BUILDER_H_
 
+#include <cstdint>
 #include <map>
 #include <memory>
 #include <optional>
 #include <string>
 #include <string_view>
+#include <utility>
 #include <variant>
 #include <vector>
 
+#include "base/check.h"
 #include "base/files/file_path.h"
 #include "base/files/scoped_temp_file.h"
 #include "base/functional/function_ref.h"
@@ -23,10 +26,14 @@
 #include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_info.h"
 #include "chrome/browser/web_applications/test/fake_web_contents_manager.h"
 #include "components/web_package/signed_web_bundles/signed_web_bundle_id.h"
-#include "components/web_package/test_support/signed_web_bundles/web_bundle_signer.h"
+#include "components/web_package/test_support/signed_web_bundles/key_pair.h"
 #include "components/webapps/isolated_web_apps/types/iwa_version.h"
+#include "components/webapps/isolated_web_apps/types/source.h"
 #include "net/http/http_status_code.h"
 #include "services/network/public/mojom/permissions_policy/permissions_policy_feature.mojom-forward.h"
+#include "third_party/blink/public/common/manifest/manifest.h"
+#include "third_party/blink/public/common/safe_url_pattern.h"
+#include "third_party/blink/public/mojom/manifest/display_mode.mojom-data-view.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom-forward.h"
 #include "ui/gfx/geometry/size.h"
 
@@ -124,6 +131,8 @@
   ManifestBuilder& AddFileHandler(std::string_view action,
                                   const FileHandlerAccept& accept);
 
+  ManifestBuilder& AddBorderlessUrlPattern(blink::SafeUrlPattern pattern);
+
   const std::string& start_url() const;
   const std::vector<IconMetadata>& icons() const;
   const IwaVersion& version() const;
@@ -145,6 +154,7 @@
       permissions_policy_;
   std::vector<std::pair<std::string, std::string>> protocol_handlers_;
   std::map<std::string, FileHandlerAccept> file_handlers_;
+  std::vector<blink::SafeUrlPattern> borderless_url_patterns_;
 };
 
 // A builder for Isolated Web Apps that supports adding resources from disk
diff --git a/chrome/browser/web_applications/jobs/manifest_to_web_app_install_info_job.cc b/chrome/browser/web_applications/jobs/manifest_to_web_app_install_info_job.cc
index 9ed0784e4..b31534d 100644
--- a/chrome/browser/web_applications/jobs/manifest_to_web_app_install_info_job.cc
+++ b/chrome/browser/web_applications/jobs/manifest_to_web_app_install_info_job.cc
@@ -4,23 +4,34 @@
 
 #include "chrome/browser/web_applications/jobs/manifest_to_web_app_install_info_job.h"
 
-#include <functional>
+#include <algorithm>
 #include <memory>
+#include <optional>
 #include <string>
 #include <utility>
 #include <vector>
 
+#include "base/check.h"
+#include "base/check_op.h"
 #include "base/containers/contains.h"
 #include "base/containers/flat_map.h"
+#include "base/feature_list.h"
+#include "base/functional/bind.h"
+#include "base/functional/function_ref.h"
+#include "base/location.h"
+#include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/notreached.h"
+#include "base/strings/to_string.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock.h"
+#include "base/task/sequenced_task_runner.h"
+#include "base/values.h"
 #include "chrome/browser/web_applications/icons/trusted_icon_filter.h"
 #include "chrome/browser/web_applications/scope_extension_info.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
-#include "chrome/browser/web_applications/web_app_icon_generator.h"
 #include "chrome/browser/web_applications/web_app_icon_operations.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_install_utils.h"
@@ -33,10 +44,13 @@
 #include "components/webapps/browser/installable/installable_evaluator.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
 #include "content/public/browser/web_contents.h"
+#include "services/network/public/cpp/permissions_policy/permissions_policy_declaration.h"
 #include "third_party/blink/public/common/features.h"
+#include "third_party/blink/public/common/manifest/manifest.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom-data-view.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
 #include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/size.h"
 #include "url/gurl.h"
 
@@ -587,6 +601,8 @@
   PopulateFileHandlerInfoFromManifest(
       manifest_->file_handlers, install_info_->scope, install_info_.get());
 
+  install_info_->borderless_url_patterns = manifest_->borderless_url_patterns;
+
   install_info_->share_target = ToWebAppShareTarget(manifest_->share_target);
 
   install_info_->protocol_handlers =
diff --git a/chrome/browser/web_applications/jobs/manifest_to_web_app_install_info_job_unittest.cc b/chrome/browser/web_applications/jobs/manifest_to_web_app_install_info_job_unittest.cc
index 15592b6b..47af704 100644
--- a/chrome/browser/web_applications/jobs/manifest_to_web_app_install_info_job_unittest.cc
+++ b/chrome/browser/web_applications/jobs/manifest_to_web_app_install_info_job_unittest.cc
@@ -4,30 +4,45 @@
 
 #include "chrome/browser/web_applications/jobs/manifest_to_web_app_install_info_job.h"
 
+#include <map>
 #include <memory>
+#include <optional>
+#include <string>
+#include <utility>
+#include <vector>
 
-#include "base/run_loop.h"
-#include "base/test/bind.h"
+#include "base/containers/contains.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/test/scoped_feature_list.h"
-#include "base/test/test_future.h"
+#include "build/buildflag.h"
 #include "chrome/browser/web_applications/os_integration/web_app_file_handler_manager.h"
 #include "chrome/browser/web_applications/test/fake_web_contents_manager.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
 #include "chrome/browser/web_applications/test/web_app_test.h"
+#include "chrome/browser/web_applications/web_app_constants.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/common/chrome_features.h"
+#include "components/services/app_service/public/cpp/icon_info.h"
+#include "components/services/app_service/public/cpp/share_target.h"
+#include "components/webapps/browser/installable/installable_logging.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
 #include "content/public/browser/web_contents.h"
+#include "services/network/public/cpp/permissions_policy/origin_with_possible_wildcards.h"
+#include "services/network/public/cpp/permissions_policy/permissions_policy_declaration.h"
+#include "services/network/public/mojom/permissions_policy/permissions_policy_feature.mojom-data-view.h"
 #include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/manifest/manifest.h"
-#include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h"
-#include "third_party/blink/public/mojom/manifest/manifest.mojom-shared.h"
+#include "third_party/blink/public/common/safe_url_pattern.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
+#include "third_party/blink/public/mojom/manifest/manifest_launch_handler.mojom-data-view.h"
+#include "third_party/liburlpattern/part.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/image/image_unittest_util.h"
+#include "url/origin.h"
 
 namespace web_app {
 
@@ -55,6 +70,16 @@
   }
 }
 
+// Returns a simple `SafeUrlPattern` for the "foo.com" hostname.
+blink::SafeUrlPattern FooUrlPattern() {
+  blink::SafeUrlPattern pattern;
+  pattern.hostname = {
+      liburlpattern::Part(liburlpattern::PartType::kFixed,
+                          /*value=*/"foo.com", liburlpattern::Modifier::kNone),
+  };
+  return pattern;
+}
+
 class ManifestToWebAppInstallInfoJobTest : public WebAppTest {
  public:
   ManifestToWebAppInstallInfoJobTest() = default;
@@ -146,6 +171,9 @@
 
   manifest->display_override.push_back(DisplayMode::kMinimalUi);
   manifest->display_override.push_back(DisplayMode::kStandalone);
+
+  manifest->borderless_url_patterns = {FooUrlPattern()};
+
   {
     auto handler = blink::mojom::ManifestFileHandler::New();
     handler->action = GURL("http://example.com/open-files");
@@ -273,6 +301,10 @@
   EXPECT_EQ(u"platform", related_app.platform);
   EXPECT_EQ(GURL("http://www.example.com"), related_app.url);
   EXPECT_EQ(u"id", related_app.id);
+
+  // Check borderless URL patterns were set.
+  EXPECT_THAT(web_app_info->borderless_url_patterns,
+              testing::ElementsAre(FooUrlPattern()));
 }
 
 TEST_F(ManifestToWebAppInstallInfoJobTest, EmptyNameUsesShortName) {
diff --git a/chrome/browser/web_applications/proto/web_app.proto b/chrome/browser/web_applications/proto/web_app.proto
index c36c27a..7183853 100644
--- a/chrome/browser/web_applications/proto/web_app.proto
+++ b/chrome/browser/web_applications/proto/web_app.proto
@@ -12,6 +12,7 @@
 import "chrome/browser/web_applications/proto/web_app_related_applications.proto";
 import "chrome/browser/web_applications/proto/web_app_share_target.proto";
 import "chrome/browser/web_applications/proto/web_app_tab_strip.proto";
+import "chrome/browser/web_applications/proto/web_app_url_pattern.proto";
 import "chromeos/ash/experiences/system_web_apps/types/proto/system_web_app_data.proto";
 
 option optimize_for = LITE_RUNTIME;
@@ -487,4 +488,7 @@
   // masking (ie. IconPurpose::MASKABLE). See also:
   // |stored_trusted_icon_sizes_any|.
   repeated int32 stored_trusted_icon_sizes_maskable = 76;
+
+  // A list of URL patterns in which the app window should be borderless.
+  repeated UrlPattern borderless_url_patterns = 77;
 }
diff --git a/chrome/browser/web_applications/test/web_app_test_utils.cc b/chrome/browser/web_applications/test/web_app_test_utils.cc
index d82ffeb8..291bfeb2 100644
--- a/chrome/browser/web_applications/test/web_app_test_utils.cc
+++ b/chrome/browser/web_applications/test/web_app_test_utils.cc
@@ -9,11 +9,9 @@
 #include <algorithm>
 #include <array>
 #include <cstdint>
-#include <functional>
 #include <iterator>
-#include <limits>
+#include <memory>
 #include <optional>
-#include <ostream>
 #include <random>
 #include <set>
 #include <string>
@@ -26,14 +24,13 @@
 #include "base/check.h"
 #include "base/check_op.h"
 #include "base/containers/flat_set.h"
-#include "base/containers/flat_tree.h"
 #include "base/containers/span.h"
 #include "base/files/file_path.h"
 #include "base/functional/bind.h"
 #include "base/json/json_reader.h"
 #include "base/location.h"
 #include "base/memory/scoped_refptr.h"
-#include "base/numerics/clamped_math.h"
+#include "base/memory/weak_ptr.h"
 #include "base/run_loop.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
@@ -52,16 +49,19 @@
 #include "chrome/browser/web_applications/isolated_web_apps/isolation_data.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
 #include "chrome/browser/web_applications/proto/web_app.pb.h"
+#include "chrome/browser/web_applications/proto/web_app_install_state.pb.h"
 #include "chrome/browser/web_applications/proto/web_app_isolation_data.pb.h"
 #include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
 #include "chrome/browser/web_applications/scope_extension_info.h"
 #include "chrome/browser/web_applications/test/web_app_test_observers.h"
+#include "chrome/browser/web_applications/user_display_mode.h"
 #include "chrome/browser/web_applications/web_app.h"
 #include "chrome/browser/web_applications/web_app_chromeos_data.h"
 #include "chrome/browser/web_applications/web_app_command_scheduler.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
+#include "chrome/browser/web_applications/web_app_install_params.h"
 #include "chrome/browser/web_applications/web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_management_type.h"
 #include "chrome/browser/web_applications/web_app_proto_utils.h"
@@ -69,7 +69,6 @@
 #include "chrome/browser/web_applications/web_app_registry_update.h"
 #include "chrome/browser/web_applications/web_app_sync_bridge.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
 #include "components/base32/base32.h"
 #include "components/prefs/pref_service.h"
@@ -80,7 +79,13 @@
 #include "components/sync/base/time.h"
 #include "components/sync/model/string_ordinal.h"
 #include "components/sync/protocol/web_app_specifics.pb.h"
+#include "components/web_package/signed_web_bundles/ecdsa_p256_public_key.h"
+#include "components/web_package/signed_web_bundles/ecdsa_p256_sha256_signature.h"
+#include "components/web_package/signed_web_bundles/ed25519_public_key.h"
+#include "components/web_package/signed_web_bundles/ed25519_signature.h"
+#include "components/web_package/signed_web_bundles/signed_web_bundle_signature_stack_entry.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
+#include "components/webapps/common/web_app_id.h"
 #include "components/webapps/isolated_web_apps/types/iwa_version.h"
 #include "components/webapps/isolated_web_apps/types/storage_location.h"
 #include "components/webapps/isolated_web_apps/types/update_channel.h"
@@ -93,11 +98,10 @@
 #include "third_party/blink/public/common/permissions_policy/policy_helper_public.h"
 #include "third_party/blink/public/common/safe_url_pattern.h"
 #include "third_party/blink/public/common/storage_key/storage_key.h"
-#include "third_party/blink/public/mojom/manifest/capture_links.mojom-shared.h"
-#include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h"
-#include "third_party/blink/public/mojom/manifest/manifest.mojom-shared.h"
-#include "third_party/blink/public/mojom/manifest/manifest_launch_handler.mojom-shared.h"
-#include "third_party/liburlpattern/pattern.h"
+#include "third_party/blink/public/mojom/manifest/capture_links.mojom-data-view.h"
+#include "third_party/blink/public/mojom/manifest/display_mode.mojom-data-view.h"
+#include "third_party/blink/public/mojom/manifest/manifest.mojom-data-view.h"
+#include "third_party/liburlpattern/part.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/size.h"
 #include "url/gurl.h"
@@ -448,9 +452,9 @@
   return icons;
 }
 
-std::vector<blink::SafeUrlPattern> CreateRandomScopePatterns(
+std::vector<blink::SafeUrlPattern> CreateRandomUrlPatterns(
     RandomHelper& random) {
-  std::vector<blink::SafeUrlPattern> scope_patterns;
+  std::vector<blink::SafeUrlPattern> url_patterns;
 
   for (int i = random.next_uint(4) + 1; i >= 0; --i) {
     blink::SafeUrlPattern url_pattern;
@@ -480,9 +484,9 @@
       url_pattern.pathname.push_back(std::move(part));
     }
 
-    scope_patterns.push_back(std::move(url_pattern));
+    url_patterns.push_back(std::move(url_pattern));
   }
-  return scope_patterns;
+  return url_patterns;
 }
 
 proto::os_state::WebAppOsIntegration GenerateRandomWebAppOsIntegration(
@@ -1046,7 +1050,7 @@
         home_tab_params.icons = CreateRandomHomeTabIcons(random);
       }
       if (random.next_bool()) {
-        home_tab_params.scope_patterns = CreateRandomScopePatterns(random);
+        home_tab_params.scope_patterns = CreateRandomUrlPatterns(random);
       }
       tab_strip.home_tab = std::move(home_tab_params);
     } else {
@@ -1204,6 +1208,9 @@
     app->SetStoredTrustedIconSizes(IconPurpose::MASKABLE,
                                    {icon_sizes[random.next_uint(8)]});
   }
+  if (is_iwa && random.next_bool()) {
+    app->SetBorderlessUrlPatterns(CreateRandomUrlPatterns(random));
+  }
 
   return app;
 }
diff --git a/chrome/browser/web_applications/web_app.cc b/chrome/browser/web_applications/web_app.cc
index e076e4d..8a775d6 100644
--- a/chrome/browser/web_applications/web_app.cc
+++ b/chrome/browser/web_applications/web_app.cc
@@ -5,66 +5,73 @@
 #include "chrome/browser/web_applications/web_app.h"
 
 #include <array>
-#include <bitset>
+#include <cstdint>
 #include <optional>
 #include <ostream>
 #include <string>
 #include <tuple>
 #include <utility>
 #include <variant>
+#include <vector>
 
 #include "base/check.h"
 #include "base/check_is_test.h"
 #include "base/check_op.h"
-#include "base/containers/flat_tree.h"
+#include "base/containers/flat_set.h"
 #include "base/containers/to_value_list.h"
+#include "base/logging.h"
 #include "base/not_fatal_until.h"
 #include "base/notreached.h"
-#include "base/numerics/clamped_math.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/to_string.h"
-#include "base/types/optional_util.h"
+#include "base/time/time.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "chrome/browser/web_applications/generated_icon_fix_util.h"
-#include "chrome/browser/web_applications/mojom/user_display_mode.mojom-shared.h"
+#include "chrome/browser/web_applications/isolated_web_apps/isolation_data.h"
+#include "chrome/browser/web_applications/mojom/user_display_mode.mojom-data-view.h"
 #include "chrome/browser/web_applications/proto/web_app.equal.h"
 #include "chrome/browser/web_applications/proto/web_app.ostream.h"
 #include "chrome/browser/web_applications/proto/web_app.pb.h"
 #include "chrome/browser/web_applications/proto/web_app.to_value.h"
-#include "chrome/browser/web_applications/proto/web_app_install_state.ostream.h"
 #include "chrome/browser/web_applications/proto/web_app_install_state.pb.h"
 #include "chrome/browser/web_applications/proto/web_app_install_state.to_value.h"
 #include "chrome/browser/web_applications/proto/web_app_os_integration_state.equal.h"
 #include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
 #include "chrome/browser/web_applications/proto/web_app_os_integration_state.to_value.h"
+#include "chrome/browser/web_applications/scope_extension_info.h"
 #include "chrome/browser/web_applications/tabbed_mode_scope_matcher.h"
 #include "chrome/browser/web_applications/user_display_mode.h"
 #include "chrome/browser/web_applications/web_app_chromeos_data.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
+#include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_management_type.h"
 #include "chrome/browser/web_applications/web_app_proto_utils.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
 #include "chrome/common/url_constants.h"
-#include "components/sync/base/time.h"
+#include "components/services/app_service/public/cpp/file_handler.h"
+#include "components/services/app_service/public/cpp/protocol_handler_info.h"
+#include "components/services/app_service/public/cpp/share_target.h"
+#include "components/sync/model/string_ordinal.h"
 #include "components/sync/protocol/proto_value_conversions.h"
 #include "components/sync/protocol/web_app_specifics.equal.h"
 #include "components/sync/protocol/web_app_specifics.pb.h"
 #include "components/sync/protocol/web_app_specifics.to_value.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
+#include "components/webapps/common/web_app_id.h"
 #include "components/webapps/isolated_web_apps/types/storage_location.h"
 #include "services/network/public/cpp/permissions_policy/permissions_policy_declaration.h"
+#include "third_party/blink/public/common/manifest/manifest.h"
 #include "third_party/blink/public/common/manifest/manifest_util.h"
 #include "third_party/blink/public/common/permissions_policy/policy_helper_public.h"
 #include "third_party/blink/public/common/safe_url_pattern.h"
-#include "third_party/blink/public/mojom/manifest/manifest.mojom-shared.h"
-#include "third_party/blink/public/mojom/manifest/manifest_launch_handler.mojom-shared.h"
+#include "third_party/blink/public/mojom/manifest/capture_links.mojom-data-view.h"
 #include "third_party/liburlpattern/options.h"
 #include "third_party/liburlpattern/pattern.h"
-#include "third_party/protobuf/src/google/protobuf/repeated_field.h"
+#include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/color_utils.h"
 #include "ui/gfx/geometry/size.h"
 #include "url/origin.h"
@@ -175,16 +182,10 @@
       icons_json.Append(ImageResourceDebugDict(icon));
     }
 
-    base::Value::List scope_patterns_json;
-    const std::vector<blink::SafeUrlPattern>& scope_patterns =
-        home_tab_params.scope_patterns;
-
-    for (const auto& scope_pattern : scope_patterns) {
-      scope_patterns_json.Append(UrlPatternDebugValue(scope_pattern));
-    }
-
     home_tab_json.Set("icons", std::move(icons_json));
-    home_tab_json.Set("scope_patterns", std::move(scope_patterns_json));
+    home_tab_json.Set("scope_patterns",
+                      base::ToValueList(home_tab_params.scope_patterns,
+                                        UrlPatternDebugValue));
     result.Set("home_tab", std::move(home_tab_json));
   }
   return base::Value(std::move(result));
@@ -483,6 +484,11 @@
   display_mode_override_ = std::move(display_mode_override);
 }
 
+void WebApp::SetBorderlessUrlPatterns(
+    std::vector<blink::SafeUrlPattern> borderless_url_patterns) {
+  borderless_url_patterns_ = std::move(borderless_url_patterns);
+}
+
 void WebApp::SetWebAppChromeOsData(
     std::optional<WebAppChromeOsData> chromeos_data) {
   chromeos_data_ = std::move(chromeos_data);
@@ -804,8 +810,9 @@
 
 bool WebApp::RemoveInstallUrlForSource(WebAppManagement::Type type,
                                        const GURL& install_url) {
-  if (!management_to_external_config_map_.count(type))
+  if (!management_to_external_config_map_.count(type)) {
     return false;
+  }
 
   bool removed =
       management_to_external_config_map_[type].install_urls.erase(install_url);
@@ -944,6 +951,7 @@
         app.dark_mode_background_color_,
         app.display_mode_,
         app.display_mode_override_,
+        app.borderless_url_patterns_,
         app.chromeos_data_,
         app.install_state_,
         app.is_from_sync_and_pending_installation_,
@@ -1013,15 +1021,17 @@
 
   auto ConvertList = [](const auto& list) {
     base::Value::List list_json;
-    for (const auto& item : list)
+    for (const auto& item : list) {
       list_json.Append(item);
+    }
     return list_json;
   };
 
   auto ConvertDebugValueList = [](const auto& list) {
     base::Value::List list_json;
-    for (const auto& item : list)
+    for (const auto& item : list) {
       list_json.Append(item.AsDebugValue());
+    }
     return list_json;
   };
 
@@ -1062,8 +1072,9 @@
   root.Set("display_mode", blink::DisplayModeToString(display_mode_));
 
   base::Value::List display_override;
-  for (const DisplayMode& mode : display_mode_override_)
+  for (const DisplayMode& mode : display_mode_override_) {
     display_override.Append(blink::DisplayModeToString(mode));
+  }
   root.Set("display_override", std::move(display_override));
 
   base::Value::Dict downloaded_icon_sizes_json;
@@ -1235,6 +1246,9 @@
   root.Set("stored_trusted_icon_sizes",
            std::move(stored_trusted_icon_sizes_json));
 
+  root.Set("borderless_url_patterns",
+           base::ToValueList(borderless_url_patterns_, UrlPatternDebugValue));
+
   return base::Value(std::move(root));
 }
 
diff --git a/chrome/browser/web_applications/web_app.h b/chrome/browser/web_applications/web_app.h
index fcf66c3..6ca8fbb 100644
--- a/chrome/browser/web_applications/web_app.h
+++ b/chrome/browser/web_applications/web_app.h
@@ -8,22 +8,22 @@
 #include <stdint.h>
 
 #include <iosfwd>
+#include <memory>
 #include <optional>
-#include <set>
 #include <string>
 #include <vector>
 
+#include "base/check.h"
 #include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
 #include "base/time/time.h"
 #include "base/values.h"
-#include "base/version.h"
 #include "build/build_config.h"
 #include "chrome/browser/web_applications/generated_icon_fix_util.h"
-#include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_integrity_block_data.h"
 #include "chrome/browser/web_applications/isolated_web_apps/isolation_data.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom-forward.h"
 #include "chrome/browser/web_applications/proto/web_app.pb.h"
+#include "chrome/browser/web_applications/proto/web_app_install_state.pb.h"
 #include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
 #include "chrome/browser/web_applications/scope_extension_info.h"
 #include "chrome/browser/web_applications/user_display_mode.h"
@@ -38,11 +38,10 @@
 #include "components/sync/model/string_ordinal.h"
 #include "components/sync/protocol/web_app_specifics.pb.h"
 #include "components/webapps/common/web_app_id.h"
-#include "components/webapps/isolated_web_apps/types/storage_location.h"
 #include "services/network/public/cpp/permissions_policy/permissions_policy_declaration.h"
 #include "third_party/blink/public/common/manifest/manifest.h"
-#include "third_party/blink/public/mojom/manifest/capture_links.mojom-shared.h"
-#include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h"
+#include "third_party/blink/public/common/safe_url_pattern.h"
+#include "third_party/blink/public/mojom/manifest/capture_links.mojom-forward.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "url/gurl.h"
 
@@ -125,6 +124,10 @@
     return display_mode_override_;
   }
 
+  const std::vector<blink::SafeUrlPattern>& borderless_url_patterns() const {
+    return borderless_url_patterns_;
+  }
+
   syncer::StringOrdinal user_page_ordinal() const {
     return syncer::StringOrdinal(sync_proto().user_page_ordinal());
   }
@@ -444,6 +447,8 @@
   // Sets the UserDisplayMode for the current platform (CrOS or default).
   void SetUserDisplayMode(mojom::UserDisplayMode user_display_mode);
   void SetDisplayModeOverride(std::vector<DisplayMode> display_mode_override);
+  void SetBorderlessUrlPatterns(
+      std::vector<blink::SafeUrlPattern> borderless_url_patterns);
   void SetWebAppChromeOsData(std::optional<WebAppChromeOsData> chromeos_data);
   void SetInstallState(proto::InstallState install_state);
   void SetIsFromSyncAndPendingInstallation(
@@ -573,6 +578,7 @@
   std::optional<SkColor> dark_mode_background_color_;
   DisplayMode display_mode_ = DisplayMode::kUndefined;
   std::vector<DisplayMode> display_mode_override_;
+  std::vector<blink::SafeUrlPattern> borderless_url_patterns_;
   std::optional<WebAppChromeOsData> chromeos_data_;
   proto::InstallState install_state_ =
       proto::InstallState::INSTALLED_WITHOUT_OS_INTEGRATION;
diff --git a/chrome/browser/web_applications/web_app_database_serialization.cc b/chrome/browser/web_applications/web_app_database_serialization.cc
index abb22e16..cdc2cec 100644
--- a/chrome/browser/web_applications/web_app_database_serialization.cc
+++ b/chrome/browser/web_applications/web_app_database_serialization.cc
@@ -4,6 +4,10 @@
 
 #include "chrome/browser/web_applications/web_app_database_serialization.h"
 
+#include <cstddef>
+#include <cstdint>
+#include <memory>
+#include <optional>
 #include <set>
 #include <string>
 #include <utility>
@@ -11,22 +15,30 @@
 #include <vector>
 
 #include "base/check.h"
+#include "base/check_op.h"
 #include "base/containers/contains.h"
+#include "base/containers/flat_set.h"
+#include "base/containers/span.h"
+#include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/not_fatal_until.h"
+#include "base/notreached.h"
 #include "base/pickle.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/types/expected.h"
 #include "build/build_config.h"
 #include "chrome/browser/web_applications/generated_icon_fix_util.h"
 #include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_integrity_block_data.h"
 #include "chrome/browser/web_applications/isolated_web_apps/isolation_data.h"
-#include "chrome/browser/web_applications/mojom/user_display_mode.mojom-shared.h"
-#include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
-#include "chrome/browser/web_applications/os_integration/web_app_file_handler_manager.h"
 #include "chrome/browser/web_applications/proto/web_app.pb.h"
 #include "chrome/browser/web_applications/proto/web_app_install_state.pb.h"
+#include "chrome/browser/web_applications/proto/web_app_launch_handler.pb.h"
 #include "chrome/browser/web_applications/proto/web_app_related_applications.pb.h"
+#include "chrome/browser/web_applications/proto/web_app_share_target.pb.h"
+#include "chrome/browser/web_applications/proto/web_app_tab_strip.pb.h"
 #include "chrome/browser/web_applications/proto/web_app_url_pattern.pb.h"
+#include "chrome/browser/web_applications/scope_extension_info.h"
 #include "chrome/browser/web_applications/user_display_mode.h"
 #include "chrome/browser/web_applications/web_app.h"
 #include "chrome/browser/web_applications/web_app_chromeos_data.h"
@@ -36,12 +48,11 @@
 #include "chrome/browser/web_applications/web_app_management_type.h"
 #include "chrome/browser/web_applications/web_app_proto_utils.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
-#include "chrome/common/chrome_features.h"
 #include "components/services/app_service/public/cpp/file_handler.h"
 #include "components/services/app_service/public/cpp/protocol_handler_info.h"
 #include "components/services/app_service/public/cpp/share_target.h"
-#include "components/sync/base/data_type.h"
 #include "components/sync/base/time.h"
+#include "components/sync/protocol/web_app_specifics.pb.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
 #include "components/webapps/common/web_app_id.h"
 #include "components/webapps/isolated_web_apps/types/iwa_version.h"
@@ -54,11 +65,16 @@
 #include "third_party/blink/public/common/permissions_policy/policy_helper_public.h"
 #include "third_party/blink/public/common/safe_url_pattern.h"
 #include "third_party/blink/public/mojom/manifest/capture_links.mojom.h"
-#include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
-#include "third_party/blink/public/mojom/safe_url_pattern.mojom.h"
+#include "third_party/protobuf/src/google/protobuf/repeated_ptr_field.h"
 #include "url/gurl.h"
 #include "url/origin.h"
 
+// TODO(crbug.com/441959098): Consider removing chromeos includes.
+#if BUILDFLAG(IS_CHROMEOS)
+#include "ash/webui/system_apps/public/system_web_app_type.h"
+#include "chromeos/ash/experiences/system_web_apps/types/system_web_app_data.h"
+#endif
+
 namespace web_app {
 
 namespace {
@@ -1419,6 +1435,12 @@
       IconPurpose::MASKABLE,
       SortedSizesPx(std::move(trusted_icon_sizes_maskable)));
 
+  auto borderless_url_patterns = ToUrlPatterns(proto.borderless_url_patterns());
+  if (!borderless_url_patterns.has_value()) {
+    return nullptr;
+  }
+  web_app->SetBorderlessUrlPatterns(std::move(borderless_url_patterns.value()));
+
   return web_app;
 }
 
@@ -1972,6 +1994,10 @@
     local_data->add_stored_trusted_icon_sizes_maskable(size);
   }
 
+  for (const auto& pattern : web_app.borderless_url_patterns()) {
+    *(local_data->add_borderless_url_patterns()) = ToUrlPatternProto(pattern);
+  }
+
   return local_data;
 }
 
diff --git a/chrome/browser/web_applications/web_app_install_info.h b/chrome/browser/web_applications/web_app_install_info.h
index 17bd22f..98391f4 100644
--- a/chrome/browser/web_applications/web_app_install_info.h
+++ b/chrome/browser/web_applications/web_app_install_info.h
@@ -11,8 +11,10 @@
 #include <memory>
 #include <optional>
 #include <string>
+#include <utility>
 #include <vector>
 
+#include "base/check.h"
 #include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
 #include "base/types/expected.h"
@@ -29,9 +31,11 @@
 #include "components/webapps/isolated_web_apps/types/iwa_version.h"
 #include "services/network/public/cpp/permissions_policy/permissions_policy_declaration.h"
 #include "third_party/blink/public/common/manifest/manifest.h"
-#include "third_party/blink/public/mojom/manifest/capture_links.mojom-shared.h"
+#include "third_party/blink/public/common/safe_url_pattern.h"
+#include "third_party/blink/public/mojom/manifest/capture_links.mojom-forward.h"
 #include "third_party/blink/public/mojom/manifest/display_mode.mojom.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
+#include "third_party/blink/public/mojom/manifest/manifest_launch_handler.mojom-data-view.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/size.h"
@@ -188,7 +192,7 @@
   std::vector<Icon> monochrome;
 
   // Sizes of successfully downloaded icons for this shortcut menu item.
-  IconSizes downloaded_icon_sizes{};
+  IconSizes downloaded_icon_sizes;
 };
 
 struct IconsWithSizeAny {
@@ -392,6 +396,10 @@
   std::optional<web_app::mojom::UserDisplayMode> user_display_mode =
       web_app::mojom::UserDisplayMode::kBrowser;
 
+  // URL patterns used to decide when a window should have display mode
+  // `kBorderless`.
+  std::vector<blink::SafeUrlPattern> borderless_url_patterns;
+
   // The extensions and mime types the app can handle.
   apps::FileHandlers file_handlers;
 
diff --git a/chrome/browser/web_applications/web_app_install_utils.cc b/chrome/browser/web_applications/web_app_install_utils.cc
index 9ba519f..2d24203 100644
--- a/chrome/browser/web_applications/web_app_install_utils.cc
+++ b/chrome/browser/web_applications/web_app_install_utils.cc
@@ -4,16 +4,12 @@
 
 #include "chrome/browser/web_applications/web_app_install_utils.h"
 
-#include <algorithm>
-#include <array>
-#include <iterator>
+#include <cstddef>
 #include <map>
 #include <optional>
-#include <ostream>
 #include <set>
 #include <string>
 #include <string_view>
-#include <type_traits>
 #include <utility>
 #include <variant>
 #include <vector>
@@ -21,19 +17,14 @@
 #include "base/check.h"
 #include "base/check_op.h"
 #include "base/containers/contains.h"
-#include "base/containers/extend.h"
 #include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
-#include "base/containers/flat_tree.h"
 #include "base/feature_list.h"
-#include "base/functional/callback_helpers.h"
-#include "base/logging.h"
 #include "base/metrics/histogram.h"
 #include "base/metrics/histogram_base.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/notreached.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
 #include "chrome/browser/favicon/favicon_utils.h"
@@ -43,13 +34,12 @@
 #include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
 #include "chrome/browser/web_applications/os_integration/web_app_file_handler_manager.h"
 #include "chrome/browser/web_applications/policy/pre_redirection_url_observer.h"
-#include "chrome/browser/web_applications/scope_extension_info.h"
-#include "chrome/browser/web_applications/user_display_mode.h"
 #include "chrome/browser/web_applications/web_app.h"
 #include "chrome/browser/web_applications/web_app_chromeos_data.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
 #include "chrome/browser/web_applications/web_app_icon_generator.h"
+#include "chrome/browser/web_applications/web_app_install_finalizer.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_install_params.h"
 #include "chrome/browser/web_applications/web_app_management_type.h"
@@ -58,8 +48,7 @@
 #include "chrome/common/chrome_features.h"
 #include "components/services/app_service/public/cpp/file_handler.h"
 #include "components/services/app_service/public/cpp/icon_info.h"
-#include "components/services/app_service/public/cpp/protocol_handler_info.h"
-#include "components/services/app_service/public/cpp/share_target.h"
+#include "components/sync/base/user_selectable_type.h"
 #include "components/sync/protocol/web_app_specifics.pb.h"
 #include "components/sync/service/sync_service.h"
 #include "components/sync/service/sync_user_settings.h"
@@ -71,10 +60,7 @@
 #include "mojo/public/cpp/bindings/struct_ptr.h"
 #include "net/http/http_util.h"
 #include "services/network/public/cpp/permissions_policy/permissions_policy_declaration.h"
-#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/manifest/manifest.h"
-#include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h"
-#include "third_party/blink/public/mojom/manifest/manifest.mojom-shared.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkColor.h"
@@ -746,6 +732,8 @@
   web_app.SetDisplayMode(web_app_info.display_mode);
   web_app.SetDisplayModeOverride(web_app_info.display_override);
 
+  web_app.SetBorderlessUrlPatterns(web_app_info.borderless_url_patterns);
+
   web_app.SetDescription(base::UTF16ToUTF8(web_app_info.description));
   web_app.SetLaunchQueryParams(web_app_info.launch_query_params);
   if (web_app_info.scope.is_valid()) {
diff --git a/chrome/browser/web_applications/web_app_install_utils_unittest.cc b/chrome/browser/web_applications/web_app_install_utils_unittest.cc
index 11eb00a0..907f846 100644
--- a/chrome/browser/web_applications/web_app_install_utils_unittest.cc
+++ b/chrome/browser/web_applications/web_app_install_utils_unittest.cc
@@ -6,49 +6,43 @@
 
 #include <stddef.h>
 
+#include <array>
 #include <map>
 #include <memory>
 #include <optional>
 #include <set>
 #include <string>
-#include <type_traits>
 #include <utility>
-#include <variant>
 #include <vector>
 
 #include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
-#include "base/feature_list.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
-#include "build/buildflag.h"
-#include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
 #include "chrome/browser/web_applications/os_integration/web_app_file_handler_manager.h"
 #include "chrome/browser/web_applications/test/web_app_icon_test_utils.h"
 #include "chrome/browser/web_applications/web_app.h"
-#include "chrome/browser/web_applications/web_app_constants.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
 #include "chrome/browser/web_applications/web_app_icon_generator.h"
+#include "chrome/browser/web_applications/web_app_icon_operations.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
+#include "components/services/app_service/public/cpp/file_handler.h"
 #include "components/services/app_service/public/cpp/icon_info.h"
-#include "components/services/app_service/public/cpp/protocol_handler_info.h"
 #include "components/services/app_service/public/cpp/share_target.h"
+#include "components/webapps/common/web_app_id.h"
 #include "mojo/public/cpp/bindings/struct_ptr.h"
-#include "services/network/public/cpp/permissions_policy/origin_with_possible_wildcards.h"
-#include "services/network/public/cpp/permissions_policy/permissions_policy_declaration.h"
-#include "services/network/public/mojom/permissions_policy/permissions_policy_feature.mojom-shared.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/manifest/manifest.h"
-#include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h"
-#include "third_party/blink/public/mojom/manifest/manifest.mojom-shared.h"
+#include "third_party/blink/public/common/safe_url_pattern.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
+#include "third_party/liburlpattern/part.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkColor.h"
-#include "ui/gfx/geometry/size.h"
 #include "ui/gfx/image/image_unittest_util.h"
 #include "ui/gfx/skia_util.h"
 #include "url/gurl.h"
@@ -267,8 +261,9 @@
     EXPECT_FALSE(web_app_info.is_generated_icon);
 
     EXPECT_TRUE(ContainsOneIconOfEachSize(web_app_info.icon_bitmaps.any));
-    for (const auto& bitmap_any : web_app_info.icon_bitmaps.any)
+    for (const auto& bitmap_any : web_app_info.icon_bitmaps.any) {
       EXPECT_EQ(SK_ColorCYAN, bitmap_any.second.getColor(0, 0));
+    }
   }
   {
     auto web_app_info = CreateWebAppInstallInfo();
@@ -284,8 +279,9 @@
     EXPECT_FALSE(web_app_info.is_generated_icon);
 
     EXPECT_TRUE(ContainsOneIconOfEachSize(web_app_info.icon_bitmaps.any));
-    for (const auto& bitmap_any : web_app_info.icon_bitmaps.any)
+    for (const auto& bitmap_any : web_app_info.icon_bitmaps.any) {
       EXPECT_EQ(SK_ColorMAGENTA, bitmap_any.second.getColor(0, 0));
+    }
   }
 }
 
@@ -418,8 +414,9 @@
 }
 
 TEST_P(FileHandlersFromManifestTest, PopulateFileHandlerIcons) {
-  if (!WebAppFileHandlerManager::IconsEnabled())
+  if (!WebAppFileHandlerManager::IconsEnabled()) {
     return;
+  }
 
   std::vector<blink::mojom::ManifestFileHandlerPtr> manifest_file_handlers =
       CreateManifestFileHandlers(1);
@@ -743,4 +740,25 @@
   EXPECT_FALSE(web_app->share_target().has_value());
 }
 
+TEST(WebAppInstallUtils, SetWebAppManifestFields_BorderlessUrlPatterns) {
+  auto web_app_info = CreateWebAppInstallInfoFromStartUrl(StartUrl());
+  web_app_info.title = u"App Name";
+
+  const webapps::AppId app_id = GenerateAppId(/*manifest_id_path=*/std::nullopt,
+                                              web_app_info.start_url());
+  auto web_app = std::make_unique<WebApp>(app_id);
+
+  blink::SafeUrlPattern foo_pattern;
+  foo_pattern.hostname = {
+      liburlpattern::Part(liburlpattern::PartType::kFixed,
+                          /*value=*/"foo.com", liburlpattern::Modifier::kNone),
+  };
+  web_app_info.borderless_url_patterns.push_back(foo_pattern);
+
+  SetWebAppManifestFields(web_app_info, *web_app);
+
+  EXPECT_THAT(web_app->borderless_url_patterns(),
+              testing::ElementsAre(foo_pattern));
+}
+
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_proto_utils.cc b/chrome/browser/web_applications/web_app_proto_utils.cc
index 0e9c4c9f..a84171d2 100644
--- a/chrome/browser/web_applications/web_app_proto_utils.cc
+++ b/chrome/browser/web_applications/web_app_proto_utils.cc
@@ -3,15 +3,30 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/web_applications/web_app_proto_utils.h"
+
+#include <optional>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/check.h"
+#include "base/logging.h"
+#include "base/notreached.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
+#include "chrome/browser/web_applications/proto/web_app.pb.h"
+#include "chrome/browser/web_applications/proto/web_app_tab_strip.pb.h"
 #include "chrome/browser/web_applications/proto/web_app_url_pattern.pb.h"
-#include "chrome/browser/web_applications/user_display_mode.h"
+#include "chrome/browser/web_applications/web_app_constants.h"
 #include "components/services/app_service/public/cpp/icon_info.h"
+#include "components/sync/protocol/web_app_specifics.pb.h"
+#include "components/webapps/common/web_app_id.h"
+#include "content/browser/background_fetch/background_fetch.pb.h"
 #include "third_party/blink/public/common/manifest/manifest.h"
+#include "third_party/blink/public/common/safe_url_pattern.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
-#include "third_party/liburlpattern/pattern.h"
+#include "third_party/liburlpattern/part.h"
 #include "ui/gfx/geometry/size.h"
+#include "url/gurl.h"
 
 namespace web_app {
 
@@ -135,8 +150,9 @@
   for (const sync_pb::WebAppIconInfo& icon_info_proto : manifest_icons_proto) {
     apps::IconInfo icon_info;
 
-    if (icon_info_proto.has_size_in_px())
+    if (icon_info_proto.has_size_in_px()) {
       icon_info.square_size_px = icon_info_proto.size_in_px();
+    }
 
     if (!icon_info_proto.has_url()) {
       DLOG(ERROR) << container_name_for_logging << " IconInfo has missing url";
@@ -152,8 +168,9 @@
     if (icon_info_proto.has_purpose()) {
       std::optional<apps::IconInfo::Purpose> opt_purpose =
           SyncPurposeToIconInfoPurpose(icon_info_proto.purpose());
-      if (!opt_purpose.has_value())
+      if (!opt_purpose.has_value()) {
         return std::nullopt;
+      }
       icon_info.purpose = opt_purpose.value();
     } else {
       // Treat unset purpose as ANY so that old data without the field is
@@ -230,8 +247,9 @@
 sync_pb::WebAppIconInfo AppIconInfoToSyncProto(
     const apps::IconInfo& icon_info) {
   sync_pb::WebAppIconInfo icon_info_proto;
-  if (icon_info.square_size_px.has_value())
+  if (icon_info.square_size_px.has_value()) {
     icon_info_proto.set_size_in_px(icon_info.square_size_px.value());
+  }
   DCHECK(!icon_info.url.is_empty());
   icon_info_proto.set_url(icon_info.url.spec());
   icon_info_proto.set_purpose(IconInfoPurposeToSyncPurpose(icon_info.purpose));
@@ -340,6 +358,19 @@
   return url_pattern;
 }
 
+std::optional<std::vector<blink::SafeUrlPattern>> ToUrlPatterns(
+    const RepeatedUrlPatternProto& proto_url_patterns) {
+  std::vector<blink::SafeUrlPattern> result;
+  for (const auto& proto_pattern : proto_url_patterns) {
+    auto url_pattern = ToUrlPattern(proto_pattern);
+    if (!url_pattern.has_value()) {
+      return std::nullopt;
+    }
+    result.push_back(url_pattern.value());
+  }
+  return result;
+}
+
 proto::UrlPattern ToUrlPatternProto(const blink::SafeUrlPattern& url_pattern) {
   proto::UrlPattern url_pattern_proto;
   for (const auto& part : url_pattern.pathname) {
@@ -372,17 +403,12 @@
       home_tab_params.icons = std::move(*icons);
     }
 
-    std::vector<blink::SafeUrlPattern> scope_patterns;
-    for (const proto::UrlPattern& proto_url_pattern :
-         tab_strip_proto.home_tab_params().scope_patterns()) {
-      std::optional<blink::SafeUrlPattern> url_pattern =
-          ToUrlPattern(proto_url_pattern);
-      if (!url_pattern) {
-        return std::nullopt;
-      }
-      scope_patterns.push_back(url_pattern.value());
+    std::optional<std::vector<blink::SafeUrlPattern>> scope_patterns =
+        ToUrlPatterns(tab_strip_proto.home_tab_params().scope_patterns());
+    if (!scope_patterns.has_value()) {
+      return std::nullopt;
     }
-    home_tab_params.scope_patterns = std::move(scope_patterns);
+    home_tab_params.scope_patterns = std::move(scope_patterns.value());
 
     tab_strip.home_tab = std::move(home_tab_params);
   }
diff --git a/chrome/browser/web_applications/web_app_proto_utils.h b/chrome/browser/web_applications/web_app_proto_utils.h
index 9463f000..831e50e 100644
--- a/chrome/browser/web_applications/web_app_proto_utils.h
+++ b/chrome/browser/web_applications/web_app_proto_utils.h
@@ -6,15 +6,19 @@
 #define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_PROTO_UTILS_H_
 
 #include <optional>
+#include <string>
 #include <vector>
 
 #include "chrome/browser/web_applications/proto/web_app.pb.h"
 #include "chrome/browser/web_applications/proto/web_app_tab_strip.pb.h"
 #include "chrome/browser/web_applications/proto/web_app_url_pattern.pb.h"
-#include "chrome/browser/web_applications/web_app.h"
+#include "chrome/browser/web_applications/web_app_constants.h"
 #include "components/sync/protocol/web_app_specifics.pb.h"
+#include "components/webapps/common/web_app_id.h"
 #include "content/browser/background_fetch/background_fetch.pb.h"
+#include "third_party/blink/public/common/manifest/manifest.h"
 #include "third_party/blink/public/common/safe_url_pattern.h"
+#include "third_party/protobuf/src/google/protobuf/repeated_ptr_field.h"
 
 namespace apps {
 struct IconInfo;
@@ -30,6 +34,9 @@
 using RepeatedImageResourceProto =
     const ::google::protobuf::RepeatedPtrField<content::proto::ImageResource>;
 
+using RepeatedUrlPatternProto =
+    ::google::protobuf::RepeatedPtrField<proto::UrlPattern>;
+
 std::optional<std::vector<apps::IconInfo>> ParseAppIconInfos(
     const char* container_name_for_logging,
     const RepeatedIconInfosProto& manifest_icons_proto);
@@ -53,6 +60,9 @@
 std::optional<blink::SafeUrlPattern> ToUrlPattern(
     const proto::UrlPattern& proto_url_pattern);
 
+std::optional<std::vector<blink::SafeUrlPattern>> ToUrlPatterns(
+    const RepeatedUrlPatternProto& proto_url_patterns);
+
 proto::UrlPattern ToUrlPatternProto(const blink::SafeUrlPattern& url_pattern);
 
 std::optional<TabStrip> ProtoToTabStrip(proto::TabStrip tab_strip_proto);
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index 3514ca0..a27d61cc 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1756857556-2516e97c7ef286be400ad0e583a2628faa4ebd3f-9fb5b29e03bfb58b64746d20e1247ea7bb241ce0.profdata
+chrome-android32-main-1756879124-200e7459337e5f1b39c9bfafc2fadb47c4cd79ec-87c19a36e4f40aeb3928f4bb19aebb17f3a745bd.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index 8d2e41b..bc718597 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1756871886-e1423b4f294000a37d5d1a393e5719a046a1d69e-4694dccaa905e832c96bf92fd5a327412935bb70.profdata
+chrome-android64-main-1756894965-339f85f88f67b4311c62162580948fe49911a5af-88d0ac56faffd84a07e3e0c5e4f8ed30b5e97c35.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index dff0806..7ecaf9c 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1756857556-f755982f8679090bb72d0db75b169329126e7c55-9fb5b29e03bfb58b64746d20e1247ea7bb241ce0.profdata
+chrome-win32-main-1756879124-4d79254810d883f444b1169c12830ce211c06a18-87c19a36e4f40aeb3928f4bb19aebb17f3a745bd.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 6bd29953..b7bf0be 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1756857556-5add76cd18de14e46c98063b554b904bb35d7131-9fb5b29e03bfb58b64746d20e1247ea7bb241ce0.profdata
+chrome-win64-main-1756879124-9ebc95b70e3e8a1d0e8404876a2a947bacb480e3-87c19a36e4f40aeb3928f4bb19aebb17f3a745bd.profdata
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 9356d70..14c69520 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -4488,7 +4488,11 @@
     }
 
     if (enable_bound_session_credentials) {
-      sources += [ "../browser/signin/bound_session_credentials/bound_session_cookie_refresh_service_impl_browsertest.cc" ]
+      sources += [
+        "../browser/signin/bound_session_credentials/bound_session_cookie_refresh_service_impl_browsertest.cc",
+        "../browser/signin/bound_session_oauth_multilogin_browsertest.cc",
+      ]
+      deps += [ "//components/unexportable_keys:test_support" ]
     }
 
     if (is_win || is_linux) {
diff --git a/chrome/test/data/autofill/autofill_address_enabled.html b/chrome/test/data/autofill/autofill_address_enabled.html
index 9f47a50..a0d5afed 100644
--- a/chrome/test/data/autofill/autofill_address_enabled.html
+++ b/chrome/test/data/autofill/autofill_address_enabled.html
@@ -20,12 +20,6 @@
         <label for="city">City</label>
         <input name="city" id="city" required autocomplete="address-level2">
 
-        <label for="state">State</label>
-        <input name="state" id="state" required autocomplete="address-level1">
-
-        <label for="country">Country</label>
-        <input name="country" id="country" required autocomplete="country">
-
         <label for="phone">Phone</label>
         <input name="phone" id="phone" type="tel" required autocomplete="tel">
 
@@ -35,4 +29,4 @@
         <input type="submit" id="button" value="OK" class="test-target-button">
     </form>
 </body>
-</html>
+</html>
\ No newline at end of file
diff --git a/chrome/test/data/web_apps/empty_web_app.json b/chrome/test/data/web_apps/empty_web_app.json
index 380e42c2..2030a47eb 100644
--- a/chrome/test/data/web_apps/empty_web_app.json
+++ b/chrome/test/data/web_apps/empty_web_app.json
@@ -7,6 +7,7 @@
    "app_service_icon_url": "chrome://app-icon/empty_app/32",
    "app_size_in_bytes": null,
    "background_color": "none",
+   "borderless_url_patterns": [  ],
    "capture_links": "kUndefined",
    "current_os_integration_states": {
    },
diff --git a/chrome/test/data/web_apps/sample_web_app.json b/chrome/test/data/web_apps/sample_web_app.json
index 6517a20b..d7a0b560 100644
--- a/chrome/test/data/web_apps/sample_web_app.json
+++ b/chrome/test/data/web_apps/sample_web_app.json
@@ -7,6 +7,7 @@
    "app_service_icon_url": "chrome://app-icon/ejhkbejlajgoplgondfmjmplbdjaofok/32",
    "app_size_in_bytes": "314765861",
    "background_color": "rgba(151,34,83,1)",
+   "borderless_url_patterns": [  ],
    "capture_links": "kNone",
    "current_os_integration_states": {
       "file_handling": {
diff --git a/chrome/test/data/webui/settings/privacy_page_test.ts b/chrome/test/data/webui/settings/privacy_page_test.ts
index 441d93b..0066f7aa 100644
--- a/chrome/test/data/webui/settings/privacy_page_test.ts
+++ b/chrome/test/data/webui/settings/privacy_page_test.ts
@@ -21,35 +21,20 @@
 import {TestSiteSettingsPrefsBrowserProxy} from './test_site_settings_prefs_browser_proxy.js';
 
 const redesignedPages: Route[] = [
-  routes.SITE_SETTINGS_ADS,
-  routes.SITE_SETTINGS_AUTOMATIC_DOWNLOADS,
-  routes.SITE_SETTINGS_BACKGROUND_SYNC,
   routes.SITE_SETTINGS_CAMERA,
-  routes.SITE_SETTINGS_CLIPBOARD,
   routes.SITE_SETTINGS_FEDERATED_IDENTITY_API,
   routes.SITE_SETTINGS_FILE_SYSTEM_WRITE,
   routes.SITE_SETTINGS_HANDLERS,
   routes.SITE_SETTINGS_HID_DEVICES,
   routes.SITE_SETTINGS_IMAGES,
-  routes.SITE_SETTINGS_JAVASCRIPT,
-  routes.SITE_SETTINGS_JAVASCRIPT_OPTIMIZER,
   routes.SITE_SETTINGS_MICROPHONE,
-  routes.SITE_SETTINGS_MIDI_DEVICES,
   routes.SITE_SETTINGS_NOTIFICATIONS,
-  routes.SITE_SETTINGS_PAYMENT_HANDLER,
   routes.SITE_SETTINGS_PDF_DOCUMENTS,
-  routes.SITE_SETTINGS_POPUPS,
   routes.SITE_SETTINGS_PROTECTED_CONTENT,
-  routes.SITE_SETTINGS_SENSORS,
   routes.SITE_SETTINGS_SERIAL_PORTS,
   routes.SITE_SETTINGS_SOUND,
   routes.SITE_SETTINGS_USB_DEVICES,
 
-  // WEB_PRINTING is currently only supported on ChromeOS.
-  // <if expr="is_chromeos">
-  routes.SITE_SETTINGS_WEB_PRINTING,
-  // </if>
-
   // TODO(crbug.com/40719916) After restructure add coverage for elements on
   // routes which depend on flags being enabled.
   // routes.SITE_SETTINGS_BLUETOOTH_SCANNING,
diff --git a/chrome/test/data/webui/settings/settings_browsertest.cc b/chrome/test/data/webui/settings/settings_browsertest.cc
index d596c96..1a2f192 100644
--- a/chrome/test/data/webui/settings/settings_browsertest.cc
+++ b/chrome/test/data/webui/settings/settings_browsertest.cc
@@ -358,7 +358,12 @@
 }
 
 // TODO(crbug.com/442545295): Flaky on at least Linux dbg.
-IN_PROC_BROWSER_TEST_F(SettingsTest, DISABLED_PrivacyPageIndex) {
+#if !defined(NDEBUG)
+#define MAYBE_PrivacyPageIndex DISABLED_PrivacyPageIndex
+#else
+#define MAYBE_PrivacyPageIndex PrivacyPageIndex
+#endif
+IN_PROC_BROWSER_TEST_F(SettingsTest, MAYBE_PrivacyPageIndex) {
   RunTest("settings/privacy_page_index_test.js", "mocha.run()");
 }
 
diff --git a/chrome/updater/update_service.h b/chrome/updater/update_service.h
index 0b04fee..e9faf93 100644
--- a/chrome/updater/update_service.h
+++ b/chrome/updater/update_service.h
@@ -200,19 +200,6 @@
 std::ostream& operator<<(std::ostream& os,
                          const UpdateService::UpdateState& update_state);
 
-inline std::ostream& operator<<(
-    std::ostream& os,
-    const UpdateService::PolicySameVersionUpdate& policy_same_version_update) {
-  return os << [&policy_same_version_update] {
-    switch (policy_same_version_update) {
-      case UpdateService::PolicySameVersionUpdate::kNotAllowed:
-        return "not allowed";
-      case UpdateService::PolicySameVersionUpdate::kAllowed:
-        return "allowed";
-    }
-  }();
-}
-
 bool operator==(const UpdateService::UpdateState& lhs,
                 const UpdateService::UpdateState& rhs);
 
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb
index 1ea7ad9c..a182c5d 100644
--- a/chromeos/strings/chromeos_strings_ar.xtb
+++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -47,7 +47,7 @@
 <translation id="1167755866710282443">افتح القائمة لتخصيص المفاتيح. اسحب القائمة لنقلها.</translation>
 <translation id="1171349345463658120">بحيرة ساحلية رملية</translation>
 <translation id="1174073918202301297">تمت إضافة الاختصار</translation>
-<translation id="11743817593307477">‏استخدِم مفاتيح الأسهم لنقل عنصر التحكّم هذا إلى الإجراء الذي تريده في اللعبة. استخدِم مفتاح Enter لوضع عنصر التحكّم. واستخدِم مفتاح Esc للإلغاء.</translation>
+<translation id="11743817593307477">‏يمكنك استخدام مفاتيح الأسهم لنقل عنصر التحكّم هذا إلى الإجراء المطلوب في اللعبة، واستخدام مفتاح Enter لوضع عنصر التحكّم، ومفتاح Esc للإلغاء.</translation>
 <translation id="1175697296044146566">تتم إدارة جهاز <ph name="DEVICE_TYPE" /> هذا من خلال <ph name="MANAGER" />.</translation>
 <translation id="1175951029573070619">إشارة متوسطة (<ph name="SIGNAL_STRENGTH" />)</translation>
 <translation id="1178581264944972037">الإيقاف مؤقتًا</translation>
@@ -1058,7 +1058,7 @@
 <translation id="5662240986744577912">إيقاف/تفعيل ميزة "شاشة الخصوصية"</translation>
 <translation id="5669267381087807207">تفعيل</translation>
 <translation id="5670702108860320605">BSSID</translation>
-<translation id="5674943355143004615">يُرجى وصف الخلفية التي تريد إنشاءها</translation>
+<translation id="5674943355143004615">يُرجى وصف الخلفية المُراد إنشاؤها</translation>
 <translation id="5680504961595602662">لوحة سريالية تعرض <ph name="SURREAL_LANDSCAPE" /> مع <ph name="SURREAL_SUBJECT" /></translation>
 <translation id="5685478548317291523">كرز</translation>
 <translation id="5691511426247308406">العائلة</translation>
@@ -1698,7 +1698,7 @@
 <translation id="8477536061607044749">التصميم الطباعي</translation>
 <translation id="8477551185774834963">وقت استجابة "نظام أسماء النطاقات" أعلى بقليل من الحدّ الأقصى المسموح به.</translation>
 <translation id="8481308460877552925">يضم معلومات غير صحيحة</translation>
-<translation id="8482376765267780829">اختَر جزءًا من النص لتبسيطه</translation>
+<translation id="8482376765267780829">يرجى اختيار جزء من النص لتبسيطه</translation>
 <translation id="8483248364096924578">‏عنوان IP</translation>
 <translation id="8491311378305535241">‏تعذَّر اجتياز جدار الحماية للاتصال بالمواقع الإلكترونية التي تستخدم بروتوكول HTTP من خلال تطبيقات Android.</translation>
 <translation id="8495070016475833911">اللبّاد</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb
index 1ceb1ec..ab8a822 100644
--- a/chromeos/strings/chromeos_strings_iw.xtb
+++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -303,7 +303,7 @@
 <translation id="2161656808144014275">טקסט</translation>
 <translation id="2163937499206714165">הפעלת המצב הכהה</translation>
 <translation id="2164131940279488868">כדי להתחיל להקליט אודיו, צריך לוודא שהמיקרופון מחובר</translation>
-<translation id="2173302385160625112">יש לבדוק את החיבור לאינטרנט</translation>
+<translation id="2173302385160625112">צריך לבדוק את החיבור לאינטרנט</translation>
 <translation id="2176909213844392588">אי אפשר להוריד את מודל התמלול ב<ph name="LANGUAGE_NAME" />. צריך לנסות שוב או להפעיל מחדש את ה-<ph name="DEVICE_TYPE" /> שלך.</translation>
 <translation id="2180197493692062006">משהו השתבש. צריך לנסות לפתוח את האפליקציה מחדש.</translation>
 <translation id="2189104374785738357">‏עריכת פרטי ה-APN</translation>
@@ -662,7 +662,7 @@
 <translation id="3942420633017001071">אבחון</translation>
 <translation id="3954678691475912818">סוג המכשיר לא ידוע.</translation>
 <translation id="3959413315969265597">‏אי אפשר להפעיל את ה-APN הזה. צריך להוסיף APN ברירת מחדל.</translation>
-<translation id="3966286471246132217">כדי לקבל תוצאות מדויקות יותר, סוגרים את כל האפליקציות עד להשלמת הבדיקה.</translation>
+<translation id="3966286471246132217">כדי לקבל תוצאות מדויקות יותר, צריך לסגור את כל האפליקציות עד להשלמת הבדיקה.</translation>
 <translation id="3967822245660637423">ההורדה הושלמה</translation>
 <translation id="3969602104473960991">‏הסיסמה של ChromeOS עודכנה</translation>
 <translation id="397105322502079400">מתבצע חישוב...</translation>
diff --git a/clank b/clank
index 2c48164..8f1bd27 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 2c481644d275a5491cf032736fc8d3c25354192d
+Subproject commit 8f1bd2721f53dac094bed898dc5a426c0e522749
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index debe4cc..f9fdfe9 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -284,8 +284,8 @@
     "form_parsing/autofill_scanner.h",
     "form_parsing/credit_card_field_parser.cc",
     "form_parsing/credit_card_field_parser.h",
-    "form_parsing/determine_heuristic_types.cc",
-    "form_parsing/determine_heuristic_types.h",
+    "form_parsing/determine_regex_types.cc",
+    "form_parsing/determine_regex_types.h",
     "form_parsing/email_field_parser.cc",
     "form_parsing/email_field_parser.h",
     "form_parsing/field_candidates.cc",
diff --git a/components/autofill/core/browser/autofill_merge_unittest.cc b/components/autofill/core/browser/autofill_merge_unittest.cc
index 97a50444..5a3ec125 100644
--- a/components/autofill/core/browser/autofill_merge_unittest.cc
+++ b/components/autofill/core/browser/autofill_merge_unittest.cc
@@ -26,7 +26,7 @@
 #include "components/autofill/core/browser/data_manager/test_personal_data_manager.h"
 #include "components/autofill/core/browser/form_import/form_data_importer.h"
 #include "components/autofill/core/browser/form_import/form_data_importer_test_api.h"
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/foundations/test_autofill_client.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
@@ -101,9 +101,10 @@
     const FormData& form) {
   auto cached_form_structure =
       std::make_unique<FormStructure>(test::WithoutValues(form));
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *cached_form_structure, nullptr);
-  heuristic_predictions.ApplyTo(cached_form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          cached_form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(cached_form_structure->fields());
   cached_form_structure->RationalizeAndAssignSections(
       GeoIpCountryCode(""), LanguageCode(""), nullptr);
   auto form_structure = std::make_unique<FormStructure>(form);
diff --git a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_encoding_unittest.cc b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_encoding_unittest.cc
index 55aa3c6f..3610f40 100644
--- a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_encoding_unittest.cc
+++ b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_encoding_unittest.cc
@@ -21,7 +21,7 @@
 #include "components/autofill/core/browser/autofill_field.h"
 #include "components/autofill/core/browser/crowdsourcing/randomized_encoder.h"
 #include "components/autofill/core/browser/field_types.h"
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #include "components/autofill/core/browser/form_parsing/form_field_parser.h"
 #include "components/autofill/core/browser/metrics/log_event.h"
 #include "components/autofill/core/browser/proto/api_v1.pb.h"
@@ -1988,9 +1988,10 @@
   // Form structure containing the state on submit.
   FormStructure form_structure(form);
 
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), cached_form_structure, nullptr);
-  heuristic_predictions.ApplyTo(cached_form_structure.fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          cached_form_structure.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(cached_form_structure.fields());
   cached_form_structure.RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                      LanguageCode(""), nullptr);
 
@@ -2447,9 +2448,9 @@
 
   // Parse the response and update the field type predictions.
   FormStructure form(form_data);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form, nullptr);
-  heuristic_predictions.ApplyTo(form.fields());
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GeoIpCountryCode(""), LanguageCode(""), form.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form.fields());
   form.RationalizeAndAssignSections(GeoIpCountryCode(""), LanguageCode(""),
                                     nullptr);
   std::vector<raw_ptr<FormStructure, VectorExperimental>> forms{&form};
@@ -2501,9 +2502,9 @@
        .url = "http://foo.com"});
 
   FormStructure form(form_data);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form, nullptr);
-  heuristic_predictions.ApplyTo(form.fields());
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GeoIpCountryCode(""), LanguageCode(""), form.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form.fields());
   form.RationalizeAndAssignSections(GeoIpCountryCode(""), LanguageCode(""),
                                     nullptr);
 
@@ -2552,9 +2553,9 @@
        .url = "http://foo.com"});
 
   FormStructure form(form_data);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form, nullptr);
-  heuristic_predictions.ApplyTo(form.fields());
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GeoIpCountryCode(""), LanguageCode(""), form.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form.fields());
   form.RationalizeAndAssignSections(GeoIpCountryCode(""), LanguageCode(""),
                                     nullptr);
 
@@ -2605,9 +2606,9 @@
              .form_control_type = FormControlType::kInputPassword}},
        .url = "http://foo.com"});
   FormStructure form(form_data);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form, nullptr);
-  heuristic_predictions.ApplyTo(form.fields());
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GeoIpCountryCode(""), LanguageCode(""), form.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form.fields());
   form.RationalizeAndAssignSections(GeoIpCountryCode(""), LanguageCode(""),
                                     nullptr);
 
@@ -2652,9 +2653,9 @@
              .form_control_type = FormControlType::kInputPassword}},
        .url = "http://foo.com"});
   FormStructure form(form_data);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form, nullptr);
-  heuristic_predictions.ApplyTo(form.fields());
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GeoIpCountryCode(""), LanguageCode(""), form.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form.fields());
   form.RationalizeAndAssignSections(GeoIpCountryCode(""), LanguageCode(""),
                                     nullptr);
 
@@ -2696,9 +2697,9 @@
        CreateTestFormField("email", "email", "", FormControlType::kInputText,
                            "address-level2")});
   FormStructure form(form_data);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form, nullptr);
-  heuristic_predictions.ApplyTo(form.fields());
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GeoIpCountryCode(""), LanguageCode(""), form.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form.fields());
   form.RationalizeAndAssignSections(GeoIpCountryCode(""), LanguageCode(""),
                                     nullptr);
 
@@ -2763,9 +2764,9 @@
        CreateTestFormField("email", "email", "", FormControlType::kInputText,
                            "address-level2")});
   FormStructure form(form_data);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form, nullptr);
-  heuristic_predictions.ApplyTo(form.fields());
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GeoIpCountryCode(""), LanguageCode(""), form.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form.fields());
   form.RationalizeAndAssignSections(GeoIpCountryCode(""), LanguageCode(""),
                                     nullptr);
 
@@ -2943,9 +2944,9 @@
            {.host_form_signature = FormSignature(12345), .name = u"name"}}});
 
   FormStructure form(form_data);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form, nullptr);
-  heuristic_predictions.ApplyTo(form.fields());
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GeoIpCountryCode(""), LanguageCode(""), form.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form.fields());
   form.RationalizeAndAssignSections(GeoIpCountryCode(""), LanguageCode(""),
                                     nullptr);
 
@@ -3670,9 +3671,10 @@
   FormStructure form_structure(form);
   std::vector<raw_ptr<FormStructure, VectorExperimental>> forms;
   forms.push_back(&form_structure);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *forms.front(), nullptr);
-  heuristic_predictions.ApplyTo(forms.front()->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          forms.front()->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(forms.front()->fields());
   forms.front()->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                               LanguageCode(""), nullptr);
 
@@ -3726,9 +3728,10 @@
 
   FormStructure form_structure(form);
   // Will identify the sections based on the heuristics types.
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure.fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure.fields());
   form_structure.RationalizeAndAssignSections(GeoIpCountryCode(""),
                                               LanguageCode(""), nullptr);
 
@@ -3781,9 +3784,10 @@
   FormStructure form_structure(form);
 
   // Will identify the sections based on the heuristics types.
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure.fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure.fields());
   form_structure.RationalizeAndAssignSections(GeoIpCountryCode(""),
                                               LanguageCode(""), nullptr);
 
@@ -3840,9 +3844,10 @@
   FormStructure form_structure(form);
 
   // Will identify the sections based on the heuristics types.
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure.fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure.fields());
   form_structure.RationalizeAndAssignSections(GeoIpCountryCode(""),
                                               LanguageCode(""), nullptr);
 
@@ -3887,9 +3892,9 @@
             CalculateFieldSignatureForField(form_data.fields()[1]));
 
   FormStructure form(form_data);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form, nullptr);
-  heuristic_predictions.ApplyTo(form.fields());
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GeoIpCountryCode(""), LanguageCode(""), form.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form.fields());
   form.RationalizeAndAssignSections(GeoIpCountryCode(""), LanguageCode(""),
                                     nullptr);
 
@@ -3932,9 +3937,9 @@
             CalculateFieldSignatureForField(form_data.fields()[1]));
 
   FormStructure form(form_data);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form, nullptr);
-  heuristic_predictions.ApplyTo(form.fields());
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GeoIpCountryCode(""), LanguageCode(""), form.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form.fields());
   form.RationalizeAndAssignSections(GeoIpCountryCode(""), LanguageCode(""),
                                     nullptr);
 
@@ -3977,9 +3982,9 @@
   }
 
   FormStructure form(form_data);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form, nullptr);
-  heuristic_predictions.ApplyTo(form.fields());
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GeoIpCountryCode(""), LanguageCode(""), form.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form.fields());
   form.RationalizeAndAssignSections(GeoIpCountryCode(""), LanguageCode(""),
                                     nullptr);
 
diff --git a/components/autofill/core/browser/crowdsourcing/determine_possible_field_types_unittest.cc b/components/autofill/core/browser/crowdsourcing/determine_possible_field_types_unittest.cc
index 7ce01ad..5e142087 100644
--- a/components/autofill/core/browser/crowdsourcing/determine_possible_field_types_unittest.cc
+++ b/components/autofill/core/browser/crowdsourcing/determine_possible_field_types_unittest.cc
@@ -15,7 +15,7 @@
 #include "components/autofill/core/browser/data_model/addresses/autofill_profile.h"
 #include "components/autofill/core/browser/data_model/payments/credit_card.h"
 #include "components/autofill/core/browser/field_types.h"
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #include "components/autofill/core/browser/foundations/test_autofill_client.h"
 #include "components/autofill/core/browser/geo/alternative_state_name_map_test_utils.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
@@ -110,9 +110,10 @@
     const FormData& form) {
   auto cached_form_structure =
       std::make_unique<FormStructure>(test::WithoutValues(form));
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *cached_form_structure, nullptr);
-  heuristic_predictions.ApplyTo(cached_form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          cached_form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(cached_form_structure->fields());
   cached_form_structure->RationalizeAndAssignSections(
       GeoIpCountryCode(""), LanguageCode(""), nullptr);
 
diff --git a/components/autofill/core/browser/data_model/addresses/autofill_structured_address_component.cc b/components/autofill/core/browser/data_model/addresses/autofill_structured_address_component.cc
index df5195543..8bdfe59 100644
--- a/components/autofill/core/browser/data_model/addresses/autofill_structured_address_component.cc
+++ b/components/autofill/core/browser/data_model/addresses/autofill_structured_address_component.cc
@@ -1040,8 +1040,7 @@
     }
   }
 
-  if ((merge_mode_ & (kRecursivelyMergeTokenEquivalentValues |
-                      kRecursivelyMergeSingleTokenSubset)) &&
+  if ((merge_mode_ & (kRecursivelyMergeTokenEquivalentValues)) &&
       token_comparison_result.status == SortedTokenComparisonStatus::kMatch) {
     return true;
   }
@@ -1052,17 +1051,6 @@
     return true;
   }
 
-  if ((merge_mode_ & kRecursivelyMergeSingleTokenSubset) &&
-      token_comparison_result.IsSingleTokenSuperset()) {
-    // This strategy is only applicable if also the unnormalized values have a
-    // single-token-superset relation.
-    SortedTokenComparisonResult unnormalized_token_comparison_result =
-        CompareSortedTokens(GetValue(), newer_component.GetValue());
-    if (unnormalized_token_comparison_result.IsSingleTokenSuperset()) {
-      return true;
-    }
-  }
-
   // If the one value is a substring of the other, use the substring of the
   // corresponding mode is active.
   if ((merge_mode_ & kUseMostRecentSubstring) &&
@@ -1179,22 +1167,6 @@
     return true;
   }
 
-  // Recursively merge a single-token subset if the corresponding mode is
-  // active.
-  if ((merge_mode_ & kRecursivelyMergeSingleTokenSubset) &&
-      token_comparison_result.IsSingleTokenSuperset()) {
-    // For the merging of subset token, the tokenization must be done without
-    // prior normalization of the values.
-    SortedTokenComparisonResult unnormalized_token_comparison_result =
-        CompareSortedTokens(GetValue(), newer_component.GetValue());
-    // The merging strategy can only be applied when the comparison of the
-    // unnormalized tokens still yields a single token superset.
-    if (unnormalized_token_comparison_result.IsSingleTokenSuperset()) {
-      return MergeSubsetComponent(newer_component,
-                                  unnormalized_token_comparison_result);
-    }
-  }
-
   // Replace the older value with the newer one if the corresponding mode is
   // active.
   if (merge_mode_ & kUseNewerIfDifferent) {
@@ -1469,88 +1441,6 @@
                               VerificationStatus::kParsed);
 }
 
-bool AddressComponent::MergeSubsetComponent(
-    const AddressComponent& subset_component,
-    const SortedTokenComparisonResult& token_comparison_result) {
-  CHECK(token_comparison_result.IsSingleTokenSuperset());
-  CHECK_EQ(token_comparison_result.additional_tokens.size(), 1u);
-  std::u16string token_to_consume =
-      token_comparison_result.additional_tokens.back().value;
-
-  int this_component_verification_score = 0;
-  int newer_component_verification_score = 0;
-  bool found_subset_component = false;
-
-  std::vector<int> unmerged_indices;
-  unmerged_indices.reserve(subcomponents_.size());
-
-  const SubcomponentsList& subset_subcomponents =
-      subset_component.Subcomponents();
-
-  unmerged_indices.reserve(subcomponents_.size());
-
-  for (size_t i = 0; i < subcomponents_.size(); i++) {
-    CHECK_EQ(subcomponents_[i]->GetStorageType(),
-             subset_subcomponents.at(i)->GetStorageType());
-    AddressComponent* subcomponent = subcomponents_[i];
-    const AddressComponent* subset_subcomponent = subset_subcomponents.at(i);
-
-    std::u16string additional_token;
-
-    // If the additional token is the value of this token. Just leave it in.
-    if (!found_subset_component &&
-        subcomponent->GetValue() == token_to_consume &&
-        subset_subcomponent->GetValue().empty()) {
-      found_subset_component = true;
-      continue;
-    }
-
-    SortedTokenComparisonResult subtoken_comparison_result =
-        CompareSortedTokens(subcomponent->GetSortedTokens(),
-                            subset_subcomponent->GetSortedTokens());
-
-    // Recursive case.
-    if (!found_subset_component &&
-        subtoken_comparison_result.IsSingleTokenSuperset()) {
-      found_subset_component = true;
-      subcomponent->MergeSubsetComponent(*subset_subcomponent,
-                                         subtoken_comparison_result);
-      continue;
-    }
-
-    // If the tokens are the equivalent, they can directly be merged.
-    if (subtoken_comparison_result.status ==
-        SortedTokenComparisonStatus::kMatch) {
-      subcomponent->MergeTokenEquivalentComponent(*subset_subcomponent);
-      continue;
-    }
-
-    // Otherwise calculate the verification score.
-    this_component_verification_score +=
-        subcomponent->GetStructureVerificationScore();
-    newer_component_verification_score +=
-        subset_subcomponent->GetStructureVerificationScore();
-    unmerged_indices.emplace_back(i);
-  }
-
-  // If the total verification score of all unmerged components of the other
-  // component is equal or larger than the score of this component, use its
-  // subcomponents including their substructure for all unmerged components.
-  if (newer_component_verification_score >= this_component_verification_score) {
-    for (size_t i : unmerged_indices) {
-      subcomponents_[i]->CopyFrom(*subset_subcomponents[i]);
-    }
-
-    if (!found_subset_component) {
-      this->ConsumeAdditionalToken(token_to_consume);
-    }
-  }
-
-  // In the current implementation it is always possible to merge.
-  // Once more tokens are supported this may change.
-  return true;
-}
-
 int AddressComponent::GetStructureVerificationScore() const {
   int result = 0;
   switch (GetVerificationStatus()) {
diff --git a/components/autofill/core/browser/data_model/addresses/autofill_structured_address_component.h b/components/autofill/core/browser/data_model/addresses/autofill_structured_address_component.h
index d207ea8c..89e922c 100644
--- a/components/autofill/core/browser/data_model/addresses/autofill_structured_address_component.h
+++ b/components/autofill/core/browser/data_model/addresses/autofill_structured_address_component.h
@@ -87,21 +87,18 @@
   kReplaceSubset = 1 << 4,
   // If both components have a different value, is the newer one.
   kUseNewerIfDifferent = 1 << 5,
-  // If the newer component contains one token more, apply a recursive strategy
-  // to merge the tokens.
-  kRecursivelyMergeSingleTokenSubset = 1 << 6,
   // If one is a substring of the other use the most recent one.
-  kUseMostRecentSubstring = 1 << 7,
+  kUseMostRecentSubstring = 1 << 6,
   // If the tokens match or one is a subset of the other, pick the shorter one.
-  kPickShorterIfOneContainsTheOther = 1 << 8,
+  kPickShorterIfOneContainsTheOther = 1 << 7,
   // If the normalized values are different, use the better one in terms
   // of verification score or the most recent one if both scores are the same.
-  kUseBetterOrMostRecentIfDifferent = 1 << 9,
+  kUseBetterOrMostRecentIfDifferent = 1 << 8,
   // Merge the child nodes and reformat the node from its children after merge
   // if the value has changed.
-  kMergeChildrenAndReformatIfNeeded = 1 << 10,
+  kMergeChildrenAndReformatIfNeeded = 1 << 9,
   // Make a merge decision based on canonicalized values.
-  kMergeBasedOnCanonicalizedValues = 1 << 11,
+  kMergeBasedOnCanonicalizedValues = 1 << 10,
   // Defines the default merging behavior.
   kDefault = kRecursivelyMergeTokenEquivalentValues
 };
@@ -446,11 +443,6 @@
   // Clears all parsed and formatted values.
   void ClearAllParsedAndFormattedValues();
 
-  // Merge a component that has exactly one token less.
-  bool MergeSubsetComponent(
-      const AddressComponent& subset_component,
-      const SortedTokenComparisonResult& token_comparison_result);
-
   // Consumes an additional token into the most appropriate subcomponent.
   // Can be implemented by the specific node types.
   // The fall-back solution uses the first empty node.
diff --git a/components/autofill/core/browser/data_model/addresses/autofill_structured_address_name_unittest.cc b/components/autofill/core/browser/data_model/addresses/autofill_structured_address_name_unittest.cc
index 8238a71..1943fb0 100644
--- a/components/autofill/core/browser/data_model/addresses/autofill_structured_address_name_unittest.cc
+++ b/components/autofill/core/browser/data_model/addresses/autofill_structured_address_name_unittest.cc
@@ -878,184 +878,5 @@
             VerificationStatus::kObserved);
 }
 
-TEST(AutofillStructuredName, MergeSubsetLastname) {
-  NameFull name;
-  NameFull subset_name;
-  test_api(name).SetMergeMode(kRecursivelyMergeSingleTokenSubset |
-                              kRecursivelyMergeTokenEquivalentValues);
-
-  AddressComponentTestValues name_values = {
-      {.type = NAME_FIRST,
-       .value = "Thomas",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_MIDDLE,
-       .value = "Neo",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_LAST,
-       .value = "Anderson y Smith",
-       .status = VerificationStatus::kObserved},
-  };
-
-  AddressComponentTestValues subset_name_values = {
-      {.type = NAME_FIRST,
-       .value = "Thomas",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_MIDDLE,
-       .value = "Neo",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_LAST_FIRST,
-       .value = "Anderson",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_LAST_SECOND,
-       .value = "Smith",
-       .status = VerificationStatus::kObserved},
-  };
-
-  AddressComponentTestValues expectation = {
-      {.type = NAME_FIRST,
-       .value = "Thomas",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_MIDDLE,
-       .value = "Neo",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_LAST_FIRST,
-       .value = "Anderson",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_LAST_CONJUNCTION,
-       .value = "y",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_LAST_SECOND,
-       .value = "Smith",
-       .status = VerificationStatus::kObserved},
-  };
-
-  SetTestValues(&name, name_values);
-  SetTestValues(&subset_name, subset_name_values);
-
-  EXPECT_TRUE(name.IsMergeableWithComponent(subset_name));
-  EXPECT_TRUE(name.MergeWithComponent(subset_name));
-
-  VerifyTestValues(&name, name_values);
-}
-
-TEST(AutofillStructuredName, MergeSubsetLastname_WithNonSpaceSeparators) {
-  NameFull name;
-  NameFull subset_name;
-  test_api(name).SetMergeMode(kRecursivelyMergeSingleTokenSubset |
-                              kRecursivelyMergeTokenEquivalentValues);
-
-  AddressComponentTestValues name_values = {
-      {.type = NAME_FULL,
-       .value = "Thomas-Neo-Anderson",
-       .status = VerificationStatus::kUserVerified},
-      {.type = NAME_FIRST,
-       .value = "Thomas",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_MIDDLE,
-       .value = "Thomas",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_LAST,
-       .value = "Anderson",
-       .status = VerificationStatus::kObserved},
-  };
-
-  AddressComponentTestValues subset_name_values = {
-      {.type = NAME_FULL,
-       .value = "Thomas-Anderson",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_FIRST,
-       .value = "Thomas",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_LAST,
-       .value = "Anderson",
-       .status = VerificationStatus::kObserved},
-  };
-
-  AddressComponentTestValues expectation = {
-      {.type = NAME_FULL,
-       .value = "Thomas-Neo-Anderson",
-       .status = VerificationStatus::kUserVerified},
-      {.type = NAME_FIRST,
-       .value = "Thomas",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_MIDDLE,
-       .value = "Thomas",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_LAST,
-       .value = "Anderson",
-       .status = VerificationStatus::kObserved},
-  };
-
-  SetTestValues(&name, name_values);
-  SetTestValues(&subset_name, subset_name_values);
-
-  // After normalization, the two names should have a single-token-superset
-  // relation.
-  SortedTokenComparisonResult token_comparison_result = CompareSortedTokens(
-      test_api(name).GetValueForComparison(subset_name.GetCountryCode()),
-      test_api(subset_name).GetValueForComparison(name.GetCountryCode()));
-  EXPECT_TRUE(token_comparison_result.IsSingleTokenSuperset());
-
-  // Without normalization, the two names should be considered distinct.
-  token_comparison_result =
-      CompareSortedTokens(name.GetValue(), subset_name.GetValue());
-  EXPECT_TRUE(token_comparison_result.status ==
-              SortedTokenComparisonStatus::kDistinct);
-
-  // Verify that those two names are not considered mergeable.
-  EXPECT_FALSE(name.IsMergeableWithComponent(subset_name));
-  EXPECT_FALSE(name.MergeWithComponent(subset_name));
-
-  VerifyTestValues(&name, expectation);
-}
-
-TEST(AutofillStructuredName, MergeSubsetLastname2) {
-  NameFull name;
-  NameFull subset_name;
-  test_api(name).SetMergeMode(kRecursivelyMergeSingleTokenSubset |
-                              kRecursivelyMergeTokenEquivalentValues);
-
-  AddressComponentTestValues name_values = {
-      {.type = NAME_FIRST,
-       .value = "Thomas",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_MIDDLE,
-       .value = "Neo",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_LAST,
-       .value = "Anderson",
-       .status = VerificationStatus::kObserved},
-  };
-
-  AddressComponentTestValues subset_name_values = {
-      {.type = NAME_FIRST,
-       .value = "Thomas",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_LAST,
-       .value = "Anderson",
-       .status = VerificationStatus::kObserved},
-  };
-
-  AddressComponentTestValues expectation = {
-      {.type = NAME_FIRST,
-       .value = "Thomas",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_MIDDLE,
-       .value = "Neo",
-       .status = VerificationStatus::kObserved},
-      {.type = NAME_LAST,
-       .value = "Anderson",
-       .status = VerificationStatus::kObserved},
-  };
-
-  SetTestValues(&name, name_values);
-  SetTestValues(&subset_name, subset_name_values);
-
-  EXPECT_TRUE(name.IsMergeableWithComponent(subset_name));
-  EXPECT_TRUE(name.MergeWithComponent(subset_name));
-
-  VerifyTestValues(&name, name_values);
-}
-
 }  // namespace
 }  // namespace autofill
diff --git a/components/autofill/core/browser/data_model/addresses/autofill_structured_address_utils.cc b/components/autofill/core/browser/data_model/addresses/autofill_structured_address_utils.cc
index e87f2eb..b32fa9b 100644
--- a/components/autofill/core/browser/data_model/addresses/autofill_structured_address_utils.cc
+++ b/components/autofill/core/browser/data_model/addresses/autofill_structured_address_utils.cc
@@ -43,16 +43,6 @@
 
 SortedTokenComparisonResult::~SortedTokenComparisonResult() = default;
 
-bool SortedTokenComparisonResult::IsSingleTokenSubset() const {
-  return status == SortedTokenComparisonStatus::kSubset &&
-         additional_tokens.size() == 1;
-}
-
-bool SortedTokenComparisonResult::IsSingleTokenSuperset() const {
-  return status == SortedTokenComparisonStatus::kSuperset &&
-         additional_tokens.size() == 1;
-}
-
 bool SortedTokenComparisonResult::OneIsSubset() const {
   return status == SortedTokenComparisonStatus::kSubset ||
          status == SortedTokenComparisonStatus::kSuperset;
@@ -338,13 +328,13 @@
           country_code));
 }
 
-bool AreStringTokenEquivalent(const std::u16string& one,
-                              const std::u16string& other) {
+bool AreStringTokenEquivalent(std::u16string_view one,
+                              std::u16string_view other) {
   return AreSortedTokensEqual(TokenizeValue(one), TokenizeValue(other));
 }
 
-bool AreStringTokenCompatible(const std::u16string& first,
-                              const std::u16string& second) {
+bool AreStringTokenCompatible(std::u16string_view first,
+                              std::u16string_view second) {
   SortedTokenComparisonResult result =
       CompareSortedTokens(TokenizeValue(first), TokenizeValue(second));
   return result.status == SortedTokenComparisonStatus::kMatch ||
@@ -363,18 +353,18 @@
   DCHECK(std::is_sorted(first.begin(), first.end(), cmp_normalized) &&
          std::is_sorted(second.begin(), second.end(), cmp_normalized));
 
-  bool is_supserset = std::includes(first.begin(), first.end(), second.begin(),
-                                    second.end(), cmp_normalized);
-  bool is_subset = std::includes(second.begin(), second.end(), first.begin(),
-                                 first.end(), cmp_normalized);
+  const bool is_superset = std::includes(
+      first.begin(), first.end(), second.begin(), second.end(), cmp_normalized);
+  const bool is_subset = std::includes(
+      second.begin(), second.end(), first.begin(), first.end(), cmp_normalized);
 
   // If first is both a superset and a subset it is the same.
-  if (is_supserset && is_subset) {
+  if (is_superset && is_subset) {
     return SortedTokenComparisonResult(SortedTokenComparisonStatus::kMatch);
   }
 
   // If it is neither, both are distinct.
-  if (!is_supserset && !is_subset) {
+  if (!is_superset && !is_subset) {
     return SortedTokenComparisonResult(SortedTokenComparisonStatus::kDistinct);
   }
 
@@ -386,7 +376,7 @@
       first.begin(), first.end(), second.begin(), second.end(),
       std::back_inserter(additional_tokens), cmp_normalized);
 
-  if (is_supserset) {
+  if (is_superset) {
     return SortedTokenComparisonResult(SortedTokenComparisonStatus::kSuperset,
                                        additional_tokens);
   }
@@ -395,8 +385,8 @@
                                      additional_tokens);
 }
 
-SortedTokenComparisonResult CompareSortedTokens(const std::u16string& first,
-                                                const std::u16string& second) {
+SortedTokenComparisonResult CompareSortedTokens(std::u16string_view first,
+                                                std::u16string_view second) {
   return CompareSortedTokens(TokenizeValue(first), TokenizeValue(second));
 }
 
diff --git a/components/autofill/core/browser/data_model/addresses/autofill_structured_address_utils.h b/components/autofill/core/browser/data_model/addresses/autofill_structured_address_utils.h
index a3fa260..bb50e504 100644
--- a/components/autofill/core/browser/data_model/addresses/autofill_structured_address_utils.h
+++ b/components/autofill/core/browser/data_model/addresses/autofill_structured_address_utils.h
@@ -71,10 +71,6 @@
   SortedTokenComparisonStatus status = SortedTokenComparisonStatus::kDistinct;
   // The additional elements in the super/subsets.
   std::vector<AddressToken> additional_tokens{};
-  // Returns true if the first is a subset of the second;
-  bool IsSingleTokenSubset() const;
-  // Return true if the first is a superset of the second;
-  bool IsSingleTokenSuperset() const;
   // Return true if one is a subset of the other.
   bool OneIsSubset() const;
   // Returns true if one contains the other.
@@ -84,7 +80,7 @@
 };
 
 // Options for capturing a named group using the
-// |CaptureTypeWithPattern(...)| functions.
+// `CaptureTypeWithPattern(...)` functions.
 struct CaptureOptions {
   // A separator that must be matched after a capture group.
   // By default, a group must be either followed by a space-like character (\s)
@@ -105,12 +101,12 @@
   // Returns a singleton instance.
   static Re2RegExCache* Instance();
 
-  // Returns a pointer to a constant compiled expression that matches |pattern|
+  // Returns a pointer to a constant compiled expression that matches `pattern`
   // case-sensitively.
   const RE2* GetRegEx(std::string_view pattern);
 
 #ifdef UNIT_TEST
-  // Returns true if the compiled regular expression corresponding to |pattern|
+  // Returns true if the compiled regular expression corresponding to `pattern`
   // is cached.
   bool IsRegExCachedForTesting(std::string_view pattern) {
     return regex_map_.count(pattern) > 0;
@@ -120,29 +116,29 @@
  private:
   Re2RegExCache();
 
-  // Since the constructor is private, |base::NoDestructor| must be friend to be
+  // Since the constructor is private, `base::NoDestructor` must be friend to be
   // allowed to construct the cache.
   friend class base::NoDestructor<Re2RegExCache>;
 
-  // Stores a compiled regular expression keyed by its corresponding |pattern|.
+  // Stores a compiled regular expression keyed by its corresponding `pattern`.
   std::map<std::string, std::unique_ptr<const RE2>, std::less<>> regex_map_;
 
   // A lock to prevent concurrent access to the map.
   base::Lock lock_;
 };
 
-// Returns true if |name| has the characteristics of a Chinese, Japanese or
+// Returns true if `name` has the characteristics of a Chinese, Japanese or
 // Korean name:
 // * It must only contain CJK characters with at most one separator in between.
 bool HasCjkNameCharacteristics(const std::string& name);
 
-// Returns true if |name| has one of the characteristics of an Hispanic/Latinx
+// Returns true if `name` has one of the characteristics of an Hispanic/Latinx
 // name:
 // * Name contains a very common Hispanic/Latinx surname.
 // * Name uses a surname conjunction.
 bool HasHispanicLatinxNameCharacteristics(const std::string& name);
 
-// Returns true if |middle_name| has the characteristics of a containing only
+// Returns true if `middle_name` has the characteristics of a containing only
 // initials:
 // * The string contains only upper case letters that may be preceded by a
 // point.
@@ -153,7 +149,7 @@
 // Example: George walker -> GW, Hans-Peter -> HP
 std::u16string ReduceToInitials(const std::u16string& value);
 
-// Parses |value| with an regular expression defined by |pattern|.
+// Parses `value` with an regular expression defined by `pattern`.
 // If the expression is fully matched, returns the matching results, keyed by
 // the name of the capture group with the captured substrings as the value.
 // Otherwise returns `nullopt`.
@@ -165,39 +161,39 @@
 ParseValueByRegularExpression(const std::string& value,
                               const std::string& pattern);
 
-// Returns a compiled case sensitive regular expression for |pattern|.
+// Returns a compiled case sensitive regular expression for `pattern`.
 std::unique_ptr<const RE2> BuildRegExFromPattern(std::string_view pattern);
 
-// Returns true if |value| can be matched by the enumuerated RegEx |regex|.
+// Returns true if `value` can be matched by the enumuerated RegEx `regex`.
 bool IsPartialMatch(const std::string& value, RegEx regex);
 
-// Returns true if |value| can be matched with |pattern|.
+// Returns true if `value` can be matched with `pattern`.
 bool IsPartialMatch(const std::string& value, const std::string& pattern);
 
 // Same as above, but accepts a compiled regular expression instead of the
 // pattern.
 bool IsPartialMatch(const std::string& value, const RE2* expression);
 
-// Returns a vector that contains all partial matches of |pattern| in |value|;
+// Returns a vector that contains all partial matches of `pattern` in `value`;
 std::vector<std::string> GetAllPartialMatches(const std::string& value,
                                               const std::string& pattern);
 
-// Extracts all placeholders of the format ${PLACEHOLDER} in |value|.
+// Extracts all placeholders of the format ${PLACEHOLDER} in `value`.
 std::vector<std::string> ExtractAllPlaceholders(const std::string& value);
 
-// Returns |value| as a placeholder token: ${value}.
+// Returns `value` as a placeholder token: ${value}.
 std::string GetPlaceholderToken(std::string_view value);
 
 // Returns a named capture group created by the concatenation of the
-// string_views in |pattern_span_initializer_list|. The group is named by the
-// string representation of |type| and respects |options|.
+// string_views in `pattern_span_initializer_list`. The group is named by the
+// string representation of `type` and respects `options`.
 std::string CaptureTypeWithPattern(
     const FieldType& type,
     std::initializer_list<std::string_view> pattern_span_initializer_list,
     const CaptureOptions& options);
 
-// Same as |CaptureTypeWithPattern(type, pattern_span_initializer_list,
-// options)| but uses default options.
+// Same as `CaptureTypeWithPattern(type, pattern_span_initializer_list,
+// options)` but uses default options.
 std::string CaptureTypeWithPattern(
     const FieldType& type,
     std::initializer_list<std::string_view> pattern_span_initializer_list);
@@ -210,9 +206,9 @@
 // A wrapper for NoCapturePattern() that makes the match optional.
 std::string NoCapturePatternOptional(const std::string& pattern);
 
-// Returns a capture group named by the string representation of |type| that
-// matches |pattern| with an additional uncaptured |prefix_pattern| and
-// |suffix_pattern|.
+// Returns a capture group named by the string representation of `type` that
+// matches `pattern` with an additional uncaptured `prefix_pattern` and
+// `suffix_pattern`.
 std::string CaptureTypeWithAffixedPattern(
     const FieldType& type,
     const std::string& prefix_pattern,
@@ -220,24 +216,24 @@
     const std::string& suffix_pattern,
     const CaptureOptions& options = CaptureOptions());
 
-// Convenience wrapper for |CaptureTypeWithAffixedPattern()| with an empty
-// |suffix_pattern|.
+// Convenience wrapper for `CaptureTypeWithAffixedPattern()` with an empty
+// `suffix_pattern`.
 std::string CaptureTypeWithPrefixedPattern(
     const FieldType& type,
     const std::string& prefix_pattern,
     const std::string& pattern,
     const CaptureOptions& options = CaptureOptions());
 
-// Convenience wrapper for |CaptureTypeWithAffixedPattern()| with an empty
-// |prefix_pattern|.
+// Convenience wrapper for `CaptureTypeWithAffixedPattern()` with an empty
+// `prefix_pattern`.
 std::string CaptureTypeWithSuffixedPattern(
     const FieldType& type,
     const std::string& pattern,
     const std::string& suffix_pattern,
     const CaptureOptions& options = CaptureOptions());
 
-// Convenience wrapper for |CaptureTypeWithAffixedPattern()| with an empty
-// |prefix_pattern| and |suffix_pattern|.
+// Convenience wrapper for `CaptureTypeWithAffixedPattern()` with an empty
+// `prefix_pattern` and `suffix_pattern`.
 std::string CaptureTypeWithPattern(
     const FieldType& type,
     const std::string& pattern,
@@ -248,7 +244,7 @@
                                            const std::string& pattern);
 
 // Calls CaptureTypeWithPatternOptional with a pattern created by the
-// concatenation of the string_views in |pattern_span_initializer_list|.
+// concatenation of the string_views in `pattern_span_initializer_list`.
 std::string CaptureTypeWithPatternOptional(
     const FieldType& type,
     std::initializer_list<std::string_view> pattern_span_initializer_list);
@@ -264,16 +260,16 @@
                           const std::vector<AddressToken>& second);
 
 // Returns true if both strings contain the same tokens after normalization.
-bool AreStringTokenEquivalent(const std::u16string& one,
-                              const std::u16string& other);
+bool AreStringTokenEquivalent(std::u16string_view one,
+                              std::u16string_view other);
 
 // Returns true if all tokens from the first string are contained in the set of
 // tokens from the second string.
-bool AreStringTokenCompatible(const std::u16string& first,
-                              const std::u16string& second);
+bool AreStringTokenCompatible(std::u16string_view first,
+                              std::u16string_view second);
 
-// Returns a sorted vector containing the tokens of |value| after |value| was
-// canonicalized. |value| is tokenized by splitting it by white spaces and
+// Returns a sorted vector containing the tokens of `value` after `value` was
+// canonicalized. `value` is tokenized by splitting it by white spaces and
 // commas.
 std::vector<AddressToken> TokenizeValue(std::u16string_view value);
 
@@ -284,8 +280,8 @@
     const std::vector<AddressToken>& second);
 
 // Convenience wrapper to supply untokenized strings.
-SortedTokenComparisonResult CompareSortedTokens(const std::u16string& first,
-                                                const std::u16string& second);
+SortedTokenComparisonResult CompareSortedTokens(std::u16string_view first,
+                                                std::u16string_view second);
 
 }  // namespace autofill
 #endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_ADDRESSES_AUTOFILL_STRUCTURED_ADDRESS_UTILS_H_
diff --git a/components/autofill/core/browser/form_import/addresses/autofill_profile_import_process_unittest.cc b/components/autofill/core/browser/form_import/addresses/autofill_profile_import_process_unittest.cc
index d5e811d6..1dd242a 100644
--- a/components/autofill/core/browser/form_import/addresses/autofill_profile_import_process_unittest.cc
+++ b/components/autofill/core/browser/form_import/addresses/autofill_profile_import_process_unittest.cc
@@ -1215,7 +1215,7 @@
   import_data.CollectMetrics(/*ukm_recorder=*/nullptr,
                              address_data_manager().GetProfiles());
   histogram_tester.ExpectUniqueSample(
-      "Autofill.ProfileImport.NameEmailSuperset.EditedType",
+      "Autofill.ProfileImport.NameEmailSupersetEditedType",
       SettingsVisibleFieldTypeForMetrics::kName, 1);
 }
 
@@ -1405,7 +1405,7 @@
   import_data.CollectMetrics(/*ukm_recorder=*/nullptr,
                              address_data_manager().GetProfiles());
   histogram_tester.ExpectUniqueSample(
-      "Autofill.ProfileImport.HomeWorkNameEmailMerge.EditedType",
+      "Autofill.ProfileImport.HomeWorkNameEmailMergeEditedType",
       SettingsVisibleFieldTypeForMetrics::kCity, 1);
 }
 
diff --git a/components/autofill/core/browser/form_import/form_data_importer_unittest.cc b/components/autofill/core/browser/form_import/form_data_importer_unittest.cc
index 330d992..c170e0f6 100644
--- a/components/autofill/core/browser/form_import/form_data_importer_unittest.cc
+++ b/components/autofill/core/browser/form_import/form_data_importer_unittest.cc
@@ -46,7 +46,7 @@
 #include "components/autofill/core/browser/data_model/payments/credit_card.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/form_import/form_data_importer_test_api.h"
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/form_structure_test_api.h"
 #include "components/autofill/core/browser/foundations/test_autofill_client.h"
@@ -212,9 +212,10 @@
     GeoIpCountryCode geo_country = GeoIpCountryCode("")) {
   auto cached_form_structure =
       std::make_unique<FormStructure>(test::WithoutValues(form));
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      geo_country, LanguageCode(""), *cached_form_structure, nullptr);
-  heuristic_predictions.ApplyTo(cached_form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(geo_country, LanguageCode(""),
+                          cached_form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(cached_form_structure->fields());
   cached_form_structure->RationalizeAndAssignSections(
       geo_country, LanguageCode(""), nullptr);
 
diff --git a/components/autofill/core/browser/form_parsing/determine_heuristic_types.h b/components/autofill/core/browser/form_parsing/determine_heuristic_types.h
deleted file mode 100644
index 754b725..0000000
--- a/components/autofill/core/browser/form_parsing/determine_heuristic_types.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_DETERMINE_HEURISTIC_TYPES_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_DETERMINE_HEURISTIC_TYPES_H_
-
-#include <memory>
-
-#include "base/containers/flat_map.h"
-#include "base/containers/span.h"
-#include "components/autofill/core/browser/country_type.h"
-#include "components/autofill/core/browser/field_types.h"
-#include "components/autofill/core/browser/form_parsing/field_candidates.h"
-#include "components/autofill/core/browser/heuristic_source.h"
-#include "components/autofill/core/common/language_code.h"
-#include "components/autofill/core/common/unique_ids.h"
-
-namespace autofill {
-
-class AutofillField;
-class FormStructure;
-class LogManager;
-
-// Holds the predictions returned by DetermineHeuristicTypes().
-class HeuristicPredictions {
- public:
-  HeuristicPredictions(HeuristicSource source,
-                       const FieldCandidatesMap& field_type_map,
-                       base::span<const std::unique_ptr<AutofillField>> fields);
-  HeuristicPredictions(const HeuristicPredictions&);
-  HeuristicPredictions(HeuristicPredictions&&);
-  HeuristicPredictions& operator=(const HeuristicPredictions&);
-  HeuristicPredictions& operator=(HeuristicPredictions&&);
-  ~HeuristicPredictions();
-
-  // Sets the heuristic types of `fields` according to `this`.
-  void ApplyTo(base::span<const std::unique_ptr<AutofillField>> fields) const;
-
- private:
-  HeuristicSource source_ = HeuristicSource::kAutofillMachineLearning;
-  base::flat_map<FieldGlobalId, FieldType> predictions_;
-};
-
-// Runs several heuristics against the form fields to determine their possible
-// types.
-[[nodiscard]] HeuristicPredictions DetermineHeuristicTypes(
-    const GeoIpCountryCode& client_country,
-    const LanguageCode& current_page_language,
-    FormStructure& form,
-    LogManager* log_manager);
-
-}  // namespace autofill
-
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_DETERMINE_HEURISTIC_TYPES_H_
diff --git a/components/autofill/core/browser/form_parsing/determine_heuristic_types.cc b/components/autofill/core/browser/form_parsing/determine_regex_types.cc
similarity index 75%
rename from components/autofill/core/browser/form_parsing/determine_heuristic_types.cc
rename to components/autofill/core/browser/form_parsing/determine_regex_types.cc
index 7555771..90039ef84 100644
--- a/components/autofill/core/browser/form_parsing/determine_heuristic_types.cc
+++ b/components/autofill/core/browser/form_parsing/determine_regex_types.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 
 #include <memory>
 
@@ -24,21 +24,18 @@
 
 namespace {
 
-raw_ptr<const FormFieldData> to_form_field_data(
-    const std::unique_ptr<AutofillField>& field) {
-  return field.get();
+raw_ptr<const FormFieldData> ToPointer(const FormFieldData& field) {
+  return &field;
 }
 
 // Classifies each field using the regular expressions. The classifications
 // are returned, but not assigned to the `fields_` yet. Use
 // `AssignBestFieldTypes()` to do so.
-FieldCandidatesMap ParseFieldTypesWithPatterns(const FormStructure& form,
+FieldCandidatesMap ParseFieldTypesWithPatterns(const FormData& form,
                                                ParsingContext& context) {
   FieldCandidatesMap field_type_map;
 
-  auto form_field_data_vector = base::ToVector(
-      form.fields(),
-      [](const auto& f) -> raw_ptr<const FormFieldData> { return f.get(); });
+  auto form_field_data_vector = base::ToVector(form.fields(), &ToPointer);
   if (form.ShouldRunHeuristics()) {
     FormFieldParser::ParseFormFields(context, form_field_data_vector,
                                      field_type_map);
@@ -65,15 +62,14 @@
 
 }  // namespace
 
-HeuristicPredictions::HeuristicPredictions(
-    HeuristicSource source,
-    const FieldCandidatesMap& field_type_map,
-    base::span<const std::unique_ptr<AutofillField>> fields)
+RegexPredictions::RegexPredictions(HeuristicSource source,
+                                   const FieldCandidatesMap& field_type_map,
+                                   base::span<const FormFieldData> fields)
     : source_(source) {
   const HeuristicSource active_source = GetActiveHeuristicSource();
   std::vector<std::pair<FieldGlobalId, FieldType>> field_predictions;
-  for (const auto& field : fields) {
-    auto iter = field_type_map.find(field->global_id());
+  for (const FormFieldData& field : fields) {
+    auto iter = field_type_map.find(field.global_id());
     if (iter == field_type_map.end()) {
       continue;
     }
@@ -84,26 +80,24 @@
           candidates.BestHeuristicTypeReason());
     }
 
-    field_predictions.emplace_back(field->global_id(),
+    field_predictions.emplace_back(field.global_id(),
                                    candidates.BestHeuristicType());
   }
   predictions_ = base::flat_map(std::move(field_predictions));
 }
 
-HeuristicPredictions::HeuristicPredictions(const HeuristicPredictions&) =
+RegexPredictions::RegexPredictions(const RegexPredictions&) = default;
+
+RegexPredictions::RegexPredictions(RegexPredictions&&) = default;
+
+RegexPredictions& RegexPredictions::operator=(const RegexPredictions&) =
     default;
 
-HeuristicPredictions::HeuristicPredictions(HeuristicPredictions&&) = default;
+RegexPredictions& RegexPredictions::operator=(RegexPredictions&&) = default;
 
-HeuristicPredictions& HeuristicPredictions::operator=(
-    const HeuristicPredictions&) = default;
+RegexPredictions::~RegexPredictions() = default;
 
-HeuristicPredictions& HeuristicPredictions::operator=(HeuristicPredictions&&) =
-    default;
-
-HeuristicPredictions::~HeuristicPredictions() = default;
-
-void HeuristicPredictions::ApplyTo(
+void RegexPredictions::ApplyTo(
     base::span<const std::unique_ptr<AutofillField>> fields) const {
   // Fields can share the same field signature. This map records for each
   // signature how many fields with the same signature have been observed.
@@ -130,18 +124,17 @@
   }
 }
 
-HeuristicPredictions DetermineHeuristicTypes(
-    const GeoIpCountryCode& client_country,
-    const LanguageCode& current_page_language,
-    FormStructure& form,
-    LogManager* log_manager) {
+RegexPredictions DetermineRegexTypes(const GeoIpCountryCode& client_country,
+                                     const LanguageCode& current_page_language,
+                                     const FormData& form,
+                                     LogManager* log_manager) {
   SCOPED_UMA_HISTOGRAM_TIMER("Autofill.Timing.DetermineHeuristicTypes");
 
   const LanguageCode& page_language =
       base::FeatureList::IsEnabled(features::kAutofillPageLanguageDetection)
           ? current_page_language
           : LanguageCode();
-  ParsingContext context(base::ToVector(form.fields(), &to_form_field_data),
+  ParsingContext context(base::ToVector(form.fields(), &ToPointer),
                          client_country, page_language,
 #if BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
                          PatternFile::kDefault,
@@ -149,9 +142,9 @@
                          PatternFile::kLegacy,
 #endif
                          GetActiveRegexFeatures(), log_manager);
-  return HeuristicPredictions(HeuristicSource::kRegexes,
-                              ParseFieldTypesWithPatterns(form, context),
-                              form.fields());
+  return RegexPredictions(HeuristicSource::kRegexes,
+                          ParseFieldTypesWithPatterns(form, context),
+                          form.fields());
 }
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/form_parsing/determine_regex_types.h b/components/autofill/core/browser/form_parsing/determine_regex_types.h
new file mode 100644
index 0000000..007a609
--- /dev/null
+++ b/components/autofill/core/browser/form_parsing/determine_regex_types.h
@@ -0,0 +1,55 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_DETERMINE_REGEX_TYPES_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_DETERMINE_REGEX_TYPES_H_
+
+#include <memory>
+
+#include "base/containers/flat_map.h"
+#include "base/containers/span.h"
+#include "components/autofill/core/browser/country_type.h"
+#include "components/autofill/core/browser/field_types.h"
+#include "components/autofill/core/browser/form_parsing/field_candidates.h"
+#include "components/autofill/core/browser/heuristic_source.h"
+#include "components/autofill/core/common/language_code.h"
+#include "components/autofill/core/common/unique_ids.h"
+
+namespace autofill {
+
+class AutofillField;
+class LogManager;
+
+// Holds the predictions returned by DetermineRegexTypes().
+class RegexPredictions {
+ public:
+  RegexPredictions(HeuristicSource source,
+                   const FieldCandidatesMap& field_type_map,
+                   base::span<const FormFieldData> fields);
+  RegexPredictions(const RegexPredictions&);
+  RegexPredictions(RegexPredictions&&);
+  RegexPredictions& operator=(const RegexPredictions&);
+  RegexPredictions& operator=(RegexPredictions&&);
+  ~RegexPredictions();
+
+  // Sets the heuristic types of `fields` according to `this`.
+  void ApplyTo(base::span<const std::unique_ptr<AutofillField>> fields) const;
+
+ private:
+  HeuristicSource source_ = internal::IsRequired();
+  base::flat_map<FieldGlobalId, FieldType> predictions_;
+};
+
+// Evaluates regular expressions against the form fields to determine their
+// possible types.
+// HeuristicSource::kRegexes refers this function.
+[[nodiscard]] RegexPredictions DetermineRegexTypes(
+    const GeoIpCountryCode& client_country,
+    const LanguageCode& current_page_language,
+    const FormData& form,
+    LogManager* log_manager);
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_DETERMINE_REGEX_TYPES_H_
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc
index f699d75..6edf7c2f 100644
--- a/components/autofill/core/browser/form_structure.cc
+++ b/components/autofill/core/browser/form_structure.cc
@@ -80,6 +80,7 @@
 #include "components/autofill/core/common/unique_ids.h"
 #include "components/security_state/core/security_state.h"
 #include "components/version_info/version_info.h"
+#include "third_party/abseil-cpp/absl/functional/overload.h"
 #include "url/origin.h"
 
 namespace autofill {
@@ -138,7 +139,7 @@
 
 // A field is active if it contributes to the form signature and it is are
 // included in queries to the Autofill server.
-bool is_active(const AutofillField& field) {
+bool is_active(const FormFieldData& field) {
   return !IsCheckable(field.check_status());
 }
 
@@ -463,12 +464,14 @@
 }
 
 bool FormStructure::ShouldRunHeuristics() const {
+  // Must be identical to FormData::ShouldRunHeuristics()!
   return AtLeastNumSatisfy(fields(), kMinRequiredFieldsForHeuristics,
                            is_active) &&
          HasAllowedScheme(source_url_);
 }
 
 bool FormStructure::ShouldRunHeuristicsForSingleFields() const {
+  // Must be identical to FormData::ShouldRunHeuristicsForSingleFields()!
   return AtLeastNumSatisfy(fields(), 1, is_active) &&
          HasAllowedScheme(source_url_);
 }
diff --git a/components/autofill/core/browser/form_structure_fuzzer.cc b/components/autofill/core/browser/form_structure_fuzzer.cc
index 0aa2a8e5..8f1e68c0 100644
--- a/components/autofill/core/browser/form_structure_fuzzer.cc
+++ b/components/autofill/core/browser/form_structure_fuzzer.cc
@@ -17,7 +17,7 @@
 #include "base/command_line.h"
 #include "base/path_service.h"
 #include "components/autofill/core/browser/country_type.h"
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #include "components/autofill/core/common/form_data.h"
 #include "components/autofill/core/common/form_data_fuzzed_producer.h"
 #include "components/autofill/core/common/form_field_data.h"
@@ -71,10 +71,10 @@
   FormData form_data = GenerateFormData(data_provider);
 
   FormStructure form_structure(form_data);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GenerateGeoIpCountryCode(data_provider), LanguageCode(""), form_structure,
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GenerateGeoIpCountryCode(data_provider), LanguageCode(""), form_data,
       /*log_manager=*/nullptr);
-  heuristic_predictions.ApplyTo(form_structure.fields());
+  regex_predictions.ApplyTo(form_structure.fields());
   form_structure.RationalizeAndAssignSections(
       GenerateGeoIpCountryCode(data_provider), LanguageCode(""),
       /*log_manager=*/nullptr);
@@ -85,7 +85,10 @@
   std::ignore = form_structure.IsCompleteCreditCardForm(
       FormStructure::CreditCardFormCompleteness::kCompleteCreditCardForm);
   std::ignore = form_structure.ShouldBeParsed();
+  std::ignore = form_structure.ToFormData().ShouldRunHeuristics();
   std::ignore = form_structure.ShouldRunHeuristics();
+  std::ignore =
+      form_structure.ToFormData().ShouldRunHeuristicsForSingleFields();
   std::ignore = form_structure.ShouldRunHeuristicsForSingleFields();
   std::ignore = form_structure.ShouldBeQueried();
   std::ignore = form_structure.ShouldBeUploaded();
diff --git a/components/autofill/core/browser/form_structure_rationalizer_unittest.cc b/components/autofill/core/browser/form_structure_rationalizer_unittest.cc
index 429dd1b..6dbb05e 100644
--- a/components/autofill/core/browser/form_structure_rationalizer_unittest.cc
+++ b/components/autofill/core/browser/form_structure_rationalizer_unittest.cc
@@ -15,7 +15,7 @@
 #include "components/autofill/core/browser/autofill_field.h"
 #include "components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_encoding.h"
 #include "components/autofill/core/browser/field_types.h"
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #include "components/autofill/core/browser/form_structure_test_api.h"
 #include "components/autofill/core/browser/heuristic_source.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
@@ -133,9 +133,10 @@
 
   // Identifies the sections based on the heuristics types.
   if (run_heuristics) {
-    const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-        GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-    heuristic_predictions.ApplyTo(form_structure->fields());
+    const RegexPredictions regex_predictions =
+        DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                            form_structure->ToFormData(), nullptr);
+    regex_predictions.ApplyTo(form_structure->fields());
     form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                  LanguageCode(""), nullptr);
   } else {
diff --git a/components/autofill/core/browser/form_structure_unittest.cc b/components/autofill/core/browser/form_structure_unittest.cc
index 0407da1..55a633c 100644
--- a/components/autofill/core/browser/form_structure_unittest.cc
+++ b/components/autofill/core/browser/form_structure_unittest.cc
@@ -27,7 +27,7 @@
 #include "components/autofill/core/browser/crowdsourcing/randomized_encoder.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/form_parsing/buildflags.h"
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #include "components/autofill/core/browser/form_parsing/form_field_parser.h"
 #include "components/autofill/core/browser/form_parsing/regex_patterns.h"
 #include "components/autofill/core/browser/form_structure_test_api.h"
@@ -82,26 +82,15 @@
  protected:
   bool FormIsAutofillable(const FormData& form) {
     FormStructure form_structure(form);
-    const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-        GeoIpCountryCode(""), LanguageCode(""), form_structure, nullptr);
-    heuristic_predictions.ApplyTo(form_structure.fields());
+    const RegexPredictions regex_predictions =
+        DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                            form_structure.ToFormData(), nullptr);
+    regex_predictions.ApplyTo(form_structure.fields());
     form_structure.RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                 LanguageCode(""), nullptr);
     return form_structure.IsAutofillable();
   }
 
-  bool FormShouldRunHeuristics(const FormData& form) {
-    return FormStructure(form).ShouldRunHeuristics();
-  }
-
-  bool FormShouldRunHeuristicsForSingleFields(const FormData& form) {
-    return FormStructure(form).ShouldRunHeuristicsForSingleFields();
-  }
-
-  bool FormShouldBeQueried(const FormData& form) {
-    return FormStructure(form).ShouldBeQueried();
-  }
-
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
   test::AutofillUnitTestEnvironment autofill_test_environment_;
@@ -460,6 +449,7 @@
   form.set_url(GURL("http://wwww.foo.com/myform"));
   form_structure = std::make_unique<FormStructure>(form);
   EXPECT_TRUE(form_structure->ShouldBeParsed());
+  EXPECT_TRUE(form_structure->ToFormData().ShouldRunHeuristics());
   EXPECT_TRUE(form_structure->ShouldRunHeuristics());
   EXPECT_TRUE(form_structure->ShouldBeQueried());
   EXPECT_TRUE(form_structure->ShouldBeUploaded());
@@ -468,6 +458,7 @@
   form.set_url(GURL("https://wwww.foo.com/myform"));
   form_structure = std::make_unique<FormStructure>(form);
   EXPECT_TRUE(form_structure->ShouldBeParsed());
+  EXPECT_TRUE(form_structure->ToFormData().ShouldRunHeuristics());
   EXPECT_TRUE(form_structure->ShouldRunHeuristics());
   EXPECT_TRUE(form_structure->ShouldBeQueried());
   EXPECT_TRUE(form_structure->ShouldBeUploaded());
@@ -476,6 +467,7 @@
   form.set_url(GURL("chrome://settings"));
   form_structure = std::make_unique<FormStructure>(form);
   EXPECT_FALSE(form_structure->ShouldBeParsed());
+  EXPECT_FALSE(form_structure->ToFormData().ShouldRunHeuristics());
   EXPECT_FALSE(form_structure->ShouldRunHeuristics());
   EXPECT_FALSE(form_structure->ShouldBeQueried());
   EXPECT_FALSE(form_structure->ShouldBeUploaded());
@@ -484,6 +476,7 @@
   form.set_url(GURL("ftp://ftp.foo.com/form.html"));
   form_structure = std::make_unique<FormStructure>(form);
   EXPECT_FALSE(form_structure->ShouldBeParsed());
+  EXPECT_FALSE(form_structure->ToFormData().ShouldRunHeuristics());
   EXPECT_FALSE(form_structure->ShouldRunHeuristics());
   EXPECT_FALSE(form_structure->ShouldBeQueried());
   EXPECT_FALSE(form_structure->ShouldBeUploaded());
@@ -492,6 +485,7 @@
   form.set_url(GURL("blob://blob.foo.com/form.html"));
   form_structure = std::make_unique<FormStructure>(form);
   EXPECT_FALSE(form_structure->ShouldBeParsed());
+  EXPECT_FALSE(form_structure->ToFormData().ShouldRunHeuristics());
   EXPECT_FALSE(form_structure->ShouldRunHeuristics());
   EXPECT_FALSE(form_structure->ShouldBeQueried());
   EXPECT_FALSE(form_structure->ShouldBeUploaded());
@@ -500,6 +494,7 @@
   form.set_url(GURL("about://about.foo.com/form.html"));
   form_structure = std::make_unique<FormStructure>(form);
   EXPECT_FALSE(form_structure->ShouldBeParsed());
+  EXPECT_FALSE(form_structure->ToFormData().ShouldRunHeuristics());
   EXPECT_FALSE(form_structure->ShouldRunHeuristics());
   EXPECT_FALSE(form_structure->ShouldBeQueried());
   EXPECT_FALSE(form_structure->ShouldBeUploaded());
@@ -883,16 +878,18 @@
   field.set_renderer_id(test::MakeFieldRendererId());
   test_api(form).Append(field);
 
-  EXPECT_FALSE(FormShouldRunHeuristics(form));
+  EXPECT_FALSE(FormStructure(form).ShouldRunHeuristics());
+  EXPECT_FALSE(form.ShouldRunHeuristics());
 
-  EXPECT_TRUE(FormShouldBeQueried(form));
+  EXPECT_TRUE(FormStructure(form).ShouldBeQueried());
 
   // Default configuration.
   {
     FormStructure form_structure(form);
-    const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-        GeoIpCountryCode(""), LanguageCode(""), form_structure, nullptr);
-    heuristic_predictions.ApplyTo(form_structure.fields());
+    const RegexPredictions regex_predictions =
+        DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                            form_structure.ToFormData(), nullptr);
+    regex_predictions.ApplyTo(form_structure.fields());
     form_structure.RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                 LanguageCode(""), nullptr);
     ASSERT_EQ(2U, form_structure.field_count());
@@ -918,8 +915,9 @@
                            FormControlType::kInputText, "given-name"),
        CreateTestFormField("Last Name", "lastname", "",
                            FormControlType::kInputText, "")});
-  EXPECT_FALSE(FormShouldRunHeuristics(form));
-  EXPECT_TRUE(FormShouldBeQueried(form));
+  EXPECT_FALSE(FormStructure(form).ShouldRunHeuristics());
+  EXPECT_FALSE(form.ShouldRunHeuristics());
+  EXPECT_TRUE(FormStructure(form).ShouldBeQueried());
 
   // As a side effect of parsing small forms, if any of the heuristics, query,
   // or upload minimums are disabled, we'll autofill fields with an
@@ -928,9 +926,10 @@
     FormData form_copy = form;
     test_api(form_copy).Remove(-1);
     FormStructure form_structure(form_copy);
-    const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-        GeoIpCountryCode(""), LanguageCode(""), form_structure, nullptr);
-    heuristic_predictions.ApplyTo(form_structure.fields());
+    const RegexPredictions regex_predictions =
+        DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                            form_structure.ToFormData(), nullptr);
+    regex_predictions.ApplyTo(form_structure.fields());
     form_structure.RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                 LanguageCode(""), nullptr);
     ASSERT_EQ(1U, form_structure.field_count());
@@ -957,14 +956,16 @@
   field.set_renderer_id(test::MakeFieldRendererId());
   test_api(form).Append(field);
 
-  EXPECT_TRUE(FormShouldRunHeuristicsForSingleFields(form));
+  EXPECT_TRUE(FormStructure(form).ShouldRunHeuristicsForSingleFields());
+  EXPECT_TRUE(form.ShouldRunHeuristicsForSingleFields());
 
   // Default configuration.
   {
     FormStructure form_structure(form);
-    const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-        GeoIpCountryCode(""), LanguageCode(""), form_structure, nullptr);
-    heuristic_predictions.ApplyTo(form_structure.fields());
+    const RegexPredictions regex_predictions =
+        DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                            form_structure.ToFormData(), nullptr);
+    regex_predictions.ApplyTo(form_structure.fields());
     form_structure.RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                 LanguageCode(""), nullptr);
     ASSERT_EQ(1U, form_structure.field_count());
@@ -991,9 +992,10 @@
                    CreateTestFormField("Password", "Password", "",
                                        FormControlType::kInputPassword)});
   FormStructure form_structure(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure.fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure.fields());
   form_structure.RationalizeAndAssignSections(GeoIpCountryCode(""),
                                               LanguageCode(""), nullptr);
   EXPECT_TRUE(
@@ -1027,9 +1029,10 @@
        CreateTestFormField("", "", "", FormControlType::kInputText,
                            "garbage billing email")});
   FormStructure form_structure(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure.fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure.fields());
   form_structure.RationalizeAndAssignSections(GeoIpCountryCode(""),
                                               LanguageCode(""), nullptr);
 
@@ -1057,9 +1060,10 @@
                    CreateTestFormField("", "", "", FormControlType::kInputText,
                                        "section-foo address-line1")});
   FormStructure form_structure(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure.fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure.ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure.fields());
   form_structure.RationalizeAndAssignSections(GeoIpCountryCode(""),
                                               LanguageCode(""), nullptr);
 
@@ -1136,9 +1140,10 @@
   test_api(form).Append(field);
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   EXPECT_TRUE(form_structure->IsAutofillable());
@@ -1214,9 +1219,10 @@
   test_api(form).Append(field);
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   EXPECT_TRUE(form_structure->IsAutofillable());
@@ -1292,9 +1298,10 @@
   test_api(form).Append(field);
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   EXPECT_TRUE(form_structure->IsAutofillable());
@@ -1360,9 +1367,10 @@
   test_api(form).Append(field);
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   EXPECT_TRUE(form_structure->IsAutofillable());
@@ -1432,9 +1440,10 @@
   test_api(form).Append(field);
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   EXPECT_TRUE(form_structure->IsAutofillable());
@@ -1488,9 +1497,10 @@
   test_api(form).Append(field);
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   EXPECT_TRUE(form_structure->IsAutofillable());
@@ -1537,9 +1547,10 @@
   test_api(form).Append(field);
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   ASSERT_EQ(4U, form_structure->field_count());
@@ -1589,9 +1600,10 @@
   test_api(form).Append(field);
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   EXPECT_TRUE(form_structure->IsAutofillable());
@@ -1635,9 +1647,10 @@
   test_api(form).Append(field);
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   EXPECT_TRUE(form_structure->IsAutofillable());
@@ -1676,9 +1689,10 @@
   test_api(form).Append(field);
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   EXPECT_TRUE(form_structure->IsAutofillable());
@@ -1758,9 +1772,10 @@
   test_api(form).Append(field);
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   EXPECT_TRUE(form_structure->IsAutofillable());
@@ -1816,9 +1831,10 @@
   test_api(form).Append(field);
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   EXPECT_TRUE(form_structure->IsAutofillable());
@@ -1867,9 +1883,10 @@
   test_api(form).Append(field);
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   EXPECT_TRUE(form_structure->IsAutofillable());
@@ -1932,9 +1949,10 @@
   test_api(form).Append(field);
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   EXPECT_TRUE(form_structure->IsAutofillable());
@@ -2001,9 +2019,10 @@
   test_api(form).Append(field);
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   EXPECT_TRUE(form_structure->IsAutofillable());
@@ -2480,20 +2499,23 @@
 }
 
 // The test ensures that single field email forms are correctly parsed via
-// `FormShouldRunHeuristicsForSingleFields`.
+// `ShouldRunHeuristicsForSingleFields()`.
 TEST_F(FormStructureTestImpl, SingleFieldEmailHeuristicsBehavior) {
   FormData form = test::GetFormData({.fields = {{.role = EMAIL_ADDRESS}}});
 
   // The form has too few fields; it should not run heuristics, falling back to
   // the single field parsing.
-  EXPECT_FALSE(FormShouldRunHeuristics(form));
-  EXPECT_TRUE(FormShouldRunHeuristicsForSingleFields(form));
+  EXPECT_FALSE(FormStructure(form).ShouldRunHeuristics());
+  EXPECT_FALSE(form.ShouldRunHeuristics());
+  EXPECT_TRUE(FormStructure(form).ShouldRunHeuristicsForSingleFields());
+  EXPECT_TRUE(form.ShouldRunHeuristicsForSingleFields());
 
   {
     FormStructure form_structure(form);
-    const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-        GeoIpCountryCode(""), LanguageCode(""), form_structure, nullptr);
-    heuristic_predictions.ApplyTo(form_structure.fields());
+    const RegexPredictions regex_predictions =
+        DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                            form_structure.ToFormData(), nullptr);
+    regex_predictions.ApplyTo(form_structure.fields());
     form_structure.RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                 LanguageCode(""), nullptr);
     ASSERT_EQ(1U, form_structure.field_count());
@@ -2504,21 +2526,24 @@
 }
 
 // The test ensures that email fields are correctly parsed (via
-// `FormShouldRunHeuristicsForSingleFields`) on small forms with two fields.
+// `ShouldRunHeuristicsForSingleFields()`) on small forms with two fields.
 TEST_F(FormStructureTestImpl, TwoFieldFormEmailHeuristicsBehavior) {
   FormData form = test::GetFormData(
       {.fields = {{.role = NAME_FULL}, {.role = EMAIL_ADDRESS}}});
 
   // The form has too few fields; it should not run heuristics, falling back to
   // the single field parsing.
-  EXPECT_FALSE(FormShouldRunHeuristics(form));
-  EXPECT_TRUE(FormShouldRunHeuristicsForSingleFields(form));
+  EXPECT_FALSE(FormStructure(form).ShouldRunHeuristics());
+  EXPECT_FALSE(form.ShouldRunHeuristics());
+  EXPECT_TRUE(FormStructure(form).ShouldRunHeuristicsForSingleFields());
+  EXPECT_TRUE(form.ShouldRunHeuristicsForSingleFields());
 
   {
     FormStructure form_structure(form);
-    const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-        GeoIpCountryCode(""), LanguageCode(""), form_structure, nullptr);
-    heuristic_predictions.ApplyTo(form_structure.fields());
+    const RegexPredictions regex_predictions =
+        DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                            form_structure.ToFormData(), nullptr);
+    regex_predictions.ApplyTo(form_structure.fields());
     form_structure.RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                 LanguageCode(""), nullptr);
     ASSERT_EQ(2U, form_structure.field_count());
@@ -2538,14 +2563,17 @@
 
   // The form has too few fields; it should not run heuristics, falling back to
   // the single field parsing.
-  EXPECT_FALSE(FormShouldRunHeuristics(form));
-  EXPECT_TRUE(FormShouldRunHeuristicsForSingleFields(form));
+  EXPECT_FALSE(FormStructure(form).ShouldRunHeuristics());
+  EXPECT_FALSE(form.ShouldRunHeuristics());
+  EXPECT_TRUE(FormStructure(form).ShouldRunHeuristicsForSingleFields());
+  EXPECT_TRUE(form.ShouldRunHeuristicsForSingleFields());
 
   {
     FormStructure form_structure(form);
-    const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-        GeoIpCountryCode(""), LanguageCode(""), form_structure, nullptr);
-    heuristic_predictions.ApplyTo(form_structure.fields());
+    const RegexPredictions regex_predictions =
+        DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                            form_structure.ToFormData(), nullptr);
+    regex_predictions.ApplyTo(form_structure.fields());
     form_structure.RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                 LanguageCode(""), nullptr);
     ASSERT_EQ(2U, form_structure.field_count());
@@ -2565,13 +2593,16 @@
 
   // The form has too few fields; it should not run heuristics, falling back to
   // the single field parsing.
-  EXPECT_FALSE(FormShouldRunHeuristics(form));
-  EXPECT_TRUE(FormShouldRunHeuristicsForSingleFields(form));
+  EXPECT_FALSE(FormStructure(form).ShouldRunHeuristics());
+  EXPECT_FALSE(form.ShouldRunHeuristics());
+  EXPECT_TRUE(FormStructure(form).ShouldRunHeuristicsForSingleFields());
+  EXPECT_TRUE(form.ShouldRunHeuristicsForSingleFields());
   {
     FormStructure form_structure(form);
-    const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-        GeoIpCountryCode(""), LanguageCode(""), form_structure, nullptr);
-    heuristic_predictions.ApplyTo(form_structure.fields());
+    const RegexPredictions regex_predictions =
+        DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                            form_structure.ToFormData(), nullptr);
+    regex_predictions.ApplyTo(form_structure.fields());
     form_structure.RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                 LanguageCode(""), nullptr);
     ASSERT_EQ(1U, form_structure.field_count());
@@ -2628,9 +2659,10 @@
                            FormControlType::kInputText, "phone")});
 
   form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   EXPECT_TRUE(form_structure->IsAutofillable());
diff --git a/components/autofill/core/browser/foundations/autofill_manager.cc b/components/autofill/core/browser/foundations/autofill_manager.cc
index 09e70621..8df9a712 100644
--- a/components/autofill/core/browser/foundations/autofill_manager.cc
+++ b/components/autofill/core/browser/foundations/autofill_manager.cc
@@ -21,7 +21,7 @@
 #include "components/autofill/core/browser/country_type.h"
 #include "components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_encoding.h"
 #include "components/autofill/core/browser/data_model/payments/credit_card.h"
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/form_structure_sectioning_util.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
@@ -128,64 +128,30 @@
          DenseSet<FormType>{FormType::kCreditCardForm};
 }
 
-#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
-// Applies a field classification ML model to `forms`.
-// The model execution is performed on a background thread. Upon completion, the
-// `callback` is invoked with the `forms`. The `optimization_target` selects
-// either the Autofill or Password Manager model. Since this function can be
-// called asynchronously (triggering a second classifier after a first one
-// completes), it takes a `WeakPtr<AutofillManager>` to handle cases where the
-// manager might be destroyed before execution.
-void ApplyMlModel(
-    base::WeakPtr<AutofillManager> manager,
-    optimization_guide::proto::OptimizationTarget optimization_target,
-    base::OnceCallback<void(std::vector<std::unique_ptr<FormStructure>>)>
-        callback,
-    std::vector<std::unique_ptr<FormStructure>> form_structures) {
-  if (!manager) {
-    return;
-  }
-  AutofillClient& client = manager->client();
-  FieldClassificationModelHandler* ml_handler = nullptr;
-  switch (optimization_target) {
-    case optimization_guide::proto::
-        OPTIMIZATION_TARGET_AUTOFILL_FIELD_CLASSIFICATION:
-      ml_handler = client.GetAutofillFieldClassificationModelHandler();
-      break;
-    case optimization_guide::proto::
-        OPTIMIZATION_TARGET_PASSWORD_MANAGER_FORM_CLASSIFICATION:
-      ml_handler = client.GetPasswordManagerFieldClassificationModelHandler();
-      break;
-    default:
-      NOTREACHED();
-  }
-  if (ml_handler) {
-    manager->SubscribeToMlModelChanges(*ml_handler, optimization_target);
-    std::vector<FormData> form_datas = base::ToVector(
-        form_structures,
-        [](auto& form_structure) { return form_structure->ToFormData(); });
-    ml_handler->GetModelPredictionsForForms(
-        std::move(form_datas),
-        manager->client().GetVariationConfigCountryCode(),
-        base::BindOnce(
-            [](std::vector<std::unique_ptr<FormStructure>> form_structures,
-               std::vector<ModelPredictions> all_predictions) {
-              for (const auto [form_structure, predictions] :
-                   base::zip(form_structures, all_predictions)) {
-                predictions.ApplyTo(form_structure->fields());
-              }
-              return form_structures;
-            },
-            std::move(form_structures))
-            .Then(std::move(callback)));
-  } else {
-    std::move(callback).Run(std::move(form_structures));
-  }
-}
-#endif  // BUILDFLAG(BUILD_WITH_TFLITE_LIB)
-
 }  // namespace
 
+// Form parsing happens asynchronously. This struct holds the necessary context.
+// The AsyncContext can be passed to any sequence and its members can be
+// accessed on that sequence.
+struct AutofillManager::AsyncContext {
+  AsyncContext(AutofillManager& manager,
+               std::vector<std::unique_ptr<FormStructure>> form_structures)
+      : form_structures(std::move(form_structures)),
+        country_code(manager.client().GetVariationConfigCountryCode()),
+        current_page_language(manager.GetCurrentPageLanguage()),
+        log_manager(IsLoggingActive(manager.log_manager())
+                        ? LogManager::CreateBuffering()
+                        : nullptr) {}
+
+  std::vector<std::unique_ptr<FormStructure>> form_structures;
+  std::vector<RegexPredictions> regex_predictions;
+  std::vector<ModelPredictions> autofill_predictions;
+  std::vector<ModelPredictions> password_manager_predictions;
+  GeoIpCountryCode country_code;
+  LanguageCode current_page_language;
+  std::unique_ptr<BufferingLogManager> log_manager;
+};
+
 AutofillManager::AutofillManager(AutofillDriver* driver)
     : driver_(CHECK_DEREF(driver)) {
   if (auto* translate_driver = client().GetTranslateDriver()) {
@@ -734,33 +700,15 @@
 void AutofillManager::ParseFormsAsyncCommon(
     std::vector<std::unique_ptr<FormStructure>> form_structures,
     base::OnceCallback<void(AutofillManager&)> callback) {
-  struct AsyncContext {
-    AsyncContext(std::vector<std::unique_ptr<FormStructure>> form_structures,
-                 GeoIpCountryCode country_code,
-                 LanguageCode current_page_language,
-                 LogManager* log_manager)
-        : form_structures(std::move(form_structures)),
-          country_code(std::move(country_code)),
-          current_page_language(std::move(current_page_language)),
-          log_manager(IsLoggingActive(log_manager)
-                          ? LogManager::CreateBuffering()
-                          : nullptr) {}
-    std::vector<std::unique_ptr<FormStructure>> form_structures;
-    std::vector<HeuristicPredictions> heuristic_predictions;
-    GeoIpCountryCode country_code;
-    LanguageCode current_page_language;
-    std::unique_ptr<BufferingLogManager> log_manager;
-  };
-
   // To be run on a different task (must not access global or member
   // variables).
   auto run_heuristics = [](AsyncContext context) {
     SCOPED_UMA_HISTOGRAM_TIMER("Autofill.Timing.ParseFormsAsync.RunHeuristics");
-    context.heuristic_predictions.reserve(context.form_structures.size());
+    context.regex_predictions.reserve(context.form_structures.size());
     for (auto& form_structure : context.form_structures) {
-      context.heuristic_predictions.push_back(DetermineHeuristicTypes(
-          context.country_code, context.current_page_language, *form_structure,
-          context.log_manager.get()));
+      context.regex_predictions.push_back(DetermineRegexTypes(
+          context.country_code, context.current_page_language,
+          form_structure->ToFormData(), context.log_manager.get()));
     }
     return context;
   };
@@ -778,21 +726,30 @@
         if (context.log_manager && self->log_manager()) {
           context.log_manager->Flush(*self->log_manager());
         }
-        CHECK_EQ(context.heuristic_predictions.size(),
+        CHECK_EQ(context.regex_predictions.size(),
                  context.form_structures.size());
-        for (auto [form_structure, heuristic_predictions] : base::zip(
-                 context.form_structures, context.heuristic_predictions)) {
-          FormStructure& raw_form_structure = *form_structure;
-          self->form_structures_[raw_form_structure.global_id()] =
-              std::move(form_structure);
-          heuristic_predictions.ApplyTo(raw_form_structure.fields());
-          raw_form_structure.RationalizeAndAssignSections(
-              context.country_code, context.current_page_language,
-              context.log_manager.get());
-          raw_form_structure.LogDeveloperEngagementMetric();
-          self->LogCurrentFieldTypes(raw_form_structure);
+        for (size_t i = 0; i < context.form_structures.size(); ++i) {
+          FormStructure& f = *context.form_structures[i];
+          self->form_structures_[f.global_id()] =
+              std::move(context.form_structures[i]);
+
+          if (!context.autofill_predictions.empty()) {
+            context.autofill_predictions[i].ApplyTo(f.fields());
+          }
+          if (!context.password_manager_predictions.empty()) {
+            context.password_manager_predictions[i].ApplyTo(f.fields());
+          }
+          if (!context.regex_predictions.empty()) {
+            context.regex_predictions[i].ApplyTo(f.fields());
+          }
+          f.RationalizeAndAssignSections(context.country_code,
+                                         context.current_page_language,
+                                         context.log_manager.get());
+
+          f.LogDeveloperEngagementMetric();
+          self->LogCurrentFieldTypes(f);
           self->NotifyObservers(
-              &Observer::OnFieldTypesDetermined, raw_form_structure.global_id(),
+              &Observer::OnFieldTypesDetermined, f.global_id(),
               Observer::FieldTypeSource::kHeuristicsOrAutocomplete);
         }
         std::move(callback).Run(*self);
@@ -804,18 +761,12 @@
       [](base::WeakPtr<AutofillManager> self,
          AsyncContext (*run_heuristics)(AsyncContext),
          base::OnceCallback<void(AsyncContext)> update_cache,
-         std::vector<std::unique_ptr<FormStructure>> forms) {
+         AsyncContext context) {
         if (!self) {
           return;
         }
         self->parsing_task_runner_->PostTaskAndReplyWithResult(
-            FROM_HERE,
-            base::BindOnce(
-                run_heuristics,
-                AsyncContext(std::move(forms),
-                             self->client().GetVariationConfigCountryCode(),
-                             self->GetCurrentPageLanguage(),
-                             self->log_manager())),
+            FROM_HERE, base::BindOnce(run_heuristics, std::move(context)),
             std::move(update_cache));
       },
       parsing_weak_ptr_factory_.GetWeakPtr(), run_heuristics,
@@ -823,30 +774,105 @@
 
 #if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
   // Parsing happens in the following order:
-  // (1) Running ML Models (first Autofill, then Password Manager).
+  // (1) Running ML models (Autofill and Password Manager).
   // (2) Running heuristics (this ensures that rationalization and sectioning
-  // are done for the active Autofill predictions).
+  //     are done for the active Autofill predictions).
   // (3) Updating the form cache.
-
-  // Chain running heuristics and updating cache after running the Password
-  // Manager model.
-  auto run_password_manager_model_if_needed = base::BindOnce(
-      &ApplyMlModel, GetWeakPtr(),
-      optimization_guide::proto::
-          OPTIMIZATION_TARGET_PASSWORD_MANAGER_FORM_CLASSIFICATION,
-      std::move(run_heuristics_and_update_cache));
-
-  // Chain running the Password Manager model after running the Autofill model.
-  ApplyMlModel(GetWeakPtr(),
-               optimization_guide::proto::
-                   OPTIMIZATION_TARGET_AUTOFILL_FIELD_CLASSIFICATION,
-               std::move(run_password_manager_model_if_needed),
-               std::move(form_structures));
+  RunMlModels(AsyncContext(*this, std::move(form_structures)),
+              std::move(run_heuristics_and_update_cache));
 #else
   std::move(run_heuristics_and_update_cache).Run(std::move(form_structures));
 #endif
 }
 
+#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+// Applies the Autofill and Password Manager ML models for field classification
+// to `forms`. The model is executed on a background sequence.
+// Calls `done_callback` upon completion on the UI sequence.
+void AutofillManager::RunMlModels(
+    AsyncContext context,
+    base::OnceCallback<void(AsyncContext)> done_callback) {
+  // Runs the specified model and calls `response` with the results.
+  // Otherwise runs `response` with the empty vector.
+  // Called on the UI thread.
+  auto run_model = [](HeuristicSource source,
+                      base::WeakPtr<AutofillManager> manager,
+                      base::OnceCallback<void(AsyncContext context,
+                                              std::vector<ModelPredictions>)>
+                          receive_predictions,
+                      AsyncContext context) {
+    if (!manager) {
+      return;
+    }
+    auto* ml_handler = [&]() -> FieldClassificationModelHandler* {
+      AutofillClient& client = manager->client();
+      switch (source) {
+        case HeuristicSource::kAutofillMachineLearning:
+          return client.GetAutofillFieldClassificationModelHandler();
+        case HeuristicSource::kPasswordManagerMachineLearning:
+          return client.GetPasswordManagerFieldClassificationModelHandler();
+        case HeuristicSource::kRegexes:
+          break;
+      }
+      NOTREACHED();
+    }();
+    if (!ml_handler) {
+      std::move(receive_predictions).Run(std::move(context), {});
+      return;
+    }
+    manager->SubscribeToMlModelChanges(*ml_handler);
+    std::vector<FormData> form_datas = base::ToVector(
+        context.form_structures,
+        [](auto& form_structure) { return form_structure->ToFormData(); });
+    GeoIpCountryCode country_code = context.country_code;
+    ml_handler->GetModelPredictionsForForms(
+        std::move(form_datas), country_code,
+        base::BindOnce(std::move(receive_predictions), std::move(context)));
+  };
+
+  // Stores the computed predictions.
+  // Called on the UI thread.
+  auto receive_predictions =
+      [](AsyncContext context,
+         std::vector<ModelPredictions> model_predictions) {
+        if (model_predictions.empty()) {
+          return context;
+        }
+        const HeuristicSource source = model_predictions.front().source();
+        DCHECK(std::ranges::all_of(model_predictions,
+                                   [source](const ModelPredictions& p) {
+                                     return p.source() == source;
+                                   }));
+        switch (source) {
+          case HeuristicSource::kAutofillMachineLearning:
+            context.autofill_predictions = std::move(model_predictions);
+            break;
+          case HeuristicSource::kPasswordManagerMachineLearning:
+            context.password_manager_predictions = std::move(model_predictions);
+            break;
+          case HeuristicSource::kRegexes:
+            NOTREACHED();
+        }
+        return context;
+      };
+
+  // First run the Autofill model.
+  run_model(
+      HeuristicSource::kAutofillMachineLearning, GetWeakPtr(),
+      base::BindOnce(receive_predictions)
+          .Then(
+              // Next run the Password Manager model.
+              base::BindOnce(run_model,
+                             HeuristicSource::kPasswordManagerMachineLearning,
+                             GetWeakPtr(),
+                             base::BindOnce(receive_predictions)
+                                 .Then(
+                                     // Then finish.
+                                     std::move(done_callback)))),
+      std::move(context));
+}
+#endif  // BUILDFLAG(BUILD_WITH_TFLITE_LIB)
+
 void AutofillManager::OnLoadedServerPredictions(
     std::optional<AutofillCrowdsourcingManager::QueryResponse> response) {
   absl::Cleanup on_after_loaded_server_predictions = [this] {
@@ -918,9 +944,8 @@
 }
 
 void AutofillManager::SubscribeToMlModelChanges(
-    FieldClassificationModelHandler& handler,
-    optimization_guide::proto::OptimizationTarget optimization_target) {
-  switch (optimization_target) {
+    FieldClassificationModelHandler& handler) {
+  switch (handler.optimization_target()) {
     case optimization_guide::proto::OptimizationTarget::
         OPTIMIZATION_TARGET_AUTOFILL_FIELD_CLASSIFICATION:
       if (!autofill_model_change_subscription_) {
diff --git a/components/autofill/core/browser/foundations/autofill_manager.h b/components/autofill/core/browser/foundations/autofill_manager.h
index 0aac9c5..8a9f147 100644
--- a/components/autofill/core/browser/foundations/autofill_manager.h
+++ b/components/autofill/core/browser/foundations/autofill_manager.h
@@ -358,9 +358,7 @@
   // After subscribing, FieldClassificationModelHandler::OnModelUpdated() will
   // trigger ReparseKnownForms(). There may be a handler for Autofill and/or
   // Password Manager.
-  void SubscribeToMlModelChanges(
-      FieldClassificationModelHandler& handler,
-      optimization_guide::proto::OptimizationTarget optimization_target);
+  void SubscribeToMlModelChanges(FieldClassificationModelHandler& handler);
 
  protected:
   explicit AutofillManager(AutofillDriver* driver);
@@ -432,6 +430,24 @@
       std::vector<raw_ptr<FormStructure, VectorExperimental>>* form_structures)
       const;
 
+  // Returns true only if the previewed form should be cleared.
+  virtual bool ShouldClearPreviewedForm() = 0;
+
+  std::map<FormGlobalId, std::unique_ptr<FormStructure>>*
+  mutable_form_structures() {
+    return &form_structures_;
+  }
+
+  // Logs the field types of `form` to chrome://autofill-internals and the
+  // autofill-information attribute (if
+  // `features::test::kAutofillShowTypePredictions` is enabled).
+  void LogCurrentFieldTypes(const FormStructure& form);
+
+ private:
+  friend class AutofillManagerTestApi;
+
+  struct AsyncContext;
+
   // Parses multiple forms in one go. The function proceeds in four stages:
   //
   // 1. Turn (almost) every FormData into a FormStructure.
@@ -466,21 +482,9 @@
       std::vector<std::unique_ptr<FormStructure>> form_structures,
       base::OnceCallback<void(AutofillManager&)> callback);
 
-  // Returns true only if the previewed form should be cleared.
-  virtual bool ShouldClearPreviewedForm() = 0;
-
-  std::map<FormGlobalId, std::unique_ptr<FormStructure>>*
-  mutable_form_structures() {
-    return &form_structures_;
-  }
-
-  // Logs the field types of `form` to chrome://autofill-internals and the
-  // autofill-information attribute (if
-  // `features::test::kAutofillShowTypePredictions` is enabled).
-  void LogCurrentFieldTypes(const FormStructure& form);
-
- private:
-  friend class AutofillManagerTestApi;
+  // Step 2 described above ParseFormsAsync().
+  void RunMlModels(AsyncContext context,
+                   base::OnceCallback<void(AsyncContext)> done_callback);
 
   // Invoked by `AutofillCrowdsourcingManager`.
   void OnLoadedServerPredictions(
diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc
index ea1c151..ab2d8c8a 100644
--- a/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc
@@ -59,7 +59,7 @@
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/filling/filling_product.h"
 #include "components/autofill/core/browser/form_import/form_data_importer_test_api.h"
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/form_structure_test_api.h"
 #include "components/autofill/core/browser/foundations/autofill_client.h"
@@ -2326,9 +2326,10 @@
       test::GetFormData({.fields = {{.role = EMAIL_OR_LOYALTY_MEMBERSHIP_ID},
                                     {.role = PASSWORD}}});
   auto form_structure = std::make_unique<FormStructure>(form_data);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
 
@@ -2403,9 +2404,10 @@
       test::GetFormData({.fields = {{.role = EMAIL_OR_LOYALTY_MEMBERSHIP_ID},
                                     {.role = PASSWORD}}});
   auto form_structure = std::make_unique<FormStructure>(form_data);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
 
@@ -4588,9 +4590,10 @@
   // Simulate having seen this form on page load.
   auto form_structure_instance = std::make_unique<FormStructure>(form);
   FormStructure* form_structure = form_structure_instance.get();
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   manager().AddSeenFormStructure(std::move(form_structure_instance));
@@ -4642,9 +4645,10 @@
   // Simulate having seen this form on page load.
   auto form_structure_instance = std::make_unique<FormStructure>(form);
   FormStructure* form_structure = form_structure_instance.get();
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   manager().AddSeenFormStructure(std::move(form_structure_instance));
@@ -4754,9 +4758,10 @@
   // Simulate having seen this form on page load.
   auto form_structure_instance = std::make_unique<FormStructure>(form);
   FormStructure* form_structure = form_structure_instance.get();
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   manager().AddSeenFormStructure(std::move(form_structure_instance));
@@ -5104,9 +5109,10 @@
   // Simulate having seen this form on page load.
   auto form_structure_instance = std::make_unique<FormStructure>(form);
   FormStructure* form_structure = form_structure_instance.get();
-  HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   manager().AddSeenFormStructure(std::move(form_structure_instance));
@@ -5127,9 +5133,10 @@
   auto form_structure_instance2 = std::make_unique<FormStructure>(form2);
   // This pointer is valid as long as autofill manager lives.
   FormStructure* form_structure2 = form_structure_instance2.get();
-  heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure2, nullptr);
-  heuristic_predictions.ApplyTo(form_structure2->fields());
+  regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure2->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure2->fields());
   form_structure2->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                 LanguageCode(""), nullptr);
   manager().AddSeenFormStructure(std::move(form_structure_instance2));
@@ -5199,9 +5206,10 @@
   // Simulate having seen this form on page load.
   // |form_structure| will be owned by |manager()|.
   auto form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   std::vector<FormSignature> signatures =
@@ -5253,9 +5261,10 @@
   FormStructure* form_structure = [&] {
     auto form_structure = std::make_unique<FormStructure>(form);
     FormStructure* ptr = form_structure.get();
-    const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-        GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-    heuristic_predictions.ApplyTo(form_structure->fields());
+    const RegexPredictions regex_predictions =
+        DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                            form_structure->ToFormData(), nullptr);
+    regex_predictions.ApplyTo(form_structure->fields());
     form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                  LanguageCode(""), nullptr);
     manager().AddSeenFormStructure(std::move(form_structure));
@@ -6042,9 +6051,10 @@
                                        FormControlType::kInputText)});
 
   auto form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   // Make sure the form can not be autofilled now.
@@ -7008,9 +7018,10 @@
   }
   // Override the types and simulate seeing the form on page load.
   auto form_structure = std::make_unique<FormStructure>(form);
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   test_api(*form_structure).SetFieldTypes(heuristic_types, server_types);
@@ -7439,10 +7450,9 @@
     {
       auto fs = std::make_unique<FormStructure>(form);
       form_structure = fs.get();
-      const HeuristicPredictions heuristic_predictions =
-          DetermineHeuristicTypes(GeoIpCountryCode(""), LanguageCode(""), *fs,
-                                  nullptr);
-      heuristic_predictions.ApplyTo(fs->fields());
+      const RegexPredictions regex_predictions = DetermineRegexTypes(
+          GeoIpCountryCode(""), LanguageCode(""), fs->ToFormData(), nullptr);
+      regex_predictions.ApplyTo(fs->fields());
       fs->RationalizeAndAssignSections(GeoIpCountryCode(""), LanguageCode(""),
                                        nullptr);
       manager().AddSeenFormStructure(std::move(fs));
diff --git a/components/autofill/core/browser/heuristic_classification_unittests.cc b/components/autofill/core/browser/heuristic_classification_unittests.cc
index 6e3788d..bdccf745 100644
--- a/components/autofill/core/browser/heuristic_classification_unittests.cc
+++ b/components/autofill/core/browser/heuristic_classification_unittests.cc
@@ -143,7 +143,7 @@
 #include "base/test/test_timeouts.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/heuristic_source.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
@@ -491,9 +491,10 @@
     // Similarly to AutofillManager::ParseFormsAsync, the heuristics are
     // executed after the ML model. If ML predictions are enabled, this does
     // not override the heuristic types but performs rationalization.
-    const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-        client_country, page_language, *form_structure, log_manager);
-    heuristic_predictions.ApplyTo(form_structure->fields());
+    const RegexPredictions regex_predictions =
+        DetermineRegexTypes(client_country, page_language,
+                            form_structure->ToFormData(), log_manager);
+    regex_predictions.ApplyTo(form_structure->fields());
     form_structure->RationalizeAndAssignSections(client_country, page_language,
                                                  log_manager);
 
diff --git a/components/autofill/core/browser/integrators/optimization_guide/autofill_optimization_guide_decider_unittest.cc b/components/autofill/core/browser/integrators/optimization_guide/autofill_optimization_guide_decider_unittest.cc
index 1e964dd..099ac15 100644
--- a/components/autofill/core/browser/integrators/optimization_guide/autofill_optimization_guide_decider_unittest.cc
+++ b/components/autofill/core/browser/integrators/optimization_guide/autofill_optimization_guide_decider_unittest.cc
@@ -18,7 +18,7 @@
 #include "components/autofill/core/browser/data_model/payments/credit_card_benefit.h"
 #include "components/autofill/core/browser/data_model/payments/credit_card_benefit_test_api.h"
 #include "components/autofill/core/browser/data_model/payments/credit_card_test_api.h"
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/form_structure_test_api.h"
 #include "components/autofill/core/browser/payments/constants.h"
@@ -145,10 +145,10 @@
   FormStructure form_structure{
       CreateTestCreditCardFormData(/*is_https=*/true,
                                    /*use_month_type=*/true)};
-  const HeuristicPredictions heuristic_predictions =
-      DetermineHeuristicTypes(GeoIpCountryCode(""), LanguageCode(""),
-                              form_structure, /*log_manager=*/nullptr);
-  heuristic_predictions.ApplyTo(form_structure.fields());
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GeoIpCountryCode(""), LanguageCode(""), form_structure.ToFormData(),
+      /*log_manager=*/nullptr);
+  regex_predictions.ApplyTo(form_structure.fields());
   form_structure.RationalizeAndAssignSections(
       GeoIpCountryCode(""), LanguageCode(""), /*log_manager=*/nullptr);
 
@@ -171,10 +171,10 @@
   FormStructure form_structure{
       CreateTestCreditCardFormData(/*is_https=*/true,
                                    /*use_month_type=*/true)};
-  const HeuristicPredictions heuristic_predictions =
-      DetermineHeuristicTypes(GeoIpCountryCode(""), LanguageCode(""),
-                              form_structure, /*log_manager=*/nullptr);
-  heuristic_predictions.ApplyTo(form_structure.fields());
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GeoIpCountryCode(""), LanguageCode(""), form_structure.ToFormData(),
+      /*log_manager=*/nullptr);
+  regex_predictions.ApplyTo(form_structure.fields());
   form_structure.RationalizeAndAssignSections(
       GeoIpCountryCode(""), LanguageCode(""), /*log_manager=*/nullptr);
 
@@ -196,10 +196,10 @@
   FormStructure form_structure{
       CreateTestCreditCardFormData(/*is_https=*/true,
                                    /*use_month_type=*/true)};
-  const HeuristicPredictions heuristic_predictions =
-      DetermineHeuristicTypes(GeoIpCountryCode(""), LanguageCode(""),
-                              form_structure, /*log_manager=*/nullptr);
-  heuristic_predictions.ApplyTo(form_structure.fields());
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GeoIpCountryCode(""), LanguageCode(""), form_structure.ToFormData(),
+      /*log_manager=*/nullptr);
+  regex_predictions.ApplyTo(form_structure.fields());
   form_structure.RationalizeAndAssignSections(
       GeoIpCountryCode(""), LanguageCode(""), /*log_manager=*/nullptr);
 
@@ -218,10 +218,10 @@
   FormStructure form_structure{
       CreateTestCreditCardFormData(/*is_https=*/true,
                                    /*use_month_type=*/true)};
-  const HeuristicPredictions heuristic_predictions =
-      DetermineHeuristicTypes(GeoIpCountryCode(""), LanguageCode(""),
-                              form_structure, /*log_manager=*/nullptr);
-  heuristic_predictions.ApplyTo(form_structure.fields());
+  const RegexPredictions regex_predictions = DetermineRegexTypes(
+      GeoIpCountryCode(""), LanguageCode(""), form_structure.ToFormData(),
+      /*log_manager=*/nullptr);
+  regex_predictions.ApplyTo(form_structure.fields());
   form_structure.RationalizeAndAssignSections(
       GeoIpCountryCode(""), LanguageCode(""), /*log_manager=*/nullptr);
 
diff --git a/components/autofill/core/browser/metrics/form_interactions_ukm_logger_unittest.cc b/components/autofill/core/browser/metrics/form_interactions_ukm_logger_unittest.cc
index f0d76f66..02239aa 100644
--- a/components/autofill/core/browser/metrics/form_interactions_ukm_logger_unittest.cc
+++ b/components/autofill/core/browser/metrics/form_interactions_ukm_logger_unittest.cc
@@ -14,7 +14,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_encoding.h"
 #include "components/autofill/core/browser/field_types.h"
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #include "components/autofill/core/browser/form_structure_test_api.h"
 #include "components/autofill/core/browser/heuristic_source.h"
 #include "components/autofill/core/browser/metrics/autofill_metrics_test_base.h"
@@ -540,9 +540,10 @@
 
   auto form_structure = std::make_unique<FormStructure>(form);
   FormStructure* form_structure_ptr = form_structure.get();
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   ASSERT_TRUE(
diff --git a/components/autofill/core/browser/metrics/profile_import_metrics.cc b/components/autofill/core/browser/metrics/profile_import_metrics.cc
index 5383488f..d963170 100644
--- a/components/autofill/core/browser/metrics/profile_import_metrics.cc
+++ b/components/autofill/core/browser/metrics/profile_import_metrics.cc
@@ -98,36 +98,32 @@
 
 // LINT.IfChange(GetImportTypeMetricsString)
 
-std::string_view GetImportTypeMetricsString(AutofillProfileImportType type) {
+std::string_view GetImportTypeEditedMetricsString(
+    AutofillProfileImportType type) {
   switch (type) {
     case AutofillProfileImportType::kNewProfile:
       return "NewProfile";
     case AutofillProfileImportType::kConfirmableMerge:
-      return "ConfirmableMerge";
     case AutofillProfileImportType::kConfirmableMergeAndSilentUpdate:
-      return "ConfirmableMergeAndSilentUpdate";
+      return "UpdateProfile";
     case AutofillProfileImportType::kProfileMigration:
-      return "ProfileMigration";
     case AutofillProfileImportType::kProfileMigrationAndSilentUpdate:
-      return "ProfileMigrationAndSilentUpdate";
+      return "MigrateProfile";
     case AutofillProfileImportType::kHomeAndWorkSuperset:
       return "HomeAndWorkSuperset";
     case AutofillProfileImportType::kNameEmailSuperset:
       return "NameEmailSuperset";
     case AutofillProfileImportType::kHomeWorkNameEmailMerge:
       return "HomeWorkNameEmailMerge";
+    // Those import types do not cause save/update/migrate/merge bubble to be
+    // displayed, thus they will never lead to emission of this metric.
     case AutofillProfileImportType::kDuplicateImport:
-      return "DuplicateImport";
     case AutofillProfileImportType::kSilentUpdate:
-      return "SilentUpdate";
     case AutofillProfileImportType::kSuppressedNewProfile:
-      return "SuppressedNewProfile";
     case AutofillProfileImportType::kSuppressedConfirmableMergeAndSilentUpdate:
-      return "SuppressedConfirmableMergeAndSilentUpdate";
     case AutofillProfileImportType::kSuppressedConfirmableMerge:
-      return "SuppressedConfirmableMerge";
     case AutofillProfileImportType::kImportTypeUnspecified:
-      return "ImportTypeUnspecified";
+      NOTREACHED();
   }
   NOTREACHED();
 }
@@ -280,49 +276,13 @@
       ConvertSettingsVisibleFieldTypeForMetrics(affected_type));
 }
 
-void LogHomeAndWorkSupersetEditedType(FieldType edited_type) {
-  base::UmaHistogramEnumeration(
-      "Autofill.ProfileImport.HomeAndWorkSupersetEditedType",
-      ConvertSettingsVisibleFieldTypeForMetrics(edited_type));
-}
-
 void LogProfileImportTypeEditedType(AutofillProfileImportType import_type,
                                     FieldType edited_type) {
-  // TODO(crbug.com/441473556): Handle the rest of import types in a generic
-  // way.
-  switch (import_type) {
-    case AutofillProfileImportType::kNewProfile:
-      autofill_metrics::LogNewProfileEditedType(edited_type);
-      break;
-    case AutofillProfileImportType::kConfirmableMerge:
-    case AutofillProfileImportType::kConfirmableMergeAndSilentUpdate:
-      autofill_metrics::LogProfileUpdateEditedType(edited_type);
-      break;
-    case AutofillProfileImportType::kProfileMigration:
-    case AutofillProfileImportType::kProfileMigrationAndSilentUpdate:
-      autofill_metrics::LogProfileMigrationEditedType(edited_type);
-      break;
-    case AutofillProfileImportType::kHomeAndWorkSuperset:
-      autofill_metrics::LogHomeAndWorkSupersetEditedType(edited_type);
-      break;
-    case AutofillProfileImportType::kNameEmailSuperset:
-    case AutofillProfileImportType::kHomeWorkNameEmailMerge:
-      base::UmaHistogramEnumeration(
-          base::StrCat({"Autofill.ProfileImport.",
-                        GetImportTypeMetricsString(import_type),
-                        ".EditedType"}),
-          ConvertSettingsVisibleFieldTypeForMetrics(edited_type));
-      break;
-    // In the following cases the prompt is not offered to the user, thus no
-    // edits can happen.
-    case AutofillProfileImportType::kDuplicateImport:
-    case AutofillProfileImportType::kSilentUpdate:
-    case AutofillProfileImportType::kSuppressedNewProfile:
-    case AutofillProfileImportType::kSuppressedConfirmableMergeAndSilentUpdate:
-    case AutofillProfileImportType::kSuppressedConfirmableMerge:
-    case AutofillProfileImportType::kImportTypeUnspecified:
-      NOTREACHED();
-  }
+  base::UmaHistogramEnumeration(
+      base::StrCat({"Autofill.ProfileImport.",
+                    GetImportTypeEditedMetricsString(import_type),
+                    "EditedType"}),
+      ConvertSettingsVisibleFieldTypeForMetrics(edited_type));
 }
 
 // static
@@ -344,12 +304,6 @@
                             parsed_successfully);
 }
 
-void LogNewProfileEditedType(FieldType edited_type) {
-  base::UmaHistogramEnumeration(
-      "Autofill.ProfileImport.NewProfileEditedType",
-      ConvertSettingsVisibleFieldTypeForMetrics(edited_type));
-}
-
 void LogProfileUpdateAffectedType(
     FieldType affected_type,
     AutofillClient::AddressPromptUserDecision decision) {
@@ -365,12 +319,6 @@
       ConvertSettingsVisibleFieldTypeForMetrics(affected_type));
 }
 
-void LogProfileUpdateEditedType(FieldType edited_type) {
-  base::UmaHistogramEnumeration(
-      "Autofill.ProfileImport.UpdateProfileEditedType",
-      ConvertSettingsVisibleFieldTypeForMetrics(edited_type));
-}
-
 void LogUpdateProfileNumberOfAffectedFields(
     int number_of_edited_fields,
     AutofillClient::AddressPromptUserDecision decision) {
@@ -393,12 +341,6 @@
                                 decision);
 }
 
-void LogProfileMigrationEditedType(FieldType edited_type) {
-  base::UmaHistogramEnumeration(
-      "Autofill.ProfileImport.MigrateProfileEditedType",
-      ConvertSettingsVisibleFieldTypeForMetrics(edited_type));
-}
-
 void LogZipCodeLengthMetric(std::u16string_view zip) {
   base::UmaHistogramExactLinear(
       "Autofill.ProfileImportValidCandidate.ZipCode.Length", zip.size(), 20);
diff --git a/components/autofill/core/browser/metrics/profile_import_metrics.h b/components/autofill/core/browser/metrics/profile_import_metrics.h
index 08b95c7e..55f2144e 100644
--- a/components/autofill/core/browser/metrics/profile_import_metrics.h
+++ b/components/autofill/core/browser/metrics/profile_import_metrics.h
@@ -194,9 +194,6 @@
 // has changed/was added.
 void LogHomeAndWorkSupersetAffectedType(FieldType affected_type);
 
-// Logs that a type was edited manually in a home/work superset prompt.
-void LogHomeAndWorkSupersetEditedType(FieldType edited_type);
-
 // Logs that a type was edited manually for a specified import type.
 void LogProfileImportTypeEditedType(AutofillProfileImportType type,
                                     FieldType edited_type);
@@ -213,9 +210,6 @@
 // only emitted when a number is present.
 void LogPhoneNumberImportParsingResult(bool parsed_successfully);
 
-// Logs that a specific type was edited in a save prompt.
-void LogNewProfileEditedType(FieldType edited_type);
-
 // Logs which storage a newly imported profile will be saved to.
 void LogNewProfileStorageLocation(const AutofillProfile& import_candidate);
 
@@ -226,9 +220,6 @@
     FieldType affected_type,
     AutofillClient::AddressPromptUserDecision decision);
 
-// Logs that a specific type was edited in an update prompt.
-void LogProfileUpdateEditedType(FieldType edited_type);
-
 // Logs the number of changed fields for a profile update that received the
 // user |decision|. Note that additional manual edits in the update prompt are
 // not accounted for in this metric.
@@ -241,9 +232,6 @@
 void LogProfileMigrationImportDecision(
     AutofillClient::AddressPromptUserDecision decision);
 
-// Logs that a specific type was edited in a migration prompt.
-void LogProfileMigrationEditedType(FieldType edited_type);
-
 // Logs the length of a zip code found in a valid and complete
 // profile considered for import.
 void LogZipCodeLengthMetric(std::u16string_view zip);
diff --git a/components/autofill/core/browser/metrics/quality_metrics_filling_unittest.cc b/components/autofill/core/browser/metrics/quality_metrics_filling_unittest.cc
index 7bec1bca..dcbfdbd 100644
--- a/components/autofill/core/browser/metrics/quality_metrics_filling_unittest.cc
+++ b/components/autofill/core/browser/metrics/quality_metrics_filling_unittest.cc
@@ -7,7 +7,7 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "components/autofill/core/browser/autofill_field.h"
 #include "components/autofill/core/browser/field_types.h"
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #include "components/autofill/core/browser/test_utils/autofill_form_test_utils.h"
 #include "components/autofill/core/common/autofill_test_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -22,9 +22,10 @@
     const test::FormDescription& form_description) {
   auto form_structure =
       std::make_unique<FormStructure>(test::GetFormData(form_description));
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   return form_structure;
diff --git a/components/autofill/core/browser/metrics/quality_metrics_unittest.cc b/components/autofill/core/browser/metrics/quality_metrics_unittest.cc
index fd44d0b4..07b47f5 100644
--- a/components/autofill/core/browser/metrics/quality_metrics_unittest.cc
+++ b/components/autofill/core/browser/metrics/quality_metrics_unittest.cc
@@ -10,7 +10,7 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/metrics/user_action_tester.h"
 #include "components/autofill/core/browser/data_manager/addresses/address_data_manager.h"
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/foundations/browser_autofill_manager_test_api.h"
 #include "components/autofill/core/browser/metrics/autofill_metrics_test_base.h"
@@ -841,9 +841,10 @@
   std::unique_ptr<FormStructure> form_structure =
       std::make_unique<FormStructure>(form);
   FormStructure* form_structure_ptr = form_structure.get();
-  const HeuristicPredictions heuristic_predictions = DetermineHeuristicTypes(
-      GeoIpCountryCode(""), LanguageCode(""), *form_structure, nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const RegexPredictions regex_predictions =
+      DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                          form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                LanguageCode(""), nullptr);
   ASSERT_TRUE(
diff --git a/components/autofill/core/browser/ml_model/field_classification_model_handler.h b/components/autofill/core/browser/ml_model/field_classification_model_handler.h
index 69570d1..c1ac7cd2 100644
--- a/components/autofill/core/browser/ml_model/field_classification_model_handler.h
+++ b/components/autofill/core/browser/ml_model/field_classification_model_handler.h
@@ -89,6 +89,10 @@
   [[nodiscard]] base::CallbackListSubscription RegisterModelChangeCallback(
       ModelChangeCallbackList::CallbackType callback);
 
+  optimization_guide::proto::OptimizationTarget optimization_target() const {
+    return optimization_target_;
+  }
+
 #if defined(UNIT_TEST)
   const FieldTypeSet& get_supported_types() const { return supported_types_; }
 #endif
diff --git a/components/autofill/core/browser/ml_model/model_predictions.h b/components/autofill/core/browser/ml_model/model_predictions.h
index a570210e..b7a283d8 100644
--- a/components/autofill/core/browser/ml_model/model_predictions.h
+++ b/components/autofill/core/browser/ml_model/model_predictions.h
@@ -11,6 +11,7 @@
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/heuristic_source.h"
 #include "components/autofill/core/common/dense_set.h"
+#include "components/autofill/core/common/is_required.h"
 #include "components/autofill/core/common/unique_ids.h"
 
 namespace autofill {
@@ -29,11 +30,13 @@
   ModelPredictions& operator=(ModelPredictions&&);
   ~ModelPredictions();
 
+  HeuristicSource source() const { return source_; }
+
   // Sets the heuristic types of `fields` according to `this`.
   void ApplyTo(base::span<const std::unique_ptr<AutofillField>> fields) const;
 
  private:
-  HeuristicSource source_ = HeuristicSource::kAutofillMachineLearning;
+  HeuristicSource source_ = internal::IsRequired();
   FieldTypeSet supported_types_;
   base::flat_map<FieldGlobalId, FieldType> predictions_;
 };
diff --git a/components/autofill/core/browser/test_utils/autofill_form_test_utils.cc b/components/autofill/core/browser/test_utils/autofill_form_test_utils.cc
index 1e319b8..a593410 100644
--- a/components/autofill/core/browser/test_utils/autofill_form_test_utils.cc
+++ b/components/autofill/core/browser/test_utils/autofill_form_test_utils.cc
@@ -6,7 +6,7 @@
 
 #include "base/containers/to_vector.h"
 #include "components/autofill/core/browser/country_type.h"
-#include "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#include "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
 #include "components/autofill/core/common/autocomplete_parsing_util.h"
@@ -225,10 +225,10 @@
     auto form_structure = std::make_unique<FormStructure>(form);
 
     if (test_case.form_flags.determine_heuristic_type) {
-      const HeuristicPredictions heuristic_predictions =
-          DetermineHeuristicTypes(GeoIpCountryCode(""), LanguageCode(""),
-                                  *form_structure, nullptr);
-      heuristic_predictions.ApplyTo(form_structure->fields());
+      const RegexPredictions regex_predictions =
+          DetermineRegexTypes(GeoIpCountryCode(""), LanguageCode(""),
+                              form_structure->ToFormData(), nullptr);
+      regex_predictions.ApplyTo(form_structure->fields());
       form_structure->RationalizeAndAssignSections(GeoIpCountryCode(""),
                                                    LanguageCode(""), nullptr);
     }
diff --git a/components/autofill/core/common/form_data.cc b/components/autofill/core/common/form_data.cc
index 25666620e..df4c00c2 100644
--- a/components/autofill/core/common/form_data.cc
+++ b/components/autofill/core/common/form_data.cc
@@ -16,6 +16,8 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "components/autofill/core/common/autofill_constants.h"
+#include "components/autofill/core/common/autofill_util.h"
 #include "components/autofill/core/common/form_field_data.h"
 #include "components/autofill/core/common/logging/log_buffer.h"
 #include "components/autofill/core/common/logging/stream_operator_util.h"
@@ -73,6 +75,34 @@
            << " FormData from pickle.";
 }
 
+// Returns true if the scheme given by |url| is one for which autofill is
+// allowed to activate. By default this only returns true for HTTP and HTTPS.
+bool HasAllowedScheme(const GURL& url) {
+  return url.SchemeIsHTTPOrHTTPS();
+}
+
+// A field is active if it contributes to the form signature and it is are
+// included in queries to the Autofill server.
+bool is_active(const FormFieldData& field) {
+  return !IsCheckable(field.check_status());
+}
+
+// Returns true if at least `num` fields satisfy `p`.
+// This is useful if `num` is significantly smaller than `fields.size()` because
+// it may avoid iterating over all of `fields`. It's equivalent to
+// `std::range::count_if(fields, [](auto& f) { p(*f); }) >= num`.
+template <typename Predicate>
+bool AtLeastNumSatisfy(base::span<const FormFieldData> fields,
+                       size_t num,
+                       Predicate p) {
+  for (auto it = fields.begin(); it != fields.end() && num > 0; ++it) {
+    if (std::invoke(p, *it)) {
+      --num;
+    }
+  }
+  return num == 0;
+}
+
 }  // namespace
 
 FrameTokenWithPredecessor::FrameTokenWithPredecessor() = default;
@@ -118,6 +148,28 @@
   return true;
 }
 
+const FormFieldData* FormData::FindFieldByGlobalId(
+    const FieldGlobalId& global_id) const {
+  auto fields_it =
+      std::ranges::find(fields(), global_id, &FormFieldData::global_id);
+
+  // If the field is found, return a pointer to the field, otherwise return
+  // nullptr.
+  return fields_it != fields().end() ? &*fields_it : nullptr;
+}
+
+bool FormData::ShouldRunHeuristics() const {
+  // Must be identical to FormStructure::ShouldRunHeuristics()!
+  return AtLeastNumSatisfy(fields(), kMinRequiredFieldsForHeuristics,
+                           is_active) &&
+         HasAllowedScheme(url());
+}
+
+bool FormData::ShouldRunHeuristicsForSingleFields() const {
+  // Must be identical to FormStructure::ShouldRunHeuristicsForSingleFields()!
+  return AtLeastNumSatisfy(fields(), 1, is_active) && HasAllowedScheme(url());
+}
+
 bool FormHasNonEmptyPasswordField(const FormData& form) {
   for (const auto& field : form.fields()) {
     if (field.IsPasswordInputElement()) {
@@ -170,16 +222,6 @@
 
 }  // namespace internal
 
-const FormFieldData* FormData::FindFieldByGlobalId(
-    const FieldGlobalId& global_id) const {
-  auto fields_it =
-      std::ranges::find(fields(), global_id, &FormFieldData::global_id);
-
-  // If the field is found, return a pointer to the field, otherwise return
-  // nullptr.
-  return fields_it != fields().end() ? &*fields_it : nullptr;
-}
-
 void SerializeFormData(const FormData& form_data, base::Pickle* pickle) {
   pickle->WriteInt(kFormDataPickleVersion);
   pickle->WriteString16(form_data.name());
diff --git a/components/autofill/core/common/form_data.h b/components/autofill/core/common/form_data.h
index bf6031a3..40c8cc5f 100644
--- a/components/autofill/core/common/form_data.h
+++ b/components/autofill/core/common/form_data.h
@@ -347,6 +347,9 @@
     likely_contains_captcha_ = likely_contains_captcha;
   }
 
+  bool ShouldRunHeuristics() const;
+  bool ShouldRunHeuristicsForSingleFields() const;
+
  private:
   friend class FormDataTestApi;
 
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
index f036334..df5e85e 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
@@ -145,7 +145,7 @@
 <translation id="2546283357679194313">ملفات تعريف الارتباط وبيانات المواقع الإلكترونية
 </translation>
 <translation id="2570922361219980984">‏الوصول إلى الموقع الجغرافي متوقف لهذا الجهاز أيضًا. يمكنك تفعليه في <ph name="BEGIN_LINK" />إعدادات Android<ph name="END_LINK" />.</translation>
-<translation id="257931822824936280">تم التوسيع - انقر للتصغير.</translation>
+<translation id="257931822824936280">تم التوسيع - يرجى النقر للتصغير.</translation>
 <translation id="2586657967955657006">الحافظة</translation>
 <translation id="2588271083332682494">تَنظيم متصفّحك من خلال "مجموعات علامات التبويب"</translation>
 <translation id="2597457036804169544">عدم تطبيق "المظهر الداكن" على المواقع الإلكترونية</translation>
@@ -331,7 +331,7 @@
 <translation id="4645575059429386691">يديره والداك</translation>
 <translation id="4663373278480897665">تم السماح باستخدام الكاميرا</translation>
 <translation id="4670064810192446073">الواقع الافتراضي</translation>
-<translation id="4672315773691449562">‏انقر على "تطبيق المتصفّح"، ثم انقر على Chrome</translation>
+<translation id="4672315773691449562">‏عليك النقر على "تطبيق المتصفّح"، ثم النقر على Chrome</translation>
 <translation id="4676059169848868271">للسماح لـ "<ph name="APP_NAME" />" باستخدام ميزة "تتبُّع اليد"، يجب تفعيل الميزة في <ph name="BEGIN_LINK" />إعدادات النظام<ph name="END_LINK" /> أيضًا.</translation>
 <translation id="4751476147751820511">أجهزة استشعار الإضاءة أو الحركة</translation>
 <translation id="4755971844837804407">عندما يكون هذا الإعداد مفعَّلاً، يمكن للمواقع الإلكترونية عرض أي إعلان لك. وعند إيقافه، لا يمكن للمواقع الإلكترونية عرض إعلانات مضلِّلة أو متداخلة.</translation>
@@ -674,8 +674,8 @@
 <translation id="868929229000858085">البحث في جهات الاتصال</translation>
 <translation id="8707904142362025782">السماح للموقع الإلكتروني بطلب استخدام الكاميرا</translation>
 <translation id="8712637175834984815">حسنًا</translation>
-<translation id="8715862698998036666">اسحب الشاشة من الأعلى ومرِّر سريعًا من الحافة اليسرى أو اليمنى للخروج من وضع ملء الشاشة.</translation>
-<translation id="8719283222052720129">‏فعِّل الإذن لتطبيق <ph name="APP_NAME" /> في <ph name="BEGIN_LINK" />إعدادات Android<ph name="END_LINK" />.</translation>
+<translation id="8715862698998036666">للخروج من وضع ملء الشاشة، عليك سحب الشاشة من الأعلى والتمرير سريعًا من الحافة اليسرى أو اليمنى.</translation>
+<translation id="8719283222052720129">‏يرجى تفعيل الإذن لتطبيق <ph name="APP_NAME" /> في <ph name="BEGIN_LINK" />إعدادات Android<ph name="END_LINK" />.</translation>
 <translation id="8721719390026067591">عندما يكون هذا الإعداد مفعَّلاً، يمكن للمواقع الإلكترونية طلب البحث عن أجهزة تتضمّن بلوتوث. وعند إيقافه، لا يمكن للمواقع الإلكترونية البحث عن تلك الأجهزة.</translation>
 <translation id="8725066075913043281">إعادة المحاولة</translation>
 <translation id="8730621377337864115">تم</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
index 679ad28..d5cb4dd 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
@@ -27,7 +27,7 @@
 <translation id="1317194122196776028">Olvidar este sitio</translation>
 <translation id="1321110954513621549">Permitido • Aproximada</translation>
 <translation id="1323433172918577554">Mostrar más</translation>
-<translation id="1333965224356556482">No permitir que los sitios vean tu ubicación</translation>
+<translation id="1333965224356556482">No permitir que los sitios accedan a tu ubicación</translation>
 <translation id="1343356790768851700">Este sitio determina qué cosas te gustan y, después, ofrece sugerencias de anuncios a otros sitios</translation>
 <translation id="1369915414381695676">Se ha añadido el sitio <ph name="SITE_NAME" /></translation>
 <translation id="1371239764779356792">Permite que un sitio guarde datos en tu dispositivo</translation>
@@ -658,7 +658,7 @@
 <translation id="8525306231823319788">Pantalla completa</translation>
 <translation id="8541410041357371550">Este sitio consulta tus temas de anuncios de Chrome para mostrarte anuncios más relevantes</translation>
 <translation id="854876774113449365">Los sitios que visites pueden insertar contenido de otros sitios, como imágenes, anuncios y texto. Estos otros sitios pueden solicitar permiso para usar información que hayan guardado sobre ti mientras navegas por el sitio. <ph name="BEGIN_LINK" />Más información sobre el contenido insertado<ph name="END_LINK" /></translation>
-<translation id="8549127125482561383">Cómo mostrar solicitudes</translation>
+<translation id="8549127125482561383">Cómo mostrar las solicitudes</translation>
 <translation id="8558480467877843976">Ahora puedes usar Chrome cada vez que navegues o toques enlaces de mensajes, documentos y otras aplicaciones.</translation>
 <translation id="857943718398505171">Permitido (recomendado)</translation>
 <translation id="8580511488901768832">hoja inferior de mis accesos directos abierta a altura completa</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
index 94e21a3..06ae13a 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
@@ -156,7 +156,7 @@
 <translation id="2677748264148917807">Esci</translation>
 <translation id="2682367912565197520">Elimina il livello di zoom salvato</translation>
 <translation id="2683434792633810741">Vuoi eliminare e reimpostare?</translation>
-<translation id="2685514716378236873">App non autorizzate</translation>
+<translation id="2685514716378236873">Autorizzazione negata</translation>
 <translation id="2713106313042589954">Disattiva fotocamera</translation>
 <translation id="2717722538473713889">Indirizzi email</translation>
 <translation id="2726059656860238749">Avvia Chrome con l'omnibox in primo piano per ridurre i tempi di avvio sui dispositivi di fascia bassa.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
index 85188c51..74426430 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
@@ -647,7 +647,7 @@
 <translation id="8444433999583714703">‏כדי לאפשר ל-<ph name="APP_NAME" /> לגשת אל המיקום, צריך להפעיל את המיקום גם ב<ph name="BEGIN_LINK" />הגדרות Android<ph name="END_LINK" />.</translation>
 <translation id="8447861592752582886">שלילת הרשאות מכשיר</translation>
 <translation id="8471525937465764768">‏אתרים מתחברים בדרך כלל להתקני USB כדי לתמוך בתכונות כמו הדפסת מסמכים או שמירה בהתקן אחסון</translation>
-<translation id="8473055640493819707">האפליקציה <ph name="APP_NAME" /> לא מעודכנת. צריך להתקין אותה מחדש.</translation>
+<translation id="8473055640493819707">האפליקציה "<ph name="APP_NAME" />" לא מעודכנת. צריך להתקין אותה מחדש.</translation>
 <translation id="847433688444405067">גלישה בכמה מכשירים</translation>
 <translation id="8487700953926739672">זמין אופליין</translation>
 <translation id="848952951823693243">תמיד תוצג בקשה לגרסת האתר לנייד</translation>
diff --git a/components/content_settings/core/browser/content_settings_default_provider.cc b/components/content_settings/core/browser/content_settings_default_provider.cc
index 2b4bbab..6898bff 100644
--- a/components/content_settings/core/browser/content_settings_default_provider.cc
+++ b/components/content_settings/core/browser/content_settings_default_provider.cc
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "base/auto_reset.h"
+#include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
@@ -26,7 +27,9 @@
 #include "components/content_settings/core/browser/website_settings_registry.h"
 #include "components/content_settings/core/common/content_settings.h"
 #include "components/content_settings/core/common/content_settings_pattern.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "components/content_settings/core/common/content_settings_utils.h"
+#include "components/content_settings/core/common/features.h"
 #include "components/content_settings/core/common/pref_names.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/pref_change_registrar.h"
@@ -68,6 +71,9 @@
 constexpr char kObsoletePrivateNetworkGuardDefaultPref[] =
     "profile.default_content_setting_values.private_network_guard";
 
+constexpr char kGeolocationMigrateDefaultValue[] =
+    "profile.default_content_setting_values.migrate_geolocation";
+
 #if !BUILDFLAG(IS_IOS)
 // This setting was accidentally bound to a UI surface intended for a different
 // setting (https://crbug.com/364820109). It should not have been settable
@@ -116,6 +122,8 @@
     }
   }
 
+  registry->RegisterBooleanPref(kGeolocationMigrateDefaultValue, false);
+
   // Obsolete prefs -------------------------------------------------------
 
   // These prefs have been deprecated, but need to be registered so they can
@@ -158,6 +166,8 @@
   // Read global defaults.
   ReadDefaultSettings();
 
+  MigrateGeolocationDefaultValue();
+
   if (should_record_metrics)
     RecordHistogramMetrics();
 
@@ -294,10 +304,11 @@
 
 void DefaultProvider::ChangeSetting(ContentSettingsType content_type,
                                     base::Value value) {
-  const ContentSettingsInfo* info =
-      ContentSettingsRegistry::GetInstance()->Get(content_type);
+  const PermissionSettingsInfo* info =
+      PermissionSettingsRegistry::GetInstance()->Get(content_type);
   DCHECK(!info || value.is_none() ||
-         info->IsDefaultSettingValid(ValueToContentSetting(value)))
+         info->delegate().IsDefaultSettingValid(
+             *info->delegate().FromValue(value)))
       << "type: " << content_type << " value: " << value.DebugString();
   if (value.is_none()) {
     value = GetDefaultValue(content_type);
@@ -401,6 +412,42 @@
 #endif  // !BUILDFLAG(IS_IOS)
 }
 
+void DefaultProvider::MigrateGeolocationDefaultValue() {
+  if (is_off_the_record_) {
+    return;
+  }
+
+  auto* info = PermissionSettingsRegistry::GetInstance()->Get(
+      ContentSettingsType::GEOLOCATION_WITH_OPTIONS);
+  // Migrate when the feature gets enabled the first time.
+  if (base::FeatureList::IsEnabled(
+          features::kApproximateGeolocationPermission) &&
+      !prefs_->GetBoolean(kGeolocationMigrateDefaultValue)) {
+    auto content_setting = ValueToContentSetting(
+        default_settings_.at(ContentSettingsType::GEOLOCATION));
+    auto geolocation_setting =
+        GeolocationSetting{ToPermissionOption(content_setting),
+                           ToPermissionOption(content_setting)};
+    ChangeSetting(ContentSettingsType::GEOLOCATION_WITH_OPTIONS,
+                  info->delegate().ToValue(geolocation_setting));
+    prefs_->SetBoolean(kGeolocationMigrateDefaultValue, true);
+  }
+
+  // Migrate back when the feature is disabled the first time.
+  if (!base::FeatureList::IsEnabled(
+          features::kApproximateGeolocationPermission) &&
+      prefs_->GetBoolean(kGeolocationMigrateDefaultValue)) {
+    auto geolocation_setting =
+        std::get<GeolocationSetting>(ValueToPermissionSetting(
+            info, default_settings_.at(
+                      ContentSettingsType::GEOLOCATION_WITH_OPTIONS)));
+    ChangeSetting(
+        ContentSettingsType::GEOLOCATION,
+        ContentSettingToValue(ToContentSetting(geolocation_setting.precise)));
+    prefs_->SetBoolean(kGeolocationMigrateDefaultValue, false);
+  }
+}
+
 void DefaultProvider::RecordHistogramMetrics() {
   base::UmaHistogramEnumeration(
       "ContentSettings.RegularProfile.DefaultCookiesSetting",
diff --git a/components/content_settings/core/browser/content_settings_default_provider.h b/components/content_settings/core/browser/content_settings_default_provider.h
index 0853559..94454bd 100644
--- a/components/content_settings/core/browser/content_settings_default_provider.h
+++ b/components/content_settings/core/browser/content_settings_default_provider.h
@@ -87,6 +87,9 @@
   // Clean up the obsolete preferences from the user's profile.
   void DiscardOrMigrateObsoletePreferences();
 
+  // Migrate between GEOLOCATION and GEOLOCATION_WITH_OPTIONS.
+  void MigrateGeolocationDefaultValue();
+
   // Record Histograms Metrics.
   void RecordHistogramMetrics();
 
diff --git a/components/content_settings/core/browser/content_settings_info.cc b/components/content_settings/core/browser/content_settings_info.cc
index f34998d8..09e574d 100644
--- a/components/content_settings/core/browser/content_settings_info.cc
+++ b/components/content_settings/core/browser/content_settings_info.cc
@@ -72,6 +72,12 @@
   return info_->IsSettingValid(content_setting);
 }
 
+bool ContentSettingsInfo::Delegate::IsDefaultSettingValid(
+    const PermissionSetting& setting) const {
+  DCHECK(std::holds_alternative<ContentSetting>(setting)) << setting;
+  return info_->IsDefaultSettingValid(std::get<ContentSetting>(setting));
+}
+
 PermissionSetting ContentSettingsInfo::Delegate::InheritInIncognito(
     const PermissionSetting& setting) const {
   ContentSetting content_setting = std::get<ContentSetting>(setting);
diff --git a/components/content_settings/core/browser/content_settings_info.h b/components/content_settings/core/browser/content_settings_info.h
index 15bf95bf..8b7307a 100644
--- a/components/content_settings/core/browser/content_settings_info.h
+++ b/components/content_settings/core/browser/content_settings_info.h
@@ -40,6 +40,7 @@
   class Delegate : public PermissionSettingsInfo::Delegate {
    public:
     bool IsValid(const PermissionSetting& setting) const override;
+    bool IsDefaultSettingValid(const PermissionSetting& setting) const override;
     PermissionSetting InheritInIncognito(
         const PermissionSetting& setting) const override;
     bool ShouldCoalesceEphemeralState() const override;
diff --git a/components/content_settings/core/browser/geolocation_setting_delegate.cc b/components/content_settings/core/browser/geolocation_setting_delegate.cc
index 0978306..f506789 100644
--- a/components/content_settings/core/browser/geolocation_setting_delegate.cc
+++ b/components/content_settings/core/browser/geolocation_setting_delegate.cc
@@ -34,6 +34,17 @@
   return true;
 }
 
+bool GeolocationSettingDelegate::IsDefaultSettingValid(
+    const PermissionSetting& setting) const {
+  DCHECK(std::holds_alternative<GeolocationSetting>(setting)) << setting;
+  auto permission_setting = std::get<GeolocationSetting>(setting);
+  if (permission_setting.approximate != permission_setting.precise) {
+    // The UI only supports default settings with approximate == precise.
+    return false;
+  }
+  return IsValid(permission_setting);
+}
+
 // Returns a setting to inherit to incognito mode. Return nullopt if the setting
 // should not be inherited.
 PermissionSetting GeolocationSettingDelegate::InheritInIncognito(
diff --git a/components/content_settings/core/browser/geolocation_setting_delegate.h b/components/content_settings/core/browser/geolocation_setting_delegate.h
index c7e7792..ccc2be8c 100644
--- a/components/content_settings/core/browser/geolocation_setting_delegate.h
+++ b/components/content_settings/core/browser/geolocation_setting_delegate.h
@@ -17,6 +17,7 @@
     : public content_settings::PermissionSettingsInfo::Delegate {
  public:
   bool IsValid(const PermissionSetting& setting) const override;
+  bool IsDefaultSettingValid(const PermissionSetting& setting) const override;
 
   PermissionSetting InheritInIncognito(
       const PermissionSetting& setting) const override;
diff --git a/components/content_settings/core/browser/permission_settings_info.h b/components/content_settings/core/browser/permission_settings_info.h
index bb8bbcc..1fc4b95 100644
--- a/components/content_settings/core/browser/permission_settings_info.h
+++ b/components/content_settings/core/browser/permission_settings_info.h
@@ -31,6 +31,8 @@
 
     // Return whether the setting is valid.
     virtual bool IsValid(const PermissionSetting& setting) const = 0;
+    virtual bool IsDefaultSettingValid(
+        const PermissionSetting& setting) const = 0;
 
     // Returns a setting to inherit to incognito mode.
     virtual PermissionSetting InheritInIncognito(
diff --git a/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerMetricsRecorder.java b/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerMetricsRecorder.java
index 8bf459f..e01361a 100644
--- a/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerMetricsRecorder.java
+++ b/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerMetricsRecorder.java
@@ -32,9 +32,9 @@
 @NullMarked
 public final class ThirdPartyCredentialManagerMetricsRecorder {
     public static final String STORE_RESULT_HISTOGRAM_NAME =
-            "PasswordManager.CredentialRequest.ThirdParty.Store";
+            "PasswordManager.CredentialRequest.ThirdParty.Store2";
     public static final String GET_RESULT_HISTOGRAM_NAME =
-            "PasswordManager.CredentialRequest.ThirdParty.Get";
+            "PasswordManager.CredentialRequest.ThirdParty.Get2";
 
     private ThirdPartyCredentialManagerMetricsRecorder() {}
 
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/ProxyTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/ProxyTest.java
index 518a117..615101e 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/ProxyTest.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/ProxyTest.java
@@ -882,6 +882,7 @@
             reason =
                     "This feature flag has not reached platform Cronet yet. Fallback provides no"
                             + " ProxyOptions support.")
+    @DisabledTest(message = "TODO(https://crbug.com/442024094): Reenable after flakiness is fixed")
     // Mockito fails on Marshmallow with NoClassDefFoundError:
     // org.mockito.internal.invocation.TypeSafeMatching$$ExternalSyntheticLambda0
     @RequiresMinAndroidApi(Build.VERSION_CODES.N)
diff --git a/components/dom_distiller/core/javascript/dom_distiller_viewer.js b/components/dom_distiller/core/javascript/dom_distiller_viewer.js
index 4288322e..35cc6c0 100644
--- a/components/dom_distiller/core/javascript/dom_distiller_viewer.js
+++ b/components/dom_distiller/core/javascript/dom_distiller_viewer.js
@@ -536,7 +536,7 @@
 
   useBaseFontSize(size) {
     this.baseSize = size;
-    reset();
+    this.reset();
   }
 }
 
diff --git a/components/enterprise/browser/promotion/promotion_eligibility_checker.cc b/components/enterprise/browser/promotion/promotion_eligibility_checker.cc
index e74ffba..c3b4af4 100644
--- a/components/enterprise/browser/promotion/promotion_eligibility_checker.cc
+++ b/components/enterprise/browser/promotion/promotion_eligibility_checker.cc
@@ -10,13 +10,10 @@
 #include "components/policy/core/common/cloud/cloud_policy_client.h"
 #include "components/signin/public/identity_manager/access_token_info.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
-#include "google_apis/gaia/gaia_constants.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace {
 
-constexpr char kOauthConsumerName[] = "promotion_eligibility_checker";
-
 constexpr char kPolicyPromotionBannerLocale[] = "en-US";
 
 }  // namespace
@@ -64,11 +61,8 @@
         enterprise_management::GetUserEligiblePromotionsResponse());
     return;
   }
-  signin::ScopeSet scopes;
-  scopes.insert(GaiaConstants::kDeviceManagementServiceOAuth);
-  scopes.insert(GaiaConstants::kGoogleUserInfoEmail);
   access_token_fetcher_ = identity_manager_->CreateAccessTokenFetcherForAccount(
-      account_id, kOauthConsumerName, scopes,
+      account_id, signin::OAuthConsumerId::kPromotionEligibilityChecker,
       base::BindOnce(&PromotionEligibilityChecker::OnAuthTokenFetched,
                      weak_factory_.GetWeakPtr()),
       signin::AccessTokenFetcher::Mode::kWaitUntilRefreshTokenAvailable);
diff --git a/components/enterprise/signin/enterprise_identity_service.cc b/components/enterprise/signin/enterprise_identity_service.cc
index aa17b04a..dd02e35 100644
--- a/components/enterprise/signin/enterprise_identity_service.cc
+++ b/components/enterprise/signin/enterprise_identity_service.cc
@@ -16,8 +16,7 @@
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/signin/public/identity_manager/account_managed_status_finder.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
-#include "components/signin/public/identity_manager/scope_set.h"
-#include "google_apis/gaia/gaia_constants.h"
+#include "components/signin/public/identity_manager/oauth_consumer_ids.h"
 #include "google_apis/gaia/google_service_auth_error.h"
 
 namespace enterprise {
@@ -281,8 +280,8 @@
   for (const auto& account : managed_accounts) {
     token_fetchers_ptr->push_back(
         identity_manager_->CreateAccessTokenFetcherForAccount(
-            account.account_id, "cloud_policy",
-            signin::ScopeSet{GaiaConstants::kDeviceManagementServiceOAuth},
+            account.account_id,
+            signin::OAuthConsumerId::kEnterpriseIdentityService,
             base::BindOnce(HandleAccessTokenFetched, barrier_callback),
             signin::AccessTokenFetcher::Mode::kImmediate));
   }
diff --git a/components/policy/core/common/cloud/cloud_policy_client_registration_helper.cc b/components/policy/core/common/cloud/cloud_policy_client_registration_helper.cc
index dccf8bb..2b0f69e 100644
--- a/components/policy/core/common/cloud/cloud_policy_client_registration_helper.cc
+++ b/components/policy/core/common/cloud/cloud_policy_client_registration_helper.cc
@@ -94,6 +94,8 @@
   // trying to register for policy.
   if (client_)
     client_->RemoveObserver(this);
+  // `client_` may be owned by `callback_`, reset to prevent dangling reference.
+  client_ = nullptr;
 }
 
 void CloudPolicyClientRegistrationHelper::StartRegistration(
diff --git a/components/signin/internal/identity_manager/oauth_consumer_registry.cc b/components/signin/internal/identity_manager/oauth_consumer_registry.cc
index 4a89fa9..173e7b3 100644
--- a/components/signin/internal/identity_manager/oauth_consumer_registry.cc
+++ b/components/signin/internal/identity_manager/oauth_consumer_registry.cc
@@ -76,6 +76,9 @@
 constexpr char kEduAccountLoginHandlerName[] = "edu_account_login_handler";
 constexpr char kChromeosFamilyLinkUserMetricsProviderName[] =
     "chromeos_family_link_user_metrics_provider";
+constexpr char kEnterpriseIdentityServiceName[] = "enterprise_identity_service";
+constexpr char kPromotionEligibilityCheckerName[] =
+    "promotion_eligibility_checker";
 
 }  // namespace
 
@@ -320,6 +323,15 @@
       return OAuthConsumer(
           /*name=*/kChromeosFamilyLinkUserMetricsProviderName,
           /*scopes=*/{});
+    case OAuthConsumerId::kEnterpriseIdentityService:
+      return OAuthConsumer(
+          /*name=*/kEnterpriseIdentityServiceName,
+          /*scopes=*/{GaiaConstants::kDeviceManagementServiceOAuth});
+    case OAuthConsumerId::kPromotionEligibilityChecker:
+      return OAuthConsumer(
+          /*name=*/kPromotionEligibilityCheckerName,
+          /*scopes=*/{GaiaConstants::kDeviceManagementServiceOAuth,
+                      GaiaConstants::kGoogleUserInfoEmail});
   }
   NOTREACHED();
 }
diff --git a/components/signin/public/identity_manager/oauth_consumer_ids.h b/components/signin/public/identity_manager/oauth_consumer_ids.h
index 1a920e5..35b69526 100644
--- a/components/signin/public/identity_manager/oauth_consumer_ids.h
+++ b/components/signin/public/identity_manager/oauth_consumer_ids.h
@@ -63,7 +63,9 @@
   kEduCoexistenceLoginHandler = 48,
   kEduAccountLoginHandler = 49,
   kChromeosFamilyLinkUserMetricsProvider = 50,
-  kMaxValue = kChromeosFamilyLinkUserMetricsProvider,
+  kEnterpriseIdentityService = 51,
+  kPromotionEligibilityChecker = 52,
+  kMaxValue = kPromotionEligibilityChecker,
 };
 // LINT.ThenChange(//tools/metrics/histograms/metadata/signin/enums.xml:OAuthConsumerId)
 
diff --git a/components/strings/components_chromium_strings_ar.xtb b/components/strings/components_chromium_strings_ar.xtb
index 92011cb..966f9c7 100644
--- a/components/strings/components_chromium_strings_ar.xtb
+++ b/components/strings/components_chromium_strings_ar.xtb
@@ -3,7 +3,7 @@
 <translationbundle lang="ar">
 <translation id="130631256467250065">تسري التغييرات في المرة التالية التي تعيد فيها تشغيل الجهاز.</translation>
 <translation id="275588974610408078">‏تقارير الأعطال غير متاحة في Chromium.</translation>
-<translation id="3064346599913645280">‏أنت تعرض صفحة Chromium آمنة</translation>
+<translation id="3064346599913645280">‏صفحة Chromium هذه آمنة</translation>
 <translation id="3255926992597692024">‏يحاول Chromium تعديل إعدادات ميزة "الملء التلقائي" لبيانات طُرق الدفع.</translation>
 <translation id="358997566136285270">‏شعار Chromium</translation>
 <translation id="4050599136622776556">‏يحاول Chromium تعديل طُرق الدفع.</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index bc92679..cdaa1403 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -975,7 +975,7 @@
 <translation id="2593272815202181319">أحادي المسافة</translation>
 <translation id="2594318783181750337">العرض السريع على الويب:</translation>
 <translation id="2595719060046994702">لا تتم إدارة جهازك وحسابك من خلال شركة أو مؤسسة أخرى.</translation>
-<translation id="2596415276201385844">‏لإنشاء اتصال آمن، فإنك بحاجة إلى ضبط ساعتك بشكل صحيح. وذلك لأن الشهادات التي تستخدمها المواقع الإلكترونية لتعريف نفسها تكون صالحة فقط لفترات محددة من الوقت. فإذا كانت ساعة جهازك غير صحيحة، فلن يتمكن Chrome من التحقق من هذه الشهادات.</translation>
+<translation id="2596415276201385844">‏لإنشاء اتصال آمن، فإنك بحاجة إلى ضبط ساعتك بشكل صحيح. وذلك لأن الشهادات التي تستخدمها مواقع الويب لتعريف نفسها تكون صالحة فقط لفترات محددة من الوقت. فإذا كانت ساعة جهازك غير صحيحة، فلن يتمكن Chrome من التحقق من هذه الشهادات.</translation>
 <translation id="2597378329261239068">هذا المستند محمي بكلمة المرور.  يُرجى إدخال كلمة مرور.</translation>
 <translation id="2600083925285092409">‏في حال حفظ هذه البطاقة لاستخدامها مع Google Pay، سيتم ملء بياناتها تلقائيًا لإجراء عمليات الشراء من خلال Chromium</translation>
 <translation id="2605979593348332811">الاسم صوتيًا</translation>
@@ -1004,7 +1004,7 @@
 <translation id="2651465929321991146">السجلّ وعلامات التبويب</translation>
 <translation id="2653659639078652383">إرسال</translation>
 <translation id="2655752832536625875">حمّام</translation>
-<translation id="2656194288057285221">‏زر إغلاق نصيحة Chrome، اضغط على مفتاح Enter للإغلاق</translation>
+<translation id="2656194288057285221">‏زر إغلاق نصيحة Chrome، يرجى الضغط على مفتاح Enter للإغلاق</translation>
 <translation id="2657637947725373811">{0,plural, =1{هل تريد نقل الملف السرّي؟}zero{هل تريد نقل الملفات السرّية؟}two{هل تريد نقل الملفَّين السريَّين؟}few{هل تريد نقل الملفات السرّية؟}many{هل تريد نقل الملفات السرّية؟}other{هل تريد نقل الملفات السرّية؟}}</translation>
 <translation id="2658843814961855121">قانون عمل وتوظيف</translation>
 <translation id="2660779039299703961">حدث</translation>
@@ -1028,7 +1028,7 @@
 <translation id="2691924980723297736">تحذير متعلق بالأمان</translation>
 <translation id="2696385693639654606">‏يتيح لك إصدار Chrome Enterprise Core إدارة سياسات المتصفّح والتطبيقات والإضافات من السحابة الإلكترونية</translation>
 <translation id="2697248912349197812">طرح سؤال على <ph name="KEYWORD_SHORT_NAME" /></translation>
-<translation id="2699273987028089219">هناك قائمة فرعية متاحة، يمكنك استخدام <ph name="SHORTCUT" /> للانتقال إلى خيارات إضافية.</translation>
+<translation id="2699273987028089219">هناك قائمة فرعية متاحة. يمكنك استخدام <ph name="SHORTCUT" /> للانتقال إلى خيارات إضافية.</translation>
 <translation id="2701514975700770343">الوجه للأسفل</translation>
 <translation id="2702592986366989640">خيار السعر المنخفض</translation>
 <translation id="2702801445560668637">قائمة القراءة</translation>
@@ -1380,7 +1380,7 @@
 <translation id="3299720788264079132">حدث خطأ أثناء استخدام ميزة "<ph name="FEATURE_NAME" />".</translation>
 <translation id="3303176609391916566">30 × 42 بوصة</translation>
 <translation id="3303855915957856445">لم يتم العثور على أي نتائج بحث</translation>
-<translation id="3303872874382375219">يعتمد ظهور إعلانات مخصّصة أو غير مخصّصة على عدة عوامل، منها هذه الإعدادات و<ph name="BEGIN_LINK1" />مواضيع الإعلانات<ph name="LINK_END1" /> و<ph name="BEGIN_LINK2" />إعدادات ملفات تعريف الارتباط<ph name="LINK_END2" /> وما إذا كان الموقع الإلكتروني الذي تعرضه يخصِّص الإعلانات. <ph name="BEGIN_LINK3" />مزيد من المعلومات حول إدارة الخصوصية في عرض الإعلانات<ph name="LINK_END3" /></translation>
+<translation id="3303872874382375219">يعتمد ظهور إعلانات مخصّصة أو غير مخصّصة على عدة عوامل، منها هذه الإعدادات و<ph name="BEGIN_LINK1" />مواضيع الإعلانات<ph name="LINK_END1" /> و<ph name="BEGIN_LINK2" />إعدادات ملفات تعريف الارتباط<ph name="LINK_END2" /> وما إذا كان الموقع الإلكتروني الذي يتم عرضه يخصِّص الإعلانات. <ph name="BEGIN_LINK3" />مزيد من المعلومات حول إدارة الخصوصية في عرض الإعلانات<ph name="LINK_END3" /></translation>
 <translation id="3304073249511302126">البحث عن أجهزة تتضمن بلوتوث</translation>
 <translation id="3304777285002411338">A2x3</translation>
 <translation id="33073482541490531">‏استُخدمت كلمة المرور التي أدخلتها للتو في عملية اختراق للبيانات، لذلك ينصح "مدير كلمات المرور" في Google بتغيير كلمة المرور هذه الآن.</translation>
@@ -1463,7 +1463,7 @@
 <translation id="3441653493275994384">الشاشة</translation>
 <translation id="3443504041532578451">قرص ضوئي (برّاق)</translation>
 <translation id="3447644283769633681">حظر جميع ملفات تعريف الارتباط التابعة لجهات خارجية</translation>
-<translation id="3447661539832366887">أوقف مالك هذا الجهاز تشغيل لعبة الديناصور.</translation>
+<translation id="3447661539832366887">أوقَف مالك هذا الجهاز تشغيل لعبة الديناصور.</translation>
 <translation id="3447884698081792621">عرض الشهادة (من إصدار <ph name="ISSUER" />)</translation>
 <translation id="3450323514459570273">‏السماح للموقع الإلكتروني بطلب التحكُّم في أجهزة MIDI وإعادة برمجتها</translation>
 <translation id="3452404311384756672">الفاصل الزمني للجلب:</translation>
@@ -1500,7 +1500,7 @@
 <translation id="350763432931695541">جارٍ استخراج النص في الصفحات القليلة التالية</translation>
 <translation id="3507869775212388416">وظائف قانونية</translation>
 <translation id="3507936815618196901">إنشاء خريطة ثلاثية الأبعاد للبيئة المحيطة بك وتتبُّع موضع الكاميرا</translation>
-<translation id="3510341387555916271">افتح لاستئناف الكتابة</translation>
+<translation id="3510341387555916271">الفتح لاستئناف الكتابة</translation>
 <translation id="3512163584740124171">يتم تجاهل هذه السياسة بسبب سياسة أخرى من نفس مجموعة السياسة لها أولوية أعلى.</translation>
 <translation id="351522771072578657">يتم حاليًا عرض قائمة</translation>
 <translation id="3517264445792388751">أوقف المشرف نظام الملفات</translation>
@@ -2208,7 +2208,7 @@
 <translation id="467662567472608290">هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ بل إنه شهادة أمان تحتوي على أخطاء. وربما يكون السبب في ذلك خطأ في التكوين أو مهاجمًا يعترض اتصالك.</translation>
 <translation id="4677585247300749148">يريد <ph name="URL" /> الاستجابة لأحداث إمكانية الوصول.</translation>
 <translation id="467809019005607715">‏العروض التقديمية من Google</translation>
-<translation id="4678379207584374453"><ph name="BEGIN_LINK" />معرفة المزيد<ph name="END_LINK" /></translation>
+<translation id="4678379207584374453"><ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
 <translation id="4682496302933121474">هل تريد ترجمة الصفحة؟</translation>
 <translation id="468314109939257734">عرض رقم بطاقتك الافتراضية</translation>
 <translation id="4686942373615810936">تم إنشاء المجموعة للتو</translation>
@@ -2384,7 +2384,7 @@
 <translation id="4950898438188848926">‏زر التبديل بين علامات التبويب، اضغط على Enter للتبديل إلى علامة التبويب المفتوحة هذه <ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" /></translation>
 <translation id="495170559598752135">إجراءات</translation>
 <translation id="4953689047182316270">الاستجابة لأحداث إمكانية الوصول</translation>
-<translation id="4957080528849277028">‏زر عرض سجلّ Chrome: انقر على هذا الزر لعرض سجلّ التصفّح وإدارته في إعدادات Chrome.</translation>
+<translation id="4957080528849277028">‏زر عرض سجلّ Chrome: يرجى النقر على هذا الزر لعرض سجلّ التصفّح وإدارته في إعدادات Chrome.</translation>
 <translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{بالإضافة إلى موقع إلكتروني واحد}zero{بالإضافة إلى # موقع إلكتروني}two{بالإضافة إلى موقعَين إلكترونيَين}few{بالإضافة إلى # مواقع إلكترونية}many{بالإضافة إلى # موقعًا إلكترونيًا}other{بالإضافة إلى # موقع إلكتروني}}</translation>
 <translation id="4958444002117714549">توسيع القائمة</translation>
 <translation id="4960068118612257147">‏يمكنك إجراء تغييرات في إعدادات "الخصوصية في عرض الإعلانات" على Chrome.</translation>
@@ -2439,7 +2439,7 @@
 <translation id="5043480802608081735">الرابط الذي نسخته</translation>
 <translation id="5043753287208271200">أصفر 3</translation>
 <translation id="5045550434625856497">كلمة مرور غير صحيحة</translation>
-<translation id="5048293684454354469">مواضيع الإعلانات هي أحد المصادر المتعدّدة التي يمكن أن يستخدمها الموقع الإلكتروني لتخصيص الإعلانات. حتى في حال عدم توفُّر مواضيع الإعلانات، سيظل بإمكان المواقع الإلكترونية عرض إعلانات لك ولكنّها قد تكون أقل تخصيصًا. تعرَّف على مزيد من المعلومات حول <ph name="BEGIN_LINK" />إدارة الخصوصية في عرض الإعلانات<ph name="LINK_END" />.</translation>
+<translation id="5048293684454354469">مواضيع الإعلانات هي أحد المصادر المتعدّدة التي يمكن أن يستخدمها الموقع الإلكتروني لتخصيص الإعلانات. حتى في حال عدم توفُّر مواضيع الإعلانات، سيظل بإمكان المواقع الإلكترونية عرض إعلانات لك ولكنّها قد تكون أقل تخصيصًا. يمكنك التعرّف على مزيد من المعلومات حول <ph name="BEGIN_LINK" />إدارة الخصوصية في عرض الإعلانات<ph name="LINK_END" />.</translation>
 <translation id="5051254010007014901">‏‫<ph name="TOOLBELT_PRECEDING_MATCH_TEXT" />، يُرجى الضغط على مفتاح Tab للاطّلاع على المزيد من اختصارات طلبات البحث المتوفّرة بعد اقتراح البحث هذا</translation>
 <translation id="5052517576853118371">المواضيع النشِطة</translation>
 <translation id="5056425809654826431">{NUM_FILES,plural, =1{لإرسال هذا الملف باستخدام ميزة "المشاركة عن قرب"، عليك إخلاء مساحة قدرها (<ph name="DISK_SPACE_SIZE" />) على جهازك.}zero{لإرسال هذه الملفات باستخدام ميزة "المشاركة عن قرب"، عليك إخلاء مساحة قدرها (<ph name="DISK_SPACE_SIZE" />) على جهازك.}two{لإرسال هذين الملفَين باستخدام ميزة "المشاركة عن قرب"، عليك إخلاء مساحة قدرها (<ph name="DISK_SPACE_SIZE" />) على جهازك.}few{لإرسال هذه الملفات باستخدام ميزة "المشاركة عن قرب"، عليك إخلاء مساحة قدرها (<ph name="DISK_SPACE_SIZE" />) على جهازك.}many{لإرسال هذه الملفات باستخدام ميزة "المشاركة عن قرب"، عليك إخلاء مساحة قدرها (<ph name="DISK_SPACE_SIZE" />) على جهازك.}other{لإرسال هذه الملفات باستخدام ميزة "المشاركة عن قرب"، عليك إخلاء مساحة قدرها (<ph name="DISK_SPACE_SIZE" />) على جهازك.}}</translation>
@@ -2704,7 +2704,7 @@
 <translation id="5490432419156082418">العناوين والمزيد</translation>
 <translation id="5492298309214877701">‏يكون للموقع الإلكتروني هذا على الشبكة الداخلية للشركة أو المؤسسة أو المدرسة نفس عنوان URL لأحد المواقع الإلكترونية الخارجية.
     <ph name="LINE_BREAK" />
-    حاول الاتصال بمشرف النظام.</translation>
+    يرجى محاولة الاتصال بمشرف النظام.</translation>
 <translation id="5496804587179176046">يجب حفظ رموز الأمان، إذ إنّه ما مِن رموز أمان محفوظة حاليًا</translation>
 <translation id="550365051221576010">ملء كل الحقول</translation>
 <translation id="5506286895894263601">لا تحتوي القائمة على أي اختصارات صالحة.</translation>
@@ -2717,7 +2717,7 @@
 <translation id="5512812358367123529">أثاث مكتبي</translation>
 <translation id="5513528801833998679">استخدام تسجيل الدخول عبر الجهاز</translation>
 <translation id="5515388687005870733">55 × 85 ملم</translation>
-<translation id="5518352028556756716">لا يمكن لمعظم المواقع الإلكترونية استخدام ملفات تعريف الارتباط التابعة لجهات خارجية لتتبُّع نشاطك أثناء التصفُّح، ولا يمكن للمواقع الإلكترونية استخدام تلك الملفات في وضع التصفُّح المتخفي.</translation>
+<translation id="5518352028556756716">لا يمكن لمعظم المواقع الإلكترونية استخدام ملفات تعريف الارتباط الخارجية لتتبُّع نشاطك أثناء التصفُّح، ولا يمكن للمواقع الإلكترونية استخدام تلك الملفات في وضع التصفُّح المتخفي.</translation>
 <translation id="5519516356611866228">مع التغييرات التي تمَّ إجراؤها</translation>
 <translation id="5519696598216267194">ورق (مثقوب مسبقًا)</translation>
 <translation id="5520105693415771152">ألا تظهر معلوماتك المُحدَّثة؟ يُرجى التواصل مع مقدِّم الخدمة لتعديلها.</translation>
@@ -3211,7 +3211,7 @@
 <translation id="6342171901363060580">‏يظهر لك هذا التحذير لأنّ هذا الموقع الإلكتروني لا يتوافق مع بروتوكول HTTPS أثناء استخدامك لوضع التصفّح المتخفي. <ph name="LEARN_MORE" /></translation>
 <translation id="634500758737709758">بدء الاتجاهات</translation>
 <translation id="6348220984832452017">الأنماط المتنوّعة المفعَّلة</translation>
-<translation id="6349101878882523185">تثبيت "<ph name="APP_NAME" />"</translation>
+<translation id="6349101878882523185">تثبيت <ph name="APP_NAME" /></translation>
 <translation id="6351658970066645919">حذف بيانات التصفّح</translation>
 <translation id="6353505687280762741">{COUNT,plural, =0{ما من كلمات مرور}=1{كلمة مرور واحدة (للقائمة <ph name="DOMAIN_LIST" />، تمت المزامنة)}=2{كلمتا مرور (للقائمة <ph name="DOMAIN_LIST" />، تمت المزامنة)}few{# كلمات مرور (للقائمة <ph name="DOMAIN_LIST" />، تمت المزامنة)}many{# كلمة مرور (للقائمة <ph name="DOMAIN_LIST" />، تمت المزامنة)}other{# كلمة مرور (للقائمة <ph name="DOMAIN_LIST" />، تمت المزامنة)}}</translation>
 <translation id="6355392890578844978">‏لا تتم إدارة هذا المتصفِّح من خلال شركة أو مؤسسة أخرى. وقد تتم إدارة النشاط على هذا الجهاز خارج Chromium. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
@@ -3330,7 +3330,7 @@
 <translation id="6513005815064132016">السماح للموقع الإلكتروني بطلب تتبُّع موضع الكاميرا</translation>
 <translation id="6516242269547757923">‏لا حاجة إلى استخدام تطبيق مصرفك للدفع في Chrome</translation>
 <translation id="6517596291481585650">تحذير: لم يتم دمج هذه السياسة كقائمة كما هو موضح بموجب السياسة؛ لأنها ليست قائمة.</translation>
-<translation id="6518133107902771759">تحقق</translation>
+<translation id="6518133107902771759">تأكيد</translation>
 <translation id="6519885440226079262">يمكن للموقع الإلكتروني طلب تتبُّع يديك</translation>
 <translation id="6520026037299163656">تطبيقات ويب وأدوات على الإنترنت</translation>
 <translation id="65203098586853226">الترجمة من <ph name="SOURCE" /> إلى <ph name="TARGET" /></translation>
@@ -3455,7 +3455,7 @@
 <translation id="6737708609449480586">مخبوزات</translation>
 <translation id="6738516213925468394">تم ترميز بياناتك باستخدام <ph name="BEGIN_LINK" />عبارة مرور المزامنة<ph name="END_LINK" /> في <ph name="TIME" />. يُرجى إدخالها لبدء المزامنة.</translation>
 <translation id="6739943577740687354">تستخدم هذه الميزة الذكاء الاصطناعي وقد تخطئ في بعض الأحيان</translation>
-<translation id="6740851646645036700">لقد وصلت إلى الحد الأقصى لاستخدام ميزة "مساعدة في الكتابة". يُرجى إعادة المحاولة لاحقًا.</translation>
+<translation id="6740851646645036700">لقد وصلت إلى الحد الأقصى لاستخدام ميزة "ساعدني في الكتابة". يُرجى إعادة المحاولة لاحقًا.</translation>
 <translation id="674375294223700098">حدث خطأ غير معروف في شهادة الخادم.</translation>
 <translation id="6743841972744298686">إعدادات المزامنة</translation>
 <translation id="6745592621698551453">التحديث الآن</translation>
@@ -3566,7 +3566,7 @@
 <translation id="6936976777388162184">‏هذا جهاز مُزوَّد بترخيص مجمّع ولا يمكن إدراجه ضمن "ترقية Kiosk and Signage".</translation>
 <translation id="6942444979237658241">التعليقات في مجموعة "<ph name="GROUP_NAME" />"</translation>
 <translation id="6944557544071529399">ألعاب استراتيجية</translation>
-<translation id="6944692733090228304">لقد أدخلتَ كلمة المرور في موقع إلكتروني لا تديره <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. ويُرجى عدم إعادة استخدام كلمة المرور في التطبيقات ومواقع الويب الأخرى لحماية حسابك.</translation>
+<translation id="6944692733090228304">لقد أدخلت كلمة المرور في موقع إلكتروني لا تديره <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. ويُرجى عدم إعادة استخدام كلمة المرور في التطبيقات ومواقع الويب الأخرى لحماية حسابك.</translation>
 <translation id="6946949206576443118">‏البحث في الويب على Chrome</translation>
 <translation id="6948051842255602737">انتهت اللعبة، والنتيجة التي حققتها هي <ph name="SCORE" />.</translation>
 <translation id="6948223029286835408">‏عند إجراء عمليات شراء على Chrome، يمكنك استخدام Pix كخيار للدفع</translation>
@@ -3938,7 +3938,7 @@
 <translation id="753556296624075801">‏بواسطة Google</translation>
 <translation id="753713322968419914">‏هل المطلوب إزالة عنوان المنزل من ميزة "الملء التلقائي" في Chrome؟</translation>
 <translation id="7537536606612762813">إلزامية</translation>
-<translation id="7543525346216957623">طلب الإذن من والدَيك</translation>
+<translation id="7543525346216957623">طلب موافقة أحد الوالدَين</translation>
 <translation id="7546409722674205727">جارٍ تشغيل "<ph name="APP_NAME" />"</translation>
 <translation id="7548892272833184391">إصلاح أخطاء الاتصال</translation>
 <translation id="7549584377607005141">تحتاج صفحة الويب هذه إلى البيانات التي أدخلتها في وقت سابق لعرضها بشكل صحيح. يمكنك إرسال هذه البيانات مرة أخرى، مما يعني أنه سيتم تكرار جميع الإجراءات السابقة.</translation>
@@ -3962,7 +3962,7 @@
 <translation id="7569983096843329377">أسود</translation>
 <translation id="7571813784389228510">‏"وضع AI" من Google</translation>
 <translation id="7574998639136359461">معدّات رياضات شتوية</translation>
-<translation id="7575207903026901870">‏إزالة زر "الاقتراحات"، اضغط على مفتاح Enter لإزالة هذا الاقتراح</translation>
+<translation id="7575207903026901870">‏إزالة زر "الاقتراحات"، يرجى الضغط على مفتاح Enter لإزالة هذا الاقتراح</translation>
 <translation id="7575800019233204241">‏"لا يتمتع اتصالك بالخصوصية" أو "&lt;span class="error-code"&gt;NET::ERR_CERT_AUTHORITY_INVALID&lt;/span&gt;" أو "&lt;span class="error-code"&gt;ERR_CERT_COMMON_NAME_INVALID&lt;/span&gt;" أو "&lt;span class="error-code"&gt;NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM&lt;/span&gt;" أو "خطأ في شهادة طبقة المقابس الآمنة (SSL)"</translation>
 <translation id="7575887283389198269">هواتف جوّالة</translation>
 <translation id="7578104083680115302">‏الدفع سريعًا على المواقع والتطبيقات على جميع الأجهزة باستخدام البطاقات التي حفظتها في Google.</translation>
@@ -4038,7 +4038,7 @@
 <translation id="7682451652090915298">رغبي</translation>
 <translation id="768344142657640519">الصفحات التي زرتها للتو</translation>
 <translation id="7684683146428206649">معدن</translation>
-<translation id="7684817988830401358">‏زر "حذف بيانات التصفّح": انقر على هذا الزر لحذف سجلّ التصفّح وملفات تعريف الارتباط وذاكرة التخزين المؤقت وغير ذلك من خلال إعدادات Chrome</translation>
+<translation id="7684817988830401358">‏زر "حذف بيانات التصفّح": يرجى النقر على هذا الزر لحذف سجلّ التصفّح وملفات تعريف الارتباط وذاكرة التخزين المؤقت وغير ذلك من خلال إعدادات Chrome</translation>
 <translation id="7684928361160505327">{0,plural, =1{تم حظر <ph name="FILE_NAME" /> بسبب السياسة.}zero{تم حظر <ph name="FILE_COUNT" /> ملف بسبب السياسة.}two{تم حظر ملفَين (<ph name="FILE_COUNT" />) بسبب السياسة.}few{تم حظر <ph name="FILE_COUNT" /> ملفات بسبب السياسة.}many{تم حظر <ph name="FILE_COUNT" /> ملفًا بسبب السياسة.}other{تم حظر <ph name="FILE_COUNT" /> ملف بسبب السياسة.}}</translation>
 <translation id="7687186412095877299">تتم تعبئة نماذج الدفع باستخدام طرق الدفع المحفوظة</translation>
 <translation id="7687305263118037187">انتهاء مهلة إعادة المحاولة</translation>
@@ -4472,7 +4472,7 @@
 <translation id="8436623588884785770">إضافة سياسة</translation>
 <translation id="8437238597147034694">تراجع عن ال&amp;نقل</translation>
 <translation id="8438786541497918448">هل تريد استخدام الكاميرا والميكروفون؟</translation>
-<translation id="8438923942245957911">أبلغت مؤسستك عن هذا الموقع الإلكتروني.</translation>
+<translation id="8438923942245957911">أبلغَت مؤسستك عن هذا الموقع الإلكتروني.</translation>
 <translation id="8446275044635689572">فنون مسرحية</translation>
 <translation id="8446884382197647889">مزيد من المعلومات</translation>
 <translation id="8449036207308062757">إدارة مساحة التخزين</translation>
@@ -4532,7 +4532,7 @@
 <translation id="8544217240017914508">‏يحاول Google Chrome تعديل إعدادات ميزة "الملء التلقائي" لبيانات طُرق الدفع.</translation>
 <translation id="8544303911974837265">بوليستر</translation>
 <translation id="854548366864113872">خيار السعر العالي</translation>
-<translation id="8546254312340305428">أدخِل سببًا للتحميل (مطلوب).</translation>
+<translation id="8546254312340305428">يرجى إدخال سبب للتحميل (مطلوب).</translation>
 <translation id="8546350655047701518">‏تصدير السجلّات بتنسيق JSON</translation>
 <translation id="8546667245446052521">ورق (أرشفة)</translation>
 <translation id="854892890027593466">‏ظرف C6/C5</translation>
@@ -4543,7 +4543,7 @@
 <translation id="8556297087315686325">مراقبة شبكات وإدارتها</translation>
 <translation id="8557066899867184262">‏رمز التحقق من البطاقة (CVC) موجود خلف بطاقتك.</translation>
 <translation id="8558347880669160417">تم السماح باستخدام الكاميرا والميكروفون هذه المرّة.</translation>
-<translation id="8559762987265718583">تعذر إنشاء اتصال خاص بـ <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> نظرًا لأن التاريخ والوقت للجهاز (<ph name="DATE_AND_TIME" />) غير صحيحين.</translation>
+<translation id="8559762987265718583">تعذر إنشاء اتصال خاص بـ <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> نظرًا لأن تاريخ ووقت جهازك (<ph name="DATE_AND_TIME" />) غير صحيحين.</translation>
 <translation id="8564182942834072828">مستندات مفصولة/نُسخ مفصولة</translation>
 <translation id="8564466070529550495">البطاقة الافتراضية غير متوفّرة حاليًا، لذا يُرجى إعادة المحاولة لاحقًا.</translation>
 <translation id="8564985650692024650">‏يُوصي Chromium بإعادة تحديد كلمة المرور <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> في حال إعادة استخدامها في مواقع إلكترونية أخرى.</translation>
@@ -4634,7 +4634,7 @@
 <translation id="8733764070897080460">‏يمكنك حظر المواضيع غير المرغوب مشاركتها مع المواقع الإلكترونية. كذلك، يحذف Chrome تلقائيًا من القائمة المواضيع بعد مرور أكثر من 4 أسابيع. مزيد من المعلومات</translation>
 <translation id="8734529307927223492">يدير <ph name="MANAGER" /> الجهاز <ph name="DEVICE_TYPE" />.</translation>
 <translation id="8736059027199600831">30 × 40 بوصة</translation>
-<translation id="8737134861345396036">‏<ph name="LAUNCH_INCOGNITO_FOCUSED_FRIENDLY_MATCH_TEXT" />، اضغط على مفتاح التبويب (Tab) ثم مفتاح Enter لفتح نافذة تصفُّح متخفٍ جديدة للتصفُّح بخصوصية تامّة.</translation>
+<translation id="8737134861345396036">‏<ph name="LAUNCH_INCOGNITO_FOCUSED_FRIENDLY_MATCH_TEXT" />، يرجى الضغط على مفتاح التبويب (Tab) ثم مفتاح Enter لفتح نافذة تصفُّح متخفٍ جديدة للتصفُّح بخصوصية تامّة.</translation>
 <translation id="8737685506611670901">فتح روابط <ph name="PROTOCOL" /> بدلاً من <ph name="REPLACED_HANDLER_TITLE" /></translation>
 <translation id="8738058698779197622">‏لإنشاء اتصال آمن، فإنك بحاجة إلى ضبط ساعتك بشكل صحيح. وذلك لأن الشهادات التي تستخدمها المواقع الإلكترونية لتعريف نفسها تكون صالحة فقط لفترات محددة من الوقت. فإذا كانت ساعة جهازك غير صحيحة، فلن يتمكن Chromium من التحقق من هذه الشهادات.</translation>
 <translation id="8740359287975076522">‏تعذر العثور على &lt;/abbr&gt;عنوان نظام أسماء النطاقات (DNS)‏&lt;abbr id="dnsDefinition"&gt; لـ <ph name="HOST_NAME" />. جارٍ تشخيص المشكلة.</translation>
@@ -4790,7 +4790,7 @@
 <translation id="902590795160480390">‏جارٍ تحميل ملف PDF</translation>
 <translation id="9026253329950610248">‏مواقع Google</translation>
 <translation id="9027020981272345766">‏تجربة إصدار Chrome Enterprise Core</translation>
-<translation id="9027531288681624875">للخروج من وضع "ملء الشاشة"، اضغط مع الاستمرار على |<ph name="ACCELERATOR" />|</translation>
+<translation id="9027531288681624875">للخروج من وضع "ملء الشاشة"، عليك الضغط مع الاستمرار على |<ph name="ACCELERATOR" />|</translation>
 <translation id="9031426777610376427">هل أردت تعديل رقم التعويض؟</translation>
 <translation id="9035022520814077154">خطأ متعلق بالأمان</translation>
 <translation id="9035824888276246493">حفظ رموز الأمان</translation>
@@ -4828,7 +4828,7 @@
 <translation id="9078912659001679888">خلّاطات وعصّارات</translation>
 <translation id="9078964945751709336">مطلوب مزيد من المعلومات</translation>
 <translation id="9080712759204168376">ملخص الطلبات</translation>
-<translation id="9084304544887760521">يمكنك تلقّي رسائل إلكترونية على <ph name="EMAIL" /> عند انخفاض أسعار العناصر التي تتّبعها على أي موقع إلكتروني.</translation>
+<translation id="9084304544887760521">يمكنك تلقّي رسائل إلكترونية على <ph name="EMAIL" /> عند انخفاض أسعار العناصر التي يتم تتبعها على أي موقع إلكتروني.</translation>
 <translation id="9089260154716455634">سياسة "التوقف عن العمل":</translation>
 <translation id="9090218457905363312">موسيقى "ريغي" والبحر الكاريبي</translation>
 <translation id="9090243919347147717">المرفقات</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb
index 6266c44..d579966 100644
--- a/components/strings/components_strings_bg.xtb
+++ b/components/strings/components_strings_bg.xtb
@@ -3232,6 +3232,7 @@
 <translation id="6380497234672085559">A0</translation>
 <translation id="638289054711715023">Термосвиваемо фолио</translation>
 <translation id="6383221683286411806">Възможно е таксуване.</translation>
+<translation id="6384448607821972818">Паролата за възстановяване е показана</translation>
 <translation id="6385164437039878414">Раници и практични чанти</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{още 1 предложение}other{още # предложения}}</translation>
 <translation id="6386565501269869892">Плик You 4</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb
index b1009b0..6ec86d1 100644
--- a/components/strings/components_strings_ca.xtb
+++ b/components/strings/components_strings_ca.xtb
@@ -3232,6 +3232,7 @@
 <translation id="6380497234672085559">A0</translation>
 <translation id="638289054711715023">Làmina de degoteig reduïda</translation>
 <translation id="6383221683286411806">Aquest lloc web et pot fer càrrecs.</translation>
+<translation id="6384448607821972818">S'ha mostrat la contrasenya de recuperació</translation>
 <translation id="6385164437039878414">Motxilles i bosses d'esports</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 suggeriment més}other{# suggeriments més}}</translation>
 <translation id="6386565501269869892">Sobre You 4</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index 5458ac0..1af6b6f6 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -1540,7 +1540,7 @@
 <translation id="357244642999988503">Quitar columna</translation>
 <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation>
 <translation id="3574520980813687946">Añadir información nueva a la dirección</translation>
-<translation id="3575121482199441727">Permitir en este sitio web</translation>
+<translation id="3575121482199441727">Permitir en este sitio</translation>
 <translation id="3575168918110434329">A4x7</translation>
 <translation id="3575589330755445706">Opción de nombre de calle seleccionada</translation>
 <translation id="3576616784287504635">Una página insertada en <ph name="SITE" /> dice</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb
index 340dc725..68fca53d 100644
--- a/components/strings/components_strings_it.xtb
+++ b/components/strings/components_strings_it.xtb
@@ -3228,6 +3228,7 @@
 <translation id="6380497234672085559">A0</translation>
 <translation id="638289054711715023">Pellicola termoretraibile</translation>
 <translation id="6383221683286411806">Potrebbe essere applicato un addebito.</translation>
+<translation id="6384448607821972818">Password di recupero mostrata</translation>
 <translation id="6385164437039878414">Zaini e borse portaoggetti</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 altro suggerimento}other{# altri suggerimenti}}</translation>
 <translation id="6386565501269869892">Busta You 4</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb
index 2384ca3..acf6818 100644
--- a/components/strings/components_strings_iw.xtb
+++ b/components/strings/components_strings_iw.xtb
@@ -710,7 +710,7 @@
 <translation id="2166378884831602661">אתר זה לא יכול לספק חיבור מאובטח</translation>
 <translation id="2168151236314517198">בהתאם למדיניות מנהל המערכת, הדפסת התוכן הזה חסומה</translation>
 <translation id="2172089022819052306">תחזוקה ותיקון של רכבים</translation>
-<translation id="2173302385160625112">יש לבדוק את החיבור לאינטרנט</translation>
+<translation id="2173302385160625112">צריך לבדוק את החיבור לאינטרנט</translation>
 <translation id="2174875517416416684">העסקה לא הושלמה. לא נמשכו כספים מהחשבון שלך.</translation>
 <translation id="2175630235841878061">‏אי אפשר להוריד קבצים שגדולים מ-100MB</translation>
 <translation id="2178665390943006934">‏הכפתור לעדכון Chrome, מפעילים אותו כדי לעדכן את Chrome דרך הגדרות Chrome</translation>
@@ -1648,7 +1648,7 @@
 <translation id="3715597595485130451">‏רגע, יש עוד צעד אחד ל-Wi-Fi</translation>
 <translation id="3717027428350673159">‏<ph name="BEGIN_LINK" />לבדוק את תצורת ה-DNS, חומת האש ושרת ה-Proxy<ph name="END_LINK" /></translation>
 <translation id="3723316892512143176">Iban</translation>
-<translation id="3723663469265383848">במהלך העדכון, לא תהיה אפשרות להשתמש במכשיר במשך עד 10 דקות.</translation>
+<translation id="3723663469265383848">במהלך העדכון, לא תהיה לך אפשרות להשתמש במכשיר במשך עד 10 דקות.</translation>
 <translation id="372429172604983730">‏אפליקציות שיכולות לגרום לשגיאה הזו כוללות תוכנות אנטי-וירוס, חומות אש ותוכנות proxy או סינון אתרים.</translation>
 <translation id="3727101516080730231">‏<ph name="CREATE_GOOGLE_SLIDE_FOCUSED_FRIENDLY_MATCH_TEXT" />, מקישים על Tab ואז על Enter כדי ליצור במהירות מצגת חדשה ב-Google Slides</translation>
 <translation id="3727309136762649052">מרחב שמות</translation>
@@ -1716,7 +1716,7 @@
 <translation id="3830139096297532361">‏אין גישה לקובץ ה-PDF הזה. לא ניתן להוריד את הקבצים לחילוץ טקסט. אפשר לנסות שוב מאוחר יותר.</translation>
 <translation id="3830470485672984938">שימוש במפתח גישה אחר</translation>
 <translation id="3831065134033923230">בדיקת הסיסמאות השמורות</translation>
-<translation id="3831915413245941253">הותקנו תוספים מהדומיין <ph name="ENROLLMENT_DOMAIN" /> כדי להשתמש בפונקציות נוספות. לתוספים יש גישה לחלק מהנתונים שלך.</translation>
+<translation id="3831915413245941253">תוספים מהדומיין <ph name="ENROLLMENT_DOMAIN" /> הותקנו כדי לאפשר שימוש בפונקציות נוספות. לתוספים יש גישה לחלק מהנתונים שלך.</translation>
 <translation id="3832522519263485449">ניקובים מרובים בצד שמאל</translation>
 <translation id="3835233591525155343">השימוש שלך במכשיר</translation>
 <translation id="3836246517890985658">מכשירי חשמל קטנים למטבח</translation>
@@ -2404,7 +2404,7 @@
 <translation id="4989542687859782284">לא זמין</translation>
 <translation id="4989809363548539747">הפלאגין הזה אינו נתמך</translation>
 <translation id="4990241977441916452">‏מעטפה – A2</translation>
-<translation id="4992066212339426712">ביטול השתקה</translation>
+<translation id="4992066212339426712">ביטול ההשתקה</translation>
 <translation id="4994095017621319069">קבוצת כרטיסיות אחת לא זמינה יותר</translation>
 <translation id="4995474875135717171">שונה בתאריך:</translation>
 <translation id="4995749490935861684">‏<ph name="CUSTOMIZE_SEARCH_ENGINES_FOCUSED_FRIENDLY_MATCH_TEXT" />, צריך ללחוץ על Tab ואז על Enter כדי לנהל את החיפוש באתר ואת מנוע החיפוש של ברירת המחדל</translation>
@@ -2501,7 +2501,7 @@
 <translation id="5144613843429436866">נתת הרשאה של <ph name="PERMISSION" /> לאתר הזה</translation>
 <translation id="5145883236150621069">קיים קוד שגיאה בתגובת המדיניות</translation>
 <translation id="5146995429444047494">התראות של <ph name="ORIGIN" /> נחסמו</translation>
-<translation id="514704532284964975">‏נשלחה בקשה מהכתובת <ph name="URL" /> לראות ולשנות מידע במכשירי NFC בזמן הלחיצה בטלפון</translation>
+<translation id="514704532284964975">‏נשלחה בקשה מהכתובת <ph name="URL" /> לקרוא ולשנות מידע במכשירי NFC כשהטלפון מוצמד אליהם</translation>
 <translation id="5147633291963801297">הצגת ירידות במחיר בחלונית הצדדית</translation>
 <translation id="5148809049217731050">פנים כלפי מעלה</translation>
 <translation id="5148889558173091794">הכתובת <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> נחסמה על ידי הארגון שלך עקב הפרת מדיניות. <ph name="BEGIN_LEARN_MORE_LINK" />מידע נוסף על האזהרה הזו<ph name="END_LEARN_MORE_LINK" /></translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb
index c936d2dd..b221808 100644
--- a/components/strings/components_strings_lo.xtb
+++ b/components/strings/components_strings_lo.xtb
@@ -3232,6 +3232,7 @@
 <translation id="6380497234672085559">A0</translation>
 <translation id="638289054711715023">ຟອຍລ໌ຫົດ</translation>
 <translation id="6383221683286411806">ອາດຈະຖືກຮຽກເກັບເງິນ.</translation>
+<translation id="6384448607821972818">ລະຫັດຜ່ານການກູ້ຄືນທີ່ສະແດງ</translation>
 <translation id="6385164437039878414">ກະເປົາເປ້ ແລະ ກະເປົາອຸປະກອນ</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{1 ຄຳແນະນຳອື່ນ}other{# ຄຳແນະນຳອື່ນ}}</translation>
 <translation id="6386565501269869892">Envelope You 4</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb
index 105b307d..9f8f33b 100644
--- a/components/strings/components_strings_lt.xtb
+++ b/components/strings/components_strings_lt.xtb
@@ -3233,6 +3233,7 @@
 <translation id="6380497234672085559">A0</translation>
 <translation id="638289054711715023">Susitraukianti folija</translation>
 <translation id="6383221683286411806">Galimi apmokestinimai.</translation>
+<translation id="6384448607821972818">Rodomas atkūrimo slaptažodis</translation>
 <translation id="6385164437039878414">Kuprinės ir krepšiai</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{Dar 1 pasiūlymas}one{Dar # pasiūlymas}few{Dar # pasiūlymai}many{Dar # pasiūlymo}other{Dar # pasiūlymų}}</translation>
 <translation id="6386565501269869892">„You 4“ vokas</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index d923b325..66e88fa 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -3227,6 +3227,7 @@
 <translation id="6380497234672085559">A0</translation>
 <translation id="638289054711715023">ஷ்ரிங்க் ஃபாயில்</translation>
 <translation id="6383221683286411806">கட்டணங்கள் விதிக்கப்படச் சாத்தியமுள்ளது.</translation>
+<translation id="6384448607821972818">மீட்புக் கடவுச்சொல் காட்டப்படுகிறது</translation>
 <translation id="6385164437039878414">முதுகில் மாட்டும் பைகள் &amp; கனமான பைகள்</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{மேலும் 1 பரிந்துரை}other{மேலும் # பரிந்துரைகள்}}</translation>
 <translation id="6386565501269869892">என்வெலப் யூ 4</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb
index 590e74a..b69f3649 100644
--- a/components/strings/components_strings_uz.xtb
+++ b/components/strings/components_strings_uz.xtb
@@ -3226,6 +3226,7 @@
 <translation id="6380497234672085559">A0</translation>
 <translation id="638289054711715023">Issiqlikka chidamli plyonka</translation>
 <translation id="6383221683286411806">Trafik uchun haq olinishi mumkin.</translation>
+<translation id="6384448607821972818">Zaxiraviy parol chiqarildi</translation>
 <translation id="6385164437039878414">Ryukzak va yordamchi sumkalar</translation>
 <translation id="6386120369904791316">{COUNT,plural, =1{yana 1 ta tavsiya}other{yana # ta tavsiya}}</translation>
 <translation id="6386565501269869892">Envelope You 4</translation>
diff --git a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
index cafcda7..805bcbb 100644
--- a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
+++ b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
@@ -6525,8 +6525,9 @@
 };
 
 #if !BUILDFLAG(IS_ANDROID)
+// TODO(crbug.com/442684241): Re-enable once flakiness is fixed.
 IN_PROC_BROWSER_TEST_F(RenderFrameHostImplReuseEmptyAvailableRenderBrowserTest,
-                       ReuseEmptyAvailableRenderForMainFrame) {
+                       DISABLED_ReuseEmptyAvailableRenderForMainFrame) {
   // The test assumes that the main frame RFH will be reused when navigating.
   DisableBackForwardCacheForTesting(shell()->web_contents(),
                                     BackForwardCache::TEST_REQUIRES_NO_CACHING);
diff --git a/content/browser/webrtc/webrtc_media_recorder_browsertest.cc b/content/browser/webrtc/webrtc_media_recorder_browsertest.cc
index 8d28ed8..8c6df3d 100644
--- a/content/browser/webrtc/webrtc_media_recorder_browsertest.cc
+++ b/content/browser/webrtc/webrtc_media_recorder_browsertest.cc
@@ -177,8 +177,8 @@
   MakeTypicalCall("testTwoChannelAudio();", kMediaRecorderHtmlFile);
 }
 
-#if BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64)
-// https://crbug.com/438812886
+#if BUILDFLAG(IS_MAC)
+// TODO(https://crbug.com/379271425): Re-enable once flakiness is addressed.
 #define MAYBE_RecordWithTransparency DISABLED_RecordWithTransparency
 #else
 #define MAYBE_RecordWithTransparency RecordWithTransparency
diff --git a/google_apis/gaia/fake_gaia.cc b/google_apis/gaia/fake_gaia.cc
index 853ce52..49ccab3 100644
--- a/google_apis/gaia/fake_gaia.cc
+++ b/google_apis/gaia/fake_gaia.cc
@@ -24,6 +24,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
+#include "base/test/values_test_util.h"
 #include "base/values.h"
 #include "google_apis/gaia/gaia_auth_consumer.h"
 #include "google_apis/gaia/gaia_auth_test_util.h"
@@ -47,16 +48,20 @@
   request_handlers_.insert(std::make_pair(           \
       path, base::BindRepeating(&FakeGaia::method, base::Unretained(this))))
 
-using net::test_server::BasicHttpResponse;
-using net::test_server::HttpRequest;
-
 namespace {
 
+using ::net::test_server::BasicHttpResponse;
+using ::net::test_server::HttpRequest;
+
+using MultiloginAction = ::FakeGaia::MultiloginCall::Action;
+
 const char kTestAuthCode[] = "fake-auth-code";
 const char kTestAuthLoginAccessToken[] = "fake-access-token";
 const char kTestRefreshToken[] = "fake-refresh-token";
 const char kTestSessionSIDCookie[] = "fake-session-SID-cookie";
 const char kTestSessionLSIDCookie[] = "fake-session-LSID-cookie";
+const char kTestSession1PSIDTSCookie[] = "fake-session-1p-SIDTS-cookie";
+const char kTestSession3PSIDTSCookie[] = "fake-session-3p-SIDTS-cookie";
 const char kTestReauthProofToken[] = "fake-reauth-proof-token";
 // Add SameSite=None and Secure because these cookies are needed in a
 // cross-site context.
@@ -70,11 +75,18 @@
 
 // OAuth2 Authentication header value prefix.
 const char kAuthHeaderBearer[] = "Bearer ";
+const char kAuthHeaderBoundOAuth[] = "BoundOAuth ";
+const char kAuthHeaderMultiOAuth[] = "MultiOAuth ";
 const char kAuthHeaderOAuth[] = "OAuth ";
 
 const char kFakeRemoveLocalAccountPath[] = "FakeRemoveLocalAccount";
 const char kFakeSAMLContinuePath[] = "FakeSAMLContinue";
 
+const char kFakeTokenBindingAssertionChallenge[] =
+    "fake-token-binding-assertion-challenge";
+
+const char kXSSIPrefix[] = ")]}'\n";
+
 typedef std::map<std::string, std::string> CookieMap;
 
 // Extracts the |access_token| from authorization header of |request|.
@@ -105,20 +117,122 @@
                                        kTestCookieAttributes));
 }
 
-std::string FormatCookieForMultilogin(std::string name, std::string value) {
-  const char format[] = R"(
-    {
-      "name":"%s",
-      "value":"%s",
-      "domain":".google.fr",
-      "path":"/",
-      "isSecure":true,
-      "isHttpOnly":false,
-      "priority":"HIGH",
-      "maxAge":63070000
+base::Value::Dict GetCookieForMultilogin(const std::string& name,
+                                         const std::string& value) {
+  return base::Value::Dict()
+      .Set("name", name)
+      .Set("value", value)
+      .Set("domain", ".google.fr")
+      .Set("path", "/")
+      .Set("isSecure", true)
+      .Set("isHttpOnly", false)
+      .Set("priority", "HIGH")
+      .Set("maxAge", 63070000);
+}
+
+base::Value::List GetCookiesForMultilogin(
+    const FakeGaia::Configuration& configuration) {
+  CHECK(!configuration.session_sid_cookie.empty());
+  CHECK(!configuration.session_lsid_cookie.empty());
+
+  base::Value::List cookies;
+
+  cookies.Append(
+      GetCookieForMultilogin("SID", configuration.session_sid_cookie));
+  cookies.Append(
+      GetCookieForMultilogin("LSID", configuration.session_lsid_cookie));
+
+  if (!configuration.session_1p_sidts_cookie.empty()) {
+    cookies.Append(GetCookieForMultilogin(
+        "__Secure-1PSIDTS", configuration.session_1p_sidts_cookie));
+  }
+  if (!configuration.session_3p_sidts_cookie.empty()) {
+    cookies.Append(GetCookieForMultilogin(
+        "__Secure-3PSIDTS", configuration.session_3p_sidts_cookie));
+  }
+
+  return cookies;
+}
+
+base::Value::Dict GetFailedAccountForMultilogin(const std::string& gaia_id,
+                                                const std::string& status,
+                                                const std::string& challenge) {
+  return base::Value::Dict()
+      .Set("obfuscated_id", gaia_id)
+      .Set("status", status)
+      .Set("token_binding_retry_response",
+           base::Value::Dict().Set("challenge", challenge));
+}
+
+base::Value::List GetFailedAccountsForMultilogin(
+    const gaia::MultiOAuthHeader& multi_oauth_header) {
+  CHECK_GT(multi_oauth_header.account_requests().size(), 0);
+
+  base::Value::List failed_accounts;
+  failed_accounts.reserve(multi_oauth_header.account_requests().size());
+
+  for (const gaia::MultiOAuthHeader_AccountRequest& account_request :
+       multi_oauth_header.account_requests()) {
+    failed_accounts.Append(GetFailedAccountForMultilogin(
+        account_request.gaia_id(), /*status=*/"RECOVERABLE",
+        kFakeTokenBindingAssertionChallenge));
+  }
+
+  return failed_accounts;
+}
+
+base::Value::List GetDeviceBoundSessionInfoForMultilogin(
+    const FakeGaia::Configuration& configuration) {
+  auto device_bound_session_info = base::Value::Dict()
+                                       .Set("domain", "GOOGLE_COM")
+                                       .Set("is_device_bound", true);
+  if (!configuration.reuse_bound_session) {
+    base::Value::List credentials;
+    if (!configuration.session_1p_sidts_cookie.empty()) {
+      credentials.Append(base::Value::Dict()
+                             .Set("type", "cookie")
+                             .Set("name", "__Secure-1PSIDTS")
+                             .Set("scope", base::Value::Dict()
+                                               .Set("domain", ".google.com")
+                                               .Set("path", "/")));
     }
-  )";
-  return base::StringPrintf(format, name.c_str(), value.c_str());
+    if (!configuration.session_3p_sidts_cookie.empty()) {
+      credentials.Append(base::Value::Dict()
+                             .Set("type", "cookie")
+                             .Set("name", "__Secure-3PSIDTS")
+                             .Set("scope", base::Value::Dict()
+                                               .Set("domain", ".google.com")
+                                               .Set("path", "/")));
+    }
+    device_bound_session_info.Set(
+        "register_session_payload",
+        base::Value::Dict()
+            .Set("session_identifier", "sidts_session")
+            .Set("credentials", std::move(credentials))
+            .Set("refresh_url", "/RotateBoundCookies"));
+  }
+  return base::Value::List().Append(std::move(device_bound_session_info));
+}
+
+MultiloginAction GetMultiloginAction(
+    const std::optional<gaia::MultiOAuthHeader>& header) {
+  if (!header.has_value()) {
+    return MultiloginAction::kReturnUnboundCookies;
+  }
+  CHECK_GT(header->account_requests().size(), 0);
+  // To simplify, look at the first account request only.
+  const gaia::MultiOAuthHeader::AccountRequest& account_request =
+      header->account_requests(0);
+  if (account_request.token_binding_assertion().empty()) {
+    return MultiloginAction::kReturnUnboundCookies;
+  }
+  if (account_request.token_binding_assertion() ==
+      GaiaConstants::kTokenBindingAssertionSentinel) {
+    return MultiloginAction::kReturnBindingChallenge;
+  }
+  // Assume that the client properly signed the challenge and is eligible to
+  // receive bound cookies.
+  return MultiloginAction::kReturnBoundCookies;
 }
 
 std::string FormatSyncTrustedRecoveryMethods(
@@ -158,6 +272,75 @@
           .c_str());
 }
 
+// It gets the bound access token from the authorization header of `request` and
+// returns `true`. If it fails at any step, it returns `false`.
+bool GetBoundAccessToken(const HttpRequest& request,
+                         std::string* access_token) {
+  std::string encoded_token;
+  if (!GetAccessToken(request, kAuthHeaderBoundOAuth, &encoded_token)) {
+    return false;
+  }
+  std::string decoded_token;
+  if (!base::Base64UrlDecode(encoded_token,
+                             base::Base64UrlDecodePolicy::DISALLOW_PADDING,
+                             &decoded_token)) {
+    return false;
+  }
+  gaia::BoundOAuthToken bound_oauth_token;
+  if (!bound_oauth_token.ParseFromString(decoded_token) ||
+      !bound_oauth_token.has_token()) {
+    return false;
+  }
+  *access_token = bound_oauth_token.token();
+  return true;
+}
+
+// It gets `gaia::MultiOAuthHeader` encoded in the authorization header of
+// `request`. If it fails at any step, it returns `std::nullopt`.
+std::optional<gaia::MultiOAuthHeader> GetMultiOAuthHeader(
+    const HttpRequest& request) {
+  auto it = request.headers.find("Authorization");
+  if (it == request.headers.end()) {
+    return std::nullopt;
+  }
+  std::optional<std::string_view> encoded_header =
+      base::RemovePrefix(it->second, kAuthHeaderMultiOAuth);
+  if (!encoded_header.has_value()) {
+    return std::nullopt;
+  }
+  std::string decoded_header;
+  if (!base::Base64UrlDecode(*encoded_header,
+                             base::Base64UrlDecodePolicy::DISALLOW_PADDING,
+                             &decoded_header)) {
+    return std::nullopt;
+  }
+  gaia::MultiOAuthHeader multi_oauth_header;
+  if (!multi_oauth_header.ParseFromString(decoded_header)) {
+    return std::nullopt;
+  }
+  return multi_oauth_header;
+}
+
+// Formats a JSON response with the data in |value|, setting the http status
+// to |status|.
+void FormatJSONResponse(const base::ValueView& value,
+                        net::HttpStatusCode status,
+                        BasicHttpResponse* http_response,
+                        const std::string& prefix = "") {
+  std::string response_json;
+  base::JSONWriter::Write(value, &response_json);
+  http_response->set_content(base::StrCat({prefix, response_json}));
+  http_response->set_code(status);
+}
+
+// Formats a JSON response with the data in |value|, setting the http status
+// to net::HTTP_OK.
+void FormatOkJSONResponse(const base::ValueView& value,
+                          BasicHttpResponse* http_response,
+                          const std::string& prefix = "") {
+  FormatJSONResponse(value, net::HTTP_OK, http_response, prefix);
+}
+
 }  // namespace
 
 FakeGaia::AccessTokenInfo::AccessTokenInfo() = default;
@@ -171,10 +354,16 @@
 
 FakeGaia::Configuration::~Configuration() = default;
 
+FakeGaia::MultiloginCall::MultiloginCall() = default;
+
+FakeGaia::MultiloginCall::~MultiloginCall() = default;
+
+FakeGaia::MultiloginCall::MultiloginCall(const MultiloginCall& other) = default;
+
 void FakeGaia::Configuration::Update(const Configuration& update) {
   // This lambda uses a pointer to data member to merge attributes.
   auto maybe_update_field = [this,
-                             &update](std::string Configuration::*field_ptr) {
+                             &update](std::string Configuration::* field_ptr) {
     if (!(update.*field_ptr).empty()) {
       this->*field_ptr = update.*field_ptr;
     }
@@ -223,6 +412,8 @@
   params.access_token = kTestAuthLoginAccessToken;
   params.session_sid_cookie = kTestSessionSIDCookie;
   params.session_lsid_cookie = kTestSessionLSIDCookie;
+  params.session_1p_sidts_cookie = kTestSession1PSIDTSCookie;
+  params.session_3p_sidts_cookie = kTestSession3PSIDTSCookie;
   params.emails = {email};
   SetConfiguration(params);
 }
@@ -470,6 +661,12 @@
   }
 }
 
+base::queue<FakeGaia::MultiloginCall> FakeGaia::GetAndResetMultiloginCalls() {
+  base::queue<MultiloginCall> result;
+  result.swap(multilogin_calls_);
+  return result;
+}
+
 GURL FakeGaia::GetFakeRemoveLocalAccountURL(const GaiaId& gaia_id) const {
   GURL url =
       GaiaUrls::GetInstance()->gaia_url().Resolve(kFakeRemoveLocalAccountPath);
@@ -481,20 +678,6 @@
   refresh_token_to_device_id_map_ = refresh_token_to_device_id_map;
 }
 
-void FakeGaia::FormatOkJSONResponse(const base::ValueView& value,
-                                    BasicHttpResponse* http_response) {
-  FormatJSONResponse(value, net::HTTP_OK, http_response);
-}
-
-void FakeGaia::FormatJSONResponse(const base::ValueView& value,
-                                  net::HttpStatusCode status,
-                                  BasicHttpResponse* http_response) {
-  std::string response_json;
-  base::JSONWriter::Write(value, &response_json);
-  http_response->set_content(response_json);
-  http_response->set_code(status);
-}
-
 const FakeGaia::AccessTokenInfo* FakeGaia::FindAccessTokenInfo(
     const std::string& auth_token,
     const std::string& client_id,
@@ -755,7 +938,8 @@
   std::string access_token;
   std::string scope;
   std::string client_id;
-  if (GetAccessToken(request, kAuthHeaderBearer, &access_token) &&
+  if ((GetAccessToken(request, kAuthHeaderBearer, &access_token) ||
+       GetBoundAccessToken(request, &access_token)) &&
       GetQueryParameter(request.content, "scope", &scope) &&
       GetQueryParameter(request.content, "client_id", &client_id)) {
     const AccessTokenInfo* token_info =
@@ -911,14 +1095,15 @@
 
 void FakeGaia::HandleMultilogin(const HttpRequest& request,
                                 BasicHttpResponse* http_response) {
-  http_response->set_code(net::HTTP_UNAUTHORIZED);
-
+  CHECK(http_response);
   if (configuration_.session_sid_cookie.empty() ||
       configuration_.session_lsid_cookie.empty()) {
     http_response->set_code(net::HTTP_BAD_REQUEST);
     return;
   }
 
+  http_response->set_code(net::HTTP_UNAUTHORIZED);
+
   GURL request_url = GURL("http://localhost").Resolve(request.relative_url);
   std::string request_query = request_url.query();
 
@@ -928,13 +1113,45 @@
     return;
   }
 
-  http_response->set_content(
-      ")]}'\n{\"status\":\"OK\",\"cookies\":[" +
-      FormatCookieForMultilogin("SID", configuration_.session_sid_cookie) +
-      "," +
-      FormatCookieForMultilogin("LSID", configuration_.session_lsid_cookie) +
-      "]}");
-  http_response->set_code(net::HTTP_OK);
+  const std::optional<gaia::MultiOAuthHeader> multi_oauth_header =
+      GetMultiOAuthHeader(request);
+  const MultiloginAction action = GetMultiloginAction(multi_oauth_header);
+  switch (action) {
+    case MultiloginAction::kReturnUnboundCookies: {
+      const base::Value::Dict response =
+          base::Value::Dict()
+              .Set("status", "OK")
+              .Set("cookies", GetCookiesForMultilogin(configuration_));
+      FormatOkJSONResponse(response, http_response, kXSSIPrefix);
+      break;
+    }
+    case MultiloginAction::kReturnBindingChallenge: {
+      CHECK(multi_oauth_header.has_value());
+      const base::Value::Dict response =
+          base::Value::Dict()
+              .Set("status", "RETRY")
+              .Set("failed_accounts",
+                   GetFailedAccountsForMultilogin(*multi_oauth_header));
+      FormatJSONResponse(response, net::HTTP_BAD_REQUEST, http_response,
+                         kXSSIPrefix);
+      break;
+    }
+    case MultiloginAction::kReturnBoundCookies: {
+      const base::Value::Dict response =
+          base::Value::Dict()
+              .Set("status", "OK")
+              .Set("cookies", GetCookiesForMultilogin(configuration_))
+              .Set("device_bound_session_info",
+                   GetDeviceBoundSessionInfoForMultilogin(configuration_));
+      FormatOkJSONResponse(response, http_response, kXSSIPrefix);
+      break;
+    }
+  }
+
+  MultiloginCall call;
+  call.header = multi_oauth_header;
+  call.action = action;
+  multilogin_calls_.push(std::move(call));
 }
 
 void FakeGaia::HandleFakeRemoveLocalAccount(
diff --git a/google_apis/gaia/fake_gaia.h b/google_apis/gaia/fake_gaia.h
index 9498266..318b03d4 100644
--- a/google_apis/gaia/fake_gaia.h
+++ b/google_apis/gaia/fake_gaia.h
@@ -11,7 +11,9 @@
 #include <string>
 
 #include "base/containers/flat_map.h"
+#include "base/containers/queue.h"
 #include "base/functional/callback.h"
+#include "google_apis/gaia/bound_oauth_token.pb.h"
 #include "google_apis/gaia/gaia_auth_consumer.h"
 #include "google_apis/gaia/gaia_id.h"
 #include "net/http/http_status_code.h"
@@ -77,8 +79,10 @@
     std::string access_token;
     std::string id_token;
 
-    // Values of SID and LSID cookie generated from multilogin call.
+    // Values of SID, SIDTS and LSID cookie generated from multilogin call.
     std::string session_sid_cookie;
+    std::string session_1p_sidts_cookie;
+    std::string session_3p_sidts_cookie;
     std::string session_lsid_cookie;
 
     // The e-mail addresses returned by /ListAccounts.
@@ -86,6 +90,12 @@
 
     // List of signed out gaia IDs returned by /ListAccounts.
     std::vector<GaiaId> signed_out_gaia_ids;
+
+    // If true and OAuthMultilogin is called with a signed challenge, the
+    // response will contain additional bound session information indicating
+    // that the existing session should be reused. Otherwise, payload to
+    // register the new session will be returned.
+    bool reuse_bound_session = false;
   };
 
   struct SyncTrustedVaultKeys {
@@ -97,6 +107,29 @@
     std::vector<std::vector<uint8_t>> trusted_public_keys;
   };
 
+  // Represents a single OAuthMultilogin call. It contains the
+  // `gaia::MultiOAuthHeader` sent by the client (if any) and the action the
+  // server took in response to the request.
+  //
+  // Only successful calls are recorded (see `MultiloginAction` for the
+  // list of possible actions).
+  struct MultiloginCall {
+    // Indicates what action the server performed when handling an
+    // OAuthMultilogin request.
+    enum class Action {
+      kReturnUnboundCookies,
+      kReturnBoundCookies,
+      kReturnBindingChallenge,
+    };
+
+    MultiloginCall();
+    MultiloginCall(const MultiloginCall& other);
+    ~MultiloginCall();
+
+    std::optional<gaia::MultiOAuthHeader> header;
+    Action action;
+  };
+
   FakeGaia();
 
   FakeGaia(const FakeGaia&) = delete;
@@ -219,6 +252,10 @@
     return passwordless_support_level_;
   }
 
+  // Returns and resets the list of OAuthMultilogin calls that have been made to
+  // the fake server.
+  base::queue<MultiloginCall> GetAndResetMultiloginCalls();
+
   // Returns the fake server's URL that browser tests can visit to trigger a
   // RemoveLocalAccount event.
   GURL GetFakeRemoveLocalAccountURL(const GaiaId& gaia_id) const;
@@ -251,17 +288,6 @@
       net::test_server::BasicHttpResponse* http_response,
       const std::string& email) const;
 
-  // Formats a JSON response with the data in |value|, setting the http status
-  // to |status|.
-  void FormatJSONResponse(const base::ValueView& value,
-                          net::HttpStatusCode status,
-                          net::test_server::BasicHttpResponse* http_response);
-
-  // Formats a JSON response with the data in |value|, setting the http status
-  // to net::HTTP_OK.
-  void FormatOkJSONResponse(const base::ValueView& value,
-                            net::test_server::BasicHttpResponse* http_response);
-
   using HttpRequestHandlerCallback = base::RepeatingCallback<void(
       const net::test_server::HttpRequest& request,
       net::test_server::BasicHttpResponse* http_response)>;
@@ -370,6 +396,7 @@
   GaiaAuthConsumer::ReAuthProofTokenStatus next_reauth_status_ =
       GaiaAuthConsumer::ReAuthProofTokenStatus::kSuccess;
   GURL embedded_setup_chromeos_iframe_url_;
+  base::queue<MultiloginCall> multilogin_calls_;
 };
 
 #endif  // GOOGLE_APIS_GAIA_FAKE_GAIA_H_
diff --git a/internal b/internal
index c80b073..ff394b1 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit c80b0733c6854cd663752371313ce29be0eba0d8
+Subproject commit ff394b1bf8f89083a017c3c4ca3cc01d5b9675fe
diff --git a/ios/chrome/app/profile/BUILD.gn b/ios/chrome/app/profile/BUILD.gn
index 0f8ad9f..1aa522a6 100644
--- a/ios/chrome/app/profile/BUILD.gn
+++ b/ios/chrome/app/profile/BUILD.gn
@@ -279,12 +279,12 @@
     "//ios/chrome/browser/shared/model/web_state_list",
     "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
     "//ios/chrome/browser/shared/ui/util/identity_snackbar:utils",
     "//ios/chrome/browser/signin/model",
     "//ios/chrome/browser/signin/model:authentication_service",
     "//ios/chrome/browser/signin/model:authentication_service_factory",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/third_party/material_components_ios",
     "//ui/base",
   ]
diff --git a/ios/chrome/app/profile/identity_confirmation_profile_agent.mm b/ios/chrome/app/profile/identity_confirmation_profile_agent.mm
index 79e1929..c89cd63 100644
--- a/ios/chrome/app/profile/identity_confirmation_profile_agent.mm
+++ b/ios/chrome/app/profile/identity_confirmation_profile_agent.mm
@@ -30,6 +30,7 @@
 #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
 #import "ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_utils.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
 #import "ios/chrome/browser/signin/model/authentication_service.h"
@@ -38,7 +39,6 @@
 #import "ios/chrome/browser/signin/model/chrome_account_manager_service_factory.h"
 #import "ios/chrome/browser/signin/model/identity_manager_factory.h"
 #import "ios/chrome/browser/signin/model/signin_util.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
index 1d516a7e..b9489a9 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
@@ -101,7 +101,7 @@
 <translation id="3440830787838130530">‏يتيح لك "مدير كلمات المرور في Google" الآن مشاركة أي كلمة مرور مع مجموعة عائلتك بسهولة وأمان</translation>
 <translation id="3472200483164753384">‏غير متاح على Chromium Canary</translation>
 <translation id="347967311580159871">‏للوصول إلى الإعدادات الإضافية التي تستخدم البيانات لتحسين تجربة استخدام Chromium، انتقِل إلى <ph name="BEGIN_LINK" />خدمات Google<ph name="END_LINK" />.</translation>
-<translation id="3512168799938877162">‏لم تتم مشاركة كلمة المرور. يُرجى التحقّق من اتصالك بالإنترنت وأنّك سجَّلت الدخول إلى Chromium. ثم أعِد المحاولة.</translation>
+<translation id="3512168799938877162">‏لم تتم مشاركة كلمة المرور. يُرجى التحقّق من اتصالك بالإنترنت ومن تسجيل الدخول إلى Chromium، ثم إعادة المحاولة.</translation>
 <translation id="3529798650269984835">‏فعِّل خيار "قفل علامات التبويب في وضع التصفّح المتخفي عند إغلاق Chromium".</translation>
 <translation id="3541247799006476453">‏للوصول بسهولة إلى كلمات المرور ومفاتيح المرور، ما عليك سوى استخدام ميزة "الملء التلقائي" في Chromium</translation>
 <translation id="3567399274263440288">‏للاستفادة إلى أقصى حدّ من Chromium، يرجى تسجيل الدخول إلى Chromium باستخدام حسابك على Google.</translation>
@@ -148,7 +148,7 @@
 
 لتغيير هذه الإعدادات، يُرجى <ph name="BEGIN_LINK" />حذف بيانات Chromium في حسابك<ph name="END_LINK" />.</translation>
 <translation id="4578500311756617174">‏نصيحة من Chromium: اضبط Chromium كمتصفِّح تلقائي</translation>
-<translation id="458786853569524949">‏يمكنك الآن استخدام Chromium في أي وقت تنقر فيه على الروابط في الرسائل الإلكترونية والمستندات والتطبيقات الأخرى.</translation>
+<translation id="458786853569524949">‏يمكنك الآن استخدام Chromium في أي وقت يتم فيه النقر على الروابط في الرسائل الإلكترونية والمستندات والتطبيقات الأخرى.</translation>
 <translation id="4633738821577273991">‏يمكنك الاستفادة من ميزة "الحماية المحسّنة للتصفّح الآمن" لهذا الملف الشخصي على Chromium أيضًا.</translation>
 <translation id="4654936625574199632">‏للمساعدة على تحسين التطبيق، يُرسل متصفِّح Chromium بيانات الاستخدام والتعطُّل إلى Google. <ph name="BEGIN_LINK" />إدارة<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">‏تفعيل الماسح الضوئي في Chromium</translation>
@@ -163,7 +163,7 @@
 <translation id="4985291216379576555">‏بلا اتصال بالإنترنت، يتعذّر على Chromium البحث عن تحديثات.</translation>
 <translation id="4996471330284142407">‏يمكنك إنجاز المزيد من المهام باستخدام متصفِّح Chromium السهل الاستخدام والآمن والأسرع من ذي قبل.</translation>
 <translation id="4999538639245140991">‏عندما يتم تسجيل خروجك من حساب تتم إدارته بواسطة <ph name="SIGNOUT_MANAGED_DOMAIN" />، سيتم حذف بيانات Chrome من هذا الجهاز. ولكن ستبقى بياناتك متوفّرة في حسابك على Google.</translation>
-<translation id="5042011327527167688">‏انقر على "العرض على Chromium باستخدام خرائط Google".</translation>
+<translation id="5042011327527167688">‏يرجى النقر على "العرض على Chromium باستخدام خرائط Google".</translation>
 <translation id="5044871537677053278">‏يرصد Chromium العناوين ويستخدم "خرائط Google" لإعلامك بالاتجاهات مع معلومات محلية.</translation>
 <translation id="5048140766121299007">‏في إعدادات "<ph name="TEXT_OF_THE_SETTINGS_MENU_ITEM" />"، يُرجى تفعيل Chromium</translation>
 <translation id="5053429694249468757">‏جارٍ حذف بيانات Chromium…</translation>
@@ -278,7 +278,7 @@
 <translation id="7763454117143368771">‏يمكنك استخدام Chromium كمتصفّح تلقائي لحماية نفسك من المواقع الإلكترونية الضارة وحماية كلمات المرور الخاصة بك.</translation>
 <translation id="7784950022329154821">‏قفل علامات التبويب في وضع التصفّح المتخفي عند إغلاق Chromium</translation>
 <translation id="78025249032851484">‏إصدار Chromium الحالي قديم.</translation>
-<translation id="7859018312476869945">‏عند الكتابة في شريط العناوين أو مربّع البحث، يرسل Chromium ما تكتبه إلى محرك البحث التلقائي للحصول على اقتراحات أفضل. يتم إيقاف هذا الإعداد في "وضع التصفّح المتخفي".</translation>
+<translation id="7859018312476869945">‏عند الكتابة في شريط العناوين أو مربّع البحث، يرسل Chromium ما تمّت كتابته إلى محرك البحث التلقائي للحصول على اقتراحات أفضل. يتم إيقاف هذا الإعداد في "وضع التصفّح المتخفي".</translation>
 <translation id="7890287942691234100">‏بدء استخدام الماسح الضوئي في Chromium</translation>
 <translation id="7905064834449738336">‏عندما تستخدم كلمة مرور، يحذّرك Chromium إذا كان قد تم نشرها على الإنترنت. وأثناء هذه العملية، يتم تشفير كلمات المرور وأسماء المستخدمين حتى لا يتمكّن أي طرف آخر من الاطّلاع عليها، بما في ذلك Google.</translation>
 <translation id="7928628054454574139">‏سيتم فتح متصفّح Chromium عند النقر على روابط في التطبيقات الأخرى</translation>
@@ -314,7 +314,7 @@
 <translation id="8776843108004031667">‏ستتم إزالة هذا الحساب بالإضافة إلى أي بيانات لم يتم حفظها من Chromium.</translation>
 <translation id="8793333988063379360">‏يمكنك العثور على إعدادات Chromium والمزيد هنا</translation>
 <translation id="8805148242934787134">‏ضبط Chromium كمتصفِّح تلقائي</translation>
-<translation id="8826789549860004832">‏يمكنك الاستفادة إلى أقصى حدّ من Chromium من خلال مواصلة إعداد المتصفّح.</translation>
+<translation id="8826789549860004832">‏يمكنك الاستفادة من Chromium من خلال مواصلة إعداد المتصفّح.</translation>
 <translation id="88376265765385899">‏فتح الإشارات المرجعية في Chromium.</translation>
 <translation id="8860548555286245440">‏فتح عناوين URL في وضع التصفُّح المتخفي من Chromium</translation>
 <translation id="8880024619507699923">‏تطلُب المؤسسة منك تسجيل الدخول لاستخدام Chromium. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
index 997714f..8e99dfe5 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
@@ -102,7 +102,7 @@
 <translation id="3360031466389132716">{THRESHOLD,plural, =1{‏يحدث هذا الإجراء في حال عدم استخدام Chrome لمدة دقيقة واحدة ({THRESHOLD}).}zero{‏يحدث هذا الإجراء في حال عدم استخدام Chrome لمدة {THRESHOLD} دقيقة.}two{‏يحدث هذا الإجراء في حال عدم استخدام Chrome لمدة دقيقتَين ({THRESHOLD}).}few{‏يحدث هذا الإجراء في حال عدم استخدام Chrome لمدة {THRESHOLD} دقائق.}many{‏يحدث هذا الإجراء في حال عدم استخدام Chrome لمدة {THRESHOLD} دقيقة.}other{‏يحدث هذا الإجراء في حال عدم استخدام Chrome لمدة {THRESHOLD} دقيقة.}}</translation>
 <translation id="3367797402528056312">‏إنهاء عملية إعداد Chrome</translation>
 <translation id="3371064404604898522">‏ضبط Chrome كمتصفِّح تلقائي</translation>
-<translation id="3399930248910934354">‏افتَح إعدادات Chrome.</translation>
+<translation id="3399930248910934354">‏يرجى فتح إعدادات Chrome</translation>
 <translation id="3440830787838130530">‏يتيح لك "مدير كلمات المرور في Google" الآن مشاركة أي كلمة مرور مع مجموعة عائلتك بسهولة وأمان</translation>
 <translation id="3460369101684070455">‏للوصول بسهولة إلى كلمات المرور المحفوظة واستخدامها في تطبيقاتك الأخرى، ما عليك سوى استخدام ميزة "الملء التلقائي" في Chrome</translation>
 <translation id="3472587960215700950">‏يستخدم Chrome "خرائط Google" لإعلامك بالاتجاهات مع معلومات محلية عن العناوين المكتشفة.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index 8afd0978..bbf94078 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -648,7 +648,7 @@
 <translation id="3533860663366814939">‏يُرجى فتح إعدادات "الملء التلقائي وكلمات المرور" (Autofill &amp; Password)</translation>
 <translation id="3540141921715814660">الإضافة إلى الإشارات المرجعية</translation>
 <translation id="3546122170015471515">‏"معاينة الخرائط" (Maps Previews) على Google.com</translation>
-<translation id="3547356470684043247">اطّلِع على تقييمات العملاء للمنتجات أو الخدمات أو التجارب لمساعدتك في اتخاذ قرارات مدروسة بشأن المراجعات</translation>
+<translation id="3547356470684043247">يمكنك الاطلاع على تقييمات العملاء للمنتجات أو الخدمات أو التجارب لمساعدتك في اتخاذ قرارات مدروسة</translation>
 <translation id="3547933853190131743">‏البحث باستخدام "وضع AI"</translation>
 <translation id="3557336313807607643">إضافة إلى جهات الاتصال</translation>
 <translation id="355765753469272474">تراجع</translation>
@@ -851,7 +851,7 @@
 <translation id="4367971618859387374">الاسم المعروض</translation>
 <translation id="4375772272517383391">إغلاق جميع علامات التبويب</translation>
 <translation id="4378154925671717803">هاتف</translation>
-<translation id="4389019817280890563">انقر لتغيير اللغة.</translation>
+<translation id="4389019817280890563">يُرجى النقر لتغيير اللغة.</translation>
 <translation id="4393294364304621138">{COUNT,plural, =1{بعد يوم واحد}zero{بعد {COUNT} يوم}two{بعد يومَين ({COUNT})}few{بعد {COUNT} أيام}many{بعد {COUNT} يومًا}other{بعد {COUNT} يوم}}</translation>
 <translation id="4402672425188312225">{COUNT,plural, =1{علامة تبويب واحدة}zero{‫# علامة تبويب}two{علامتا تبويب}few{‫# علامات تبويب}many{‫# علامة تبويب}other{‫# علامة تبويب}}</translation>
 <translation id="4404790787924017676">يتيح ذلك تلقّي تنبيهات بشأن انخفاض أسعار المنتجات التي يتم تتبُّعها</translation>
@@ -860,7 +860,7 @@
 <translation id="4415276339145661267">‏إدارة حسابك على Google</translation>
 <translation id="4420409367264901497">تعديل الإشارة المرجعية</translation>
 <translation id="4425365312778464779">هذا الحساب مُدار</translation>
-<translation id="4430277756566635951">الحساب الذي تم اختياره حاليًا هو <ph name="EMAIL" />. اختَر حسابًا.</translation>
+<translation id="4430277756566635951">الحساب الذي تم اختياره حاليًا هو <ph name="EMAIL" />. يُرجى اختيار حساب.</translation>
 <translation id="4430505936695785931">أصبح بإمكانك الآن ملء كلمات المرور المحفوظة في تطبيقات أخرى</translation>
 <translation id="4431224949908513835">اختَر طريقة دفع لاستخدامها.</translation>
 <translation id="4432122368769493392">الإعدادات…</translation>
@@ -1423,7 +1423,7 @@
 <translation id="6505334220040167806">تصغير مجموعة علامات التبويب</translation>
 <translation id="6506996418997555004">مشاركة مجموعة علامات التبويب "<ph name="GROUP_NAME" />"</translation>
 <translation id="6507973708545996744">سجِّل الدخول لعرض قائمة القراءة على جميع أجهزتك.</translation>
-<translation id="6518133107902771759">تحقق</translation>
+<translation id="6518133107902771759">تأكيد</translation>
 <translation id="6518861084553706202">سيتم إغلاق علامات التبويب. وقد تشمل البيانات المحذوفة كلمات المرور وسجلّ التصفّح وملفات تعريف الارتباط وغير ذلك.</translation>
 <translation id="6523575793810663688">الاطّلاع على الإرشادات</translation>
 <translation id="6524082013156754186">الحفظ في الحساب</translation>
@@ -1718,7 +1718,7 @@
 <translation id="7662316065255305764">معلومات الموقع الإلكتروني</translation>
 <translation id="7665369617277396874">إضافة حساب</translation>
 <translation id="7666861622396822790">يمكنك إدارة هذه الميزة من خلال <ph name="BEGIN_LINK" />إعدادات المحتوى<ph name="END_LINK" />.</translation>
-<translation id="7669493687462784703">هل تريد مواصلة تنزيل ملف شخصي يتضمّن إعدادات من موقع <ph name="WEBSITE" /> الإلكتروني؟</translation>
+<translation id="7669493687462784703">هل المطلوب مواصلة تنزيل ملف شخصي يتضمّن إعدادات من موقع <ph name="WEBSITE" /> الإلكتروني؟</translation>
 <translation id="7673346542062368520">يمكنك التمرير سريعًا إلى اليمين للتصفُّح في "وضع التصفّح المتخفي".</translation>
 <translation id="7679915578945954324">تم نسخ عناوين المواقع الإلكترونية.</translation>
 <translation id="7695953765525234038">شريط البحث</translation>
@@ -1728,7 +1728,7 @@
 <translation id="7708994397325774423">الحصول على جميع كلمات المرور</translation>
 <translation id="7711440461521638739">لم يتم العثور على أي كلمات مرور مستخدَمة لحساب آخر.</translation>
 <translation id="7712361583414030698">عرض النسخة بلا إنترنت</translation>
-<translation id="7719038820139380048">سجِّل الدخول للحصول على محتوى استنادًا إلى اهتماماتك.</translation>
+<translation id="7719038820139380048">يُرجى تسجيل الدخول للحصول على محتوى يتلاءم مع اهتماماتك.</translation>
 <translation id="7720901330179380635">جارٍ البحث باستخدام <ph name="SEARCH_ENGINE" /></translation>
 <translation id="7724085059277147439">{count,plural, =1{‏تم حفظ العنصر في حسابك على Google،‏ {email}.}zero{‏تم حفظ العناصر في حسابك على Google،‏ {email}.}two{‏تم حفظ العنصرين في حسابك على Google،‏ {email}.}few{‏تم حفظ العناصر في حسابك على Google،‏ {email}.}many{‏تم حفظ العناصر في حسابك على Google،‏ {email}.}other{‏تم حفظ العناصر في حسابك على Google،‏ {email}.}}</translation>
 <translation id="7729458878441927652">يجب مزامنة علامات التبويب والسجلّ للاطّلاع عليها من أجهزتك الأخرى.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
index b5f43b3e..b0d7fb9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -1554,7 +1554,7 @@
 <translation id="6979737339423435258">از ابتدا تا الآن</translation>
 <translation id="6983306615164277634">برای تغییر موقعیت نوار نشانی، همچنین می‌توانید آن را لمس کنید و نگه دارید.</translation>
 <translation id="6987201788018524855">ویژگی‌های مفیدی را که ازدست داده‌اید کاوش کنید</translation>
-<translation id="6989636517316575338">درباره هر صفحه‌ای سؤال بپرسید</translation>
+<translation id="6989636517316575338">پرسش درباره هر صفحه‌ای</translation>
 <translation id="6990519590575500580">Facetime</translation>
 <translation id="6998251471716094661">قیمت محصولات را پیگیری کنید و برای کاهش قیمت در هر سایتی هشدار دریافت کنید</translation>
 <translation id="7004032350256606903">سازمانتان از شما می‌خواهد به‌طور خصوصی مرور کنید.
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
index f773137c..48e415b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -80,7 +80,7 @@
 <translation id="1312168552565502328">‏קובצי cookie, נתוני אתרים</translation>
 <translation id="1312721752506309252">מופעלת הגנה משופרת</translation>
 <translation id="1321993286294231467">קרתה שגיאה בשמירת התמונה.</translation>
-<translation id="1322735045095424339">מצב אנונימי נדרש על ידי הארגון שלך</translation>
+<translation id="1322735045095424339">הארגון שלך דורש שימוש במצב פרטי</translation>
 <translation id="1323735185997015385">מחיקה</translation>
 <translation id="132683371494960526">יש ללחוץ פעמיים כדי לשנות את תיקיית האב.</translation>
 <translation id="1333455942675373522">מקלדת</translation>
@@ -241,7 +241,7 @@
 <translation id="1902277226107477495">זיהוי הכתובת מושבת. אפשר להפעיל אותו בחזרה ב"הגדרות".</translation>
 <translation id="1904580727789512086">‏כתובות ה-URL שביקרת בהן נשמרות בחשבון שלך ב-Google</translation>
 <translation id="1911619930368729126">‏העלאה אל Google Drive</translation>
-<translation id="1925706052394657380">‏פתיחת ההגדרות של <ph name="BEGIN_BOLD" />אפליקציות ברירת המחדל<ph name="END_BOLD" /> ב-iOS</translation>
+<translation id="1925706052394657380">‏פותחים את ההגדרות של <ph name="BEGIN_BOLD" />יישומי ברירת מחדל<ph name="END_BOLD" /> ב-iOS</translation>
 <translation id="1941314575388338491">כדי להעתיק, לוחצים לחיצה כפולה.</translation>
 <translation id="1943478190258551035">תפריט ← הגדרות</translation>
 <translation id="1952728750904661634">כניסה עם חשבון מנוהל</translation>
@@ -251,7 +251,7 @@
 <translation id="1962348300797608157">שותפה איתכם סיסמה לאתר <ph name="WEBSITE" /> על ידי <ph name="BEGIN_BOLD" /><ph name="FULL_NAME" /><ph name="END_BOLD" /></translation>
 <translation id="1962969542251276847">נעילת מסך</translation>
 <translation id="1963976881984600709">הגנה רגילה</translation>
-<translation id="1964507856799750384">לחיצה על <ph name="BEGIN_BOLD" />אפליקציית דפדפן<ph name="END_BOLD" /></translation>
+<translation id="1964507856799750384">לוחצים על <ph name="BEGIN_BOLD" />דפדפן היישומים<ph name="END_BOLD" /></translation>
 <translation id="1966313166384086081">נתונים מאתרים</translation>
 <translation id="1967461193809857427">{count,plural, =1{‏רוצה לחזור לכרטיסייה האחרונה שבה גלשת ב-Android?}one{‏רוצה לחזור לכרטיסיות האחרונות שבהן גלשת ב-Android?}two{‏רוצה לחזור לכרטיסיות האחרונות שבהן גלשת ב-Android?}other{‏רוצה לחזור לכרטיסיות האחרונות שבהן גלשת ב-Android?}}</translation>
 <translation id="1972325230031091483">מהירות הגלישה תגבר כי התוכן ייטען באופן יזום, על סמך הביקור הנוכחי שלך בדף האינטרנט</translation>
diff --git a/ios/chrome/browser/authentication/ui_bundled/BUILD.gn b/ios/chrome/browser/authentication/ui_bundled/BUILD.gn
index f7d04dbe..6e50b8e 100644
--- a/ios/chrome/browser/authentication/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/authentication/ui_bundled/BUILD.gn
@@ -269,11 +269,11 @@
     "//ios/chrome/browser/settings/ui_bundled:constants",
     "//ios/chrome/browser/settings/ui_bundled/google_services:constants",
     "//ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts:constants",
+    "//ios/chrome/browser/shared/public/snackbar:constants",
     "//ios/chrome/browser/shared/ui/table_view:constants",
     "//ios/chrome/browser/signin/model:capabilities_types",
     "//ios/chrome/browser/signin/model:fake_system_identity",
     "//ios/chrome/browser/signin/model:test_constants",
-    "//ios/chrome/browser/snackbar/public:constants",
     "//ios/chrome/common/ui/promo_style:constants",
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
diff --git a/ios/chrome/browser/authentication/ui_bundled/DEPS b/ios/chrome/browser/authentication/ui_bundled/DEPS
index a7988f82..6969127 100644
--- a/ios/chrome/browser/authentication/ui_bundled/DEPS
+++ b/ios/chrome/browser/authentication/ui_bundled/DEPS
@@ -22,7 +22,6 @@
   "+ios/chrome/browser/discover_feed/model",
   "+ios/chrome/browser/push_notification",
   "+ios/chrome/browser/net/model",
-  "+ios/chrome/browser/snackbar/public",
 ]
 
 specific_include_rules = {
diff --git a/ios/chrome/browser/authentication/ui_bundled/account_menu/BUILD.gn b/ios/chrome/browser/authentication/ui_bundled/account_menu/BUILD.gn
index 9e3c3ded..40063e2 100644
--- a/ios/chrome/browser/authentication/ui_bundled/account_menu/BUILD.gn
+++ b/ios/chrome/browser/authentication/ui_bundled/account_menu/BUILD.gn
@@ -174,9 +174,9 @@
     "//ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts:constants",
     "//ios/chrome/browser/shared/model/prefs:pref_names",
     "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/public/snackbar:constants",
     "//ios/chrome/browser/signin/model:fake_system_identity",
     "//ios/chrome/browser/signin/model:test_constants",
-    "//ios/chrome/browser/snackbar/public:constants",
     "//ios/chrome/browser/start_surface/ui_bundled:feature_flags",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:switches",
diff --git a/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_egtest.mm b/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_egtest.mm
index 458af917..d1cefbb 100644
--- a/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_egtest.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_egtest.mm
@@ -18,9 +18,9 @@
 #import "ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts/manage_accounts_table_view_controller_constants.h"
 #import "ios/chrome/browser/shared/model/prefs/pref_names.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_constants.h"
 #import "ios/chrome/browser/signin/model/fake_system_identity.h"
 #import "ios/chrome/browser/signin/model/test_constants.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_constants.h"
 #import "ios/chrome/browser/start_surface/ui_bundled/start_surface_features.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
diff --git a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/BUILD.gn b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/BUILD.gn
index d958087..f85e5e05 100644
--- a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/BUILD.gn
+++ b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/BUILD.gn
@@ -114,6 +114,7 @@
     "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/browser/shared/public/features:system_flags",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
     "//ios/chrome/browser/shared/ui/util/identity_snackbar:utils",
@@ -123,7 +124,6 @@
     "//ios/chrome/browser/signin/model:capabilities_types",
     "//ios/chrome/browser/signin/model:system_identity",
     "//ios/chrome/browser/signin/model:system_identity_manager",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/browser/sync/model",
     "//ios/public/provider/chrome/browser/signin:signin_error_api",
     "//ios/web/public",
diff --git a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/DEPS b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/DEPS
index e0faa085..04ccdc4 100644
--- a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/DEPS
+++ b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/DEPS
@@ -1,6 +1,5 @@
 specific_include_rules = {
   "authentication_flow_performer_base\.mm": [
     "+ios/chrome/browser/bubble/model/utils.h",
-    "+ios/chrome/browser/snackbar/public",
   ]
 }
diff --git a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer_base.mm b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer_base.mm
index 93bf341..353523b 100644
--- a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer_base.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer_base.mm
@@ -54,6 +54,8 @@
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
 #import "ios/chrome/browser/shared/public/features/system_flags.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_utils.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
@@ -63,8 +65,6 @@
 #import "ios/chrome/browser/signin/model/chrome_account_manager_service_factory.h"
 #import "ios/chrome/browser/signin/model/constants.h"
 #import "ios/chrome/browser/signin/model/identity_manager_factory.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
 #import "ios/chrome/browser/sync/model/sync_service_factory.h"
 #import "ios/chrome/grit/ios_branded_strings.h"
 #import "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/authentication/ui_bundled/separate_profiles_egtest.mm b/ios/chrome/browser/authentication/ui_bundled/separate_profiles_egtest.mm
index 00395f1..6c0448a 100644
--- a/ios/chrome/browser/authentication/ui_bundled/separate_profiles_egtest.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/separate_profiles_egtest.mm
@@ -812,15 +812,8 @@
       @"Profile should be personal");
 }
 
-// TODO(crbug.com/433320893): Re-enable this test on device.
-#if !TARGET_OS_SIMULATOR
-#define MAYBE_testProfileDeletedOnRemoveManagedAccount \
-  DISABLED_testProfileDeletedOnRemoveManagedAccount
-#else
-#define MAYBE_testProfileDeletedOnRemoveManagedAccount \
-  testProfileDeletedOnRemoveManagedAccount
-#endif
-- (void)MAYBE_testProfileDeletedOnRemoveManagedAccount {
+// TODO(crbug.com/411035267): Re-enable this test.
+- (void)DISABLED_testProfileDeletedOnRemoveManagedAccount {
   // Setup: There's 1 personal and 1 managed account. The personal account is
   // signed in.
   FakeSystemIdentity* const personalIdentity =
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin_earl_grey_ui_test_util.mm b/ios/chrome/browser/authentication/ui_bundled/signin_earl_grey_ui_test_util.mm
index 39abf42..12d942a 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin_earl_grey_ui_test_util.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signin_earl_grey_ui_test_util.mm
@@ -17,10 +17,10 @@
 #import "ios/chrome/browser/settings/ui_bundled/google_services/google_services_settings_constants.h"
 #import "ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts/manage_accounts_table_view_controller_constants.h"
 #import "ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_constants.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_constants.h"
 #import "ios/chrome/browser/shared/ui/table_view/table_view_navigation_controller_constants.h"
 #import "ios/chrome/browser/signin/model/fake_system_identity.h"
 #import "ios/chrome/browser/signin/model/test_constants.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_constants.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/BUILD.gn b/ios/chrome/browser/bookmarks/ui_bundled/BUILD.gn
index 671f6289..232a98c 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/bookmarks/ui_bundled/BUILD.gn
@@ -26,12 +26,12 @@
     "//ios/chrome/browser/shared/model/browser",
     "//ios/chrome/browser/shared/model/prefs:pref_names",
     "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/table_view",
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
     "//ios/chrome/browser/shared/ui/util:url_with_title",
     "//ios/chrome/browser/signin/model:authentication_service",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/browser/sync/model",
     "//ios/chrome/common/ui/colors",
     "//ios/third_party/material_components_ios",
@@ -66,11 +66,11 @@
     "//ios/chrome/browser/ntp/shared/metrics:home_metrics",
     "//ios/chrome/browser/shared/model/profile",
     "//ios/chrome/browser/shared/public/features:system_flags",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/symbols",
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
     "//ios/chrome/browser/signin/model:authentication_service",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/browser/sync/model",
     "//ios/chrome/common/ui/colors",
     "//ui/base",
@@ -110,13 +110,13 @@
     "//ios/chrome/browser/shared/model/profile/test",
     "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/browser/shared/public/features:system_flags",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/signin/model",
     "//ios/chrome/browser/signin/model:authentication_service",
     "//ios/chrome/browser/signin/model:authentication_service_factory",
     "//ios/chrome/browser/signin/model:fake_system_identity",
     "//ios/chrome/browser/signin/model:fake_system_identity_manager",
     "//ios/chrome/browser/signin/model:test_support",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/browser/sync/model",
     "//ios/chrome/browser/sync/model:test_support",
     "//testing/gtest",
@@ -150,8 +150,8 @@
     "//ios/chrome/browser/policy/model:eg_test_support+eg2",
     "//ios/chrome/browser/popup_menu/ui_bundled:constants",
     "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/public/snackbar:constants",
     "//ios/chrome/browser/signin/model:fake_system_identity",
-    "//ios/chrome/browser/snackbar/public:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:launch_configuration",
@@ -216,8 +216,8 @@
     "//ios/chrome/browser/bookmarks/model:bookmark_storage_type",
     "//ios/chrome/browser/popup_menu/ui_bundled:constants",
     "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/public/snackbar:constants",
     "//ios/chrome/browser/shared/ui/table_view:constants",
-    "//ios/chrome/browser/snackbar/public:constants",
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/DEPS b/ios/chrome/browser/bookmarks/ui_bundled/DEPS
index 4fc9044..fb32dec2 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/DEPS
+++ b/ios/chrome/browser/bookmarks/ui_bundled/DEPS
@@ -9,7 +9,6 @@
   "+ios/chrome/browser/sharing/ui_bundled",
   "+ios/chrome/browser/ntp/shared/metrics/home_metrics.h",
   "+ios/chrome/browser/settings/ui_bundled",
-  "+ios/chrome/browser/snackbar/public",
 ]
 
 specific_include_rules = {
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_earl_grey_ui.mm b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_earl_grey_ui.mm
index 8f8df0b..98dfd391 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_earl_grey_ui.mm
+++ b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_earl_grey_ui.mm
@@ -14,8 +14,8 @@
 #import "ios/chrome/browser/bookmarks/ui_bundled/bookmark_ui_constants.h"
 #import "ios/chrome/browser/popup_menu/ui_bundled/popup_menu_constants.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_constants.h"
 #import "ios/chrome/browser/shared/ui/table_view/table_view_constants.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_constants.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_mediator.h b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_mediator.h
index 011c0e64f..189ff6e6 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_mediator.h
+++ b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_mediator.h
@@ -38,7 +38,7 @@
     NS_DESIGNATED_INITIALIZER;
 
 // Registers the feature preferences.
-+ (void)registerBrowserStatePrefs:(user_prefs::PrefRegistrySyncable*)registry;
++ (void)registerProfilePrefs:(user_prefs::PrefRegistrySyncable*)registry;
 
 // Disconnects the mediator
 - (void)disconnect;
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_mediator.mm b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_mediator.mm
index 36df4cf..bc5e076 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_mediator.mm
+++ b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_mediator.mm
@@ -23,12 +23,12 @@
 #import "ios/chrome/browser/ntp/shared/metrics/home_metrics.h"
 #import "ios/chrome/browser/shared/model/prefs/pref_names.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/shared/ui/util/url_with_title.h"
 #import "ios/chrome/browser/signin/model/authentication_service.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "net/base/apple/url_conversions.h"
 #import "ui/base/l10n/l10n_util.h"
@@ -49,7 +49,7 @@
   raw_ptr<syncer::SyncService> _syncService;
 }
 
-+ (void)registerBrowserStatePrefs:(user_prefs::PrefRegistrySyncable*)registry {
++ (void)registerProfilePrefs:(user_prefs::PrefRegistrySyncable*)registry {
   registry->RegisterInt64Pref(
       prefs::kIosBookmarkLastUsedFolderReceivingBookmarks,
       kLastUsedBookmarkFolderNone);
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_mediator_unittest.mm b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_mediator_unittest.mm
index b0fc0567..359616c 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_mediator_unittest.mm
+++ b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_mediator_unittest.mm
@@ -23,13 +23,13 @@
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
 #import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
 #import "ios/chrome/browser/signin/model/authentication_service.h"
 #import "ios/chrome/browser/signin/model/authentication_service_factory.h"
 #import "ios/chrome/browser/signin/model/chrome_account_manager_service.h"
 #import "ios/chrome/browser/signin/model/chrome_account_manager_service_factory.h"
 #import "ios/chrome/browser/signin/model/fake_system_identity.h"
 #import "ios/chrome/browser/signin/model/fake_system_identity_manager.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
 #import "ios/chrome/browser/sync/model/sync_service_factory.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "testing/gtest_mac.h"
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_path_cache.h b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_path_cache.h
index e49ee394..3c15322 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_path_cache.h
+++ b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_path_cache.h
@@ -23,7 +23,7 @@
 @interface BookmarkPathCache : NSObject
 
 // Registers the feature preferences.
-+ (void)registerBrowserStatePrefs:(user_prefs::PrefRegistrySyncable*)registry;
++ (void)registerProfilePrefs:(user_prefs::PrefRegistrySyncable*)registry;
 
 // Caches the bookmark top most row that the user was last viewing.
 + (void)cacheBookmarkTopMostRowWithPrefService:(PrefService*)prefService
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_path_cache.mm b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_path_cache.mm
index 0a218a11..527cc44 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_path_cache.mm
+++ b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_path_cache.mm
@@ -20,7 +20,7 @@
 
 @implementation BookmarkPathCache
 
-+ (void)registerBrowserStatePrefs:(user_prefs::PrefRegistrySyncable*)registry {
++ (void)registerProfilePrefs:(user_prefs::PrefRegistrySyncable*)registry {
   registry->RegisterInt64Pref(prefs::kIosBookmarkCachedFolderId, kFolderNone);
   registry->RegisterInt64Pref(
       prefs::kIosBookmarkCachedFolderModel,
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_path_cache_unittest.mm b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_path_cache_unittest.mm
index c452da3..0c8a9ecf 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_path_cache_unittest.mm
+++ b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_path_cache_unittest.mm
@@ -22,7 +22,7 @@
  protected:
   void SetUp() override {
     BookmarkIOSUnitTestSupport::SetUp();
-    [BookmarkPathCache registerBrowserStatePrefs:prefs_.registry()];
+    [BookmarkPathCache registerProfilePrefs:prefs_.registry()];
   }
 
   sync_preferences::TestingPrefServiceSyncable prefs_;
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_utils_ios.mm b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_utils_ios.mm
index 1b681a701..958ef6d 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/bookmark_utils_ios.mm
+++ b/ios/chrome/browser/bookmarks/ui_bundled/bookmark_utils_ios.mm
@@ -43,11 +43,11 @@
 #import "ios/chrome/browser/ntp/shared/metrics/home_metrics.h"
 #import "ios/chrome/browser/shared/model/profile/profile_ios.h"
 #import "ios/chrome/browser/shared/public/features/system_flags.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/signin/model/authentication_service.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "third_party/skia/include/core/SkColor.h"
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/bookmarks_entries_egtest.mm b/ios/chrome/browser/bookmarks/ui_bundled/bookmarks_entries_egtest.mm
index a198827..4df484de 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/bookmarks_entries_egtest.mm
+++ b/ios/chrome/browser/bookmarks/ui_bundled/bookmarks_entries_egtest.mm
@@ -15,7 +15,7 @@
 #import "ios/chrome/browser/bookmarks/ui_bundled/bookmark_earl_grey_ui.h"
 #import "ios/chrome/browser/bookmarks/ui_bundled/bookmark_ui_constants.h"
 #import "ios/chrome/browser/popup_menu/ui_bundled/popup_menu_constants.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_constants.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_constants.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/folder_chooser/BUILD.gn b/ios/chrome/browser/bookmarks/ui_bundled/folder_chooser/BUILD.gn
index ca0a5d8..dc60714 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/folder_chooser/BUILD.gn
+++ b/ios/chrome/browser/bookmarks/ui_bundled/folder_chooser/BUILD.gn
@@ -130,8 +130,8 @@
     "//ios/chrome/browser/bookmarks/model:bookmark_storage_type",
     "//ios/chrome/browser/bookmarks/ui_bundled:constants",
     "//ios/chrome/browser/bookmarks/ui_bundled:eg_test_support+eg2",
+    "//ios/chrome/browser/shared/public/snackbar:constants",
     "//ios/chrome/browser/signin/model:fake_system_identity",
-    "//ios/chrome/browser/snackbar/public:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
     "//net:test_support",
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/folder_chooser/bookmarks_folder_chooser_egtest.mm b/ios/chrome/browser/bookmarks/ui_bundled/folder_chooser/bookmarks_folder_chooser_egtest.mm
index e6503e9..640b753 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/folder_chooser/bookmarks_folder_chooser_egtest.mm
+++ b/ios/chrome/browser/bookmarks/ui_bundled/folder_chooser/bookmarks_folder_chooser_egtest.mm
@@ -17,8 +17,8 @@
 #import "ios/chrome/browser/bookmarks/ui_bundled/bookmark_earl_grey.h"
 #import "ios/chrome/browser/bookmarks/ui_bundled/bookmark_earl_grey_ui.h"
 #import "ios/chrome/browser/bookmarks/ui_bundled/bookmark_ui_constants.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_constants.h"
 #import "ios/chrome/browser/signin/model/fake_system_identity.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_constants.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/home/BUILD.gn b/ios/chrome/browser/bookmarks/ui_bundled/home/BUILD.gn
index d4f7e1b..848ead1 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/home/BUILD.gn
+++ b/ios/chrome/browser/bookmarks/ui_bundled/home/BUILD.gn
@@ -150,10 +150,10 @@
     "//ios/chrome/browser/settings/ui_bundled/google_services:constants",
     "//ios/chrome/browser/shared/model/prefs:pref_names",
     "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/public/snackbar:constants",
     "//ios/chrome/browser/shared/ui/elements:eg_test_support+eg2",
     "//ios/chrome/browser/signin/model:fake_system_identity",
     "//ios/chrome/browser/signin/model:test_constants",
-    "//ios/chrome/browser/snackbar/public:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
     "//net:test_support",
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/home/DEPS b/ios/chrome/browser/bookmarks/ui_bundled/home/DEPS
index 4e90e96..cce7bda 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/home/DEPS
+++ b/ios/chrome/browser/bookmarks/ui_bundled/home/DEPS
@@ -9,7 +9,6 @@
   "+ios/chrome/browser/net/model/crurl.h",
   "+ios/chrome/browser/policy/model/policy_util.h",
   "+ios/chrome/browser/reminder_notifications/coordinator/reminder_notifications_coordinator.h",
-  "+ios/chrome/browser/snackbar/public",
   "+ios/chrome/browser/tabs/model/tab_title_util.h",
   "+ios/chrome/browser/url_loading/model",
   "+ios/chrome/browser/window_activities/model/window_activity_helpers.h",
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.h b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.h
index b3169d4b..408e7b0 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.h
+++ b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.h
@@ -90,7 +90,7 @@
 @property(nonatomic, assign) const bookmarks::BookmarkNode* editingFolderNode;
 
 // Registers the feature preferences.
-+ (void)registerBrowserStatePrefs:(user_prefs::PrefRegistrySyncable*)registry;
++ (void)registerProfilePrefs:(user_prefs::PrefRegistrySyncable*)registry;
 
 // Designated initializer.
 // `bookmarkModel` must not be `nullptr`. It must also be loaded.
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.mm b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.mm
index d6ac524..6440919 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.mm
+++ b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.mm
@@ -140,7 +140,7 @@
   bookmark_utils_ios::NodeSet _selectedNodesForEditMode;
 }
 
-+ (void)registerBrowserStatePrefs:(user_prefs::PrefRegistrySyncable*)registry {
++ (void)registerProfilePrefs:(user_prefs::PrefRegistrySyncable*)registry {
   registry->RegisterBooleanPref(
       prefs::kIosBookmarkUploadSyncLeftBehindCompleted, false);
 }
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_promo_egtest.mm b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_promo_egtest.mm
index cbff1374..4155fb5 100644
--- a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_promo_egtest.mm
+++ b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_promo_egtest.mm
@@ -27,9 +27,9 @@
 #import "ios/chrome/browser/policy/model/policy_earl_grey_utils.h"
 #import "ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_constants.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_constants.h"
 #import "ios/chrome/browser/signin/model/fake_system_identity.h"
 #import "ios/chrome/browser/signin/model/test_constants.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_constants.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/DEPS b/ios/chrome/browser/content_suggestions/ui_bundled/DEPS
index b1eceb7..b91fa31c 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/DEPS
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/DEPS
@@ -65,5 +65,4 @@
   "+ios/chrome/browser/content_notification/model/content_notification_util.h",
   "+ios/chrome/browser/page_image/model/page_image_service_factory.h",
   "+ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator.h",
-  "+ios/chrome/browser/snackbar/public",
 ]
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/cells/BUILD.gn b/ios/chrome/browser/content_suggestions/ui_bundled/cells/BUILD.gn
index f97c2ba6..9f4fe5fd 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/cells/BUILD.gn
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/cells/BUILD.gn
@@ -103,11 +103,11 @@
     "//ios/chrome/browser/shared/model/utils",
     "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
     "//ios/chrome/browser/signin/model",
     "//ios/chrome/browser/signin/model:system_identity",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/browser/url_loading/model",
     "//ios/chrome/browser/url_loading/model:url_loading_params_header",
     "//ios/chrome/browser/widget_kit/model:features",
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/cells/most_visited_tiles_mediator.mm b/ios/chrome/browser/content_suggestions/ui_bundled/cells/most_visited_tiles_mediator.mm
index 331cccd8..65bcdc8 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/cells/most_visited_tiles_mediator.mm
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/cells/most_visited_tiles_mediator.mm
@@ -39,10 +39,10 @@
 #import "ios/chrome/browser/shared/model/utils/observable_boolean.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
 #import "ios/chrome/browser/url_loading/model/url_loading_browser_agent.h"
 #import "ios/chrome/browser/url_loading/model/url_loading_params.h"
 #import "ios/chrome/common/app_group/app_group_constants.h"
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/price_tracking_promo/BUILD.gn b/ios/chrome/browser/content_suggestions/ui_bundled/price_tracking_promo/BUILD.gn
index c1833fc..e0b4035 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/price_tracking_promo/BUILD.gn
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/price_tracking_promo/BUILD.gn
@@ -41,13 +41,13 @@
     "//ios/chrome/browser/shared/model/application_context",
     "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/symbols",
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
     "//ios/chrome/browser/signin/model",
     "//ios/chrome/browser/signin/model:authentication_service",
     "//ios/chrome/browser/signin/model:system_identity",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/elements",
     "//ios/chrome/common/ui/favicon",
@@ -85,6 +85,7 @@
     "//ios/chrome/browser/shared/model/prefs:pref_names",
     "//ios/chrome/browser/shared/model/profile/test",
     "//ios/chrome/browser/shared/public/commands",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
     "//ios/chrome/browser/signin/model",
     "//ios/chrome/browser/signin/model:authentication_service",
@@ -92,7 +93,6 @@
     "//ios/chrome/browser/signin/model:fake_system_identity",
     "//ios/chrome/browser/signin/model:fake_system_identity_manager",
     "//ios/chrome/browser/signin/model:test_support",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/test:test_support",
     "//ios/public/provider/chrome/browser/push_notification:push_notification_api",
     "//ios/testing:block_swizzler",
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/price_tracking_promo/price_tracking_promo_mediator.mm b/ios/chrome/browser/content_suggestions/ui_bundled/price_tracking_promo/price_tracking_promo_mediator.mm
index a7cf1db6..53c6fbc4 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/price_tracking_promo/price_tracking_promo_mediator.mm
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/price_tracking_promo/price_tracking_promo_mediator.mm
@@ -37,11 +37,11 @@
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
 #import "ios/chrome/browser/shared/public/commands/application_commands.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
 #import "ios/chrome/browser/signin/model/authentication_service.h"
 #import "ios/chrome/browser/signin/model/system_identity.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
 #import "ios/chrome/common/ui/favicon/favicon_attributes.h"
 #import "ios/chrome/common/ui/favicon/favicon_constants.h"
 #import "ios/chrome/common/ui/favicon/favicon_view.h"
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/price_tracking_promo/price_tracking_promo_mediator_unittest.mm b/ios/chrome/browser/content_suggestions/ui_bundled/price_tracking_promo/price_tracking_promo_mediator_unittest.mm
index d79eeb0..53e604b 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/price_tracking_promo/price_tracking_promo_mediator_unittest.mm
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/price_tracking_promo/price_tracking_promo_mediator_unittest.mm
@@ -25,13 +25,13 @@
 #import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h"
 #import "ios/chrome/browser/shared/model/profile/test/test_profile_manager_ios.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/browser/signin/model/authentication_service.h"
 #import "ios/chrome/browser/signin/model/authentication_service_factory.h"
 #import "ios/chrome/browser/signin/model/fake_authentication_service_delegate.h"
 #import "ios/chrome/browser/signin/model/fake_system_identity.h"
 #import "ios/chrome/browser/signin/model/fake_system_identity_manager.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h"
 #import "ios/public/provider/chrome/browser/push_notification/push_notification_api.h"
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/tab_resumption/BUILD.gn b/ios/chrome/browser/content_suggestions/ui_bundled/tab_resumption/BUILD.gn
index 92033d5..0dff4a3 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/tab_resumption/BUILD.gn
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/tab_resumption/BUILD.gn
@@ -65,11 +65,11 @@
     "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/browser/shared/public/features:system_flags",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/symbols",
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
     "//ios/chrome/browser/signin/model:authentication_service",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/browser/snapshots/model",
     "//ios/chrome/browser/snapshots/model:model_common",
     "//ios/chrome/browser/start_surface/ui_bundled",
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/tab_resumption/tab_resumption_mediator.mm b/ios/chrome/browser/content_suggestions/ui_bundled/tab_resumption/tab_resumption_mediator.mm
index a0eb75a..97fc093 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/tab_resumption/tab_resumption_mediator.mm
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/tab_resumption/tab_resumption_mediator.mm
@@ -78,10 +78,10 @@
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
 #import "ios/chrome/browser/shared/public/features/system_flags.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
 #import "ios/chrome/browser/signin/model/authentication_service.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
 #import "ios/chrome/browser/snapshots/model/snapshot_browser_agent.h"
 #import "ios/chrome/browser/snapshots/model/snapshot_id.h"
 #import "ios/chrome/browser/start_surface/ui_bundled/start_surface_features.h"
diff --git a/ios/chrome/browser/credential_provider/model/BUILD.gn b/ios/chrome/browser/credential_provider/model/BUILD.gn
index c64f661..fa93e594 100644
--- a/ios/chrome/browser/credential_provider/model/BUILD.gn
+++ b/ios/chrome/browser/credential_provider/model/BUILD.gn
@@ -114,7 +114,6 @@
       "//ios/chrome/browser/shared/model/profile/test",
       "//ios/chrome/browser/shared/model/web_state_list",
       "//ios/chrome/browser/shared/public/commands",
-      "//ios/chrome/browser/shared/public/features",
       "//ios/chrome/browser/signin/model:fake_system_identity",
       "//ios/chrome/browser/signin/model:fake_system_identity_manager",
       "//ios/chrome/browser/signin/model:test_support",
diff --git a/ios/chrome/browser/credential_provider/model/credential_provider_service.mm b/ios/chrome/browser/credential_provider/model/credential_provider_service.mm
index 994b990..ece25a9 100644
--- a/ios/chrome/browser/credential_provider/model/credential_provider_service.mm
+++ b/ios/chrome/browser/credential_provider/model/credential_provider_service.mm
@@ -575,9 +575,7 @@
     return;
   }
 
-  BOOL is_enabled = base::FeatureList::IsEnabled(
-                        kCredentialProviderAutomaticPasskeyUpgrade) &&
-                    saving_passwords_enabled_.GetValue() &&
+  BOOL is_enabled = saving_passwords_enabled_.GetValue() &&
                     saving_passkeys_enabled_.GetValue() &&
                     automatic_passkey_upgrades_enabled_.GetValue();
   [app_group::GetGroupUserDefaults()
diff --git a/ios/chrome/browser/credential_provider/model/credential_provider_service_unittest.mm b/ios/chrome/browser/credential_provider/model/credential_provider_service_unittest.mm
index d26b3a4..d56a257 100644
--- a/ios/chrome/browser/credential_provider/model/credential_provider_service_unittest.mm
+++ b/ios/chrome/browser/credential_provider/model/credential_provider_service_unittest.mm
@@ -21,7 +21,6 @@
 #import "components/password_manager/core/browser/password_form.h"
 #import "components/password_manager/core/browser/password_store/password_store_change.h"
 #import "components/password_manager/core/browser/password_store/test_password_store.h"
-#import "components/password_manager/core/common/password_manager_features.h"
 #import "components/password_manager/core/common/password_manager_pref_names.h"
 #import "components/prefs/pref_registry_simple.h"
 #import "components/prefs/pref_service.h"
@@ -38,7 +37,6 @@
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
 #import "ios/chrome/browser/shared/model/prefs/pref_names.h"
 #import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h"
-#import "ios/chrome/browser/shared/public/features/features.h"
 #import "ios/chrome/common/app_group/app_group_constants.h"
 #import "ios/chrome/common/credential_provider/constants.h"
 #import "ios/chrome/common/credential_provider/credential.h"
@@ -817,9 +815,6 @@
 
 TEST_F(CredentialProviderServiceTest,
        AutomaticPasskeyUpgradeDisabledsWithSavingPasswordsDisabled) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      kCredentialProviderAutomaticPasskeyUpgrade);
   CreateCredentialProviderService();
 
   // The test is initialized with the passkey preferences as true.
@@ -839,9 +834,6 @@
 
 TEST_F(CredentialProviderServiceTest,
        AutomaticPasskeyUpgradesDisabledWithSavingPasskeysDisabled) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      kCredentialProviderAutomaticPasskeyUpgrade);
   CreateCredentialProviderService();
 
   // The test is initialized with the passkey preferences as true.
@@ -861,9 +853,6 @@
 
 TEST_F(CredentialProviderServiceTest,
        AutomaticPasskeyUpgradesPreferenceDisabled) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      kCredentialProviderAutomaticPasskeyUpgrade);
   CreateCredentialProviderService();
 
   // The test is initialized with the passkey preferences as true.
diff --git a/ios/chrome/browser/credential_provider/model/features.h b/ios/chrome/browser/credential_provider/model/features.h
index 47956fc6b..474cced 100644
--- a/ios/chrome/browser/credential_provider/model/features.h
+++ b/ios/chrome/browser/credential_provider/model/features.h
@@ -8,10 +8,6 @@
 #import "base/feature_list.h"
 #import "ios/chrome/browser/credential_provider/model/credential_provider_buildflags.h"
 
-// Feature flag to enable automatic passkey upgrade for the credential
-// provider.
-BASE_DECLARE_FEATURE(kCredentialProviderAutomaticPasskeyUpgrade);
-
 // Feature flag to enable passkey PRF support in the credential provider.
 BASE_DECLARE_FEATURE(kCredentialProviderPasskeyPRF);
 
diff --git a/ios/chrome/browser/credential_provider/model/features.mm b/ios/chrome/browser/credential_provider/model/features.mm
index 56761f7..294bd4f 100644
--- a/ios/chrome/browser/credential_provider/model/features.mm
+++ b/ios/chrome/browser/credential_provider/model/features.mm
@@ -4,9 +4,6 @@
 
 #import "ios/chrome/browser/credential_provider/model/features.h"
 
-BASE_FEATURE(CredentialProviderAutomaticPasskeyUpgrade,
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 BASE_FEATURE(CredentialProviderPasskeyPRF, base::FEATURE_ENABLED_BY_DEFAULT);
 
 BASE_FEATURE(CredentialProviderPasskeyLargeBlob,
diff --git a/ios/chrome/browser/download/coordinator/BUILD.gn b/ios/chrome/browser/download/coordinator/BUILD.gn
index 891157ec..ff79fee 100644
--- a/ios/chrome/browser/download/coordinator/BUILD.gn
+++ b/ios/chrome/browser/download/coordinator/BUILD.gn
@@ -70,6 +70,7 @@
   testonly = true
   sources = [
     "ar_quick_look_coordinator_unittest.mm",
+    "download_file_preview_coordinator_unittest.mm",
     "download_manager_coordinator_unittest.mm",
     "download_manager_mediator_unittest.mm",
     "pass_kit_coordinator_unittest.mm",
diff --git a/ios/chrome/browser/download/coordinator/download_file_preview_coordinator.mm b/ios/chrome/browser/download/coordinator/download_file_preview_coordinator.mm
index 592aac9..c6e2dfd 100644
--- a/ios/chrome/browser/download/coordinator/download_file_preview_coordinator.mm
+++ b/ios/chrome/browser/download/coordinator/download_file_preview_coordinator.mm
@@ -37,6 +37,13 @@
 
   _currentFileURL = fileURL;
 
+  // If a preview controller is already presented, just reload the data.
+  if (_previewController) {
+    [_previewController reloadData];
+    return;
+  }
+
+  // Create and present new preview controller.
   _previewController = [[QLPreviewController alloc] init];
   _previewController.dataSource = self;
   _previewController.delegate = self;
@@ -49,12 +56,7 @@
 #pragma mark - Private Methods
 
 - (void)dismissPreviewIfPresented {
-  if (_previewController) {
-    [_previewController.presentingViewController
-        dismissViewControllerAnimated:YES
-                           completion:nil];
-    _previewController = nil;
-  }
+  [_previewController dismissViewControllerAnimated:NO completion:nil];
 }
 
 #pragma mark - QLPreviewControllerDataSource
diff --git a/ios/chrome/browser/download/coordinator/download_file_preview_coordinator_unittest.mm b/ios/chrome/browser/download/coordinator/download_file_preview_coordinator_unittest.mm
new file mode 100644
index 0000000..0f7e7bb4
--- /dev/null
+++ b/ios/chrome/browser/download/coordinator/download_file_preview_coordinator_unittest.mm
@@ -0,0 +1,197 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/download/coordinator/download_file_preview_coordinator.h"
+
+#import <QuickLook/QuickLook.h>
+
+#import <memory>
+
+#import "base/base_paths.h"
+#import "base/files/file_path.h"
+#import "base/files/file_util.h"
+#import "base/path_service.h"
+#import "base/strings/sys_string_conversions.h"
+#import "base/test/ios/wait_util.h"
+#import "ios/chrome/browser/shared/model/browser/test/test_browser.h"
+#import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h"
+#import "ios/chrome/test/scoped_key_window.h"
+#import "ios/web/public/test/web_task_environment.h"
+#import "testing/gtest/include/gtest/gtest.h"
+#import "testing/platform_test.h"
+
+using base::test::ios::kWaitForUIElementTimeout;
+using base::test::ios::WaitUntilConditionOrTimeout;
+
+namespace {
+
+// Test file name for creating temporary files.
+const char kTestFileName[] = "test_document.pdf";
+const char kTestFileContent[] = "Test PDF content for preview";
+
+// Returns a temporary file path for testing.
+base::FilePath GetTestFilePath() {
+  base::FilePath temp_dir;
+  base::GetTempDir(&temp_dir);
+  return temp_dir.AppendASCII(kTestFileName);
+}
+
+// Creates a test file at the given path.
+bool CreateTestFile(const base::FilePath& file_path) {
+  std::string content(kTestFileContent);
+  return base::WriteFile(file_path, content);
+}
+
+}  // namespace
+
+class DownloadFilePreviewCoordinatorTest : public PlatformTest {
+ protected:
+  DownloadFilePreviewCoordinatorTest() {
+    profile_ = TestProfileIOS::Builder().Build();
+    browser_ = std::make_unique<TestBrowser>(profile_.get());
+    base_view_controller_ = [[UIViewController alloc] init];
+    coordinator_ = [[DownloadFilePreviewCoordinator alloc]
+        initWithBaseViewController:base_view_controller_
+                           browser:browser_.get()];
+    [scoped_key_window_.Get() setRootViewController:base_view_controller_];
+  }
+
+  ~DownloadFilePreviewCoordinatorTest() override {
+    [coordinator_ stop];
+
+    // Clean up test file if it exists.
+    if (!test_file_path_.empty()) {
+      base::DeleteFile(test_file_path_);
+    }
+  }
+
+  // Creates a test file and returns its URL.
+  NSURL* CreateTestFileURL() {
+    test_file_path_ = GetTestFilePath();
+    if (!CreateTestFile(test_file_path_)) {
+      return nil;
+    }
+    NSString* path = base::SysUTF8ToNSString(test_file_path_.value());
+    return [NSURL fileURLWithPath:path];
+  }
+
+  // Needed for test profile created by TestBrowser().
+  web::WebTaskEnvironment task_environment_;
+  std::unique_ptr<TestProfileIOS> profile_;
+  std::unique_ptr<TestBrowser> browser_;
+  UIViewController* base_view_controller_;
+  DownloadFilePreviewCoordinator* coordinator_;
+  ScopedKeyWindow scoped_key_window_;
+  base::FilePath test_file_path_;
+};
+
+// Tests that coordinator conforms to required protocols.
+TEST_F(DownloadFilePreviewCoordinatorTest, ProtocolConformance) {
+  EXPECT_TRUE([coordinator_
+      conformsToProtocol:@protocol(QLPreviewControllerDataSource)]);
+  EXPECT_TRUE(
+      [coordinator_ conformsToProtocol:@protocol(QLPreviewControllerDelegate)]);
+}
+
+// Tests coordinator initialization and basic properties.
+TEST_F(DownloadFilePreviewCoordinatorTest, Initialization) {
+  EXPECT_TRUE(coordinator_);
+  EXPECT_EQ(base_view_controller_, coordinator_.baseViewController);
+  EXPECT_EQ(browser_.get(), coordinator_.browser);
+}
+
+// Tests presenting a valid file URL.
+TEST_F(DownloadFilePreviewCoordinatorTest, PresentValidFileURL) {
+  NSURL* file_url = CreateTestFileURL();
+  ASSERT_TRUE(file_url);
+
+  // Present the file.
+  [coordinator_ presentFilePreviewWithURL:file_url];
+
+  // Wait for QLPreviewController to be presented.
+  EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^{
+    return [base_view_controller_.presentedViewController class] ==
+           [QLPreviewController class];
+  }));
+}
+
+// Tests stop method properly cleans up.
+TEST_F(DownloadFilePreviewCoordinatorTest, Stop) {
+  NSURL* file_url = CreateTestFileURL();
+  ASSERT_TRUE(file_url);
+
+  // Present the file.
+  [coordinator_ presentFilePreviewWithURL:file_url];
+
+  // Wait for QLPreviewController to be presented.
+  EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^{
+    return [base_view_controller_.presentedViewController class] ==
+           [QLPreviewController class];
+  }));
+
+  // Stop should dismiss the preview.
+  [coordinator_ stop];
+
+  // Wait for dismissal.
+  EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^{
+    return base_view_controller_.presentedViewController == nil;
+  }));
+}
+
+// Tests coordinator behavior with multiple method calls.
+TEST_F(DownloadFilePreviewCoordinatorTest, MultipleMethodCalls) {
+  NSURL* file_url = CreateTestFileURL();
+  ASSERT_TRUE(file_url);
+
+  // First call should present.
+  [coordinator_ presentFilePreviewWithURL:file_url];
+
+  EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^{
+    return [base_view_controller_.presentedViewController class] ==
+           [QLPreviewController class];
+  }));
+
+  UIViewController* first_presented =
+      base_view_controller_.presentedViewController;
+
+  // Second call should reuse the same controller and reload data.
+  [coordinator_ presentFilePreviewWithURL:file_url];
+
+  // Wait for potential change.
+  base::test::ios::SpinRunLoopWithMinDelay(base::Seconds(0.1));
+
+  // Should still have the same QLPreviewController presented.
+  EXPECT_EQ(first_presented, base_view_controller_.presentedViewController);
+  EXPECT_TRUE([base_view_controller_.presentedViewController class] ==
+              [QLPreviewController class]);
+
+  // Stop should clean up properly.
+  [coordinator_ stop];
+
+  EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^{
+    return base_view_controller_.presentedViewController == nil;
+  }));
+}
+
+// Tests that coordinator handles start/stop lifecycle properly.
+TEST_F(DownloadFilePreviewCoordinatorTest, StartStopLifecycle) {
+  [coordinator_ start];
+
+  NSURL* file_url = CreateTestFileURL();
+  ASSERT_TRUE(file_url);
+
+  // Present file after starting.
+  [coordinator_ presentFilePreviewWithURL:file_url];
+
+  EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^{
+    return [base_view_controller_.presentedViewController class] ==
+           [QLPreviewController class];
+  }));
+
+  [coordinator_ stop];
+
+  EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^{
+    return base_view_controller_.presentedViewController == nil;
+  }));
+}
diff --git a/ios/chrome/browser/download/model/BUILD.gn b/ios/chrome/browser/download/model/BUILD.gn
index 0834918..9a5a784 100644
--- a/ios/chrome/browser/download/model/BUILD.gn
+++ b/ios/chrome/browser/download/model/BUILD.gn
@@ -39,9 +39,10 @@
     "download_record_observer_bridge.h",
     "download_record_observer_bridge.mm",
     "download_record_service.h",
-    "download_record_service.mm",
     "download_record_service_factory.h",
     "download_record_service_factory.mm",
+    "download_record_service_impl.h",
+    "download_record_service_impl.mm",
     "external_app_util.h",
     "external_app_util.mm",
     "installation_notifier+Testing.h",
@@ -134,7 +135,7 @@
     "download_filter_util_unittest.mm",
     "download_manager_tab_helper_unittest.mm",
     "download_record_database_unittest.mm",
-    "download_record_service_unittest.mm",
+    "download_record_service_impl_unittest.mm",
     "google_drive_app_util_unittest.mm",
     "installation_notifier_unittest.mm",
     "pass_kit_tab_helper_unittest.mm",
diff --git a/ios/chrome/browser/download/model/download_record_service.h b/ios/chrome/browser/download/model/download_record_service.h
index 3147d780..7a56009c 100644
--- a/ios/chrome/browser/download/model/download_record_service.h
+++ b/ios/chrome/browser/download/model/download_record_service.h
@@ -5,33 +5,26 @@
 #ifndef IOS_CHROME_BROWSER_DOWNLOAD_MODEL_DOWNLOAD_RECORD_SERVICE_H_
 #define IOS_CHROME_BROWSER_DOWNLOAD_MODEL_DOWNLOAD_RECORD_SERVICE_H_
 
-#import <map>
-#import <memory>
 #import <optional>
 #import <string>
-#import <string_view>
 #import <vector>
 
-#import "base/memory/raw_ptr.h"
-#import "base/memory/weak_ptr.h"
-#import "base/observer_list.h"
-#import "base/scoped_multi_source_observation.h"
-#import "base/sequence_checker.h"
-#import "base/task/sequenced_task_runner.h"
+#import "base/functional/callback.h"
 #import "components/keyed_service/core/keyed_service.h"
-#import "ios/chrome/browser/download/model/download_record.h"
-#import "ios/chrome/browser/download/model/download_record_observer.h"
-#import "ios/web/public/download/download_task.h"
-#import "ios/web/public/download/download_task_observer.h"
 
 namespace base {
 class FilePath;
 }  // namespace base
-class DownloadRecordDatabase;
 
-// Service that manages download records with persistent storage.
-class DownloadRecordService : public KeyedService,
-                              public web::DownloadTaskObserver {
+namespace web {
+class DownloadTask;
+}  // namespace web
+
+struct DownloadRecord;
+class DownloadRecordObserver;
+
+// Base class for download record service that defines the public interface.
+class DownloadRecordService : public KeyedService {
  public:
   // Callback types for async operations.
   using DownloadRecordsCallback =
@@ -40,97 +33,39 @@
       base::OnceCallback<void(std::optional<DownloadRecord>)>;
   using CompletionCallback = base::OnceCallback<void(bool success)>;
 
-  explicit DownloadRecordService(const base::FilePath& profile_path);
+  DownloadRecordService() = default;
 
   DownloadRecordService(const DownloadRecordService&) = delete;
   DownloadRecordService& operator=(const DownloadRecordService&) = delete;
 
-  ~DownloadRecordService() override;
+  ~DownloadRecordService() override = default;
 
   // Records a new download and start observing it.
-  void RecordDownload(web::DownloadTask* task);
+  virtual void RecordDownload(web::DownloadTask* task) = 0;
   // Retrieves all downloads. Callback is invoked on the calling thread.
-  void GetAllDownloadsAsync(DownloadRecordsCallback callback);
+  virtual void GetAllDownloadsAsync(DownloadRecordsCallback callback) = 0;
   // Retrieves a download by ID. Callback is invoked on the calling thread.
-  void GetDownloadByIdAsync(const std::string& download_id,
-                            DownloadRecordCallback callback);
+  virtual void GetDownloadByIdAsync(const std::string& download_id,
+                                    DownloadRecordCallback callback) = 0;
   // Removes a download by ID. Callback is invoked on the calling thread.
-  void RemoveDownloadByIdAsync(
+  virtual void RemoveDownloadByIdAsync(
       const std::string& download_id,
-      CompletionCallback callback = CompletionCallback());
+      CompletionCallback callback = CompletionCallback()) = 0;
 
   // Updates the file path for a download record by ID.
   // Callback is invoked on the calling thread.
-  void UpdateDownloadFilePathAsync(
+  virtual void UpdateDownloadFilePathAsync(
       const std::string& download_id,
       const base::FilePath& file_path,
-      CompletionCallback callback = CompletionCallback());
+      CompletionCallback callback = CompletionCallback()) = 0;
 
   // Gets download task by ID.
-  web::DownloadTask* GetDownloadTaskById(std::string_view download_id) const;
+  virtual web::DownloadTask* GetDownloadTaskById(
+      std::string_view download_id) const = 0;
 
   // Observer management.
-  void AddObserver(DownloadRecordObserver* observer);
-  void RemoveObserver(DownloadRecordObserver* observer);
-
-  // web::DownloadTaskObserver implementation.
-  void OnDownloadUpdated(web::DownloadTask* task) override;
-  void OnDownloadDestroyed(web::DownloadTask* task) override;
-
- private:
-  // Notifies observers.
-  void NotifyDownloadAdded(const DownloadRecord& record);
-  void NotifyDownloadUpdated(const DownloadRecord& record);
-  void NotifyDownloadsRemoved(
-      const std::vector<std::string_view>& download_ids);
-
-  // Determines whether a download record update should be persisted to the
-  // database by comparing critical fields between the new and cached records.
-  bool ShouldPersistUpdate(const DownloadRecord& new_record,
-                           const DownloadRecord& cached_record);
-
-  // Initializes database operations, called on database_task_runner_.
-  void InitializeDatabase(const base::FilePath& profile_path);
-  void LoadHistoricalRecords();
-  void CleanupInconsistentStates();
-
-  // Database CRUD operations, called on database_task_runner_.
-  bool InsertRecord(const DownloadRecord& record);
-  std::optional<DownloadRecord> UpdateRecord(const DownloadRecord& record);
-  bool DeleteRecord(std::string_view id);
-  bool UpdateRecordsState(const std::vector<std::string>& download_ids,
-                          web::DownloadTask::State new_state);
-  std::optional<DownloadRecord> UpdateFilePathInRecord(
-      const std::string& download_id,
-      const base::FilePath& file_path);
-
-  // Cache query operations, called on database_task_runner_.
-  std::vector<DownloadRecord> GetAllFromCache();
-  std::optional<DownloadRecord> GetByIdFromCache(std::string_view id);
-
-  // Database thread data, accessed on database_task_runner_.
-  std::map<std::string, DownloadRecord> database_cache_;
-  std::unique_ptr<DownloadRecordDatabase> database_;
-
-  // ObserverList for download record changes.
-  base::ObserverList<DownloadRecordObserver, /* check_empty= */ true>
-      observers_;
-  // Observation for download tasks.
-  base::ScopedMultiSourceObservation<web::DownloadTask,
-                                     web::DownloadTaskObserver>
-      download_task_observations_{this};
-
-  // Task runner for database operations.
-  scoped_refptr<base::SequencedTaskRunner> database_task_runner_;
-
-  // Main thread sequence checker for public API calls.
-  SEQUENCE_CHECKER(main_sequence_checker_);
-
-  // Database thread sequence checker. Will be bound on first database thread
-  // access.
-  SEQUENCE_CHECKER(database_sequence_checker_);
-
-  base::WeakPtrFactory<DownloadRecordService> weak_ptr_factory_{this};
+  virtual void AddObserver(DownloadRecordObserver* observer) = 0;
+  virtual void RemoveObserver(DownloadRecordObserver* observer) = 0;
 };
 
 #endif  // IOS_CHROME_BROWSER_DOWNLOAD_MODEL_DOWNLOAD_RECORD_SERVICE_H_
diff --git a/ios/chrome/browser/download/model/download_record_service_factory.mm b/ios/chrome/browser/download/model/download_record_service_factory.mm
index 1ea7336..47a91732 100644
--- a/ios/chrome/browser/download/model/download_record_service_factory.mm
+++ b/ios/chrome/browser/download/model/download_record_service_factory.mm
@@ -7,7 +7,7 @@
 #import <memory>
 
 #import "base/files/file_path.h"
-#import "ios/chrome/browser/download/model/download_record_service.h"
+#import "ios/chrome/browser/download/model/download_record_service_impl.h"
 #import "ios/chrome/browser/shared/model/profile/profile_ios.h"
 
 DownloadRecordServiceFactory* DownloadRecordServiceFactory::GetInstance() {
@@ -32,5 +32,5 @@
 DownloadRecordServiceFactory::BuildServiceInstanceFor(
     web::BrowserState* context) const {
   ProfileIOS* profile = ProfileIOS::FromBrowserState(context);
-  return std::make_unique<DownloadRecordService>(profile->GetStatePath());
+  return std::make_unique<DownloadRecordServiceImpl>(profile->GetStatePath());
 }
diff --git a/ios/chrome/browser/download/model/download_record_service_impl.h b/ios/chrome/browser/download/model/download_record_service_impl.h
new file mode 100644
index 0000000..4efaa96
--- /dev/null
+++ b/ios/chrome/browser/download/model/download_record_service_impl.h
@@ -0,0 +1,118 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_DOWNLOAD_MODEL_DOWNLOAD_RECORD_SERVICE_IMPL_H_
+#define IOS_CHROME_BROWSER_DOWNLOAD_MODEL_DOWNLOAD_RECORD_SERVICE_IMPL_H_
+
+#import <map>
+#import <string>
+
+#import "base/memory/raw_ptr.h"
+#import "base/memory/weak_ptr.h"
+#import "base/observer_list.h"
+#import "base/scoped_multi_source_observation.h"
+#import "base/sequence_checker.h"
+#import "base/task/sequenced_task_runner.h"
+#import "ios/chrome/browser/download/model/download_record.h"
+#import "ios/chrome/browser/download/model/download_record_observer.h"
+#import "ios/chrome/browser/download/model/download_record_service.h"
+#import "ios/web/public/download/download_task.h"
+#import "ios/web/public/download/download_task_observer.h"
+
+namespace base {
+class FilePath;
+}  // namespace base
+
+class DownloadRecordDatabase;
+
+// Implementation class that manages download records with persistent storage.
+class DownloadRecordServiceImpl : public DownloadRecordService,
+                                  public web::DownloadTaskObserver {
+ public:
+  explicit DownloadRecordServiceImpl(const base::FilePath& profile_path);
+
+  DownloadRecordServiceImpl(const DownloadRecordServiceImpl&) = delete;
+  DownloadRecordServiceImpl& operator=(const DownloadRecordServiceImpl&) =
+      delete;
+
+  ~DownloadRecordServiceImpl() override;
+
+  // DownloadRecordService implementation.
+  void RecordDownload(web::DownloadTask* task) override;
+  void GetAllDownloadsAsync(DownloadRecordsCallback callback) override;
+  void GetDownloadByIdAsync(const std::string& download_id,
+                            DownloadRecordCallback callback) override;
+  void RemoveDownloadByIdAsync(
+      const std::string& download_id,
+      CompletionCallback callback = CompletionCallback()) override;
+  void UpdateDownloadFilePathAsync(
+      const std::string& download_id,
+      const base::FilePath& file_path,
+      CompletionCallback callback = CompletionCallback()) override;
+  web::DownloadTask* GetDownloadTaskById(
+      std::string_view download_id) const override;
+  void AddObserver(DownloadRecordObserver* observer) override;
+  void RemoveObserver(DownloadRecordObserver* observer) override;
+
+  // web::DownloadTaskObserver implementation.
+  void OnDownloadUpdated(web::DownloadTask* task) override;
+  void OnDownloadDestroyed(web::DownloadTask* task) override;
+
+ private:
+  // Notifies observers.
+  void NotifyDownloadAdded(const DownloadRecord& record);
+  void NotifyDownloadUpdated(const DownloadRecord& record);
+  void NotifyDownloadsRemoved(
+      const std::vector<std::string_view>& download_ids);
+
+  // Determines whether a download record update should be persisted to the
+  // database by comparing critical fields between the new and cached records.
+  bool ShouldPersistUpdate(const DownloadRecord& new_record,
+                           const DownloadRecord& cached_record);
+
+  // Initializes database operations, called on database_task_runner_.
+  void InitializeDatabase(const base::FilePath& profile_path);
+  void LoadHistoricalRecords();
+  void CleanupInconsistentStates();
+
+  // Database CRUD operations, called on database_task_runner_.
+  bool InsertRecord(const DownloadRecord& record);
+  std::optional<DownloadRecord> UpdateRecord(const DownloadRecord& record);
+  bool DeleteRecord(std::string_view id);
+  bool UpdateRecordsState(const std::vector<std::string>& download_ids,
+                          web::DownloadTask::State new_state);
+  std::optional<DownloadRecord> UpdateFilePathInRecord(
+      const std::string& download_id,
+      const base::FilePath& file_path);
+
+  // Cache query operations, called on database_task_runner_.
+  std::vector<DownloadRecord> GetAllFromCache();
+  std::optional<DownloadRecord> GetByIdFromCache(std::string_view id);
+
+  // Database thread data, accessed on database_task_runner_.
+  std::map<std::string, DownloadRecord> database_cache_;
+  std::unique_ptr<DownloadRecordDatabase> database_;
+
+  // ObserverList for download record changes.
+  base::ObserverList<DownloadRecordObserver, /* check_empty= */ true>
+      observers_;
+  // Observation for download tasks.
+  base::ScopedMultiSourceObservation<web::DownloadTask,
+                                     web::DownloadTaskObserver>
+      download_task_observations_{this};
+
+  // Task runner for database operations.
+  scoped_refptr<base::SequencedTaskRunner> database_task_runner_;
+
+  // Main thread sequence checker for public API calls.
+  SEQUENCE_CHECKER(main_sequence_checker_);
+
+  // Database thread sequence checker. Will be bound on first database thread
+  // access.
+  SEQUENCE_CHECKER(database_sequence_checker_);
+
+  base::WeakPtrFactory<DownloadRecordServiceImpl> weak_ptr_factory_{this};
+};
+
+#endif  // IOS_CHROME_BROWSER_DOWNLOAD_MODEL_DOWNLOAD_RECORD_SERVICE_IMPL_H_
diff --git a/ios/chrome/browser/download/model/download_record_service.mm b/ios/chrome/browser/download/model/download_record_service_impl.mm
similarity index 81%
rename from ios/chrome/browser/download/model/download_record_service.mm
rename to ios/chrome/browser/download/model/download_record_service_impl.mm
index 307f848..9875187 100644
--- a/ios/chrome/browser/download/model/download_record_service.mm
+++ b/ios/chrome/browser/download/model/download_record_service_impl.mm
@@ -2,22 +2,25 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/download/model/download_record_service.h"
+#import "ios/chrome/browser/download/model/download_record_service_impl.h"
+
+#import <memory>
+#import <optional>
+#import <string_view>
+#import <vector>
 
 #import "base/files/file_path.h"
 #import "base/files/file_util.h"
 #import "base/functional/bind.h"
 #import "base/strings/sys_string_conversions.h"
 #import "base/task/thread_pool.h"
-#import "ios/chrome/browser/download/model/download_record.h"
 #import "ios/chrome/browser/download/model/download_record_database.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
-#import "ios/web/public/download/download_task.h"
-#import "ios/web/public/download/download_task_observer.h"
 
 #pragma mark - Public
 
-DownloadRecordService::DownloadRecordService(const base::FilePath& profile_path)
+DownloadRecordServiceImpl::DownloadRecordServiceImpl(
+    const base::FilePath& profile_path)
     : database_task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
           {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
            base::TaskShutdownBehavior::BLOCK_SHUTDOWN})) {
@@ -29,7 +32,7 @@
 
   database_task_runner_->PostTask(
       FROM_HERE, base::BindOnce(
-                     [](base::WeakPtr<DownloadRecordService> service,
+                     [](base::WeakPtr<DownloadRecordServiceImpl> service,
                         const base::FilePath& profile_path) {
                        if (!service) {
                          return;
@@ -40,14 +43,14 @@
                      weak_ptr_factory_.GetWeakPtr(), profile_path));
 }
 
-DownloadRecordService::~DownloadRecordService() {
+DownloadRecordServiceImpl::~DownloadRecordServiceImpl() {
   // Ensure database is destroyed on the correct thread.
   if (database_) {
     database_task_runner_->DeleteSoon(FROM_HERE, std::move(database_));
   }
 }
 
-void DownloadRecordService::RecordDownload(web::DownloadTask* task) {
+void DownloadRecordServiceImpl::RecordDownload(web::DownloadTask* task) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
   CHECK(task);
 
@@ -57,10 +60,10 @@
 
   database_task_runner_->PostTaskAndReplyWithResult(
       FROM_HERE,
-      base::BindOnce(&DownloadRecordService::InsertRecord,
+      base::BindOnce(&DownloadRecordServiceImpl::InsertRecord,
                      base::Unretained(this), record),
       base::BindOnce(
-          [](base::WeakPtr<DownloadRecordService> service,
+          [](base::WeakPtr<DownloadRecordServiceImpl> service,
              web::DownloadTask* task, const DownloadRecord& record,
              bool success) {
             if (service && success) {
@@ -71,28 +74,28 @@
           weak_ptr_factory_.GetWeakPtr(), task, record));
 }
 
-void DownloadRecordService::GetAllDownloadsAsync(
+void DownloadRecordServiceImpl::GetAllDownloadsAsync(
     DownloadRecordsCallback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
   database_task_runner_->PostTaskAndReplyWithResult(
       FROM_HERE,
-      base::BindOnce(&DownloadRecordService::GetAllFromCache,
+      base::BindOnce(&DownloadRecordServiceImpl::GetAllFromCache,
                      base::Unretained(this)),
       std::move(callback));
 }
 
-void DownloadRecordService::GetDownloadByIdAsync(
+void DownloadRecordServiceImpl::GetDownloadByIdAsync(
     const std::string& download_id,
     DownloadRecordCallback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
   database_task_runner_->PostTaskAndReplyWithResult(
       FROM_HERE,
-      base::BindOnce(&DownloadRecordService::GetByIdFromCache,
+      base::BindOnce(&DownloadRecordServiceImpl::GetByIdFromCache,
                      base::Unretained(this), download_id),
       std::move(callback));
 }
 
-void DownloadRecordService::RemoveDownloadByIdAsync(
+void DownloadRecordServiceImpl::RemoveDownloadByIdAsync(
     const std::string& download_id,
     CompletionCallback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
@@ -104,10 +107,10 @@
 
   database_task_runner_->PostTaskAndReplyWithResult(
       FROM_HERE,
-      base::BindOnce(&DownloadRecordService::DeleteRecord,
+      base::BindOnce(&DownloadRecordServiceImpl::DeleteRecord,
                      base::Unretained(this), download_id),
       base::BindOnce(
-          [](base::WeakPtr<DownloadRecordService> service,
+          [](base::WeakPtr<DownloadRecordServiceImpl> service,
              const std::string& download_id, CompletionCallback callback,
              bool success) {
             if (service && success) {
@@ -120,7 +123,7 @@
           weak_ptr_factory_.GetWeakPtr(), download_id, std::move(callback)));
 }
 
-void DownloadRecordService::UpdateDownloadFilePathAsync(
+void DownloadRecordServiceImpl::UpdateDownloadFilePathAsync(
     const std::string& download_id,
     const base::FilePath& file_path,
     CompletionCallback callback) {
@@ -128,10 +131,10 @@
 
   database_task_runner_->PostTaskAndReplyWithResult(
       FROM_HERE,
-      base::BindOnce(&DownloadRecordService::UpdateFilePathInRecord,
+      base::BindOnce(&DownloadRecordServiceImpl::UpdateFilePathInRecord,
                      base::Unretained(this), download_id, file_path),
       base::BindOnce(
-          [](base::WeakPtr<DownloadRecordService> service,
+          [](base::WeakPtr<DownloadRecordServiceImpl> service,
              CompletionCallback callback,
              std::optional<DownloadRecord> updated_record) {
             bool success = updated_record.has_value();
@@ -145,7 +148,7 @@
           weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
 
-web::DownloadTask* DownloadRecordService::GetDownloadTaskById(
+web::DownloadTask* DownloadRecordServiceImpl::GetDownloadTaskById(
     std::string_view download_id) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
   // Search through all observed download tasks.
@@ -159,19 +162,20 @@
 
 #pragma mark - Observer Management
 
-void DownloadRecordService::AddObserver(DownloadRecordObserver* observer) {
+void DownloadRecordServiceImpl::AddObserver(DownloadRecordObserver* observer) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
   observers_.AddObserver(observer);
 }
 
-void DownloadRecordService::RemoveObserver(DownloadRecordObserver* observer) {
+void DownloadRecordServiceImpl::RemoveObserver(
+    DownloadRecordObserver* observer) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
   observers_.RemoveObserver(observer);
 }
 
 #pragma mark - web::DownloadTaskObserver
 
-void DownloadRecordService::OnDownloadUpdated(web::DownloadTask* task) {
+void DownloadRecordServiceImpl::OnDownloadUpdated(web::DownloadTask* task) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
   CHECK(task);
 
@@ -179,10 +183,10 @@
 
   database_task_runner_->PostTaskAndReplyWithResult(
       FROM_HERE,
-      base::BindOnce(&DownloadRecordService::UpdateRecord,
+      base::BindOnce(&DownloadRecordServiceImpl::UpdateRecord,
                      base::Unretained(this), updated_record),
       base::BindOnce(
-          [](base::WeakPtr<DownloadRecordService> service,
+          [](base::WeakPtr<DownloadRecordServiceImpl> service,
              std::optional<DownloadRecord> record_opt) {
             if (service && record_opt.has_value()) {
               service->NotifyDownloadUpdated(record_opt.value());
@@ -191,25 +195,26 @@
           weak_ptr_factory_.GetWeakPtr()));
 }
 
-void DownloadRecordService::OnDownloadDestroyed(web::DownloadTask* task) {
+void DownloadRecordServiceImpl::OnDownloadDestroyed(web::DownloadTask* task) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
   download_task_observations_.RemoveObservation(task);
 }
 
 #pragma mark - Private
 
-void DownloadRecordService::NotifyDownloadAdded(const DownloadRecord& record) {
+void DownloadRecordServiceImpl::NotifyDownloadAdded(
+    const DownloadRecord& record) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
   observers_.Notify(&DownloadRecordObserver::OnDownloadAdded, record);
 }
 
-void DownloadRecordService::NotifyDownloadUpdated(
+void DownloadRecordServiceImpl::NotifyDownloadUpdated(
     const DownloadRecord& record) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
   observers_.Notify(&DownloadRecordObserver::OnDownloadUpdated, record);
 }
 
-void DownloadRecordService::NotifyDownloadsRemoved(
+void DownloadRecordServiceImpl::NotifyDownloadsRemoved(
     const std::vector<std::string_view>& download_ids) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
   observers_.Notify(&DownloadRecordObserver::OnDownloadsRemoved, download_ids);
@@ -217,7 +222,7 @@
 
 #pragma mark - Database Thread Operations
 
-bool DownloadRecordService::ShouldPersistUpdate(
+bool DownloadRecordServiceImpl::ShouldPersistUpdate(
     const DownloadRecord& new_record,
     const DownloadRecord& cached_record) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(database_sequence_checker_);
@@ -228,7 +233,7 @@
   return !new_record.EqualsExcludingProgress(cached_record);
 }
 
-void DownloadRecordService::InitializeDatabase(
+void DownloadRecordServiceImpl::InitializeDatabase(
     const base::FilePath& profile_path) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(database_sequence_checker_);
 
@@ -249,7 +254,7 @@
   }
 }
 
-void DownloadRecordService::LoadHistoricalRecords() {
+void DownloadRecordServiceImpl::LoadHistoricalRecords() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(database_sequence_checker_);
 
   if (!database_ || !database_->IsInitialized()) {
@@ -266,7 +271,7 @@
   CleanupInconsistentStates();
 }
 
-void DownloadRecordService::CleanupInconsistentStates() {
+void DownloadRecordServiceImpl::CleanupInconsistentStates() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(database_sequence_checker_);
 
   if (!database_ || !database_->IsInitialized()) {
@@ -289,7 +294,7 @@
   UpdateRecordsState(records_to_fix, web::DownloadTask::State::kFailed);
 }
 
-bool DownloadRecordService::InsertRecord(const DownloadRecord& record) {
+bool DownloadRecordServiceImpl::InsertRecord(const DownloadRecord& record) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(database_sequence_checker_);
 
   if (!database_ || !database_->IsInitialized()) {
@@ -304,7 +309,7 @@
   return false;
 }
 
-std::optional<DownloadRecord> DownloadRecordService::UpdateRecord(
+std::optional<DownloadRecord> DownloadRecordServiceImpl::UpdateRecord(
     const DownloadRecord& updated_record) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(database_sequence_checker_);
 
@@ -340,7 +345,7 @@
   return std::nullopt;
 }
 
-bool DownloadRecordService::UpdateRecordsState(
+bool DownloadRecordServiceImpl::UpdateRecordsState(
     const std::vector<std::string>& download_ids,
     web::DownloadTask::State new_state) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(database_sequence_checker_);
@@ -368,7 +373,7 @@
   return false;
 }
 
-std::optional<DownloadRecord> DownloadRecordService::UpdateFilePathInRecord(
+std::optional<DownloadRecord> DownloadRecordServiceImpl::UpdateFilePathInRecord(
     const std::string& download_id,
     const base::FilePath& file_path) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(database_sequence_checker_);
@@ -385,7 +390,7 @@
   return UpdateRecord(updated_record);
 }
 
-bool DownloadRecordService::DeleteRecord(std::string_view id) {
+bool DownloadRecordServiceImpl::DeleteRecord(std::string_view id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(database_sequence_checker_);
 
   if (!database_ || !database_->IsInitialized()) {
@@ -407,7 +412,7 @@
   return false;
 }
 
-std::vector<DownloadRecord> DownloadRecordService::GetAllFromCache() {
+std::vector<DownloadRecord> DownloadRecordServiceImpl::GetAllFromCache() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(database_sequence_checker_);
 
   std::vector<DownloadRecord> records;
@@ -420,7 +425,7 @@
   return records;
 }
 
-std::optional<DownloadRecord> DownloadRecordService::GetByIdFromCache(
+std::optional<DownloadRecord> DownloadRecordServiceImpl::GetByIdFromCache(
     std::string_view download_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(database_sequence_checker_);
 
diff --git a/ios/chrome/browser/download/model/download_record_service_unittest.mm b/ios/chrome/browser/download/model/download_record_service_impl_unittest.mm
similarity index 91%
rename from ios/chrome/browser/download/model/download_record_service_unittest.mm
rename to ios/chrome/browser/download/model/download_record_service_impl_unittest.mm
index 8697104..ce9b9bd 100644
--- a/ios/chrome/browser/download/model/download_record_service_unittest.mm
+++ b/ios/chrome/browser/download/model/download_record_service_impl_unittest.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/download/model/download_record_service.h"
+#import "ios/chrome/browser/download/model/download_record_service_impl.h"
 
 #import <memory>
 #import <optional>
@@ -53,7 +53,7 @@
 
 }  // namespace
 
-class DownloadRecordServiceTest : public PlatformTest {
+class DownloadRecordServiceImplTest : public PlatformTest {
  protected:
   void SetUp() override {
     PlatformTest::SetUp();
@@ -62,11 +62,7 @@
 
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
 
-    service_ = std::make_unique<DownloadRecordService>(temp_dir_.GetPath());
-    ASSERT_TRUE(service_);
-
-    // Wait for database initialization to complete.
-    task_environment_.RunUntilIdle();
+    CreateService();
   }
 
   void TearDown() override {
@@ -74,6 +70,14 @@
     PlatformTest::TearDown();
   }
 
+  void CreateService() {
+    service_ = std::make_unique<DownloadRecordServiceImpl>(temp_dir_.GetPath());
+    ASSERT_TRUE(service_);
+
+    // Wait for database initialization to complete.
+    task_environment_.RunUntilIdle();
+  }
+
   std::unique_ptr<web::FakeDownloadTask> CreateFakeDownloadTask(
       const std::string& identifier,
       const std::string& original_url = "https://example.com/file.pdf",
@@ -107,12 +111,12 @@
   std::unique_ptr<DownloadRecordService> service_;
 };
 
-TEST_F(DownloadRecordServiceTest, RecordDownload) {
+TEST_F(DownloadRecordServiceImplTest, RecordDownload) {
   auto task = CreateFakeDownloadTask("test_download_1");
   RecordDownloadAndValidate(task.get());
 }
 
-TEST_F(DownloadRecordServiceTest, GetAllDownloads) {
+TEST_F(DownloadRecordServiceImplTest, GetAllDownloads) {
   auto task1 = CreateFakeDownloadTask("download_1");
   auto task2 = CreateFakeDownloadTask("download_2");
 
@@ -137,7 +141,7 @@
             result[1].download_id);
 }
 
-TEST_F(DownloadRecordServiceTest, GetDownloadById) {
+TEST_F(DownloadRecordServiceImplTest, GetDownloadById) {
   const std::string download_id = "test_download";
   auto task = CreateFakeDownloadTask(download_id);
   RecordDownloadAndValidate(task.get());
@@ -158,7 +162,7 @@
   EXPECT_EQ(download_id, result->download_id);
 }
 
-TEST_F(DownloadRecordServiceTest, GetNonExistentDownloadById) {
+TEST_F(DownloadRecordServiceImplTest, GetNonExistentDownloadById) {
   base::RunLoop run_loop;
   std::optional<DownloadRecord> result;
 
@@ -174,7 +178,7 @@
   EXPECT_FALSE(result.has_value());
 }
 
-TEST_F(DownloadRecordServiceTest, RemoveDownloadById) {
+TEST_F(DownloadRecordServiceImplTest, RemoveDownloadById) {
   const std::string download_id = "test_download";
   auto task = CreateFakeDownloadTask(download_id);
   RecordDownloadAndValidate(task.get());
@@ -204,7 +208,7 @@
   service_->RemoveObserver(&mock_observer);
 }
 
-TEST_F(DownloadRecordServiceTest, RemoveNonExistentDownloadById) {
+TEST_F(DownloadRecordServiceImplTest, RemoveNonExistentDownloadById) {
   base::RunLoop run_loop;
   bool removal_success = false;
 
@@ -220,7 +224,7 @@
   EXPECT_TRUE(removal_success);
 }
 
-TEST_F(DownloadRecordServiceTest, UpdateDownloadFilePath) {
+TEST_F(DownloadRecordServiceImplTest, UpdateDownloadFilePath) {
   auto task = CreateFakeDownloadTask(kTestDownloadId);
   RecordDownloadAndValidate(task.get());
 
@@ -252,7 +256,7 @@
   service_->RemoveObserver(&mock_observer);
 }
 
-TEST_F(DownloadRecordServiceTest, UpdateNonExistentDownloadFilePath) {
+TEST_F(DownloadRecordServiceImplTest, UpdateNonExistentDownloadFilePath) {
   const std::string non_existent_id = "non_existent_download";
   const base::FilePath test_path("/test/path/file.pdf");
 
@@ -270,7 +274,7 @@
   EXPECT_FALSE(update_success);
 }
 
-TEST_F(DownloadRecordServiceTest, UpdateDownloadStates) {
+TEST_F(DownloadRecordServiceImplTest, UpdateDownloadStates) {
   const std::string download_id = "state_test_download";
   auto task = CreateFakeDownloadTask(download_id);
   RecordDownloadAndValidate(task.get());
@@ -301,7 +305,7 @@
   service_->RemoveObserver(&mock_observer);
 }
 
-TEST_F(DownloadRecordServiceTest, NotifiesAllObservers) {
+TEST_F(DownloadRecordServiceImplTest, NotifiesAllObservers) {
   MockDownloadRecordObserver observer1;
   MockDownloadRecordObserver observer2;
 
@@ -339,14 +343,14 @@
   service_->RemoveObserver(&observer2);
 }
 
-TEST_F(DownloadRecordServiceTest, PersistDataInDatabase) {
+TEST_F(DownloadRecordServiceImplTest, PersistDataInDatabase) {
   const std::string download_id = "persistent_download";
   auto task = CreateFakeDownloadTask(download_id);
   RecordDownloadAndValidate(task.get());
 
   // Creates new service instance with same database path.
   service_.reset();
-  service_ = std::make_unique<DownloadRecordService>(temp_dir_.GetPath());
+  CreateService();
 
   base::RunLoop verify_loop;
   std::optional<DownloadRecord> result;
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 3dda346..59574b4 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -2079,11 +2079,6 @@
      flag_descriptions::kEnhancedSafeBrowsingPromoName,
      flag_descriptions::kEnhancedSafeBrowsingPromoDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(safe_browsing::kEnhancedSafeBrowsingPromo)},
-    {"cpe-automatic-passkey-upgrade",
-     flag_descriptions::kCredentialProviderAutomaticPasskeyUpgradeName,
-     flag_descriptions::kCredentialProviderAutomaticPasskeyUpgradeDescription,
-     flags_ui::kOsIos,
-     FEATURE_VALUE_TYPE(kCredentialProviderAutomaticPasskeyUpgrade)},
     {"cpe-passkey-prf-support",
      flag_descriptions::kCredentialProviderPasskeyPRFName,
      flag_descriptions::kCredentialProviderPasskeyPRFDescription,
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index 6eb6581..de6cd35 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -339,11 +339,6 @@
 const char kContextualPanelDescription[] =
     "Enables the contextual panel feature.";
 
-const char kCredentialProviderAutomaticPasskeyUpgradeName[] =
-    "Credential Provider Automatic Passkey Upgrade";
-const char kCredentialProviderAutomaticPasskeyUpgradeDescription[] =
-    "Enables automatic passkey upgrade in the Credential Provider Extension.";
-
 const char kCredentialProviderPasskeyLargeBlobName[] =
     "Credential Provider Large Blob support";
 const char kCredentialProviderPasskeyLargeBlobDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index fa98867..baf5c3c 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -197,9 +197,6 @@
 extern const char kContextualPanelName[];
 extern const char kContextualPanelDescription[];
 
-extern const char kCredentialProviderAutomaticPasskeyUpgradeName[];
-extern const char kCredentialProviderAutomaticPasskeyUpgradeDescription[];
-
 extern const char kCredentialProviderPasskeyLargeBlobName[];
 extern const char kCredentialProviderPasskeyLargeBlobDescription[];
 
diff --git a/ios/chrome/browser/lens_overlay/coordinator/BUILD.gn b/ios/chrome/browser/lens_overlay/coordinator/BUILD.gn
index e9316bd..9a8cd49 100644
--- a/ios/chrome/browser/lens_overlay/coordinator/BUILD.gn
+++ b/ios/chrome/browser/lens_overlay/coordinator/BUILD.gn
@@ -84,12 +84,12 @@
     "//ios/chrome/browser/shared/model/web_state_list",
     "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/symbols",
     "//ios/chrome/browser/shared/ui/symbols:buildflags",
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/browser/shared/ui/util:omnibox_util",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/browser/snapshots/model",
     "//ios/chrome/browser/tabs/model",
     "//ios/chrome/browser/web/model",
diff --git a/ios/chrome/browser/lens_overlay/coordinator/DEPS b/ios/chrome/browser/lens_overlay/coordinator/DEPS
index 99e0106..0d949a17 100644
--- a/ios/chrome/browser/lens_overlay/coordinator/DEPS
+++ b/ios/chrome/browser/lens_overlay/coordinator/DEPS
@@ -18,5 +18,4 @@
   "+ios/chrome/browser/omnibox/model/chrome_omnibox_client_ios.h",
   "+ios/chrome/browser/overlays/model",
   "+ios/chrome/browser/overlays/model/public",
-  "+ios/chrome/browser/snackbar/public",
 ]
diff --git a/ios/chrome/browser/lens_overlay/coordinator/lens_result_page_mediator.mm b/ios/chrome/browser/lens_overlay/coordinator/lens_result_page_mediator.mm
index 5abb4a5..b6a5a59 100644
--- a/ios/chrome/browser/lens_overlay/coordinator/lens_result_page_mediator.mm
+++ b/ios/chrome/browser/lens_overlay/coordinator/lens_result_page_mediator.mm
@@ -24,9 +24,9 @@
 #import "ios/chrome/browser/shared/public/commands/open_new_tab_command.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
 #import "ios/chrome/browser/tabs/model/tab_helper_util.h"
 #import "ios/chrome/browser/web/model/blocked_popup_tab_helper.h"
 #import "ios/chrome/browser/web/model/web_navigation_util.h"
diff --git a/ios/chrome/browser/ntp/ui_bundled/BUILD.gn b/ios/chrome/browser/ntp/ui_bundled/BUILD.gn
index e6de819c..570f1a4 100644
--- a/ios/chrome/browser/ntp/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/ntp/ui_bundled/BUILD.gn
@@ -189,6 +189,7 @@
     "//ios/chrome/browser/shared/model/web_state_list",
     "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
     "//ios/chrome/browser/shared/ui/util:util_swift",
@@ -198,7 +199,6 @@
     "//ios/chrome/browser/signin/model:authentication_service_factory",
     "//ios/chrome/browser/signin/model:capabilities_types",
     "//ios/chrome/browser/signin/model:system_identity_manager",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/browser/supervised_user/model:capabilities",
     "//ios/chrome/browser/sync/model",
     "//ios/chrome/browser/toolbar/ui_bundled/public",
diff --git a/ios/chrome/browser/ntp/ui_bundled/DEPS b/ios/chrome/browser/ntp/ui_bundled/DEPS
index 05fbafe..4849734d 100644
--- a/ios/chrome/browser/ntp/ui_bundled/DEPS
+++ b/ios/chrome/browser/ntp/ui_bundled/DEPS
@@ -58,7 +58,6 @@
   "+ios/chrome/browser/signin/model/chrome_account_manager_service_factory.h",
   "+ios/chrome/browser/signin/model/identity_manager_factory.h",
   "+ios/chrome/browser/signin/model/system_identity_manager.h",
-  "+ios/chrome/browser/snackbar/public",
   "+ios/chrome/browser/supervised_user/model/family_link_user_capabilities_observer_bridge.h",
   "+ios/chrome/browser/sync/model/sync_observer_bridge.h",
   "+ios/chrome/browser/sync/model/sync_service_factory.h",
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm
index 9028977..cbe7fb5 100644
--- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm
+++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm
@@ -117,6 +117,7 @@
 #import "ios/chrome/browser/shared/public/commands/show_signin_command.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
 #import "ios/chrome/browser/shared/ui/util/layout_guide_names.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
@@ -131,7 +132,6 @@
 #import "ios/chrome/browser/signin/model/chrome_account_manager_service_factory.h"
 #import "ios/chrome/browser/signin/model/identity_manager_factory.h"
 #import "ios/chrome/browser/signin/model/system_identity_manager.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
 #import "ios/chrome/browser/supervised_user/model/family_link_user_capabilities_observer_bridge.h"
 #import "ios/chrome/browser/sync/model/sync_service_factory.h"
 #import "ios/chrome/browser/toolbar/ui_bundled/public/fakebox_focuser.h"
diff --git a/ios/chrome/browser/overlays/ui_bundled/infobar_banner/DEPS b/ios/chrome/browser/overlays/ui_bundled/infobar_banner/DEPS
index 1edd17d..a29d05a 100644
--- a/ios/chrome/browser/overlays/ui_bundled/infobar_banner/DEPS
+++ b/ios/chrome/browser/overlays/ui_bundled/infobar_banner/DEPS
@@ -2,5 +2,4 @@
   "+ios/chrome/browser/authentication/ui_bundled/signin_promo",
   "+ios/chrome/browser/infobars/ui_bundled/banners",
   "+ios/chrome/browser/infobars/ui_bundled/presentation",
-  "+ios/chrome/browser/snackbar/public",
 ]
diff --git a/ios/chrome/browser/overlays/ui_bundled/infobar_banner/save_card/BUILD.gn b/ios/chrome/browser/overlays/ui_bundled/infobar_banner/save_card/BUILD.gn
index e17ff7c..4a0a3f4 100644
--- a/ios/chrome/browser/overlays/ui_bundled/infobar_banner/save_card/BUILD.gn
+++ b/ios/chrome/browser/overlays/ui_bundled/infobar_banner/save_card/BUILD.gn
@@ -22,9 +22,9 @@
     "//ios/chrome/browser/overlays/ui_bundled:coordinators",
     "//ios/chrome/browser/overlays/ui_bundled/infobar_banner:mediators",
     "//ios/chrome/browser/shared/public/commands",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/symbols",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
-    "//ios/chrome/browser/snackbar/public",
     "//ui/base",
   ]
 }
@@ -57,8 +57,8 @@
     "//ios/chrome/browser/overlays/model/test",
     "//ios/chrome/browser/overlays/ui_bundled/test",
     "//ios/chrome/browser/shared/public/commands",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
-    "//ios/chrome/browser/snackbar/public",
     "//testing/gmock",
     "//testing/gtest",
     "//third_party/ocmock",
diff --git a/ios/chrome/browser/overlays/ui_bundled/infobar_banner/save_card/save_card_infobar_banner_overlay_mediator.mm b/ios/chrome/browser/overlays/ui_bundled/infobar_banner/save_card/save_card_infobar_banner_overlay_mediator.mm
index 0d5969a..aef3ce1 100644
--- a/ios/chrome/browser/overlays/ui_bundled/infobar_banner/save_card/save_card_infobar_banner_overlay_mediator.mm
+++ b/ios/chrome/browser/overlays/ui_bundled/infobar_banner/save_card/save_card_infobar_banner_overlay_mediator.mm
@@ -14,10 +14,10 @@
 #import "ios/chrome/browser/overlays/ui_bundled/infobar_banner/infobar_banner_overlay_mediator.h"
 #import "ios/chrome/browser/overlays/ui_bundled/overlay_request_mediator+subclassing.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/browser/shared/ui/symbols/symbols.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/browser/overlays/ui_bundled/infobar_banner/save_card/save_card_infobar_banner_overlay_mediator_unittest.mm b/ios/chrome/browser/overlays/ui_bundled/infobar_banner/save_card/save_card_infobar_banner_overlay_mediator_unittest.mm
index 0947ea8..b81077c 100644
--- a/ios/chrome/browser/overlays/ui_bundled/infobar_banner/save_card/save_card_infobar_banner_overlay_mediator_unittest.mm
+++ b/ios/chrome/browser/overlays/ui_bundled/infobar_banner/save_card/save_card_infobar_banner_overlay_mediator_unittest.mm
@@ -21,8 +21,8 @@
 #import "ios/chrome/browser/infobars/ui_bundled/banners/test/fake_infobar_banner_consumer.h"
 #import "ios/chrome/browser/overlays/model/public/default/default_infobar_overlay_request_config.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "testing/gtest_mac.h"
 #import "testing/platform_test.h"
diff --git a/ios/chrome/browser/reading_list/model/BUILD.gn b/ios/chrome/browser/reading_list/model/BUILD.gn
index dcedc02fa..a520d12 100644
--- a/ios/chrome/browser/reading_list/model/BUILD.gn
+++ b/ios/chrome/browser/reading_list/model/BUILD.gn
@@ -54,12 +54,12 @@
     "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/browser/shared/public/features:system_flags",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
     "//ios/chrome/browser/shared/ui/util:url_with_title",
     "//ios/chrome/browser/signin/model",
     "//ios/chrome/browser/signin/model:signin_util",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/browser/sync/model:data_type_store_service_factory",
     "//ios/chrome/common",
     "//ios/components/webui:url_constants",
diff --git a/ios/chrome/browser/reading_list/model/DEPS b/ios/chrome/browser/reading_list/model/DEPS
index ca0a7025..4ec91b1 100644
--- a/ios/chrome/browser/reading_list/model/DEPS
+++ b/ios/chrome/browser/reading_list/model/DEPS
@@ -16,7 +16,6 @@
   ],
   "^reading_list_browser_agent.mm": [
     "+ios/chrome/browser/shared/ui/util/uikit_ui_util.h",
-    "+ios/chrome/browser/snackbar/public",
     "+ios/chrome/browser/ntp/shared/metrics/home_metrics.h",
   ],
 
diff --git a/ios/chrome/browser/reading_list/model/reading_list_browser_agent.mm b/ios/chrome/browser/reading_list/model/reading_list_browser_agent.mm
index 2d25ba96..257b44b 100644
--- a/ios/chrome/browser/reading_list/model/reading_list_browser_agent.mm
+++ b/ios/chrome/browser/reading_list/model/reading_list_browser_agent.mm
@@ -21,11 +21,11 @@
 #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/signin/model/identity_manager_factory.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/web/public/web_state.h"
 #import "net/base/apple/url_conversions.h"
diff --git a/ios/chrome/browser/reading_list/ui_bundled/BUILD.gn b/ios/chrome/browser/reading_list/ui_bundled/BUILD.gn
index 390c62f..fe37fb1 100644
--- a/ios/chrome/browser/reading_list/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/reading_list/ui_bundled/BUILD.gn
@@ -244,11 +244,11 @@
     "//ios/chrome/browser/settings/ui_bundled:constants",
     "//ios/chrome/browser/settings/ui_bundled/google_services:constants",
     "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/public/snackbar:constants",
     "//ios/chrome/browser/shared/ui/elements:eg_test_support+eg2",
     "//ios/chrome/browser/shared/ui/symbols",
     "//ios/chrome/browser/shared/ui/table_view:constants",
     "//ios/chrome/browser/signin/model:fake_system_identity",
-    "//ios/chrome/browser/snackbar/public:constants",
     "//ios/chrome/common/ui/table_view:cells_constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
diff --git a/ios/chrome/browser/reading_list/ui_bundled/DEPS b/ios/chrome/browser/reading_list/ui_bundled/DEPS
index 7fb3c0d..2861c47a 100644
--- a/ios/chrome/browser/reading_list/ui_bundled/DEPS
+++ b/ios/chrome/browser/reading_list/ui_bundled/DEPS
@@ -15,7 +15,6 @@
   "+ios/chrome/browser/settings/ui_bundled",
   "+ios/chrome/browser/sharing/ui_bundled",
   "+ios/chrome/browser/signin/model",
-  "+ios/chrome/browser/snackbar/public",
   "+ios/chrome/browser/sync/model",
   "+ios/chrome/browser/url_loading/model",
   "+ios/chrome/browser/window_activities/model/window_activity_helpers.h",
diff --git a/ios/chrome/browser/reading_list/ui_bundled/reading_list_account_storage_egtest.mm b/ios/chrome/browser/reading_list/ui_bundled/reading_list_account_storage_egtest.mm
index 2a06e47..fd96a62 100644
--- a/ios/chrome/browser/reading_list/ui_bundled/reading_list_account_storage_egtest.mm
+++ b/ios/chrome/browser/reading_list/ui_bundled/reading_list_account_storage_egtest.mm
@@ -16,10 +16,10 @@
 #import "ios/chrome/browser/reading_list/ui_bundled/reading_list_egtest_utils.h"
 #import "ios/chrome/browser/settings/ui_bundled/settings_table_view_controller_constants.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_constants.h"
 #import "ios/chrome/browser/shared/ui/elements/activity_overlay_egtest_util.h"
 #import "ios/chrome/browser/shared/ui/table_view/table_view_navigation_controller_constants.h"
 #import "ios/chrome/browser/signin/model/fake_system_identity.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_constants.h"
 #import "ios/chrome/common/ui/table_view/table_view_cells_constants.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
diff --git a/ios/chrome/browser/reading_list/ui_bundled/reading_list_egtest.mm b/ios/chrome/browser/reading_list/ui_bundled/reading_list_egtest.mm
index 232af8a..574a4c4f 100644
--- a/ios/chrome/browser/reading_list/ui_bundled/reading_list_egtest.mm
+++ b/ios/chrome/browser/reading_list/ui_bundled/reading_list_egtest.mm
@@ -27,10 +27,10 @@
 #import "ios/chrome/browser/reading_list/ui_bundled/reading_list_egtest_utils.h"
 #import "ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_constants.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_constants.h"
 #import "ios/chrome/browser/shared/ui/symbols/symbols.h"
 #import "ios/chrome/browser/shared/ui/table_view/table_view_constants.h"
 #import "ios/chrome/browser/signin/model/fake_system_identity.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_constants.h"
 #import "ios/chrome/common/ui/table_view/table_view_cells_constants.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
diff --git a/ios/chrome/browser/send_tab_to_self/ui_bundled/BUILD.gn b/ios/chrome/browser/send_tab_to_self/ui_bundled/BUILD.gn
index 69374f9..4159497 100644
--- a/ios/chrome/browser/send_tab_to_self/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/send_tab_to_self/ui_bundled/BUILD.gn
@@ -23,13 +23,13 @@
     "//ios/chrome/browser/shared/model/profile",
     "//ios/chrome/browser/shared/model/url:constants",
     "//ios/chrome/browser/shared/public/commands",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
     "//ios/chrome/browser/signin/model",
     "//ios/chrome/browser/signin/model:authentication_service",
     "//ios/chrome/browser/signin/model:authentication_service_factory",
     "//ios/chrome/browser/signin/model:system_identity",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/browser/sync/model",
     "//ui/base",
     "//url",
diff --git a/ios/chrome/browser/send_tab_to_self/ui_bundled/DEPS b/ios/chrome/browser/send_tab_to_self/ui_bundled/DEPS
index 83bab01..42111708 100644
--- a/ios/chrome/browser/send_tab_to_self/ui_bundled/DEPS
+++ b/ios/chrome/browser/send_tab_to_self/ui_bundled/DEPS
@@ -5,5 +5,4 @@
   "+ios/chrome/browser/sync/model",
   "+ios/chrome/browser/authentication/ui_bundled",
   "+ios/chrome/browser/settings/ui_bundled/cells",
-  "+ios/chrome/browser/snackbar/public",
 ]
diff --git a/ios/chrome/browser/send_tab_to_self/ui_bundled/send_tab_to_self_coordinator.mm b/ios/chrome/browser/send_tab_to_self/ui_bundled/send_tab_to_self_coordinator.mm
index 800a386..23120c6 100644
--- a/ios/chrome/browser/send_tab_to_self/ui_bundled/send_tab_to_self_coordinator.mm
+++ b/ios/chrome/browser/send_tab_to_self/ui_bundled/send_tab_to_self_coordinator.mm
@@ -40,6 +40,7 @@
 #import "ios/chrome/browser/shared/public/commands/show_signin_command.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
 #import "ios/chrome/browser/shared/public/commands/toolbar_commands.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/signin/model/authentication_service.h"
@@ -47,7 +48,6 @@
 #import "ios/chrome/browser/signin/model/chrome_account_manager_service.h"
 #import "ios/chrome/browser/signin/model/chrome_account_manager_service_factory.h"
 #import "ios/chrome/browser/signin/model/system_identity.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
 #import "ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h"
 #import "ios/chrome/browser/sync/model/sync_service_factory.h"
 #import "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/settings/ui_bundled/BUILD.gn b/ios/chrome/browser/settings/ui_bundled/BUILD.gn
index 9b4478e..244cd0b 100644
--- a/ios/chrome/browser/settings/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/settings/ui_bundled/BUILD.gn
@@ -206,6 +206,7 @@
     "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/browser/shared/public/features:system_flags",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/elements:elements_internal",
     "//ios/chrome/browser/shared/ui/list_model",
     "//ios/chrome/browser/shared/ui/symbols",
@@ -224,7 +225,6 @@
     "//ios/chrome/browser/signin/model:constants",
     "//ios/chrome/browser/signin/model:signin_util",
     "//ios/chrome/browser/signin/model:system_identity",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/browser/sync/model",
     "//ios/chrome/browser/tabs/model/inactive_tabs:features",
     "//ios/chrome/browser/translate/model",
diff --git a/ios/chrome/browser/settings/ui_bundled/DEPS b/ios/chrome/browser/settings/ui_bundled/DEPS
index 328dfb33..bb62573 100644
--- a/ios/chrome/browser/settings/ui_bundled/DEPS
+++ b/ios/chrome/browser/settings/ui_bundled/DEPS
@@ -43,7 +43,6 @@
   "+ios/chrome/browser/search_engine_choice/ui_bundled",
   "+ios/chrome/browser/search_engines/model",
   "+ios/chrome/browser/signin/model",
-  "+ios/chrome/browser/snackbar/public",
   "+ios/chrome/browser/supervised_user/model",
   "+ios/chrome/browser/sync/model",
   "+ios/chrome/browser/tabs/model/inactive_tabs",
diff --git a/ios/chrome/browser/settings/ui_bundled/about_chrome_table_view_controller.mm b/ios/chrome/browser/settings/ui_bundled/about_chrome_table_view_controller.mm
index d78e0a4..2810ffc 100644
--- a/ios/chrome/browser/settings/ui_bundled/about_chrome_table_view_controller.mm
+++ b/ios/chrome/browser/settings/ui_bundled/about_chrome_table_view_controller.mm
@@ -19,13 +19,13 @@
 #import "ios/chrome/browser/shared/public/commands/open_new_tab_command.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
 #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_text_item.h"
 #import "ios/chrome/browser/shared/ui/table_view/legacy_chrome_table_view_styler.h"
 #import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h"
 #import "ios/chrome/browser/shared/ui/util/pasteboard_util.h"
 #import "ios/chrome/browser/shared/ui/util/terms_util.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
 #import "ios/chrome/common/channel_info.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/grit/ios_branded_strings.h"
diff --git a/ios/chrome/browser/settings/ui_bundled/password/DEPS b/ios/chrome/browser/settings/ui_bundled/password/DEPS
index e9f6d32e..d6570f9 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/DEPS
+++ b/ios/chrome/browser/settings/ui_bundled/password/DEPS
@@ -1,4 +1,3 @@
 include_rules = [
   "+components/trusted_vault/trusted_vault_server_constants.h",
-  "+ios/chrome/browser/snackbar/public",
 ]
diff --git a/ios/chrome/browser/settings/ui_bundled/password/password_details/BUILD.gn b/ios/chrome/browser/settings/ui_bundled/password/password_details/BUILD.gn
index c18b30c6..1d769690 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/password_details/BUILD.gn
+++ b/ios/chrome/browser/settings/ui_bundled/password/password_details/BUILD.gn
@@ -106,12 +106,12 @@
     "//ios/chrome/browser/settings/ui_bundled/password:password_constants",
     "//ios/chrome/browser/settings/ui_bundled/password/password_details/cells",
     "//ios/chrome/browser/shared/public/commands",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/list_model",
     "//ios/chrome/browser/shared/ui/symbols",
     "//ios/chrome/browser/shared/ui/table_view:utils",
     "//ios/chrome/browser/shared/ui/table_view/cells",
     "//ios/chrome/browser/shared/ui/util",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/common:string_util",
     "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/elements:popover_label_view_controller",
@@ -173,9 +173,9 @@
     "//ios/chrome/browser/shared/model/profile",
     "//ios/chrome/browser/shared/model/profile/test",
     "//ios/chrome/browser/shared/public/commands",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/table_view:test_support",
     "//ios/chrome/browser/shared/ui/table_view/cells",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/browser/sync/model",
     "//ios/chrome/browser/sync/model:test_support",
     "//ios/chrome/common/ui/reauthentication",
diff --git a/ios/chrome/browser/settings/ui_bundled/password/password_details/password_details_table_view_controller.mm b/ios/chrome/browser/settings/ui_bundled/password/password_details/password_details_table_view_controller.mm
index cdf47f4..98bcc4c 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/password_details/password_details_table_view_controller.mm
+++ b/ios/chrome/browser/settings/ui_bundled/password/password_details/password_details_table_view_controller.mm
@@ -31,6 +31,7 @@
 #import "ios/chrome/browser/shared/public/commands/application_commands.h"
 #import "ios/chrome/browser/shared/public/commands/open_new_tab_command.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
 #import "ios/chrome/browser/shared/ui/symbols/symbols.h"
 #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_multi_line_text_edit_item.h"
 #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_multi_line_text_edit_item_delegate.h"
@@ -42,7 +43,6 @@
 #import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h"
 #import "ios/chrome/browser/shared/ui/util/pasteboard_util.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.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"
diff --git a/ios/chrome/browser/settings/ui_bundled/password/password_details/password_details_table_view_controller_unittest.mm b/ios/chrome/browser/settings/ui_bundled/password/password_details/password_details_table_view_controller_unittest.mm
index a606851..5584341 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/password_details/password_details_table_view_controller_unittest.mm
+++ b/ios/chrome/browser/settings/ui_bundled/password/password_details/password_details_table_view_controller_unittest.mm
@@ -32,10 +32,10 @@
 #import "ios/chrome/browser/shared/public/commands/application_commands.h"
 #import "ios/chrome/browser/shared/public/commands/open_new_tab_command.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
 #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_multi_line_text_edit_item.h"
 #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_edit_item.h"
 #import "ios/chrome/browser/shared/ui/table_view/legacy_chrome_table_view_controller_test.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
 #import "ios/chrome/common/ui/reauthentication/reauthentication_module.h"
 #import "ios/chrome/common/ui/table_view/table_view_cells_constants.h"
 #import "ios/chrome/grit/ios_branded_strings.h"
diff --git a/ios/chrome/browser/settings/ui_bundled/password/password_manager_egtest.mm b/ios/chrome/browser/settings/ui_bundled/password/password_manager_egtest.mm
index 05639ac..4d1e7a53 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/password_manager_egtest.mm
+++ b/ios/chrome/browser/settings/ui_bundled/password/password_manager_egtest.mm
@@ -741,11 +741,6 @@
     config.iph_feature_enabled = "IPH_iOSPromoPasswordManagerWidget";
   }
 
-  if ([self isRunningTest:@selector(testAutomaticPasskeyUpgradesPrefToggle)]) {
-    config.features_enabled.push_back(
-        kCredentialProviderAutomaticPasskeyUpgrade);
-  }
-
   if ([self isRunningTest:@selector(testTappingInfoButtonForHiddenPasskey)]) {
     config.features_enabled.push_back(kCredentialProviderSignalAPI);
   }
@@ -2404,6 +2399,7 @@
   [[EarlGrey
       selectElementWithMatcher:grey_accessibilityLabel(@"About passkeys")]
       performAction:grey_tap()];
+  [ChromeEarlGrey waitForPageToFinishLoading];
 
   // Check that the help center article was opened.
   GREYAssertEqual(std::string("support.google.com"),
diff --git a/ios/chrome/browser/settings/ui_bundled/password/password_settings/BUILD.gn b/ios/chrome/browser/settings/ui_bundled/password/password_settings/BUILD.gn
index 246967d8..d204a21a 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/password_settings/BUILD.gn
+++ b/ios/chrome/browser/settings/ui_bundled/password/password_settings/BUILD.gn
@@ -72,11 +72,8 @@
     "//components/strings",
     "//ios/chrome/app:tests_hook",
     "//ios/chrome/app/strings",
-    "//ios/chrome/browser/credential_provider/model:features",
-    "//ios/chrome/browser/settings/ui_bundled/password:features",
     "//ios/chrome/browser/shared/coordinator/utils",
     "//ios/chrome/browser/shared/public/commands",
-    "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/browser/shared/ui/symbols",
     "//ios/chrome/browser/shared/ui/table_view",
     "//ios/chrome/browser/shared/ui/table_view:utils",
@@ -126,14 +123,11 @@
     "//base/test:test_support",
     "//components/affiliations/core/browser:test_support",
     "//components/password_manager/core/browser:test_support",
-    "//components/password_manager/core/common:features",
     "//components/signin/public/identity_manager/objc",
     "//components/sync/base",
     "//components/webauthn/core/browser",
     "//components/webauthn/core/browser:test_support",
     "//ios/chrome/app/strings",
-    "//ios/chrome/browser/credential_provider/model:features",
-    "//ios/chrome/browser/passwords/model:features",
     "//ios/chrome/browser/passwords/model:store_factory",
     "//ios/chrome/browser/passwords/model/metrics",
     "//ios/chrome/browser/settings/ui_bundled/password:features",
diff --git a/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller.mm b/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller.mm
index 0a5cc07a07..48db053 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller.mm
+++ b/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller.mm
@@ -11,7 +11,6 @@
 #import "base/apple/foundation_util.h"
 #import "base/check.h"
 #import "base/check_op.h"
-#import "base/feature_list.h"
 #import "base/i18n/message_formatter.h"
 #import "base/metrics/histogram_functions.h"
 #import "base/metrics/user_metrics.h"
@@ -20,11 +19,8 @@
 #import "components/password_manager/core/browser/password_manager_metrics_util.h"
 #import "components/strings/grit/components_strings.h"
 #import "ios/chrome/app/tests_hook.h"
-#import "ios/chrome/browser/credential_provider/model/features.h"
-#import "ios/chrome/browser/settings/ui_bundled/password/password_manager_ui_features.h"
 #import "ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_constants.h"
 #import "ios/chrome/browser/shared/coordinator/utils/credential_provider_settings_utils.h"
-#import "ios/chrome/browser/shared/public/features/features.h"
 #import "ios/chrome/browser/shared/ui/symbols/symbols.h"
 #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_text_item.h"
 #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_image_item.h"
@@ -122,12 +118,6 @@
   return should_show_item;
 }
 
-// Whether automatic passkey upgrades feature is enabled.
-BOOL AutomaticPasskeyUpgradeFeatureEnabled() {
-  return base::FeatureList::IsEnabled(
-      kCredentialProviderAutomaticPasskeyUpgrade);
-}
-
 }  // namespace
 
 @implementation PasswordSettingsViewController {
@@ -1247,8 +1237,7 @@
 // Automatic passkey upgrades switch should be displayed if the feature is
 // enabled and both saving passkeys and password setting is enabled.
 - (BOOL)shouldDisplayPasskeyUpgradesSwitch {
-  return AutomaticPasskeyUpgradeFeatureEnabled() && _savingPasswordsEnabled &&
-         _savingPasskeysEnabled;
+  return _savingPasswordsEnabled && _savingPasskeysEnabled;
 }
 
 - (void)updateDeleteAllCredentialsSection {
diff --git a/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller_unittest.mm b/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller_unittest.mm
index 7b981083..667b017 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller_unittest.mm
+++ b/ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_view_controller_unittest.mm
@@ -7,11 +7,8 @@
 #import "base/apple/foundation_util.h"
 #import "base/test/ios/wait_util.h"
 #import "base/test/metrics/histogram_tester.h"
-#import "base/test/scoped_feature_list.h"
 #import "base/test/task_environment.h"
 #import "base/test/test_timeouts.h"
-#import "ios/chrome/browser/credential_provider/model/features.h"
-#import "ios/chrome/browser/settings/ui_bundled/password/password_manager_ui_features.h"
 #import "ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_constants.h"
 #import "ios/chrome/browser/settings/ui_bundled/password/password_settings/password_settings_consumer.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
@@ -99,10 +96,6 @@
 };
 
 TEST_F(PasswordSettingsViewControllerTest, OrdersSectionsCorrectly) {
-  // TODO(crbug.com/355666571): Clean up after launch.
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(kCredentialProviderAutomaticPasskeyUpgrade);
-
   // Ensure all sections are visible.
   [controller() setCanBulkMove:YES localPasswordsCount:2];
   [controller() setSavingPasswordsEnabled:YES managedByPolicy:NO];
@@ -252,13 +245,7 @@
 }
 
 TEST_F(PasswordSettingsViewControllerTest,
-       DisplaysAutomaticPasskeyUpgradesSwitchWithFeatureEnabled) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      kCredentialProviderAutomaticPasskeyUpgrade);
-
-  // Re-create the controller so that the enabled flag is picked up.
-  CreateController();
+       DisplaysAutomaticPasskeyUpgradesSwitch) {
   [controller() setSavingPasswordsEnabled:YES managedByPolicy:NO];
   [controller() setSavingPasskeysEnabled:YES];
 
diff --git a/ios/chrome/browser/settings/ui_bundled/translate_table_view_controller.mm b/ios/chrome/browser/settings/ui_bundled/translate_table_view_controller.mm
index 4db8829..6f2abdd 100644
--- a/ios/chrome/browser/settings/ui_bundled/translate_table_view_controller.mm
+++ b/ios/chrome/browser/settings/ui_bundled/translate_table_view_controller.mm
@@ -24,6 +24,7 @@
 #import "ios/chrome/browser/shared/model/prefs/pref_backed_boolean.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
 #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_text_item.h"
 #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_link_header_footer_item.h"
 #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_switch_cell.h"
@@ -31,7 +32,6 @@
 #import "ios/chrome/browser/shared/ui/table_view/table_view_model.h"
 #import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
 #import "ios/chrome/browser/translate/model/chrome_ios_translate_client.h"
 #import "ios/chrome/grit/ios_branded_strings.h"
 #import "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/shared/model/prefs/browser_prefs.mm b/ios/chrome/browser/shared/model/prefs/browser_prefs.mm
index 307d4ddd..1bed2fa 100644
--- a/ios/chrome/browser/shared/model/prefs/browser_prefs.mm
+++ b/ios/chrome/browser/shared/model/prefs/browser_prefs.mm
@@ -751,9 +751,9 @@
   tab_resumption_prefs::RegisterProfilePrefs(registry);
   reader_mode_prefs::RegisterProfilePrefs(registry);
 
-  [BookmarkMediator registerBrowserStatePrefs:registry];
-  [BookmarkPathCache registerBrowserStatePrefs:registry];
-  [BookmarksHomeMediator registerBrowserStatePrefs:registry];
+  [BookmarkMediator registerProfilePrefs:registry];
+  [BookmarkPathCache registerProfilePrefs:registry];
+  [BookmarksHomeMediator registerProfilePrefs:registry];
   [ContentSuggestionsMediator registerProfilePrefs:registry];
   [HandoffManager registerBrowserStatePrefs:registry];
   [SigninCoordinator registerProfilePrefs:registry];
diff --git a/ios/chrome/browser/shared/model/profile/profile_keyed_service_factory_ios.cc b/ios/chrome/browser/shared/model/profile/profile_keyed_service_factory_ios.cc
index 51aa9c9..d43be881 100644
--- a/ios/chrome/browser/shared/model/profile/profile_keyed_service_factory_ios.cc
+++ b/ios/chrome/browser/shared/model/profile/profile_keyed_service_factory_ios.cc
@@ -22,6 +22,16 @@
   return testing_creation_ == TestingCreation::kNoServiceForTests;
 }
 
+void ProfileKeyedServiceFactoryIOS::RegisterBrowserStatePrefs(
+    user_prefs::PrefRegistrySyncable* registry) {
+  RegisterProfilePrefs(registry);
+}
+
+void ProfileKeyedServiceFactoryIOS::RegisterProfilePrefs(
+    user_prefs::PrefRegistrySyncable* registry) {
+  // Nothing to do.
+}
+
 KeyedService* ProfileKeyedServiceFactoryIOS::GetServiceForProfile(
     ProfileIOS* profile,
     bool create) {
diff --git a/ios/chrome/browser/shared/model/profile/profile_keyed_service_factory_ios.h b/ios/chrome/browser/shared/model/profile/profile_keyed_service_factory_ios.h
index 43468bf..1d1a849 100644
--- a/ios/chrome/browser/shared/model/profile/profile_keyed_service_factory_ios.h
+++ b/ios/chrome/browser/shared/model/profile/profile_keyed_service_factory_ios.h
@@ -72,6 +72,12 @@
   web::BrowserState* GetBrowserStateToUse(web::BrowserState* ctx) const final;
   bool ServiceIsCreatedWithBrowserState() const final;
   bool ServiceIsNULLWhileTesting() const final;
+  void RegisterBrowserStatePrefs(
+      user_prefs::PrefRegistrySyncable* registry) override;
+
+  // Registers any user preferences on this service. This should be overridden
+  // by any service that wants to register profile-specific preferences.
+  virtual void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
 
   // Helper that casts the value returned by GetKeyedServiceForProfile() to the
   // sub-class T of KeyedService.
diff --git a/ios/chrome/browser/shared/model/profile/refcounted_profile_keyed_service_factory_ios.cc b/ios/chrome/browser/shared/model/profile/refcounted_profile_keyed_service_factory_ios.cc
index a88e708..811e6fa7 100644
--- a/ios/chrome/browser/shared/model/profile/refcounted_profile_keyed_service_factory_ios.cc
+++ b/ios/chrome/browser/shared/model/profile/refcounted_profile_keyed_service_factory_ios.cc
@@ -25,6 +25,16 @@
   return testing_creation_ == TestingCreation::kNoServiceForTests;
 }
 
+void RefcountedProfileKeyedServiceFactoryIOS::RegisterBrowserStatePrefs(
+    user_prefs::PrefRegistrySyncable* registry) {
+  RegisterProfilePrefs(registry);
+}
+
+void RefcountedProfileKeyedServiceFactoryIOS::RegisterProfilePrefs(
+    user_prefs::PrefRegistrySyncable* registry) {
+  // Nothing to do.
+}
+
 scoped_refptr<RefcountedKeyedService>
 RefcountedProfileKeyedServiceFactoryIOS::GetServiceForProfile(
     ProfileIOS* profile,
diff --git a/ios/chrome/browser/shared/model/profile/refcounted_profile_keyed_service_factory_ios.h b/ios/chrome/browser/shared/model/profile/refcounted_profile_keyed_service_factory_ios.h
index c97d048..7fc0e08f 100644
--- a/ios/chrome/browser/shared/model/profile/refcounted_profile_keyed_service_factory_ios.h
+++ b/ios/chrome/browser/shared/model/profile/refcounted_profile_keyed_service_factory_ios.h
@@ -77,6 +77,12 @@
   web::BrowserState* GetBrowserStateToUse(web::BrowserState* ctx) const final;
   bool ServiceIsCreatedWithBrowserState() const final;
   bool ServiceIsNULLWhileTesting() const final;
+  void RegisterBrowserStatePrefs(
+      user_prefs::PrefRegistrySyncable* registry) override;
+
+  // Registers any user preferences on this service. This should be overridden
+  // by any service that wants to register profile-specific preferences.
+  virtual void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
 
   // Helper that casts the value returned by GetKeyedServiceForProfile() to the
   // sub-class T of KeyedService.
diff --git a/ios/chrome/browser/snackbar/public/BUILD.gn b/ios/chrome/browser/shared/public/snackbar/BUILD.gn
similarity index 94%
rename from ios/chrome/browser/snackbar/public/BUILD.gn
rename to ios/chrome/browser/shared/public/snackbar/BUILD.gn
index c7e129e..d94c717 100644
--- a/ios/chrome/browser/snackbar/public/BUILD.gn
+++ b/ios/chrome/browser/shared/public/snackbar/BUILD.gn
@@ -2,14 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-source_set("constants") {
-  sources = [
-    "snackbar_constants.h",
-    "snackbar_constants.mm",
-  ]
-}
-
-source_set("public") {
+source_set("snackbar") {
   sources = [
     "snackbar_message.h",
     "snackbar_message.mm",
@@ -22,3 +15,10 @@
   ]
   frameworks = [ "Foundation.framework" ]
 }
+
+source_set("constants") {
+  sources = [
+    "snackbar_constants.h",
+    "snackbar_constants.mm",
+  ]
+}
diff --git a/ios/chrome/browser/snackbar/public/snackbar_constants.h b/ios/chrome/browser/shared/public/snackbar/snackbar_constants.h
similarity index 82%
rename from ios/chrome/browser/snackbar/public/snackbar_constants.h
rename to ios/chrome/browser/shared/public/snackbar/snackbar_constants.h
index e79eba5f..8d46ee6 100644
--- a/ios/chrome/browser/snackbar/public/snackbar_constants.h
+++ b/ios/chrome/browser/shared/public/snackbar/snackbar_constants.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_SNACKBAR_PUBLIC_SNACKBAR_CONSTANTS_H_
-#define IOS_CHROME_BROWSER_SNACKBAR_PUBLIC_SNACKBAR_CONSTANTS_H_
+#ifndef IOS_CHROME_BROWSER_SHARED_PUBLIC_SNACKBAR_SNACKBAR_CONSTANTS_H_
+#define IOS_CHROME_BROWSER_SHARED_PUBLIC_SNACKBAR_SNACKBAR_CONSTANTS_H_
 
 #import <Foundation/Foundation.h>
 
@@ -22,4 +22,4 @@
 // Accessibility identifier for the snackbar trailing accessory view.
 extern NSString* const kSnackbarTrailingAccessoryAccessibilityId;
 
-#endif  // IOS_CHROME_BROWSER_SNACKBAR_PUBLIC_SNACKBAR_CONSTANTS_H_
+#endif  // IOS_CHROME_BROWSER_SHARED_PUBLIC_SNACKBAR_SNACKBAR_CONSTANTS_H_
diff --git a/ios/chrome/browser/snackbar/public/snackbar_constants.mm b/ios/chrome/browser/shared/public/snackbar/snackbar_constants.mm
similarity index 91%
rename from ios/chrome/browser/snackbar/public/snackbar_constants.mm
rename to ios/chrome/browser/shared/public/snackbar/snackbar_constants.mm
index becba24..b26b52bb 100644
--- a/ios/chrome/browser/snackbar/public/snackbar_constants.mm
+++ b/ios/chrome/browser/shared/public/snackbar/snackbar_constants.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/snackbar/public/snackbar_constants.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_constants.h"
 
 NSString* const kSnackbarAccessibilityId = @"kSnackbarAccessibilityId";
 NSString* const kSnackbarTitleAccessibilityId =
diff --git a/ios/chrome/browser/snackbar/public/snackbar_message.h b/ios/chrome/browser/shared/public/snackbar/snackbar_message.h
similarity index 90%
rename from ios/chrome/browser/snackbar/public/snackbar_message.h
rename to ios/chrome/browser/shared/public/snackbar/snackbar_message.h
index 507dd58f..40f64c7 100644
--- a/ios/chrome/browser/snackbar/public/snackbar_message.h
+++ b/ios/chrome/browser/shared/public/snackbar/snackbar_message.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_SNACKBAR_PUBLIC_SNACKBAR_MESSAGE_H_
-#define IOS_CHROME_BROWSER_SNACKBAR_PUBLIC_SNACKBAR_MESSAGE_H_
+#ifndef IOS_CHROME_BROWSER_SHARED_PUBLIC_SNACKBAR_SNACKBAR_MESSAGE_H_
+#define IOS_CHROME_BROWSER_SHARED_PUBLIC_SNACKBAR_SNACKBAR_MESSAGE_H_
 
 #import <UIKit/UIKit.h>
 
@@ -56,4 +56,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_SNACKBAR_PUBLIC_SNACKBAR_MESSAGE_H_
+#endif  // IOS_CHROME_BROWSER_SHARED_PUBLIC_SNACKBAR_SNACKBAR_MESSAGE_H_
diff --git a/ios/chrome/browser/snackbar/public/snackbar_message.mm b/ios/chrome/browser/shared/public/snackbar/snackbar_message.mm
similarity index 87%
rename from ios/chrome/browser/snackbar/public/snackbar_message.mm
rename to ios/chrome/browser/shared/public/snackbar/snackbar_message.mm
index 5b8eda5..44779eeb 100644
--- a/ios/chrome/browser/snackbar/public/snackbar_message.mm
+++ b/ios/chrome/browser/shared/public/snackbar/snackbar_message.mm
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
 
 #import <MaterialComponents/MaterialSnackbar.h>
 
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 
 namespace {
 
diff --git a/ios/chrome/browser/snackbar/public/snackbar_message_action.h b/ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h
similarity index 70%
rename from ios/chrome/browser/snackbar/public/snackbar_message_action.h
rename to ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h
index 1c847ff..15639a8 100644
--- a/ios/chrome/browser/snackbar/public/snackbar_message_action.h
+++ b/ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_SNACKBAR_PUBLIC_SNACKBAR_MESSAGE_ACTION_H_
-#define IOS_CHROME_BROWSER_SNACKBAR_PUBLIC_SNACKBAR_MESSAGE_ACTION_H_
+#ifndef IOS_CHROME_BROWSER_SHARED_PUBLIC_SNACKBAR_SNACKBAR_MESSAGE_ACTION_H_
+#define IOS_CHROME_BROWSER_SHARED_PUBLIC_SNACKBAR_SNACKBAR_MESSAGE_ACTION_H_
 
 #import <Foundation/Foundation.h>
 
@@ -21,4 +21,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_SNACKBAR_PUBLIC_SNACKBAR_MESSAGE_ACTION_H_
+#endif  // IOS_CHROME_BROWSER_SHARED_PUBLIC_SNACKBAR_SNACKBAR_MESSAGE_ACTION_H_
diff --git a/ios/chrome/browser/snackbar/public/snackbar_message_action.mm b/ios/chrome/browser/shared/public/snackbar/snackbar_message_action.mm
similarity index 70%
rename from ios/chrome/browser/snackbar/public/snackbar_message_action.mm
rename to ios/chrome/browser/shared/public/snackbar/snackbar_message_action.mm
index b6e00f22a..e58c940 100644
--- a/ios/chrome/browser/snackbar/public/snackbar_message_action.mm
+++ b/ios/chrome/browser/shared/public/snackbar/snackbar_message_action.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 
 @implementation SnackbarMessageAction
 @end
diff --git a/ios/chrome/browser/shared/ui/util/BUILD.gn b/ios/chrome/browser/shared/ui/util/BUILD.gn
index 6fbc3a0..51d3e31 100644
--- a/ios/chrome/browser/shared/ui/util/BUILD.gn
+++ b/ios/chrome/browser/shared/ui/util/BUILD.gn
@@ -86,7 +86,7 @@
   deps = [
     "//base",
     "//ios/chrome/app:tests_hook",
-    "//ios/chrome/browser/snackbar/public",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/third_party/material_components_ios",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/shared/ui/util/DEPS b/ios/chrome/browser/shared/ui/util/DEPS
index 915f57eb..b20ab3a 100644
--- a/ios/chrome/browser/shared/ui/util/DEPS
+++ b/ios/chrome/browser/shared/ui/util/DEPS
@@ -1,9 +1,3 @@
 # Copyright 2025 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
-
-specific_include_rules = {
-    "snackbar_util.mm": [
-        "+ios/chrome/browser/snackbar/public",
-    ],
-}
diff --git a/ios/chrome/browser/shared/ui/util/identity_snackbar/BUILD.gn b/ios/chrome/browser/shared/ui/util/identity_snackbar/BUILD.gn
index bfaf066..7a8e5bb4 100644
--- a/ios/chrome/browser/shared/ui/util/identity_snackbar/BUILD.gn
+++ b/ios/chrome/browser/shared/ui/util/identity_snackbar/BUILD.gn
@@ -19,6 +19,7 @@
     "//ios/chrome/browser/shared/model/profile",
     "//ios/chrome/browser/shared/model/profile:features",
     "//ios/chrome/browser/shared/public/commands",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/symbols",
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
@@ -26,7 +27,6 @@
     "//ios/chrome/browser/signin/model:authentication_service_factory",
     "//ios/chrome/browser/signin/model:constants",
     "//ios/chrome/browser/signin/model:system_identity",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/common/ui/colors",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/shared/ui/util/identity_snackbar/DEPS b/ios/chrome/browser/shared/ui/util/identity_snackbar/DEPS
index 880da98..5868724 100644
--- a/ios/chrome/browser/shared/ui/util/identity_snackbar/DEPS
+++ b/ios/chrome/browser/shared/ui/util/identity_snackbar/DEPS
@@ -6,5 +6,4 @@
   "+ios/chrome/browser/signin/model/constants.h",
   "+ios/chrome/browser/signin/model/identity_manager_factory.h",
   "+ios/chrome/browser/signin/model/system_identity.h",
-  "+ios/chrome/browser/snackbar/public",
 ]
diff --git a/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_utils.mm b/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_utils.mm
index a935b04..c7c7da83 100644
--- a/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_utils.mm
+++ b/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_utils.mm
@@ -14,6 +14,7 @@
 #import "ios/chrome/browser/shared/model/profile/profile_ios.h"
 #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
 #import "ios/chrome/browser/shared/ui/symbols/symbols.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
@@ -23,7 +24,6 @@
 #import "ios/chrome/browser/signin/model/constants.h"
 #import "ios/chrome/browser/signin/model/identity_manager_factory.h"
 #import "ios/chrome/browser/signin/model/system_identity.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/grit/ios_branded_strings.h"
 #import "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/shared/ui/util/snackbar_util.mm b/ios/chrome/browser/shared/ui/util/snackbar_util.mm
index 823348af..8aeedce 100644
--- a/ios/chrome/browser/shared/ui/util/snackbar_util.mm
+++ b/ios/chrome/browser/shared/ui/util/snackbar_util.mm
@@ -8,7 +8,7 @@
 
 #import "base/time/time.h"
 #import "ios/chrome/app/tests_hook.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
 
 MDCSnackbarMessage* CreateSnackbarMessage(NSString* text) {
   MDCSnackbarMessage* snackbar_message =
diff --git a/ios/chrome/browser/snackbar/ui_bundled/BUILD.gn b/ios/chrome/browser/snackbar/ui_bundled/BUILD.gn
index e697431c..4c0bed40 100644
--- a/ios/chrome/browser/snackbar/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/snackbar/ui_bundled/BUILD.gn
@@ -14,11 +14,11 @@
     "//ios/chrome/browser/shared/coordinator/scene:scene_state_header",
     "//ios/chrome/browser/shared/model/browser",
     "//ios/chrome/browser/shared/public/commands",
+    "//ios/chrome/browser/shared/public/snackbar",
+    "//ios/chrome/browser/shared/public/snackbar:constants",
     "//ios/chrome/browser/shared/ui/chrome_overlay_window",
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
-    "//ios/chrome/browser/snackbar/public",
-    "//ios/chrome/browser/snackbar/public:constants",
     "//ios/chrome/browser/snackbar/ui_bundled/ui",
     "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
@@ -38,7 +38,7 @@
     "//ios/chrome/app:tests_hook",
     "//ios/chrome/browser/shared/model/browser",
     "//ios/chrome/browser/shared/public/commands",
-    "//ios/chrome/browser/snackbar/public",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/test/app:test_support",
   ]
 }
@@ -60,7 +60,7 @@
   deps = [
     ":eg_test_support+eg2",
     "//base/test:test_support",
-    "//ios/chrome/browser/snackbar/public:constants",
+    "//ios/chrome/browser/shared/public/snackbar:constants",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
     "//ui/base",
diff --git a/ios/chrome/browser/snackbar/ui_bundled/snackbar_coordinator.mm b/ios/chrome/browser/snackbar/ui_bundled/snackbar_coordinator.mm
index f8186df..f31a954 100644
--- a/ios/chrome/browser/snackbar/ui_bundled/snackbar_coordinator.mm
+++ b/ios/chrome/browser/snackbar/ui_bundled/snackbar_coordinator.mm
@@ -10,23 +10,14 @@
 #import "ios/chrome/browser/shared/model/browser/browser.h"
 #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/browser/shared/ui/chrome_overlay_window/chrome_overlay_window.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
 #import "ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view.h"
 #import "ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view_delegate.h"
 
-namespace {
-// The amount of time after a snackbar is presented, during which it will
-// retain a11y focus so that VoiceOver is not interrupted by a modal dismissal
-// transition.
-const double kRetainA11yFocusSeconds = 0.75;
-// The duration of the snackbar fade in/out animation.
-const NSTimeInterval kSnackbarAnimationDuration = 0.3;
-}  // namespace
-
 @interface SnackbarCoordinator () <SnackbarViewDelegate>
 @end
 
@@ -34,6 +25,9 @@
   __weak id<SnackbarCoordinatorDelegate> _delegate;
   SnackbarView* _snackbarView;
   ChromeOverlayWindow* _overlay_window;
+  // Flag to prevent dismissal logic from running multiple times from concurrent
+  // events (e.g., user tap and timer firing simultaneously).
+  BOOL _isDismissing;
 }
 
 - (instancetype)initWithBaseViewController:(UIViewController*)baseViewController
@@ -166,22 +160,22 @@
     return;
   }
 
+  // A dismissal can be triggered by the timer and by a user tap concurrently.
+  // This flag prevents the dismissal logic from running more than once.
+  if (_isDismissing) {
+    return;
+  }
+  _isDismissing = YES;
+
   if (_snackbarView.message.completionHandler) {
     _snackbarView.message.completionHandler(NO);
   }
 
-  BOOL shouldAnimate = animated && !UIAccessibilityIsReduceMotionEnabled();
-  if (shouldAnimate) {
-    [UIView animateWithDuration:kSnackbarAnimationDuration
-        animations:^{
-          [self updateSnackbarAlpha:0.0];
-        }
-        completion:^(BOOL finished) {
-          [self removeSnackbarView];
-        }];
-  } else {
-    [self removeSnackbarView];
-  }
+  __weak __typeof(self) weakSelf = self;
+  [_snackbarView dismissAnimated:animated
+                      completion:^{
+                        [weakSelf removeSnackbarView];
+                      }];
 }
 
 #pragma mark - SnackbarViewDelegate
@@ -190,8 +184,9 @@
   [self dismissSnackbar:snackbarView animated:YES];
 }
 
-- (void)snackbarViewWasTapped:(SnackbarView*)snackbarView {
-  [self dismissSnackbar:snackbarView animated:YES];
+- (void)snackbarViewDidRequestDismissal:(SnackbarView*)snackbarView
+                               animated:(BOOL)animated {
+  [self dismissSnackbar:snackbarView animated:animated];
 }
 
 #pragma mark - Private
@@ -200,78 +195,35 @@
 // presents a new `SnackbarView`.
 - (void)presentSnackbar:(SnackbarMessage*)message
        withBottomOffset:(CGFloat)offset {
+  // If a snackbar is already showing, dismiss it before showing the new one.
   if (_snackbarView) {
     [self dismissAllSnackbars];
   }
+  _isDismissing = NO;
 
+  // Create and configure the new snackbar view.
   _snackbarView = [[SnackbarView alloc] initWithMessage:message];
   _snackbarView.delegate = self;
   _snackbarView.bottomOffset = offset;
 
+  // Add the snackbar to the window and present it.
   [_overlay_window activateOverlay:_snackbarView withLevel:UIWindowLevelNormal];
-
-  if (!UIAccessibilityIsReduceMotionEnabled()) {
-    [self updateSnackbarAlpha:0.0];
-    [UIView animateWithDuration:kSnackbarAnimationDuration
-                     animations:^{
-                       [self updateSnackbarAlpha:1.0];
-                     }];
-  }
-
-  if (UIAccessibilityIsVoiceOverRunning()) {
-    [self retainAccessibilityFocusOnView:_snackbarView.accessibilityFocusView
-                                 seconds:kRetainA11yFocusSeconds];
-    // Don't dismiss the snackbar if VoiceOver is running.
-    return;
-  }
-
-  __weak __typeof(self) weakSelf = self;
-  __weak SnackbarView* weakSnackbarView = _snackbarView;
-  dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
-                               (int64_t)(message.duration * NSEC_PER_SEC)),
-                 dispatch_get_main_queue(), ^{
-                   [weakSelf dismissSnackbar:weakSnackbarView animated:YES];
-                 });
-}
-
-// Updates the alpha of the snackbar view.
-- (void)updateSnackbarAlpha:(CGFloat)alpha {
-  _snackbarView.alpha = alpha;
+  [_snackbarView
+      presentAnimated:YES
+           completion:^{
+               // The view will now schedule its own dismissal and call
+               // the delegate when it's time.
+           }];
 }
 
 // Removes the snackbar view from the hierarchy and nils out the ivar.
 - (void)removeSnackbarView {
+  if (!_snackbarView) {
+    return;
+  }
   [_overlay_window deactivateOverlay:_snackbarView];
   _snackbarView = nil;
-}
-
-#pragma mark - Private
-
-// Forces `view` to retain the accessibility focus for `seconds`. If
-// another view becomes focused, the focus is forced back to `view`.
-- (void)retainAccessibilityFocusOnView:(UIView*)view seconds:(double)seconds {
-  __weak UIView* weakView = view;
-  auto retainFocus = ^(NSNotification* notification) {
-    id focusedElement = notification.userInfo[UIAccessibilityFocusedElementKey];
-    if (weakView && focusedElement != weakView) {
-      UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification,
-                                      weakView);
-    }
-  };
-
-  // Observe accessibility focus changes.
-  id observer = [[NSNotificationCenter defaultCenter]
-      addObserverForName:UIAccessibilityElementFocusedNotification
-                  object:nil
-                   queue:nil
-              usingBlock:retainFocus];
-
-  // Stop observing after `seconds`.
-  dispatch_time_t time =
-      dispatch_time(DISPATCH_TIME_NOW, seconds * NSEC_PER_SEC);
-  dispatch_after(time, dispatch_get_main_queue(), ^{
-    [[NSNotificationCenter defaultCenter] removeObserver:observer];
-  });
+  _isDismissing = NO;
 }
 
 @end
diff --git a/ios/chrome/browser/snackbar/ui_bundled/snackbar_view_egtest.mm b/ios/chrome/browser/snackbar/ui_bundled/snackbar_view_egtest.mm
index 3b12d61..0fce922 100644
--- a/ios/chrome/browser/snackbar/ui_bundled/snackbar_view_egtest.mm
+++ b/ios/chrome/browser/snackbar/ui_bundled/snackbar_view_egtest.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/snackbar/public/snackbar_constants.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_constants.h"
 #import "ios/chrome/browser/snackbar/ui_bundled/snackbar_view_test_app_interface.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
diff --git a/ios/chrome/browser/snackbar/ui_bundled/snackbar_view_test_app_interface.mm b/ios/chrome/browser/snackbar/ui_bundled/snackbar_view_test_app_interface.mm
index 5781d01..d3cea73 100644
--- a/ios/chrome/browser/snackbar/ui_bundled/snackbar_view_test_app_interface.mm
+++ b/ios/chrome/browser/snackbar/ui_bundled/snackbar_view_test_app_interface.mm
@@ -9,8 +9,8 @@
 #import "ios/chrome/browser/shared/model/browser/browser.h"
 #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 
 @implementation SnackbarViewTestAppInterface
diff --git a/ios/chrome/browser/snackbar/ui_bundled/ui/BUILD.gn b/ios/chrome/browser/snackbar/ui_bundled/ui/BUILD.gn
index a0a25bc..a95ddc0 100644
--- a/ios/chrome/browser/snackbar/ui_bundled/ui/BUILD.gn
+++ b/ios/chrome/browser/snackbar/ui_bundled/ui/BUILD.gn
@@ -11,9 +11,9 @@
   deps = [
     "//base",
     "//ios/chrome/app/strings",
+    "//ios/chrome/browser/shared/public/snackbar",
+    "//ios/chrome/browser/shared/public/snackbar:constants",
     "//ios/chrome/browser/shared/ui/util",
-    "//ios/chrome/browser/snackbar/public",
-    "//ios/chrome/browser/snackbar/public:constants",
     "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ui/base",
diff --git a/ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view.h b/ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view.h
index b903f422..41a28ac 100644
--- a/ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view.h
+++ b/ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view.h
@@ -22,9 +22,6 @@
 // The bottom offset for the snackbar.
 @property(nonatomic, assign) CGFloat bottomOffset;
 
-// The view that should receive accessibility focus when the snackbar appears.
-@property(nonatomic, strong, readonly) UIView* accessibilityFocusView;
-
 // Designated initializer.
 - (instancetype)initWithMessage:(SnackbarMessage*)message
     NS_DESIGNATED_INITIALIZER;
@@ -33,6 +30,12 @@
 - (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
 - (instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE;
 
+// Presents the snackbar.
+- (void)presentAnimated:(BOOL)animated completion:(void (^)(void))completion;
+
+// Dismisses the snackbar.
+- (void)dismissAnimated:(BOOL)animated completion:(void (^)(void))completion;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_SNACKBAR_UI_BUNDLED_UI_SNACKBAR_VIEW_H_
diff --git a/ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view.mm b/ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view.mm
index 9caa65fe..9fe5d97 100644
--- a/ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view.mm
+++ b/ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view.mm
@@ -5,10 +5,10 @@
 #import "ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view.h"
 
 #import "base/check.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_constants.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_constants.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
 #import "ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view_delegate.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
@@ -17,6 +17,14 @@
 
 namespace {
 
+// The amount of time after a snackbar is presented, during which it will
+// retain a11y focus so that VoiceOver is not interrupted by a modal dismissal
+// transition.
+const double kRetainA11yFocusSeconds = 0.75;
+
+// Animation constants.
+const NSTimeInterval kSnackbarAnimationDuration = 0.3;
+
 // Snackbar constants.
 const CGFloat kSnackbarCornerRadius = 16.0;
 const CGFloat kHorizontalPadding = 16.0;
@@ -79,6 +87,53 @@
   return self;
 }
 
+#pragma mark - Public
+
+- (void)presentAnimated:(BOOL)animated completion:(void (^)(void))completion {
+  if (UIAccessibilityIsVoiceOverRunning()) {
+    [self retainAccessibilityFocus];
+  }
+
+  if (animated && !UIAccessibilityIsReduceMotionEnabled()) {
+    self.alpha = 0.0;
+    [UIView animateWithDuration:kSnackbarAnimationDuration
+        animations:^{
+          self.alpha = 1.0;
+        }
+        completion:^(BOOL finished) {
+          [self scheduleDismissal];
+          if (completion) {
+            completion();
+          }
+        }];
+  } else {
+    [self scheduleDismissal];
+    if (completion) {
+      completion();
+    }
+  }
+}
+
+- (void)dismissAnimated:(BOOL)animated completion:(void (^)(void))completion {
+  if (animated && !UIAccessibilityIsReduceMotionEnabled()) {
+    [UIView animateWithDuration:kSnackbarAnimationDuration
+        animations:^{
+          self.alpha = 0.0;
+        }
+        completion:^(BOOL finished) {
+          if (completion) {
+            completion();
+          }
+        }];
+  } else {
+    if (completion) {
+      completion();
+    }
+  }
+}
+
+#pragma mark - UIView
+
 - (void)didMoveToWindow {
   [super didMoveToWindow];
   [self updateUserInterfaceStyle];
@@ -97,18 +152,23 @@
   }
 }
 
-- (UIView*)accessibilityFocusView {
-  return _titleLabel;
-}
-
-#pragma mark - UIView
-
 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event {
   // The snackbar view can be larger than its content view. Only intercept
   // touches that are within the content view.
   return CGRectContainsPoint(_contentView.frame, point);
 }
 
+#pragma mark - UIGestureRecognizerDelegate
+
+- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer
+       shouldReceiveTouch:(UITouch*)touch {
+  // Don't handle taps on the action button.
+  if (touch.view == _button) {
+    return NO;
+  }
+  return YES;
+}
+
 #pragma mark - Private
 
 // Main setup method.
@@ -443,18 +503,49 @@
 
 // Handles the view tap.
 - (void)handleViewTap {
-  [self.delegate snackbarViewWasTapped:self];
+  [self.delegate snackbarViewDidRequestDismissal:self animated:YES];
 }
 
-#pragma mark - UIGestureRecognizerDelegate
+// If another view becomes focused, the focus is forced back to the title view.
+- (void)retainAccessibilityFocus {
+  __weak UIView* weakView = _titleLabel;
+  auto retainFocus = ^(NSNotification* notification) {
+    id focusedElement = notification.userInfo[UIAccessibilityFocusedElementKey];
+    if (weakView && focusedElement != weakView) {
+      UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification,
+                                      weakView);
+    }
+  };
 
-- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer
-       shouldReceiveTouch:(UITouch*)touch {
-  // Don't handle taps on the action button.
-  if (touch.view == _button) {
-    return NO;
+  // Observe accessibility focus changes.
+  id observer = [[NSNotificationCenter defaultCenter]
+      addObserverForName:UIAccessibilityElementFocusedNotification
+                  object:nil
+                   queue:nil
+              usingBlock:retainFocus];
+
+  // Stop observing after `kRetainA11yFocusSeconds`.
+  dispatch_time_t time =
+      dispatch_time(DISPATCH_TIME_NOW, kRetainA11yFocusSeconds * NSEC_PER_SEC);
+  dispatch_after(time, dispatch_get_main_queue(), ^{
+    [[NSNotificationCenter defaultCenter] removeObserver:observer];
+  });
+}
+
+// Schedules the automatic dismissal of the snackbar.
+- (void)scheduleDismissal {
+  // Don't auto-dismiss if VoiceOver is running.
+  if (UIAccessibilityIsVoiceOverRunning()) {
+    return;
   }
-  return YES;
+
+  __weak __typeof(self) weakSelf = self;
+  dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
+                               (int64_t)(self.message.duration * NSEC_PER_SEC)),
+                 dispatch_get_main_queue(), ^{
+                   [weakSelf.delegate snackbarViewDidRequestDismissal:weakSelf
+                                                             animated:YES];
+                 });
 }
 
 @end
diff --git a/ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view_delegate.h b/ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view_delegate.h
index 93c3fdf..bb65779 100644
--- a/ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view_delegate.h
+++ b/ios/chrome/browser/snackbar/ui_bundled/ui/snackbar_view_delegate.h
@@ -13,8 +13,9 @@
 // Called when the action button is tapped.
 - (void)snackbarViewDidTapActionButton:(SnackbarView*)snackbarView;
 
-// Called when the snackbar view itself is tapped.
-- (void)snackbarViewWasTapped:(SnackbarView*)snackbarView;
+// Called when the snackbar view requests to be dismissed.
+- (void)snackbarViewDidRequestDismissal:(SnackbarView*)snackbarView
+                               animated:(BOOL)animated;
 
 @end
 
diff --git a/ios/chrome/browser/supervised_user/coordinator/BUILD.gn b/ios/chrome/browser/supervised_user/coordinator/BUILD.gn
index 0a1cc5e..0a9d5e5a 100644
--- a/ios/chrome/browser/supervised_user/coordinator/BUILD.gn
+++ b/ios/chrome/browser/supervised_user/coordinator/BUILD.gn
@@ -22,8 +22,8 @@
     "//ios/chrome/browser/shared/model/browser",
     "//ios/chrome/browser/shared/model/profile",
     "//ios/chrome/browser/shared/public/commands",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/browser/supervised_user/model",
     "//ios/chrome/browser/supervised_user/ui",
     "//ios/chrome/browser/supervised_user/ui:constants",
diff --git a/ios/chrome/browser/supervised_user/coordinator/DEPS b/ios/chrome/browser/supervised_user/coordinator/DEPS
index d15dfbbb7..39454e81 100644
--- a/ios/chrome/browser/supervised_user/coordinator/DEPS
+++ b/ios/chrome/browser/supervised_user/coordinator/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
   "+ios/chrome/browser/authentication",
   "+ios/chrome/browser/signin/model",
-  "+ios/chrome/browser/snackbar/public",
 ]
diff --git a/ios/chrome/browser/supervised_user/coordinator/parent_access_coordinator.mm b/ios/chrome/browser/supervised_user/coordinator/parent_access_coordinator.mm
index 26a6ea0..e0e79b2 100644
--- a/ios/chrome/browser/supervised_user/coordinator/parent_access_coordinator.mm
+++ b/ios/chrome/browser/supervised_user/coordinator/parent_access_coordinator.mm
@@ -16,9 +16,9 @@
 #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
 #import "ios/chrome/browser/shared/public/commands/parent_access_commands.h"
 #import "ios/chrome/browser/shared/public/commands/snackbar_commands.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
 #import "ios/chrome/browser/supervised_user/coordinator/parent_access_mediator.h"
 #import "ios/chrome/browser/supervised_user/coordinator/parent_access_mediator_delegate.h"
 #import "ios/chrome/browser/supervised_user/model/parent_access_tab_helper.h"
diff --git a/ios/chrome/browser/supervised_user/model/BUILD.gn b/ios/chrome/browser/supervised_user/model/BUILD.gn
index d296b47..a1a3a03 100644
--- a/ios/chrome/browser/supervised_user/model/BUILD.gn
+++ b/ios/chrome/browser/supervised_user/model/BUILD.gn
@@ -162,10 +162,10 @@
     "//ios/chrome/browser/settings/ui_bundled/clear_browsing_data:features",
     "//ios/chrome/browser/settings/ui_bundled/google_services:constants",
     "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/public/snackbar:constants",
     "//ios/chrome/browser/signin/model:capabilities_types",
     "//ios/chrome/browser/signin/model:fake_system_identity",
     "//ios/chrome/browser/signin/model:system_identity_manager",
-    "//ios/chrome/browser/snackbar/public:constants",
     "//ios/chrome/browser/supervised_user/ui:constants",
     "//ios/chrome/browser/tab_switcher/ui_bundled/tab_grid:tab_grid_metrics",
     "//ios/chrome/browser/tab_switcher/ui_bundled/tab_grid:tab_grid_ui_constants",
diff --git a/ios/chrome/browser/supervised_user/model/supervised_user_with_parental_controls_egtest.mm b/ios/chrome/browser/supervised_user/model/supervised_user_with_parental_controls_egtest.mm
index 2dba5eac..6d056f6 100644
--- a/ios/chrome/browser/supervised_user/model/supervised_user_with_parental_controls_egtest.mm
+++ b/ios/chrome/browser/supervised_user/model/supervised_user_with_parental_controls_egtest.mm
@@ -22,9 +22,9 @@
 #import "ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_constants.h"
 #import "ios/chrome/browser/settings/ui_bundled/supervised_user_settings_app_interface.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_constants.h"
 #import "ios/chrome/browser/signin/model/capabilities_types.h"
 #import "ios/chrome/browser/signin/model/fake_system_identity.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_constants.h"
 #import "ios/chrome/browser/supervised_user/ui/constants.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
diff --git a/ios/chrome/browser/tab_switcher/tab_grid/base_grid/coordinator/BUILD.gn b/ios/chrome/browser/tab_switcher/tab_grid/base_grid/coordinator/BUILD.gn
index f0ae540d..f6b5ef2b 100644
--- a/ios/chrome/browser/tab_switcher/tab_grid/base_grid/coordinator/BUILD.gn
+++ b/ios/chrome/browser/tab_switcher/tab_grid/base_grid/coordinator/BUILD.gn
@@ -26,8 +26,8 @@
     "//ios/chrome/browser/shared/model/web_state_list",
     "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/browser/tab_switcher/tab_grid/base_grid/ui",
     "//ios/chrome/browser/tab_switcher/tab_grid/base_grid/ui:grid_mediator_item_provider",
     "//ios/chrome/browser/tab_switcher/ui_bundled:tab_group_confirmation",
diff --git a/ios/chrome/browser/tab_switcher/tab_grid/base_grid/coordinator/DEPS b/ios/chrome/browser/tab_switcher/tab_grid/base_grid/coordinator/DEPS
index 663b08c..9f18e55 100644
--- a/ios/chrome/browser/tab_switcher/tab_grid/base_grid/coordinator/DEPS
+++ b/ios/chrome/browser/tab_switcher/tab_grid/base_grid/coordinator/DEPS
@@ -16,7 +16,6 @@
   "+ios/chrome/browser/reading_list/model",
   "+ios/chrome/browser/saved_tab_groups/model",
   "+ios/chrome/browser/snapshots/model",
-  "+ios/chrome/browser/snackbar/public",
   "+ios/chrome/browser/tabs_search/model",
   "+ios/chrome/browser/tab_switcher/tab_grid/base_grid/ui",
   "+ios/chrome/browser/url_loading/model",
diff --git a/ios/chrome/browser/tab_switcher/tab_grid/base_grid/coordinator/base_grid_coordinator.mm b/ios/chrome/browser/tab_switcher/tab_grid/base_grid/coordinator/base_grid_coordinator.mm
index f5cdcd0..cad7b009 100644
--- a/ios/chrome/browser/tab_switcher/tab_grid/base_grid/coordinator/base_grid_coordinator.mm
+++ b/ios/chrome/browser/tab_switcher/tab_grid/base_grid/coordinator/base_grid_coordinator.mm
@@ -24,9 +24,9 @@
 #import "ios/chrome/browser/shared/public/commands/tab_grid_toolbar_commands.h"
 #import "ios/chrome/browser/shared/public/commands/tab_group_confirmation_commands.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
 #import "ios/chrome/browser/tab_switcher/tab_grid/base_grid/coordinator/base_grid_coordinator+subclassing.h"
 #import "ios/chrome/browser/tab_switcher/tab_grid/base_grid/coordinator/base_grid_mediator.h"
 #import "ios/chrome/browser/tab_switcher/tab_grid/base_grid/ui/base_grid_view_controller.h"
diff --git a/ios/chrome/browser/tab_switcher/tab_strip/coordinator/BUILD.gn b/ios/chrome/browser/tab_switcher/tab_strip/coordinator/BUILD.gn
index 0d854e1c..1308c5b 100644
--- a/ios/chrome/browser/tab_switcher/tab_strip/coordinator/BUILD.gn
+++ b/ios/chrome/browser/tab_switcher/tab_strip/coordinator/BUILD.gn
@@ -46,11 +46,11 @@
     "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/shared/public/commands:shared_group_last_tab_commands",
     "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/public/snackbar",
     "//ios/chrome/browser/shared/ui/util:snackbar_util",
     "//ios/chrome/browser/sharing/ui_bundled",
     "//ios/chrome/browser/signin/model:authentication_service",
     "//ios/chrome/browser/signin/model:authentication_service_factory",
-    "//ios/chrome/browser/snackbar/public",
     "//ios/chrome/browser/tab_switcher/tab_strip/ui",
     "//ios/chrome/browser/tab_switcher/tab_strip/ui:swift",
     "//ios/chrome/browser/tab_switcher/tab_strip/ui:utils",
diff --git a/ios/chrome/browser/tab_switcher/tab_strip/coordinator/DEPS b/ios/chrome/browser/tab_switcher/tab_strip/coordinator/DEPS
index 6d295c7..b70f33cd 100644
--- a/ios/chrome/browser/tab_switcher/tab_strip/coordinator/DEPS
+++ b/ios/chrome/browser/tab_switcher/tab_strip/coordinator/DEPS
@@ -15,6 +15,5 @@
   "+ios/chrome/browser/saved_tab_groups/ui",
   "+ios/chrome/browser/sharing/ui_bundled",
   "+ios/chrome/browser/signin/model",
-  "+ios/chrome/browser/snackbar/public",
   "+ios/chrome/browser/web_state_list/model/web_state_list_favicon_driver_observer.h",
 ]
diff --git a/ios/chrome/browser/tab_switcher/tab_strip/coordinator/tab_strip_coordinator.mm b/ios/chrome/browser/tab_switcher/tab_strip/coordinator/tab_strip_coordinator.mm
index 773c3854..f704dbd 100644
--- a/ios/chrome/browser/tab_switcher/tab_strip/coordinator/tab_strip_coordinator.mm
+++ b/ios/chrome/browser/tab_switcher/tab_strip/coordinator/tab_strip_coordinator.mm
@@ -38,13 +38,13 @@
 #import "ios/chrome/browser/shared/public/commands/tab_groups_commands.h"
 #import "ios/chrome/browser/shared/public/commands/tab_strip_commands.h"
 #import "ios/chrome/browser/shared/public/commands/tab_strip_last_tab_dragged_alert_command.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_message_action.h"
 #import "ios/chrome/browser/shared/ui/util/snackbar_util.h"
 #import "ios/chrome/browser/sharing/ui_bundled/sharing_coordinator.h"
 #import "ios/chrome/browser/sharing/ui_bundled/sharing_params.h"
 #import "ios/chrome/browser/signin/model/authentication_service.h"
 #import "ios/chrome/browser/signin/model/authentication_service_factory.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_message_action.h"
 #import "ios/chrome/browser/tab_switcher/tab_strip/coordinator/tab_strip_mediator.h"
 #import "ios/chrome/browser/tab_switcher/tab_strip/coordinator/tab_strip_mediator_delegate.h"
 #import "ios/chrome/browser/tab_switcher/tab_strip/ui/context_menu/tab_strip_context_menu_helper.h"
diff --git a/ios/chrome/browser/whats_new/ui/strings/resources/ios_whats_new_strings_iw.xtb b/ios/chrome/browser/whats_new/ui/strings/resources/ios_whats_new_strings_iw.xtb
index 6d770e6..eaf6549 100644
--- a/ios/chrome/browser/whats_new/ui/strings/resources/ios_whats_new_strings_iw.xtb
+++ b/ios/chrome/browser/whats_new/ui/strings/resources/ios_whats_new_strings_iw.xtb
@@ -9,7 +9,7 @@
 <translation id="2657494017069155956">‏כדי להגיע מהר יותר לאפליקציה Chrome, אפשר להעביר אותה ל-Dock במסך הבית של האייפון</translation>
 <translation id="268174276332005428">‏בחירה של קבצים מ-Drive</translation>
 <translation id="3021342271734507256">משרטטים, מדגישים או לוחצים על כל דבר במסך כדי לחפש</translation>
-<translation id="3266153067803506235">‏לוחצים לחיצה ארוכה על סמל Chrome ואז לוחצים על 'עריכה של מסך הבית'</translation>
+<translation id="3266153067803506235">‏לוחצים לחיצה ארוכה על סמל Chrome ואז לוחצים על "עריכה של מסך הבית"</translation>
 <translation id="3872216204881482120">מסומנת בכוכב</translation>
 <translation id="3950820424414687140">כניסה</translation>
 <translation id="3958312024468322930">‏גוררים את הסמל אל ה-Dock שבחלק התחתון של מסך הבית</translation>
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb
index 0c6a1021..123247f 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb
@@ -30,7 +30,7 @@
 <translation id="3378214228000661758">إنشاء مفتاح مرور للحساب</translation>
 <translation id="3580107423202590938">‏ما مِن كلمات مرور محفوظة في متصفِّح Chrome</translation>
 <translation id="368844171100841558">استبدال</translation>
-<translation id="3739920431472254679">‏يتم حفظ كلمات المرور في "مدير كلمات المرور" من Google لتتمكّن من استخدامها على أي جهاز.</translation>
+<translation id="3739920431472254679">‏يتم حفظ كلمات المرور في "مدير كلمات المرور" من Google ليكون بإمكانك استخدامها على أي جهاز.</translation>
 <translation id="3766986124385716423">اسم المستخدم المعروض</translation>
 <translation id="3789385946721385622">اسم المستخدم</translation>
 <translation id="3830647155781949426">‏ستُحفظ كلمة المرور في "مدير كلمات المرور" من Google على عنوان البريد الإلكتروني <ph name="EMAIL" /> عند العودة إلى Chrome.</translation>
@@ -76,7 +76,7 @@
 <translation id="8219905600827687498">كلمات المرور المقترَحة</translation>
 <translation id="8300526662653766176">إعداد رمز مرور</translation>
 <translation id="8332511935157148552">لم يتم العثور على كلمات مرور.</translation>
-<translation id="8486024683491936104">هل تريد استبدال كلمة المرور؟</translation>
+<translation id="8486024683491936104">استبدال كلمة المرور؟</translation>
 <translation id="8503813439785031346">اسم المستخدم</translation>
 <translation id="8518521100965196752">لاستخدام كلمات المرور، يجب أولاً إعداد رمز مرور على جهازك.</translation>
 <translation id="8558791374138667443">‏يتم حفظ مفاتيح المرور في "مدير كلمات المرور في Google"</translation>
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn
index fb47ab0..9b694a85 100644
--- a/ios/chrome/test/earl_grey/BUILD.gn
+++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -233,12 +233,12 @@
     "//ios/chrome/browser/shared/model/web_state_list",
     "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/public/snackbar:constants",
     "//ios/chrome/browser/shared/ui/symbols",
     "//ios/chrome/browser/shared/ui/table_view/cells",
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/browser/shared/ui/util:eg_app_support+eg2",
     "//ios/chrome/browser/shared/ui/util:omnibox_util",
-    "//ios/chrome/browser/snackbar/public:constants",
     "//ios/chrome/browser/snackbar/ui_bundled:eg_app_support+eg2",
     "//ios/chrome/browser/ssl/model:eg_app_support+eg2",
     "//ios/chrome/browser/sync/model",
diff --git a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm
index 6090fc2..4837bf3e1 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm
+++ b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm
@@ -49,12 +49,12 @@
 #import "ios/chrome/browser/settings/ui_bundled/tabs/tabs_settings_constants.h"
 #import "ios/chrome/browser/share_kit/model/test_constants.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/snackbar/snackbar_constants.h"
 #import "ios/chrome/browser/shared/ui/symbols/symbols.h"
 #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_switch_cell.h"
 #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_switch_item.h"
 #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_url_item.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
-#import "ios/chrome/browser/snackbar/public/snackbar_constants.h"
 #import "ios/chrome/browser/tab_switcher/tab_strip/ui/swift_constants_for_objective_c.h"
 #import "ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/grid_constants.h"
 #import "ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/inactive_tabs/inactive_tabs_constants.h"
diff --git a/ios/web_view/internal/autofill/cwv_autofill_form_unittest.mm b/ios/web_view/internal/autofill/cwv_autofill_form_unittest.mm
index 9cf63a3d..d479431 100644
--- a/ios/web_view/internal/autofill/cwv_autofill_form_unittest.mm
+++ b/ios/web_view/internal/autofill/cwv_autofill_form_unittest.mm
@@ -9,7 +9,7 @@
 #import "base/path_service.h"
 #import "base/strings/sys_string_conversions.h"
 #import "components/autofill/core/browser/country_type.h"
-#import "components/autofill/core/browser/form_parsing/determine_heuristic_types.h"
+#import "components/autofill/core/browser/form_parsing/determine_regex_types.h"
 #import "components/autofill/core/browser/form_structure.h"
 #import "components/autofill/core/browser/test_utils/autofill_test_utils.h"
 #import "components/autofill/core/common/language_code.h"
@@ -37,11 +37,10 @@
   autofill::FormData form_data = autofill::test::CreateTestAddressFormData();
   std::unique_ptr<autofill::FormStructure> form_structure =
       std::make_unique<autofill::FormStructure>(form_data);
-  const autofill::HeuristicPredictions heuristic_predictions =
-      DetermineHeuristicTypes(autofill::GeoIpCountryCode(""),
-                              autofill::LanguageCode(""), *form_structure,
-                              nullptr);
-  heuristic_predictions.ApplyTo(form_structure->fields());
+  const autofill::RegexPredictions regex_predictions = DetermineRegexTypes(
+      autofill::GeoIpCountryCode(""), autofill::LanguageCode(""),
+      form_structure->ToFormData(), nullptr);
+  regex_predictions.ApplyTo(form_structure->fields());
   form_structure->RationalizeAndAssignSections(
       autofill::GeoIpCountryCode(""), autofill::LanguageCode(""), nullptr);
   CWVAutofillForm* form =
diff --git a/ios_internal b/ios_internal
index 8973266..0f3ad28 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit 89732666c0f8dbda36eef150dfa4e0902a7750f2
+Subproject commit 0f3ad28696ed0444f3465d1a90b977b04b692fd7
diff --git a/media/gpu/windows/d3d12_video_encode_av1_delegate.cc b/media/gpu/windows/d3d12_video_encode_av1_delegate.cc
index d77624f0..8073782 100644
--- a/media/gpu/windows/d3d12_video_encode_av1_delegate.cc
+++ b/media/gpu/windows/d3d12_video_encode_av1_delegate.cc
@@ -840,12 +840,11 @@
   if (request_keyframe) {
     // When encoding a key frame, as API requirements, all array entries in
     // ReferenceFramesReconPictureDescriptors should be set to invalid index.
-    for (auto& descriptor :
-         picture_params_.ReferenceFramesReconPictureDescriptors) {
-      descriptor.ReconstructedPictureResourceIndex = 0XFF;
-    }
+    reference_descriptors_.fill({.ReconstructedPictureResourceIndex = 0xFF});
     picture_params_.PrimaryRefFrame = kPrimaryRefNone;
   }
+  std::copy(reference_descriptors_.begin(), reference_descriptors_.end(),
+            picture_params_.ReferenceFramesReconPictureDescriptors);
 
   if (svc_layers_) {
     CHECK(metadata_.svc_generic.has_value());
@@ -1079,11 +1078,9 @@
       .FrameType = picture_params_.FrameType,
       .OrderHint = picture_params_.OrderHint,
       .PictureIndex = picture_params_.PictureIndex};
-  base::span descriptors =
-      picture_params_.ReferenceFramesReconPictureDescriptors;
-  for (size_t i = 0; i < std::size(descriptors); i++) {
+  for (size_t i = 0; i < reference_descriptors_.size(); i++) {
     if (picture_params_.RefreshFrameFlags & (1 << i)) {
-      descriptors[i] = a_descriptor;
+      reference_descriptors_[i] = a_descriptor;
     }
   }
 }
diff --git a/media/gpu/windows/d3d12_video_encode_av1_delegate.h b/media/gpu/windows/d3d12_video_encode_av1_delegate.h
index d2c1563..a5ff58b 100644
--- a/media/gpu/windows/d3d12_video_encode_av1_delegate.h
+++ b/media/gpu/windows/d3d12_video_encode_av1_delegate.h
@@ -89,6 +89,10 @@
   // input_arguments_.PictureControlDesc.PictureControlCodecData
   D3D12_VIDEO_ENCODER_AV1_PICTURE_CONTROL_CODEC_DATA picture_params_{};
 
+  // picture_params_.ReferenceFramesReconPictureDescriptors
+  std::array<D3D12_VIDEO_ENCODER_AV1_REFERENCE_PICTURE_DESCRIPTOR, 8>
+      reference_descriptors_{};
+
   // Bitrate controller for CBR encoding.
   std::unique_ptr<aom::AV1RateControlRTC> software_brc_;
 
diff --git a/remoting/resources/remoting_strings_ar.xtb b/remoting/resources/remoting_strings_ar.xtb
index 627a427..ef335c0a 100644
--- a/remoting/resources/remoting_strings_ar.xtb
+++ b/remoting/resources/remoting_strings_ar.xtb
@@ -70,7 +70,7 @@
 <translation id="4227991223508142681">أداة إدارة حسابات المضيفين</translation>
 <translation id="4240294130679914010">‏أداة إزالة مضيف التوافق مع نظام التشغيل Chrome</translation>
 <translation id="4257751272692708833">‏برنامج إعادة توجيه عناوين URL من خلال "<ph name="PRODUCT_NAME" />"</translation>
-<translation id="4277736576214464567">رمز الدخول غير صالح، يُرجى إعادة المحاولة.</translation>
+<translation id="4277736576214464567">رمز الدخول غير صالح. يُرجى إعادة المحاولة.</translation>
 <translation id="4281844954008187215">بنود الخدمة</translation>
 <translation id="4405930547258349619">المكتبة الأساسية</translation>
 <translation id="443560535555262820">فتح إعدادات "أدوات تسهيل الاستخدام" المفضّلة</translation>
@@ -91,7 +91,7 @@
 <translation id="4974476491460646149">تم إغلاق الاتصال بـ <ph name="HOSTNAME" /></translation>
 <translation id="4985296110227979402">تحتاج أولاً إلى إعداد جهاز الكمبيوتر لإتاحة الدخول عن بُعد</translation>
 <translation id="4987330545941822761">‏لا يمكن لميزة "الوصول إلى الكمبيوتر المكتبي عن بُعد من Chrome" تحديد المتصفّح الذي يجب استخدامه لفتح عناوين URL على الجهاز. يُرجى اختيار المتصفّح من القائمة أدناه.</translation>
-<translation id="5064360042339518108"><ph name="HOSTNAME" /> (في وضع عدم اتصال)</translation>
+<translation id="5064360042339518108"><ph name="HOSTNAME" /> (غير متصل بالإنترنت)</translation>
 <translation id="507204348399810022">هل المطلوب فعلاً إيقاف الاتصالات عن بُعد بـ <ph name="HOSTNAME" />؟</translation>
 <translation id="5095424396646120601">إعداد تقارير الأعطال</translation>
 <translation id="5170982930780719864">رقم تعريف المضيف غير صالح.</translation>
@@ -109,7 +109,7 @@
 <translation id="579702532610384533">إعادة الاتصال</translation>
 <translation id="5810269635982033450">تعمل الشاشة كلوحة تتبع</translation>
 <translation id="5823554426827907568">طلب "<ph name="CLIENT_USERNAME" />" إذنًا بالوصول إلى جهاز الكمبيوتر الخاص بك للاطّلاع على شاشة جهازك والتحكّم بلوحة المفاتيح والماوس. يُرجى النقر على "<ph name="IDS_SHARE_CONFIRM_DIALOG_DECLINE" />" إذا لم يكن هذا الطلب متوقَّعًا. ويمكنك النقر على "<ph name="IDS_SHARE_CONFIRM_DIALOG_CONFIRM" />" للسماح بهذا الاتصال في حال كنت على استعداد.</translation>
-<translation id="5823658491130719298">‏على جهاز الكمبيوتر الذي تريد الدخول إليه عن بُعد، افتح Chrome وانتقل إلى <ph name="INSTALLATION_LINK" /></translation>
+<translation id="5823658491130719298">‏على الكمبيوتر المراد الوصول إليه عن بُعد، يرجى فتح Chrome والانتقال إلى <ph name="INSTALLATION_LINK" /></translation>
 <translation id="5841343754884244200">خيارات العرض</translation>
 <translation id="6033507038939587647">خيارات لوحة المفاتيح</translation>
 <translation id="6040143037577758943">إغلاق</translation>
@@ -153,7 +153,7 @@
 <translation id="7665369617277396874">إضافة حساب</translation>
 <translation id="7678209621226490279">إرساء إلى اليمين</translation>
 <translation id="7693372326588366043">تحديث قائمة المضيفين</translation>
-<translation id="7714222945760997814">الإبلاغ عن هذا الإخفاق</translation>
+<translation id="7714222945760997814">الإبلاغ عن هذا</translation>
 <translation id="7868137160098754906">يُرجى إدخال رقم التعريف الشخصي لجهاز الكمبيوتر البعيد.</translation>
 <translation id="7895403300744144251">لا تسمح سياسات الأمان على جهاز الكمبيوتر البعيد بالاتصالات من حسابك.</translation>
 <translation id="7936528439960309876">إرساء إلى اليسار</translation>
diff --git a/testing/buildbot/filters/android.emulator_12l_landscape.chrome_public_test_apk.filter b/testing/buildbot/filters/android.emulator_12l_landscape.chrome_public_test_apk.filter
index 60233c0..977328b 100644
--- a/testing/buildbot/filters/android.emulator_12l_landscape.chrome_public_test_apk.filter
+++ b/testing/buildbot/filters/android.emulator_12l_landscape.chrome_public_test_apk.filter
@@ -1,5 +1,9 @@
-# crbug.com/386395527
+# crbug.com/442769979
 -org.chromium.chrome.browser.app.bookmarks.BookmarkTest.testSmallDrag_Down_FoldersOnly
+-org.chromium.chrome.browser.app.bookmarks.PartnerBookmarkTest.testCannotSelectPartner
+-org.chromium.chrome.browser.incognito.IncognitoPermissionLeakageTest.testBlockPermissionDoNotLeakFromIncognitoToIncognito__INCOGNITO_TAB_INCOGNITO_CCT
+-org.chromium.chrome.browser.page_info.PageInfoDiscoverabilityTest.testPageInfoDiscoverabilityBlockPrompt
+-org.chromium.chrome.browser.permissions.RuntimePermissionTest.testDenyTriggersNoRuntime
 -org.chromium.chrome.browser.tasks.tab_management.TabListContainerViewBinderTest.testSetInitialScrollIndex_Grid
 -org.chromium.chrome.browser.webapps.WebApkIntegrationTest.testWebApkServiceIntegration
 -org.chromium.chrome.browser.webapps.WebappNavigationTest.testCloseButtonReturnsToUrlBeforeRedirects
diff --git a/third_party/androidx/build.gradle b/third_party/androidx/build.gradle
index c494b94..33862b947 100644
--- a/third_party/androidx/build.gradle
+++ b/third_party/androidx/build.gradle
@@ -310,7 +310,7 @@
     google()
     maven {
         // This URL is generated by the fetch_all_androidx.py script.
-        url 'https://androidx.dev/snapshots/builds/14033507/artifacts/repository'
+        url 'https://androidx.dev/snapshots/builds/14036292/artifacts/repository'
     }
     mavenCentral()
 }
diff --git a/third_party/angle b/third_party/angle
index 875b740..9f62c10 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit 875b7400b543fcec116388e587b1197cf95524e7
+Subproject commit 9f62c102a8dfabe5e32cdce50ee414d1973edf9e
diff --git a/third_party/blink/common/safe_url_pattern.cc b/third_party/blink/common/safe_url_pattern.cc
index 2798b975..391361f8 100644
--- a/third_party/blink/common/safe_url_pattern.cc
+++ b/third_party/blink/common/safe_url_pattern.cc
@@ -10,6 +10,14 @@
 
 SafeUrlPattern::SafeUrlPattern() = default;
 
+SafeUrlPattern::SafeUrlPattern(const SafeUrlPattern&) = default;
+
+SafeUrlPattern& SafeUrlPattern::operator=(const SafeUrlPattern&) = default;
+
+SafeUrlPattern::SafeUrlPattern(SafeUrlPattern&&) = default;
+
+SafeUrlPattern& SafeUrlPattern::operator=(SafeUrlPattern&&) = default;
+
 SafeUrlPattern::~SafeUrlPattern() = default;
 
 bool operator==(const SafeUrlPattern& left, const SafeUrlPattern& right) {
diff --git a/third_party/blink/public/common/safe_url_pattern.h b/third_party/blink/public/common/safe_url_pattern.h
index 51622e03..71a41db 100644
--- a/third_party/blink/public/common/safe_url_pattern.h
+++ b/third_party/blink/public/common/safe_url_pattern.h
@@ -32,6 +32,10 @@
 // purpose.
 struct BLINK_COMMON_EXPORT SafeUrlPattern {
   SafeUrlPattern();
+  SafeUrlPattern(const SafeUrlPattern&);
+  SafeUrlPattern& operator=(const SafeUrlPattern&);
+  SafeUrlPattern(SafeUrlPattern&&);
+  SafeUrlPattern& operator=(SafeUrlPattern&&);
   ~SafeUrlPattern();
 
   // The list of members has to stay in sync with the list in the equality
diff --git a/third_party/blink/public/devtools_protocol/domains/Autofill.pdl b/third_party/blink/public/devtools_protocol/domains/Autofill.pdl
index 4dd9d9e..bafa83a2 100644
--- a/third_party/blink/public/devtools_protocol/domains/Autofill.pdl
+++ b/third_party/blink/public/devtools_protocol/domains/Autofill.pdl
@@ -22,8 +22,6 @@
   type AddressField extends object
     properties
       # address field name, for example GIVEN_NAME.
-      # The full list of supported field names:
-      # https://source.chromium.org/chromium/chromium/src/+/main:components/autofill/core/browser/field_types.cc;l=38
       string name
       # address field value, for example Jon Doe.
       string value
@@ -92,10 +90,8 @@
       DOM.BackendNodeId fieldId
       # Identifies the frame that field belongs to.
       optional Page.FrameId frameId
-      # Credit card information to fill out the form. Credit card data is not saved.  Mutually exclusive with `address`.
-      optional CreditCard card
-      # Address to fill out the form. Address data is not saved. Mutually exclusive with `card`.
-      optional Address address
+      # Credit card information to fill out the form. Credit card data is not saved.
+      CreditCard card
 
   # Set addresses so that developers can verify their forms implementation.
   command setAddresses
diff --git a/third_party/blink/public/devtools_protocol/domains/PWA.pdl b/third_party/blink/public/devtools_protocol/domains/PWA.pdl
index 1fd5973..82cb01f5 100644
--- a/third_party/blink/public/devtools_protocol/domains/PWA.pdl
+++ b/third_party/blink/public/devtools_protocol/domains/PWA.pdl
@@ -53,7 +53,8 @@
   #
   # To generate bundle id for proxy mode:
   # 1. Generate 32 random bytes.
-  # 2. Add a specific suffix 0x00 at the end.
+  # 2. Add a specific suffix at the end following the documentation
+  #    https://github.com/WICG/isolated-web-apps/blob/main/Scheme.md#suffix
   # 3. Encode the entire sequence using Base32 without padding.
   #
   # If Chrome is not in IWA dev
diff --git a/third_party/blink/public/mojom/manifest/manifest.mojom b/third_party/blink/public/mojom/manifest/manifest.mojom
index f5825c07..0dac489 100644
--- a/third_party/blink/public/mojom/manifest/manifest.mojom
+++ b/third_party/blink/public/mojom/manifest/manifest.mojom
@@ -61,6 +61,8 @@
 
   array<DisplayMode> display_override;
 
+  array<SafeUrlPattern> borderless_url_patterns;
+
   device.mojom.ScreenOrientationLockType orientation;
 
   array<ManifestImageResource> icons;
diff --git a/third_party/blink/public/strings/translations/blink_strings_iw.xtb b/third_party/blink/public/strings/translations/blink_strings_iw.xtb
index 63b4c236..81eefc32 100644
--- a/third_party/blink/public/strings/translations/blink_strings_iw.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_iw.xtb
@@ -44,7 +44,7 @@
 <translation id="4718048029184481307">הפעלה במצב תמונה בתוך תמונה</translation>
 <translation id="4812940957355064477">יש להזין מספר.</translation>
 <translation id="4975562563186953947"><ph name="SELECTED_COUNT" /> נבחרו</translation>
-<translation id="4992066212339426712">ביטול השתקה</translation>
+<translation id="4992066212339426712">ביטול ההשתקה</translation>
 <translation id="49969490063480558">יש להזין את החלק אחרי "<ph name="ATSIGN" />". השדה "<ph name="INVALIDADDRESS" />" אינו מלא.</translation>
 <translation id="5164977714490026579">הערך חייב להיות גדול מ-<ph name="MINIMUM" /> או שווה לו.</translation>
 <translation id="5196716972587102051">2</translation>
diff --git a/third_party/blink/renderer/core/html/forms/html_text_area_element_test.cc b/third_party/blink/renderer/core/html/forms/html_text_area_element_test.cc
index 560e6d7..fd9f7590 100644
--- a/third_party/blink/renderer/core/html/forms/html_text_area_element_test.cc
+++ b/third_party/blink/renderer/core/html/forms/html_text_area_element_test.cc
@@ -173,4 +173,36 @@
   GetFrame().SetHadUserInteraction(false);
 }
 
+// crbug.com/442551790
+TEST_F(HTMLTextAreaElementTest, ClearWithInsertText) {
+  SetBodyInnerHTML("<textarea id=test>some text\n</textarea>");
+  auto& textarea = TestElement();
+  textarea.Focus();
+  textarea.select();
+  const auto* inner_editor =
+      To<LayoutBlockFlow>(textarea.GetLayoutBox()->FirstChildBox());
+  ASSERT_TRUE(inner_editor);
+
+  GetDocument().execCommand("insertText", false, "", ASSERT_NO_EXCEPTION);
+  UpdateAllLifecyclePhasesForTest();
+  EXPECT_GT(inner_editor->StitchedSize().height, LayoutUnit());
+}
+
+// crbug.com/442600643
+TEST_F(HTMLTextAreaElementTest, RemoveLastLineWithInsertText) {
+  SetBodyInnerHTML(
+      "<textarea id=test style='line-height:20px;'>a\nb</textarea>");
+  auto& textarea = TestElement();
+  textarea.Focus();
+  textarea.SetSelectionRange(2, 3);
+  const auto* inner_editor =
+      To<LayoutBlockFlow>(textarea.GetLayoutBox()->FirstChildBox());
+  ASSERT_TRUE(inner_editor);
+
+  GetDocument().execCommand("insertText", false, "", ASSERT_NO_EXCEPTION);
+  UpdateAllLifecyclePhasesForTest();
+  // The box should have two lines high.
+  EXPECT_EQ(inner_editor->StitchedSize().height, LayoutUnit(20 * 2));
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/text_control_element.cc b/third_party/blink/renderer/core/html/forms/text_control_element.cc
index 6ce7ce8..02170175 100644
--- a/third_party/blink/renderer/core/html/forms/text_control_element.cc
+++ b/third_party/blink/renderer/core/html/forms/text_control_element.cc
@@ -945,6 +945,17 @@
     return;
   }
   Node* last_child = inner_editor->lastChild();
+  if (RuntimeEnabledFeatures::TextareaLastLineRemovalFixEnabled()) {
+    // Remove the last empty text.  It prevents from adding the placeholder
+    // break though it produces no height.
+    while (auto* text_last_child = DynamicTo<Text>(last_child)) {
+      if (!text_last_child->data().empty()) {
+        break;
+      }
+      last_child = last_child->previousSibling();
+      text_last_child->remove();
+    }
+  }
   if (RuntimeEnabledFeatures::TextareaLineEndingsAsBrEnabled() &&
       IsA<HTMLBRElement>(last_child)) {
     if (!IsPlaceholderBreakElement(last_child)) {
diff --git a/third_party/blink/renderer/core/layout/inline/fit_text_utils.cc b/third_party/blink/renderer/core/layout/inline/fit_text_utils.cc
index 1419e90..d348cb0 100644
--- a/third_party/blink/renderer/core/layout/inline/fit_text_utils.cc
+++ b/third_party/blink/renderer/core/layout/inline/fit_text_utils.cc
@@ -116,6 +116,54 @@
   return scaled_desc;
 }
 
+float ComputeAdditionalPaintTimeScale(const InlineItemsData& items_data,
+                                      LayoutUnit available_width,
+                                      LayoutUnit epsilon,
+                                      WritingMode writing_mode,
+                                      HarfBuzzShaper& shaper,
+                                      ShapeResultSpacing<String>& spacing,
+                                      const InlineCursor& line,
+                                      float scale,
+                                      std::optional<float> limit,
+                                      LayoutUnit static_total_size) {
+  LayoutUnit flexible_total_size;
+  for (InlineCursor descendants = line.CursorForDescendants(); descendants;
+       descendants.MoveToNextInlineLeaf()) {
+    const auto& current = descendants.Current();
+    if (!current.IsText()) {
+      continue;
+    }
+    const Font& font = *current.Style().GetFont();
+    bool restricted = false;
+    FontDescription scaled_desc =
+        ScaledFontDescription(font, scale, limit, restricted);
+    if (restricted) {
+      // We won't apply additional scale if font-size is restricted by `limit`.
+      return 1.0f;
+    }
+    Font* scaled_font =
+        MakeGarbageCollected<Font>(scaled_desc, font.GetFontSelector());
+    auto iter = std::ranges::find_if(
+        items_data.items, [&](const Member<InlineItem>& item) {
+          return item->StartOffset() <= current.TextStartOffset() &&
+                 current.TextEndOffset() <= item->EndOffset();
+        });
+    CHECK_NE(iter, items_data.items.end());
+    ShapeResult* shape_result =
+        ShapeForFit(**iter, current.TextStartOffset(), current.TextEndOffset(),
+                    shaper, *scaled_font, items_data.segments.get());
+    if (spacing.SetSpacing(scaled_desc)) {
+      shape_result->ApplySpacing(spacing);
+    }
+    flexible_total_size += shape_result->SnappedWidth().ClampNegativeToZero();
+  }
+  LayoutUnit remaining_space =
+      available_width - (flexible_total_size + static_total_size);
+  return remaining_space.Abs() >= epsilon
+             ? (flexible_total_size + remaining_space) / flexible_total_size
+             : 1.0f;
+}
+
 }  // namespace
 
 bool ShouldApplyFitText(const InlineNode node) {
@@ -202,6 +250,7 @@
   if (fit_text.Target() != FitTextTarget::kConsistent) {
     return ParagraphScale();
   }
+  float additional_paint_time_scale = 1.0f;
   for (InlineCursor cursor(*box_fragment, *items); cursor;
        cursor.MoveToNextSkippingChildren()) {
     if (!cursor.Current().IsLineBox()) {
@@ -214,11 +263,13 @@
       continue;
     }
     LayoutUnit flexible_total_size;
+    LayoutUnit flexible_total_size_including_letter_spacing;
     bool is_font_size_method = fit_text.Method() == FitTextMethod::kFontSize;
     const InlineItemsData& items_data =
         node.ItemsData(cursor.CurrentItem()->UsesFirstLineStyle());
     HarfBuzzShaper shaper(items_data.text_content);
     ShapeResultSpacing<String> spacing(items_data.text_content);
+    const auto limit = ComputeSizeLimit(fit_text, is_grow, node);
     for (InlineCursor descendants = cursor.CursorForDescendants(); descendants;
          descendants.MoveToNextInlineLeaf()) {
       const auto& current = descendants.Current();
@@ -244,18 +295,31 @@
         flexible_total_size +=
             ToLogicalSize(current.Size(), writing_mode).inline_size;
       }
+      flexible_total_size_including_letter_spacing +=
+          ToLogicalSize(current.Size(), writing_mode).inline_size;
     }
     if (!flexible_total_size ||
         remaining_space + flexible_total_size <= LayoutUnit()) {
       continue;
     }
     float scale = (remaining_space + flexible_total_size) / flexible_total_size;
-    // TODO(crbug.com/417306102): Respect to fit_text.SizeLimit().
-    minimum_scale = std::min(minimum_scale, scale);
+    if (scale < minimum_scale) {
+      minimum_scale = scale;
+      if (fit_text.Method() == FitTextMethod::kFontSize) {
+        // This value should exclude letter-spacing because
+        // ComputeAdditionalPaintTimeScale() is for the paint-time scaling,
+        // which scales letter-spacing.
+        LayoutUnit static_total_size =
+            available_width - remaining_space -
+            flexible_total_size_including_letter_spacing;
+        additional_paint_time_scale = ComputeAdditionalPaintTimeScale(
+            items_data, available_width, epsilon, writing_mode, shaper, spacing,
+            cursor, scale, limit, static_total_size);
+      }
+    }
   }
-  // TODO(crbug.com/417306102): Compute additional_paint_time_scale for the
-  // font-size method.
-  return {std::isfinite(minimum_scale) ? minimum_scale : 1.0f, 1.0f};
+  return {std::isfinite(minimum_scale) ? minimum_scale : 1.0f,
+          additional_paint_time_scale};
 }
 
 LineFitter::LineFitter(const InlineNode node, LineInfo* line_info)
diff --git a/third_party/blink/renderer/core/layout/inline/inline_node.cc b/third_party/blink/renderer/core/layout/inline/inline_node.cc
index d31f743..9804f43 100644
--- a/third_party/blink/renderer/core/layout/inline/inline_node.cc
+++ b/third_party/blink/renderer/core/layout/inline/inline_node.cc
@@ -1994,7 +1994,7 @@
       const Font* font = RuntimeEnabledFeatures::TabSizeAncestorEnabled()
                              ? &node.FontForTab()
                              : style.GetFont();
-      const SimpleFontData* font_data = font->PrimaryFont();
+      const SimpleFontData* font_data = font->PrimaryFontForTabSize();
       // Sync with `ShapeResult::CreateForTabulationCharacters()`.
       TextRunLayoutUnit glyph_advance = TextRunLayoutUnit::FromFloatRound(
           font->TabWidth(font_data, tab_size, position));
diff --git a/third_party/blink/renderer/extensions/webview/media_integrity/media_integrity_token_provider.cc b/third_party/blink/renderer/extensions/webview/media_integrity/media_integrity_token_provider.cc
index f357fc1..e77c7c6 100644
--- a/third_party/blink/renderer/extensions/webview/media_integrity/media_integrity_token_provider.cc
+++ b/third_party/blink/renderer/extensions/webview/media_integrity/media_integrity_token_provider.cc
@@ -32,8 +32,8 @@
   provider_remote_.Bind(std::move(provider_pending_remote),
                         context->GetTaskRunner(TaskType::kInternalDefault));
   provider_remote_.set_disconnect_handler(
-      WTF::BindOnce(&MediaIntegrityTokenProvider::OnProviderConnectionError,
-                    WrapWeakPersistent(this)));
+      blink::BindOnce(&MediaIntegrityTokenProvider::OnProviderConnectionError,
+                      WrapWeakPersistent(this)));
 }
 
 void MediaIntegrityTokenProvider::OnProviderConnectionError() {
@@ -78,9 +78,9 @@
   token_resolvers_.insert(resolver);
   provider_remote_->RequestToken(
       opt_content_binding,
-      WTF::BindOnce(&MediaIntegrityTokenProvider::OnRequestTokenResponse,
-                    WrapPersistent(this), WrapPersistent(script_state),
-                    WrapPersistent(resolver)));
+      blink::BindOnce(&MediaIntegrityTokenProvider::OnRequestTokenResponse,
+                      WrapPersistent(this), WrapPersistent(script_state),
+                      WrapPersistent(resolver)));
   return promise;
 }
 
diff --git a/third_party/blink/renderer/extensions/webview/web_view_android.cc b/third_party/blink/renderer/extensions/webview/web_view_android.cc
index 22a818a..6a3d9eb 100644
--- a/third_party/blink/renderer/extensions/webview/web_view_android.cc
+++ b/third_party/blink/renderer/extensions/webview/web_view_android.cc
@@ -54,7 +54,7 @@
       execution_context->GetTaskRunner(TaskType::kInternalDefault);
   execution_context->GetBrowserInterfaceBroker().GetInterface(
       media_integrity_service_remote_.BindNewPipeAndPassReceiver(task_runner));
-  media_integrity_service_remote_.set_disconnect_handler(WTF::BindOnce(
+  media_integrity_service_remote_.set_disconnect_handler(blink::BindOnce(
       &WebViewAndroid::OnServiceConnectionError, WrapWeakPersistent(this)));
 }
 
@@ -134,10 +134,10 @@
   provider_resolvers_.insert(resolver);
   media_integrity_service_remote_->GetIntegrityProvider(
       std::move(provider_pending_receiver), cloud_project_number,
-      WTF::BindOnce(&WebViewAndroid::OnGetIntegrityProviderResponse,
-                    WrapPersistent(this), WrapPersistent(script_state),
-                    std::move(provider_pending_remote), cloud_project_number,
-                    WrapPersistent(resolver)));
+      blink::BindOnce(&WebViewAndroid::OnGetIntegrityProviderResponse,
+                      WrapPersistent(this), WrapPersistent(script_state),
+                      std::move(provider_pending_remote), cloud_project_number,
+                      WrapPersistent(resolver)));
 
   return promise;
 }
diff --git a/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry.cc b/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry.cc
index e4fd571..b5cdede 100644
--- a/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry.cc
+++ b/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry.h"
 
+#include <optional>
+
 #include "mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h"
 #include "mojo/public/cpp/bindings/remote_set.h"
 #include "third_party/blink/public/mojom/content_extraction/ai_page_content_metadata.mojom-blink.h"
@@ -28,7 +30,62 @@
 
 namespace blink {
 
-namespace {}  // namespace
+namespace {
+
+template <typename T>
+void DeliverMutation(const HeapVector<Member<MutationRecord>>& records,
+                     base::RepeatingClosure on_changed) {
+  // We are looking for changes to elements of type T.
+  for (const auto& record : records) {
+    if (record->type() == "attributes") {
+      if (IsA<T>(record->target())) {
+        on_changed.Run();
+        return;
+      }
+    } else {  // "childList"
+      for (unsigned i = 0; i < record->addedNodes()->length(); ++i) {
+        if (IsA<T>(record->addedNodes()->item(i))) {
+          on_changed.Run();
+          return;
+        }
+      }
+      for (unsigned i = 0; i < record->removedNodes()->length(); ++i) {
+        if (IsA<T>(record->removedNodes()->item(i))) {
+          on_changed.Run();
+          return;
+        }
+      }
+    }
+  }
+}
+
+void ObserveHead(WeakMember<Node>& observing,
+                 MutationObserver* observer,
+                 HTMLHeadElement* head,
+                 const std::optional<Vector<String>>& attribute_filter) {
+  if (observing.Get() == head) {
+    return;
+  }
+  observer->disconnect();
+  MutationObserverInit* init = MutationObserverInit::Create();
+  init->setChildList(true);
+  init->setAttributes(true);
+  init->setSubtree(true);
+  if (attribute_filter) {
+    init->setAttributeFilter(*attribute_filter);
+  }
+  DummyExceptionStateForTesting exception_state;
+  observer->observe(head, init, exception_state);
+  DCHECK(!exception_state.HadException());
+  observing = head;
+}
+
+template <typename ObserverSet, typename MutationObserver>
+bool UpdateObserver(Document* document,
+                    ObserverSet& observer_set,
+                    MutationObserver& mutation_observer);
+
+}  // namespace
 
 class FrameMetadataObserverRegistry::PaidContentMutationObserver final
     : public MutationObserver::Delegate {
@@ -48,28 +105,11 @@
 
   void Deliver(const HeapVector<Member<MutationRecord>>& records,
                MutationObserver&) override {
-    // We are looking for changes to script tags which indicate paid content.
-    for (const auto& record : records) {
-      if (record->type() == "attributes") {
-        if (IsA<HTMLScriptElement>(record->target())) {
-          registry_->OnPaidContentMetadataChanged();
-          return;
-        }
-      } else {  // "childList"
-        for (unsigned i = 0; i < record->addedNodes()->length(); ++i) {
-          if (IsA<HTMLScriptElement>(record->addedNodes()->item(i))) {
-            registry_->OnPaidContentMetadataChanged();
-            return;
-          }
-        }
-        for (unsigned i = 0; i < record->removedNodes()->length(); ++i) {
-          if (IsA<HTMLScriptElement>(record->removedNodes()->item(i))) {
-            registry_->OnPaidContentMetadataChanged();
-            return;
-          }
-        }
-      }
-    }
+    DeliverMutation<HTMLScriptElement>(
+        records,
+        BindRepeating(
+            &FrameMetadataObserverRegistry::OnPaidContentMetadataChanged,
+            WrapWeakPersistent(registry_.Get())));
   }
 
   void Trace(Visitor* visitor) const override {
@@ -90,21 +130,7 @@
  public:
   explicit MetaTagsMutationObserver(FrameMetadataObserverRegistry* registry);
 
-  void ObserveHead(HTMLHeadElement* head) {
-    if (observing_ == head) {
-      return;
-    }
-    observer_->disconnect();
-    MutationObserverInit* init = MutationObserverInit::Create();
-    init->setChildList(true);
-    init->setAttributes(true);
-    init->setSubtree(true);
-    init->setAttributeFilter(Vector<String>{"name", "content"});
-    DummyExceptionStateForTesting exception_state;
-    observer_->observe(head, init, exception_state);
-    DCHECK(!exception_state.HadException());
-    observing_ = head;
-  }
+  void ObserveHead(HTMLHeadElement* head);
 
   void Disconnect() {
     observer_->disconnect();
@@ -115,9 +141,12 @@
     return registry_->GetSupplementable()->GetExecutionContext();
   }
 
-  void Deliver(const HeapVector<Member<MutationRecord>>&,
+  void Deliver(const HeapVector<Member<MutationRecord>>& records,
                MutationObserver&) override {
-    registry_->OnMetaTagsChanged();
+    DeliverMutation<HTMLMetaElement>(
+        records,
+        BindRepeating(&FrameMetadataObserverRegistry::OnMetaTagsChanged,
+                           WrapWeakPersistent(registry_.Get())));
   }
 
   void Trace(Visitor* visitor) const override {
@@ -139,25 +168,19 @@
 
 void FrameMetadataObserverRegistry::PaidContentMutationObserver::ObserveHead(
     HTMLHeadElement* head) {
-  if (observing_ == head) {
-    return;
-  }
-
-  observer_->disconnect();
-  MutationObserverInit* init = MutationObserverInit::Create();
-  init->setChildList(true);
-  init->setAttributes(true);
-  init->setSubtree(false);
-  DummyExceptionStateForTesting exception_state;
-  observer_->observe(head, init, exception_state);
-  DCHECK(!exception_state.HadException());
-  observing_ = head;
+  ::blink::ObserveHead(observing_, observer_.Get(), head, std::nullopt);
 }
 
 FrameMetadataObserverRegistry::MetaTagsMutationObserver::
     MetaTagsMutationObserver(FrameMetadataObserverRegistry* registry)
     : registry_(registry), observer_(MutationObserver::Create(this)) {}
 
+void FrameMetadataObserverRegistry::MetaTagsMutationObserver::ObserveHead(
+    HTMLHeadElement* head) {
+  ::blink::ObserveHead(observing_, observer_.Get(), head,
+              Vector<String>{"name", "content"});
+}
+
 // static
 const char FrameMetadataObserverRegistry::kSupplementName[] =
     "FrameMetadataObserverRegistry";
@@ -363,41 +386,13 @@
 }
 
 bool FrameMetadataObserverRegistry::UpdateMetaTagsObserver() {
-  if (metatags_observers_.empty()) {
-    meta_tags_mutation_observer_->Disconnect();
-    return false;
-  }
-  Document* document = GetSupplementable();
-  HTMLHeadElement* head = document->head();
-  if (head) {
-    // A head element exists, so we observe it for future changes, which is more
-    // efficient than observing the whole document.
-    meta_tags_mutation_observer_->ObserveHead(head);
-  } else {
-    // If a document is loaded without a head element, then we
-    // could add an observer here for dynamically added head elements.
-    // This should be rare, and if we choose to support this then care should
-    // be taken to ensure the listener is efficient.
-  }
-  return true;
+  return UpdateObserver(GetSupplementable(), metatags_observers_,
+                        meta_tags_mutation_observer_);
 }
 
 bool FrameMetadataObserverRegistry::UpdatePaidContentObserver() {
-  if (paid_content_metadata_observers_.empty()) {
-    paid_content_mutation_observer_->Disconnect();
-    return false;
-  }
-  Document* document = GetSupplementable();
-  HTMLHeadElement* head = document->head();
-  if (head) {
-    paid_content_mutation_observer_->ObserveHead(head);
-  } else {
-    // If a document is loaded without a head element, then we
-    // could add an observer here for dynamically added head elements.
-    // This should be rare, and if we choose to support this then care should
-    // be taken to ensure the listener is efficient.
-  }
-  return true;
+  return UpdateObserver(GetSupplementable(), paid_content_metadata_observers_,
+                        paid_content_mutation_observer_);
 }
 
 void FrameMetadataObserverRegistry::DisconnectHandler(
@@ -428,4 +423,23 @@
   UpdatePaidContentObserver();
 }
 
+namespace {
+
+template <typename ObserverSet, typename MutationObserver>
+bool UpdateObserver(Document* document,
+                    ObserverSet& observer_set,
+                    MutationObserver& mutation_observer) {
+  if (observer_set.empty()) {
+    mutation_observer->Disconnect();
+    return false;
+  }
+  HTMLHeadElement* head = document->head();
+  if (head) {
+    mutation_observer->ObserveHead(head);
+  }
+  return true;
+}
+
+}  // namespace
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry_unittest.cc b/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry_unittest.cc
index 23a7ab8..357befc 100644
--- a/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry_unittest.cc
+++ b/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry_unittest.cc
@@ -197,6 +197,38 @@
   EXPECT_TRUE(observer.future().Get());
 }
 
+TEST_F(FrameMetadataObserverRegistryTest, PaidContentUnaffectedByOtherElements) {
+  LoadHTML(R"HTML(
+    <head>
+      <script type="application/ld+json">{
+        "@context": "http://schema.org",
+        "@type": "NewsArticle",
+        "isAccessibleForFree": false
+      }</script>
+    </head>
+    <body></body>
+  )HTML");
+  BindRegistry();
+
+  MockPaidContentMetadataObserver observer;
+  registry_->AddPaidContentMetadataObserver(
+      observer.BindNewPipeAndPassRemote());
+  test::RunPendingTasks();
+
+  ASSERT_TRUE(observer.future().IsReady());
+  EXPECT_TRUE(observer.future().Get());
+
+  // Add a meta element, which should not trigger the observer.
+  observer.future().Clear();
+  auto* meta_element =
+      MakeGarbageCollected<HTMLMetaElement>(*GetDocument(), CreateElementFlags());
+  meta_element->setAttribute(html_names::kNameAttr, AtomicString("author"));
+  meta_element->setAttribute(html_names::kContentAttr, AtomicString("Gary"));
+  GetDocument()->head()->AppendChild(meta_element);
+  test::RunPendingTasks();
+
+  EXPECT_FALSE(observer.future().IsReady());
+}
 TEST_F(FrameMetadataObserverRegistryTest, MetaTags) {
   LoadHTML(R"HTML(
     <head>
@@ -357,6 +389,39 @@
   EXPECT_EQ(meta_tags3[0]->content, "testing");
 }
 
+TEST_F(FrameMetadataObserverRegistryTest, MetaTagsUnaffectedByOtherElements) {
+  LoadHTML(R"HTML(
+    <head>
+      <meta name="author" content="Gary">
+    </head>
+    <body></body>
+  )HTML");
+  BindRegistry();
+
+  MockMetaTagsObserver observer;
+  Vector<String> names_to_observe;
+  names_to_observe.push_back("author");
+
+  registry_->AddMetaTagsObserver(names_to_observe,
+                                 observer.BindNewPipeAndPassRemote());
+  test::RunPendingTasks();
+
+  // Initial state.
+  ASSERT_TRUE(observer.future().IsReady());
+  VerifyAuthorMetaTag(observer.future().Take());
+
+  // Add a script element, which should not trigger the observer.
+  observer.future().Clear();
+  auto* script_element =
+      MakeGarbageCollected<HTMLScriptElement>(*GetDocument(),
+                                              CreateElementFlags());
+  script_element->setTextContent("console.log('hello');");
+  GetDocument()->head()->AppendChild(script_element);
+  test::RunPendingTasks();
+
+  EXPECT_FALSE(observer.future().IsReady());
+}
+
 // Re-enable this test once we support observing head elements that are added
 // dynamically.
 TEST_F(FrameMetadataObserverRegistryTest, DISABLED_MetaTagsAddedWithHead) {
diff --git a/third_party/blink/renderer/modules/manifest/manifest_parser.cc b/third_party/blink/renderer/modules/manifest/manifest_parser.cc
index 7499f414..1807405 100644
--- a/third_party/blink/renderer/modules/manifest/manifest_parser.cc
+++ b/third_party/blink/renderer/modules/manifest/manifest_parser.cc
@@ -376,6 +376,12 @@
       UseCounter::Count(execution_context_, WebFeature::kWebAppTabbed);
     }
   }
+
+  if (base::FeatureList::IsEnabled(blink::features::kWebAppBorderless)) {
+    manifest_->borderless_url_patterns =
+        ParseUrlPatterns(root_object.get(), "borderless_url_patterns");
+  }
+
   manifest_->orientation = ParseOrientation(root_object.get());
   manifest_->icons = ParseIcons(root_object.get());
   if (!manifest_->icons.empty()) {
diff --git a/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc b/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc
index 5bf4b41..e25d3ce1 100644
--- a/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc
+++ b/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc
@@ -1207,6 +1207,37 @@
   }
 }
 
+TEST_F(ManifestParserTest, BorderlessUrlPatternsParseRules) {
+  // Reject 'borderless_url_patterns' when the flag is disabled (default).
+  {
+    auto& manifest = ParseManifest(R"({
+      "borderless_url_patterns": [ {"hostname": "foo.com"} ]
+    })");
+    EXPECT_TRUE(manifest->borderless_url_patterns.empty());
+    EXPECT_EQ(0u, GetErrorCount());
+  }
+
+  // Accept 'borderless_url_patterns' when the flag is enabled.
+  {
+    base::test::ScopedFeatureList feature_list;
+    feature_list.InitAndEnableFeature(blink::features::kWebAppBorderless);
+    auto& manifest = ParseManifest(R"({
+      "borderless_url_patterns": [
+        {"protocol": "ftp"},
+        {"hostname": "foo.com"},
+        {"protocol": "ftp", "hostname": "bar.com"}
+      ]
+    })");
+    EXPECT_THAT(
+        manifest->borderless_url_patterns,
+        ElementsAre(
+            PatternDataEq({.protocol = {"ftp"}}),
+            PatternDataEq({.protocol = {"http"}, .hostname = {"foo.com"}}),
+            PatternDataEq({.protocol = {"ftp"}, .hostname = {"bar.com"}})));
+    EXPECT_EQ(0u, GetErrorCount());
+  }
+}
+
 TEST_F(ManifestParserTest, OrientationParseRules) {
   // Smoke test.
   {
diff --git a/third_party/blink/renderer/platform/fonts/font.h b/third_party/blink/renderer/platform/fonts/font.h
index a5945ac..90364e1 100644
--- a/third_party/blink/renderer/platform/fonts/font.h
+++ b/third_party/blink/renderer/platform/fonts/font.h
@@ -171,6 +171,9 @@
   // Returns the primary font that contains the CJK water glyph.
   const SimpleFontData* PrimaryFontWithCjkWater() const;
 
+  // Returns the primary font that contains the space glyph for tab-size.
+  const SimpleFontData* PrimaryFontForTabSize() const;
+
   // Returns a list of font features for this `FontDescription`. The returned
   // list is common for all `SimpleFontData` for `this`.
   base::span<const FontFeatureRange> GetFontFeatures() const;
@@ -271,6 +274,11 @@
       font_description_);
 }
 
+inline const SimpleFontData* Font::PrimaryFontForTabSize() const {
+  return EnsureFontFallbackList()->PrimarySimpleFontDataForTabSize(
+      font_description_);
+}
+
 inline FontSelector* Font::GetFontSelector() const {
   return font_fallback_list_ ? font_fallback_list_->GetFontSelector() : nullptr;
 }
diff --git a/third_party/blink/renderer/platform/fonts/font_fallback_list.cc b/third_party/blink/renderer/platform/fonts/font_fallback_list.cc
index 5e6ec1ae..5bba873 100644
--- a/third_party/blink/renderer/platform/fonts/font_fallback_list.cc
+++ b/third_party/blink/renderer/platform/fonts/font_fallback_list.cc
@@ -38,6 +38,7 @@
 #include "third_party/blink/renderer/platform/fonts/font_family.h"
 #include "third_party/blink/renderer/platform/fonts/font_performance.h"
 #include "third_party/blink/renderer/platform/fonts/segmented_font_data.h"
+#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/wtf/text/character_names.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_uchar.h"
 
@@ -52,6 +53,7 @@
   visitor->Trace(cached_primary_simple_font_data_with_space_);
   visitor->Trace(cached_primary_simple_font_data_with_digit_zero_);
   visitor->Trace(cached_primary_simple_font_data_with_cjk_water_);
+  visitor->Trace(cached_primary_simple_font_data_for_tab_size_);
   visitor->Trace(font_selector_);
   visitor->Trace(shape_cache_);
 }
@@ -74,17 +76,19 @@
 
 const SimpleFontData* FontFallbackList::DeterminePrimarySimpleFontData(
     const FontDescription& font_description,
-    UChar32 lookup_character) {
+    UChar32 lookup_character,
+    bool should_contain_glyph) {
   base::ElapsedTimer timer;
-  const SimpleFontData* result =
-      DeterminePrimarySimpleFontDataCore(font_description, lookup_character);
+  const SimpleFontData* result = DeterminePrimarySimpleFontDataCore(
+      font_description, lookup_character, should_contain_glyph);
   FontPerformance::AddPrimaryFontTime(timer.Elapsed());
   return result;
 }
 
 const SimpleFontData* FontFallbackList::DeterminePrimarySimpleFontDataCore(
     const FontDescription& font_description,
-    UChar32 lookup_character) {
+    UChar32 lookup_character,
+    bool should_contain_glyph) {
   bool should_load_custom_font = true;
 
   for (unsigned font_index = 0;; ++font_index) {
@@ -111,6 +115,12 @@
         font_data->FontDataForCharacter(lookup_character);
     DCHECK(font_data_for_space);
 
+    if (RuntimeEnabledFeatures::FontFallbackForTabSizeEnabled() &&
+        should_contain_glyph &&
+        !font_data_for_space->GlyphForCharacter(lookup_character)) {
+      continue;
+    }
+
     // When a custom font is loading, we should use the correct fallback font to
     // layout the text.  Here skip the temporary font for the loading custom
     // font which may not act as the correct fallback font.
diff --git a/third_party/blink/renderer/platform/fonts/font_fallback_list.h b/third_party/blink/renderer/platform/fonts/font_fallback_list.h
index 9224f53a..e50dc218 100644
--- a/third_party/blink/renderer/platform/fonts/font_fallback_list.h
+++ b/third_party/blink/renderer/platform/fonts/font_fallback_list.h
@@ -112,6 +112,17 @@
     return cached_primary_simple_font_data_with_cjk_water_;
   }
 
+  const SimpleFontData* PrimarySimpleFontDataForTabSize(
+      const FontDescription& font_description) {
+    if (!cached_primary_simple_font_data_for_tab_size_) {
+      cached_primary_simple_font_data_for_tab_size_ =
+          DeterminePrimarySimpleFontData(font_description, uchar::kSpace,
+                                         /*should_contain_glyph=*/true);
+      DCHECK(cached_primary_simple_font_data_for_tab_size_);
+    }
+    return cached_primary_simple_font_data_for_tab_size_;
+  }
+
   const FontData* FontDataAt(const FontDescription&, unsigned index);
 
   base::span<const FontFeatureRange> GetFontFeatures(const FontDescription&);
@@ -137,10 +148,12 @@
 
   const SimpleFontData* DeterminePrimarySimpleFontData(
       const FontDescription&,
-      UChar32 lookup_character = uchar::kSpace);
+      UChar32 lookup_character = uchar::kSpace,
+      bool should_contain_glyph = false);
   const SimpleFontData* DeterminePrimarySimpleFontDataCore(
       const FontDescription&,
-      UChar32 lookup_character = uchar::kSpace);
+      UChar32 lookup_character = uchar::kSpace,
+      bool should_contain_glyph = false);
 
   void ComputeFontFeatures(const FontDescription&);
   bool ComputeCanShapeWordByWord(const FontDescription&);
@@ -149,6 +162,7 @@
   Member<const SimpleFontData> cached_primary_simple_font_data_with_space_;
   Member<const SimpleFontData> cached_primary_simple_font_data_with_digit_zero_;
   Member<const SimpleFontData> cached_primary_simple_font_data_with_cjk_water_;
+  Member<const SimpleFontData> cached_primary_simple_font_data_for_tab_size_;
   const Member<FontSelector> font_selector_;
   int family_index_ = 0;
   const uint16_t generation_;
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc b/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc
index e77047f3..66b2ff78 100644
--- a/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc
+++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc
@@ -1845,7 +1845,7 @@
     unsigned start_index,
     unsigned length) {
   DCHECK_GT(length, 0u);
-  const SimpleFontData* font_data = font->PrimaryFont();
+  const SimpleFontData* font_data = font->PrimaryFontForTabSize();
   DCHECK(font_data);
   ShapeResult* result =
       MakeGarbageCollected<ShapeResult>(start_index, length, direction);
diff --git a/third_party/blink/renderer/platform/image-decoders/bmp/bmp_image_decoder_test.cc b/third_party/blink/renderer/platform/image-decoders/bmp/bmp_image_decoder_test.cc
index 4d1a5ba..2868a9c 100644
--- a/third_party/blink/renderer/platform/image-decoders/bmp/bmp_image_decoder_test.cc
+++ b/third_party/blink/renderer/platform/image-decoders/bmp/bmp_image_decoder_test.cc
@@ -135,7 +135,13 @@
 using BMPSuiteEntry = std::tuple<std::string, std::string>;
 class BMPImageDecoderTest : public testing::TestWithParam<BMPSuiteEntry> {};
 
-TEST_P(BMPImageDecoderTest, VerifyBMPSuiteImage) {
+#if BUILDFLAG(IS_LINUX)
+#define MAYBE_VerifyBMPSuiteImage DISABLED_VerifyBMPSuiteImage
+#else
+#define MAYBE_VerifyBMPSuiteImage VerifyBMPSuiteImage
+#endif
+// TODO(crbug.com/422362214): Re-enable once flakiness is addressed.
+TEST_P(BMPImageDecoderTest, MAYBE_VerifyBMPSuiteImage) {
   // Load the BMP file under test.
   const auto& [entry_dir, entry_bmp] = GetParam();
   std::string bmp_path = base::StringPrintf(
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 1fbd28a4..a323df9 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2412,6 +2412,10 @@
       status: {"Android": "", "default": "stable"},
     },
     {
+      name: "FontFallbackForTabSize",
+      status: "stable",
+    },
+    {
       name: "FontFamilyPostscriptMatchingCTMigration",
     },
     {
@@ -4871,6 +4875,11 @@
       status: "stable",
     },
     {
+      // crbug.com/442551790
+      name: "TextareaLastLineRemovalFix",
+      status: "stable",
+    },
+    {
       // crbug.com/414858401
       name: "TextareaLineEndingsAsBr",
       status: "stable",
@@ -4916,6 +4925,10 @@
       status: "experimental",
     },
     {
+      name: "TextEmphasisPunctuationExceptions",
+      status: "stable"
+    },
+    {
       name: "TextFragmentAPI",
       status: "experimental",
     },
diff --git a/third_party/blink/renderer/platform/text/character.cc b/third_party/blink/renderer/platform/text/character.cc
index 4eec45d..68d6271 100644
--- a/third_party/blink/renderer/platform/text/character.cc
+++ b/third_party/blink/renderer/platform/text/character.cc
@@ -38,6 +38,7 @@
 #include <algorithm>
 
 #include "base/synchronization/lock.h"
+#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/text/character_property_data.h"
 #include "third_party/blink/renderer/platform/text/icu_error.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
@@ -260,6 +261,41 @@
     return false;
   }
 
+  if (RuntimeEnabledFeatures::TextEmphasisPunctuationExceptionsEnabled()) {
+    // A set of exceptions for punctuation.
+    switch (c) {
+      // List from
+      // https://drafts.csswg.org/css-text-decor/#text-emphasis-style-property
+      case uchar::kNumberSign:
+      case uchar::kPercentSign:
+      case uchar::kAmpersand:
+      case uchar::kCommercialAt:
+      case uchar::kSectionSign:
+      case uchar::kPilcrowSign:
+      case uchar::kArabicIndicPerMilleSign:
+      case uchar::kArabicIndicPerTenThousandSign:
+      case uchar::kArabicPercentSign:
+      case uchar::kPerMilleSign:
+      case uchar::kPerTenThousandSign:
+      case uchar::kTironianSignEt:
+      case uchar::kReversedPilcrowSign:
+      case uchar::kSwungDash:
+      case uchar::kPartAlternationMark:
+      // Characters with NFKD equivalence to the above.
+      case uchar::kSmallNumberSign:
+      case uchar::kSmallAmpersand:
+      case uchar::kSmallPercentSign:
+      case uchar::kSmallCommercialAt:
+      case uchar::kFullwidthNumberSign:
+      case uchar::kFullwidthPercentSign:
+      case uchar::kFullwidthAmpersand:
+      case uchar::kFullwidthCommercialAt:
+        return true;
+      default:
+        break;
+    }
+  }
+
   // Punctuation
   if (category &
       (unicode::kPunctuation_Dash | unicode::kPunctuation_Open |
@@ -268,9 +304,6 @@
        unicode::kPunctuation_FinalQuote)) {
     return false;
   }
-  // TODO(layout-dev): css/css-text-decor/text-emphasis-punctuation-3.html
-  // requires implementation for the following rule in the specification:
-  // > do not NFKD normalize to any of the following symbols:
 
   return true;
 }
diff --git a/third_party/blink/renderer/platform/text/character_test.cc b/third_party/blink/renderer/platform/text/character_test.cc
index b0ddd7d..931ee181 100644
--- a/third_party/blink/renderer/platform/text/character_test.cc
+++ b/third_party/blink/renderer/platform/text/character_test.cc
@@ -738,4 +738,66 @@
   }
 }
 
+static struct CanReceiveTextEmphasisTestData {
+  const UChar32 character;
+  bool expected;
+} can_receive_text_emphasis_test_data[] = {
+    {u'0', true},
+    {u'a', true},
+    {u'人', true},
+    {u'한', true},
+    // Additional word-separator characters.
+    {uchar::kEthiopicWordspace, false},
+    {uchar::kAegeanWordSeparatorLine, false},
+    {uchar::kAegeanWordSeparatorDot, false},
+    {uchar::kUgariticWordDivider, false},
+    {uchar::kTibetanMarkIntersyllabicTsheg, false},
+    {uchar::kTibetanMarkDelimiterTshegBstar, false},
+    // Punctuation.
+    {u'(', false},
+    {u']', false},
+    {u'!', false},
+    {u' ', false},
+    {u',', false},
+    // A set of exceptions for punctuation.
+    {uchar::kNumberSign, true},
+    {uchar::kPercentSign, true},
+    {uchar::kAmpersand, true},
+    {uchar::kCommercialAt, true},
+    {uchar::kSectionSign, true},
+    {uchar::kPilcrowSign, true},
+    {uchar::kArabicIndicPerMilleSign, true},
+    {uchar::kArabicIndicPerTenThousandSign, true},
+    {uchar::kArabicPercentSign, true},
+    {uchar::kPerMilleSign, true},
+    {uchar::kPerTenThousandSign, true},
+    {uchar::kTironianSignEt, true},
+    {uchar::kReversedPilcrowSign, true},
+    {uchar::kSwungDash, true},
+    {uchar::kPartAlternationMark, true},
+    // Characters with NFKD equivalence to the above.
+    {uchar::kSmallNumberSign, true},
+    {uchar::kSmallAmpersand, true},
+    {uchar::kSmallPercentSign, true},
+    {uchar::kSmallCommercialAt, true},
+    {uchar::kFullwidthNumberSign, true},
+    {uchar::kFullwidthPercentSign, true},
+    {uchar::kFullwidthAmpersand, true},
+    {uchar::kFullwidthCommercialAt, true},
+};
+
+class CanReceiveTextEmphasisTest
+    : public testing::Test,
+      public testing::WithParamInterface<CanReceiveTextEmphasisTestData> {};
+
+INSTANTIATE_TEST_SUITE_P(
+    CanReceiveTextEmphasisTest,
+    CanReceiveTextEmphasisTest,
+    testing::ValuesIn(can_receive_text_emphasis_test_data));
+
+TEST_P(CanReceiveTextEmphasisTest, ToLowerWithoutOffset) {
+  const auto data = GetParam();
+  EXPECT_EQ(Character::CanReceiveTextEmphasis(data.character), data.expected);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/wtf/forward.h b/third_party/blink/renderer/platform/wtf/forward.h
index bfa7ea9a..91344e5 100644
--- a/third_party/blink/renderer/platform/wtf/forward.h
+++ b/third_party/blink/renderer/platform/wtf/forward.h
@@ -55,12 +55,4 @@
 
 }  // namespace blink
 
-namespace WTF {
-
-// TODO(crbug.com/422768753): Remove these `using` directives.
-using blink::String;
-using blink::Vector;
-
-}  // namespace WTF
-
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_FORWARD_H_
diff --git a/third_party/blink/renderer/platform/wtf/functional.h b/third_party/blink/renderer/platform/wtf/functional.h
index c09994b6..ddca3d5 100644
--- a/third_party/blink/renderer/platform/wtf/functional.h
+++ b/third_party/blink/renderer/platform/wtf/functional.h
@@ -464,18 +464,4 @@
 
 }  // namespace base
 
-// TODO(crbug.com/422768753): Remove these `using` directives.
-namespace WTF {
-using blink::BindOnce;
-using blink::BindRepeating;
-using blink::CrossThreadFunction;
-using blink::CrossThreadOnceClosure;
-using blink::CrossThreadOnceFunction;
-using blink::CrossThreadRepeatingFunction;
-using blink::CrossThreadUnretained;
-using blink::RetainedRef;
-using blink::Unretained;
-using blink::UnretainedWrapper;
-}  // namespace WTF
-
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_FUNCTIONAL_H_
diff --git a/third_party/blink/renderer/platform/wtf/hash_map.h b/third_party/blink/renderer/platform/wtf/hash_map.h
index 9812ade..0e7b1ec8 100644
--- a/third_party/blink/renderer/platform/wtf/hash_map.h
+++ b/third_party/blink/renderer/platform/wtf/hash_map.h
@@ -592,8 +592,4 @@
 
 }  // namespace blink
 
-namespace WTF {
-using blink::HashMap;
-}  // namespace WTF
-
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_HASH_MAP_H_
diff --git a/third_party/blink/renderer/platform/wtf/hash_set.h b/third_party/blink/renderer/platform/wtf/hash_set.h
index 0ff3f5d..4b61982 100644
--- a/third_party/blink/renderer/platform/wtf/hash_set.h
+++ b/third_party/blink/renderer/platform/wtf/hash_set.h
@@ -380,9 +380,4 @@
 
 }  // namespace blink
 
-// TODO(crbug.com/422768753): Remove this `using` directive.
-namespace WTF {
-using blink::HashSet;
-}  // namespace WTF
-
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_HASH_SET_H_
diff --git a/third_party/blink/renderer/platform/wtf/text/README.md b/third_party/blink/renderer/platform/wtf/text/README.md
index 1f94534..02a4fd8 100644
--- a/third_party/blink/renderer/platform/wtf/text/README.md
+++ b/third_party/blink/renderer/platform/wtf/text/README.md
@@ -155,18 +155,33 @@
 checking whether all the source characters can be represented in
 Latin-1.
 
+## Concatenation
+
+We have multiple ways to create a new string by concatenating multiple
+input strings. Use `blink::StrCat()` if the number of input strings is
+fixed. Use `StringBuilder` otherwise.
+
+### `StrCat()`
+
+The `StrCat()` function is the most efficient way to concatenate strings.
+We can use it if the number of input strings is known at compile time
+because `StrCat()`'s argument is a `std::initializer_list`.
 
 ### `operator+`
 
-The + operator on Strings is the most efficient way to combine smaller
-strings into larger strings. Using templates, `operator+` builds a
-tree of temporary objects that mirrors the tree of `operator+`
+The `+` operator on Blink string types is the simplest way to combine
+smaller strings into larger strings. Using templates, `operator+` builds
+a tree of temporary objects that mirrors the tree of `operator+`
 invocations. When the temporary objects are (implicitly) collapsed to
 a `String`, we first compute the length of the final string and then
 allocate a single `StringImpl` object of exactly the correct size.
 After allocating the object, we copy all the characters into the
 string. This approach means we copy the characters exactly once into
-the correctly sized buffer, which is maximally efficient.
+the correctly sized buffer, which is efficient.
+
+Because of the complex template usages, code size generated for
+`operator+` is much larger than `StrCat()`, and its runtime speed is
+slightly slower than `StrCat()`.
 
 ### `StringBuilder`
 
diff --git a/third_party/blink/renderer/platform/wtf/text/character_names.h b/third_party/blink/renderer/platform/wtf/text/character_names.h
index 1e48912..30fc20d 100644
--- a/third_party/blink/renderer/platform/wtf/text/character_names.h
+++ b/third_party/blink/renderer/platform/wtf/text/character_names.h
@@ -46,6 +46,9 @@
 const UChar kFormFeed = 0x000C;
 const UChar kCarriageReturn = 0x000D;
 const UChar kSpace = 0x0020;
+const UChar kNumberSign = 0x0023;
+const UChar kPercentSign = 0x0025;
+const UChar kAmpersand = 0x0026;
 const UChar kComma = 0x002C;
 const UChar kHyphenMinus = 0x002D;
 const UChar kFullStop = 0x002E;
@@ -53,13 +56,16 @@
 const UChar kDigitZero = 0x0030;
 const UChar kColon = 0x003A;
 const UChar kSemiColon = 0x003B;
+const UChar kCommercialAt = 0x0040;
 const UChar kReverseSolidus = 0x005C;
 const UChar kLowLine = 0x005F;
 const UChar kVerticalLine = 0x7C;
 const UChar kDelete = 0x007F;
 const UChar kNoBreakSpace = 0x00A0;
 const UChar kYenSign = 0x00A5;
+const UChar kSectionSign = 0x00A7;
 const UChar kSoftHyphen = 0x00AD;
+const UChar kPilcrowSign = 0x00B6;
 const UChar kMiddleDot = 0x00B7;
 const UChar kLatinSmallLetterSharpS = 0x00DF;
 
@@ -87,7 +93,10 @@
 const UChar kGreekCapitalReversedDottedLunateSigmaSymbol = 0x03FF;
 const UChar kHebrewPunctuationGeresh = 0x05F3;
 const UChar kHebrewPunctuationGershayim = 0x05F4;
+const UChar kArabicIndicPerMilleSign = 0x0609;
+const UChar kArabicIndicPerTenThousandSign = 0x060A;
 const UChar kArabicLetterMark = 0x061C;
+const UChar kArabicPercentSign = 0x066A;
 const UChar kTibetanMarkIntersyllabicTsheg = 0x0F0B;
 const UChar kTibetanMarkDelimiterTshegBstar = 0x0F0C;
 
@@ -122,7 +131,12 @@
 const UChar kPopDirectionalFormatting = 0x202C;
 const UChar kLeftToRightOverride = 0x202D;
 const UChar kRightToLeftOverride = 0x202E;
+const UChar kPerMilleSign = 0x2030;
+const UChar kPerTenThousandSign = 0x2031;
 const UChar kOverline = 0x203E;
+const UChar kTironianSignEt = 0x204A;
+const UChar kReversedPilcrowSign = 0x204B;
+const UChar kSwungDash = 0x2053;
 const UChar kLeftToRightIsolate = 0x2066;
 const UChar kRightToLeftIsolate = 0x2067;
 const UChar kFirstStrongIsolate = 0x2068;
@@ -165,6 +179,7 @@
 const UChar kIdeographicComma = 0x3001;
 const UChar kIdeographicFullStop = 0x3002;
 const UChar kLeftCornerBracket = 0x300C;
+const UChar kPartAlternationMark = 0x303D;
 const UChar kHiraganaLetterSmallA = 0x3041;
 const UChar kHiraganaLetterA = 0x3042;
 const UChar kKatakanaMiddleDot = 0x30FB;
@@ -183,8 +198,15 @@
 const UChar kVariationSelector16 = 0xFE0F;
 const UChar kSesameDot = 0xFE45;
 const UChar kWhiteSesameDot = 0xFE46;
+const UChar kSmallNumberSign = 0xFE5F;
+const UChar kSmallAmpersand = 0xFE60;
+const UChar kSmallPercentSign = 0xFE6A;
+const UChar kSmallCommercialAt = 0xFE6B;
 const UChar kZeroWidthNoBreakSpace = 0xFEFF;
 const UChar kFullwidthExclamationMark = 0xFF01;
+const UChar kFullwidthNumberSign = 0xFF03;
+const UChar kFullwidthPercentSign = 0xFF05;
+const UChar kFullwidthAmpersand = 0xFF06;
 const UChar kFullwidthComma = 0xFF0C;
 const UChar kFullwidthHyphenMinus = 0xFF0D;
 const UChar kFullwidthFullStop = 0xFF0E;
@@ -192,6 +214,7 @@
 const UChar kFullwidthDigitNine = 0xFF19;
 const UChar kFullwidthColon = 0xFF1A;
 const UChar kFullwidthSemicolon = 0xFF1B;
+const UChar kFullwidthCommercialAt = 0xFF20;
 const UChar kObjectReplacementCharacter = 0xFFFC;
 const UChar kReplacementCharacter = 0xFFFD;
 const UChar32 kNonCharacter = 0xFFFF;
diff --git a/third_party/blink/renderer/platform/wtf/text/wtf_string.h b/third_party/blink/renderer/platform/wtf/text/wtf_string.h
index 433054e..d20b1425 100644
--- a/third_party/blink/renderer/platform/wtf/text/wtf_string.h
+++ b/third_party/blink/renderer/platform/wtf/text/wtf_string.h
@@ -718,19 +718,6 @@
 
 }  // namespace blink
 
-namespace WTF {
-
-// TODO(crbug.com/422768753): Remove these`using` directives.
-using blink::CodeUnitCompare;
-using blink::CodeUnitCompareIgnoringASCIICase;
-using blink::CodeUnitCompareLessThan;
-using blink::EqualIgnoringNullity;
-using blink::g_empty_string;
-using blink::g_xmlns_with_colon;
-using blink::NewlineThenWhitespaceStringsTable;
-using blink::String;
-}  // namespace WTF
-
 WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(String)
 
 #include "third_party/blink/renderer/platform/wtf/text/string_operators.h"
diff --git a/third_party/blink/renderer/platform/wtf/vector.h b/third_party/blink/renderer/platform/wtf/vector.h
index df421219..39c4ec4 100644
--- a/third_party/blink/renderer/platform/wtf/vector.h
+++ b/third_party/blink/renderer/platform/wtf/vector.h
@@ -2630,16 +2630,4 @@
 
 }  // namespace blink
 
-// TODO(crbug.com/422768753): Remove these `using` directives.
-namespace WTF {
-using blink::Erase;
-using blink::EraseIf;
-using blink::kVectorNeedsDestructor;
-using blink::ToVector;
-using blink::Vector;
-using blink::VectorBuffer;
-using blink::VectorOperationOrigin;
-using blink::VectorTypeOperations;
-}  // namespace WTF
-
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_VECTOR_H_
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 96bf58d..d9e3cf5 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -117,10 +117,6 @@
 crbug.com/1393073 [ Linux ] virtual/fenced-frame-mparch/external/wpt/fenced-frame/anchor-focus.https.html [ Failure Pass ]
 crbug.com/340949930 virtual/fenced-frame-mparch/external/wpt/fenced-frame/intersection-observer.https.html [ Failure Timeout ]
 
-# temporarily disabled to land a devtools CL
-crbug.com/407752215 http/tests/devtools/network/network-choose-preview-view.js [ Failure Pass ]
-crbug.com/407752215 http/tests/devtools/network/preview-searchable.js [ Failure Pass ]
-
 # WPT Test harness doesn't deal with finding an about:blank ref test
 crbug.com/895777 external/wpt/infrastructure/assumptions/blank.html [ Timeout ]
 crbug.com/895777 external/wpt/css/css-transforms/text-perspective-001.html [ Timeout ]
@@ -4303,7 +4299,6 @@
 crbug.com/626703 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-auto-006.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/mathml/presentation-markup/operators/non-spacing-accent-1.xhtml [ Failure ]
 crbug.com/626703 [ Mac13 Release ] external/wpt/IndexedDB/reading-autoincrement-indexes.any.html [ Timeout ]
-crbug.com/626703 external/wpt/css/css-text/tab-size/tab-size-integer-005.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/white-space/text-wrap-balance-float-003.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/white-space/text-wrap-balance-float-004.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/white-space/text-wrap-balance-float-005.html [ Failure ]
@@ -9320,8 +9315,11 @@
 
 crbug.com/41493642 external/wpt/html/semantics/embedded-content/the-canvas-element/toBlob-cross-realm-callback-report-exception.html [ Failure Pass ]
 
+# Temporarily disabled to land a devtools CL
+crbug.com/436136172 http/tests/devtools/a11y-axe-core/sources/event-listener-breakpoints-a11y-test.js [ Failure Pass ]
+
 #Disable due to high frequency flakiness
-# temporarily skipped to land crrev.com/c/6889751 crbug.com/393175977 [ Debug Mac14 ] http/tests/devtools/network/preview-searchable.js [ Failure Pass Timeout ]
+crbug.com/393175977 [ Debug Mac14 ] http/tests/devtools/network/preview-searchable.js [ Failure Pass Timeout ]
 crbug.com/393175977 [ Debug Mac14 ] http/tests/devtools/sources/debugger-breakpoints/event-listener-breakpoints-xhr.js [ Failure Pass Timeout ]
 
 # Gardener 2025-01-21
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index 319dfe3..af7ba9b 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -328531,13 +328531,17 @@
      []
     ],
     "resources": {
-     "setAppBadge_iframe.html": [
-      "8738099658fbb2de893658e70242e855ecccd4b1",
+     "badge_iframe.html": [
+      "29e8b529012f58596c419b9726870af8ed73e4e7",
+      []
+     ],
+     "message-handler.js": [
+      "c308e6f432a59e0e024ae5ec7bd8e780ad0bc989",
       []
      ]
     },
     "setAppBadge_cross_origin.sub.https-expected.txt": [
-     "f1208e041c36113d082d71cb90c961a5fac3c66e",
+     "afde8233a3a1d410927e28cfe37198b37fc29241",
      []
     ]
    },
@@ -393830,7 +393834,7 @@
       ]
      },
      "fedcm-helper.sub.js": [
-      "466b362a94458bbe808d5a6d29e67c6e6891827f",
+      "915eed6f2264d2d6468b29b96065d2b3f610eac1",
       []
      ],
      "fedcm-helper.sub.js.headers": [
@@ -393861,6 +393865,10 @@
       "681fcd6787525632b0e5f1f24b2ca308d7fe6b82",
       []
      ],
+     "flexible_tokens.py": [
+      "72971fa71f1afe6e450463d329509f196d601047",
+      []
+     ],
      "idp_close.html": [
       "84c0dfa88b791edff35649d1627e004a824e5d36",
       []
@@ -393929,6 +393937,10 @@
       "d7304159834804c417f498acebc45f59e588dcbb",
       []
      ],
+     "manifest_flexible_tokens.json": [
+      "917ddf6365cb5920c1fde74e996e1d6e16fbae2f",
+      []
+     ],
      "manifest_id_assertion_endpoint_returns_error.json": [
       "e098cc4511a1980392097d0a26c020db3243ae35",
       []
@@ -396892,250 +396904,6 @@
       ]
      }
     },
-    "private-network-access": {
-     "META.yml": [
-      "944ce6f14a1204f048e00db3b7ea21da93037709",
-      []
-     ],
-     "README.md": [
-      "cbb5b85b74d1347b93c7f0e480cf978262da6b03",
-      []
-     ],
-     "anchor.tentative.https.window_include=from-private-expected.txt": [
-      "a1f71342af938b921068edb09a61ee9f7c7d56af",
-      []
-     ],
-     "anchor.tentative.https.window_include=from-public-expected.txt": [
-      "d14171bc367dbc44dd4e8888d5a9cc1b943ce793",
-      []
-     ],
-     "anchor.tentative.https.window_include=from-treat-as-public-expected.txt": [
-      "aa8c3d8001da1c0aaa3c81d6264ed4bf658725bc",
-      []
-     ],
-     "anchor.tentative.window-expected.txt": [
-      "06cd1f13ec8f52bf10fdfd2a6bfcc6e0578c4753",
-      []
-     ],
-     "iframe.tentative.https.window_include=from-private-expected.txt": [
-      "9e4b954d95b3e00e6968afa84e9eb1e17c84039d",
-      []
-     ],
-     "iframe.tentative.https.window_include=from-public-expected.txt": [
-      "73c9c1ab14c1d36c6aaa5730cb5762fc6e7b0dcf",
-      []
-     ],
-     "iframe.tentative.https.window_include=from-treat-as-public-expected.txt": [
-      "ed2ff83c8a68f9292f2f05aee946752089095b71",
-      []
-     ],
-     "iframe.tentative.https.window_include=grandparent-expected.txt": [
-      "484ddc3e916df8e8c39984a32a2d9dff1cca73bf",
-      []
-     ],
-     "iframe.tentative.window-expected.txt": [
-      "b87f29659cd1dfc4f1057af2f19b8987f6ed8290",
-      []
-     ],
-     "nested-worker.tentative.https.window-expected.txt": [
-      "34e0ed452a0c1e0ed380e677ecafbfc2cf54390c",
-      []
-     ],
-     "nested-worker.tentative.window-expected.txt": [
-      "34e0ed452a0c1e0ed380e677ecafbfc2cf54390c",
-      []
-     ],
-     "resources": {
-      "anchor.html": [
-       "0780b3fa502d1651cdf93332bfa957f15f2425ff",
-       []
-      ],
-      "executor.html": [
-       "d71212951cb63ebd310820d1df7c8789b5fbd316",
-       []
-      ],
-      "fenced-frame-fetcher.https.html": [
-       "b14601dba51d96e29340a43bde00f7b8af25fd9d",
-       []
-      ],
-      "fenced-frame-fetcher.https.html.headers": [
-       "6247f6d63211cd39dffca9fc507aefcdee586eba",
-       []
-      ],
-      "fenced-frame-private-network-access-target.https.html": [
-       "2b55e056f39834bbad4af96d2dc2549fbc400bf7",
-       []
-      ],
-      "fenced-frame-private-network-access.https.html": [
-       "98f118432e0ee13b8b089977bd3c640343005497",
-       []
-      ],
-      "fenced-frame-private-network-access.https.html.headers": [
-       "6247f6d63211cd39dffca9fc507aefcdee586eba",
-       []
-      ],
-      "fetcher.html": [
-       "000a5cc25bb72b334d41ff05e7b8f22691f48f30",
-       []
-      ],
-      "fetcher.js": [
-       "3a1859876d406cebe9a2bbc63952d019ddc5ed06",
-       []
-      ],
-      "iframed-no-preflight-received.html": [
-       "20b5150d44a770f7519ba5ecec85e79ef9bda064",
-       []
-      ],
-      "iframed.html": [
-       "c889c2882a45030fb1257db6be812a722475c9f3",
-       []
-      ],
-      "iframer.html": [
-       "304cc54ae4448b84bf43aad3279b2dd198add165",
-       []
-      ],
-      "no-preflight-received.html": [
-       "5ee533e1820d737f6cbfb8cc4f5b7a134706c3fd",
-       []
-      ],
-      "open-to-existing-window.html": [
-       "6460024bc80c1709bf9d805f7f51413de0c251f2",
-       []
-      ],
-      "openee.html": [
-       "8f0a859cb3256c0535738f4e3c445c41532cf82b",
-       []
-      ],
-      "opener.html": [
-       "78b66c6db7bfba26cb5b25e05807ff2cfedfe19e",
-       []
-      ],
-      "preflight.py": [
-       "44676632394a6973a7f77c661eb4824d9e1e411a",
-       []
-      ],
-      "service-worker-bridge.html": [
-       "816de535feaa83c224e76159d3defa571b1199fe",
-       []
-      ],
-      "service-worker-fetch-all.js": [
-       "78ac8d1576b49802fa1587c332ba8cad7a568daf",
-       []
-      ],
-      "service-worker.js": [
-       "bca71ad910cb189c2de6298b4ea59b5594aba637",
-       []
-      ],
-      "shared-fetcher.js": [
-       "30bde1e0542d144f9b5b0e47824802df13556ee2",
-       []
-      ],
-      "shared-worker-blob-fetcher.html": [
-       "a79869b2f96249969d44e5f18341fa1cbd094f4d",
-       []
-      ],
-      "shared-worker-fetcher.html": [
-       "4af4b1f23959e00c50d48a926f24d97edb8edb90",
-       []
-      ],
-      "socket-opener.html": [
-       "48d27216bedf9aa1daf4d2a4e96f860e9315a0c3",
-       []
-      ],
-      "support.sub.js": [
-       "6d0743e0f8fb45271d39a9dfd3a7179a2323a662",
-       []
-      ],
-      "worker-blob-fetcher.html": [
-       "5a50271e11b57d808b01a5849b1bee7d3dbeba28",
-       []
-      ],
-      "worker-fetcher.html": [
-       "bd155a532bd2d9dd2b5f96383cb8bde27a289856",
-       []
-      ],
-      "worker-fetcher.js": [
-       "aab49afe6f47c752884d407cfa48ef38e3b4a847",
-       []
-      ],
-      "xhr-sender.html": [
-       "b131fa41f9a8bf14c5c0a1aac8fcc2593bec6c42",
-       []
-      ]
-     },
-     "service-worker-fetch-document-treat-as-public.tentative.https.window-expected.txt": [
-      "c9433e6f5deb270f6c70872722c6250ff0fe54eb",
-      []
-     ],
-     "service-worker-fetch-document.tentative.https.window-expected.txt": [
-      "3f3485f4c707cfaee7242ef1240a0093245cf0de",
-      []
-     ],
-     "service-worker-fetch.tentative.https.window_1-8-expected.txt": [
-      "3f3485f4c707cfaee7242ef1240a0093245cf0de",
-      []
-     ],
-     "service-worker-fetch.tentative.https.window_9-last-expected.txt": [
-      "c9433e6f5deb270f6c70872722c6250ff0fe54eb",
-      []
-     ],
-     "shared-worker-blob-fetch.tentative.https.window-expected.txt": [
-      "48d96266fc416a2e2cf3fd6bce3d98f0dcdaa8ce",
-      []
-     ],
-     "shared-worker-blob-fetch.tentative.window-expected.txt": [
-      "2c97a97b069b7c2f4ed160370f9c27c8cdc3bf87",
-      []
-     ],
-     "shared-worker-fetch.tentative.https.window-expected.txt": [
-      "4eac0e8fd66512f791a984e697d27be712892be9",
-      []
-     ],
-     "shared-worker-fetch.tentative.window-expected.txt": [
-      "b9e9af7e396e9edff7fc5cf2c5678e65823d527c",
-      []
-     ],
-     "shared-worker.tentative.window-expected.txt": [
-      "34e0ed452a0c1e0ed380e677ecafbfc2cf54390c",
-      []
-     ],
-     "websocket.tentative.window-expected.txt": [
-      "f39de90ff57aaf483cdde713f8d3f9082959654c",
-      []
-     ],
-     "window-open-existing.tentative.window-expected.txt": [
-      "06cd1f13ec8f52bf10fdfd2a6bfcc6e0578c4753",
-      []
-     ],
-     "window-open.tentative.https.window_include=from-private-expected.txt": [
-      "a1f71342af938b921068edb09a61ee9f7c7d56af",
-      []
-     ],
-     "window-open.tentative.https.window_include=from-public-expected.txt": [
-      "d14171bc367dbc44dd4e8888d5a9cc1b943ce793",
-      []
-     ],
-     "window-open.tentative.https.window_include=from-treat-as-public-expected.txt": [
-      "aa8c3d8001da1c0aaa3c81d6264ed4bf658725bc",
-      []
-     ],
-     "window-open.tentative.window-expected.txt": [
-      "06cd1f13ec8f52bf10fdfd2a6bfcc6e0578c4753",
-      []
-     ],
-     "worker-fetch.tentative.https.window-expected.txt": [
-      "48d96266fc416a2e2cf3fd6bce3d98f0dcdaa8ce",
-      []
-     ],
-     "worker-fetch.tentative.window-expected.txt": [
-      "5d0ad0a4a437f817878e2f59bf35a7195a3e799d",
-      []
-     ],
-     "worker.tentative.window-expected.txt": [
-      "34e0ed452a0c1e0ed380e677ecafbfc2cf54390c",
-      []
-     ]
-    },
     "range": {
      "blob.any-expected.txt": [
       "f70305b43dcc034bb75d5a00e23a1302729eabb7",
@@ -479817,7 +479585,7 @@
      ]
     ],
     "setAppBadge_cross_origin.sub.https.html": [
-     "7e548879bcbf67c84a94a6b5d9dd276016d03ff0",
+     "55ca1e1758e6f73843cacdccd03b603b6d47d5e7",
      [
       null,
       {}
@@ -577025,6 +576793,28 @@
       }
      ]
     ],
+    "fedcm-flexible-token": {
+     "basic.https.html": [
+      "cbbe0b8abe2e3fcea96d4fb908bcb4de30a71399",
+      [
+       null,
+       {
+        "testdriver": true,
+        "timeout": "long"
+       }
+      ]
+     ],
+     "complex.https.html": [
+      "47369f3a9bb52dac390680ac9fda15ce810268c6",
+      [
+       null,
+       {
+        "testdriver": true,
+        "timeout": "long"
+       }
+      ]
+     ]
+    },
     "fedcm-identity-assertion-nocors.https.html": [
      "a5e2e52e47aba95e6a02f8244ca0234e25f6a08e",
      [
@@ -577863,7 +577653,7 @@
      ]
     ],
     "disallowed-navigation-to-blob.https.html": [
-     "3722609410745847a34b91555f3cd8e5b402d0bf",
+     "9b299cd5e1e03641586004eb0b53ab14ce3bfd1b",
      [
       null,
       {
@@ -577872,7 +577662,7 @@
      ]
     ],
     "disallowed-navigation-to-data.https.html": [
-     "99c2e05bee3b491fe6f67976899527ec7bd1fa23",
+     "7ab8edc7e11076ca33f4affa0a88a622e17afe8e",
      [
       null,
       {
@@ -577890,7 +577680,7 @@
      ]
     ],
     "disallowed-navigations-dangling-markup-urn.https.html": [
-     "a36f98f9755a4773407f10c4ad163571dd5dc267",
+     "8302edc6e9f5a28ab2608a8acd8f5a243153ad3b",
      [
       null,
       {
@@ -577908,7 +577698,7 @@
      ]
     ],
     "disallowed-navigations.https.html": [
-     "54fa95f16f469c59101e4f0c43206824770bcffe",
+     "5cde50d4201beb36418fbb18399dec693d3d50d4",
      [
       null,
       {
@@ -592594,1473 +592384,6 @@
       ]
      ]
     },
-    "private-network-access": {
-     "anchor.tentative.https.window.js": [
-      "4e860ad381df9b97fe3486e6b9d8d98eaabf808a",
-      [
-       "fetch/private-network-access/anchor.tentative.https.window.html?include=from-local",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ],
-         [
-          "variant",
-          "?include=from-treat-as-public"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ],
-      [
-       "fetch/private-network-access/anchor.tentative.https.window.html?include=from-private",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ],
-         [
-          "variant",
-          "?include=from-treat-as-public"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ],
-      [
-       "fetch/private-network-access/anchor.tentative.https.window.html?include=from-public",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ],
-         [
-          "variant",
-          "?include=from-treat-as-public"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ],
-      [
-       "fetch/private-network-access/anchor.tentative.https.window.html?include=from-treat-as-public",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ],
-         [
-          "variant",
-          "?include=from-treat-as-public"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ]
-     ],
-     "anchor.tentative.window.js": [
-      "cb538658081437ba5867d2df426c444aacaa6c2c",
-      [
-       "fetch/private-network-access/anchor.tentative.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ]
-     ],
-     "fetch-from-treat-as-public.tentative.https.window.js": [
-      "084e03282f4f78cf10408647ffd7d9a2f274c0e7",
-      [
-       "fetch/private-network-access/fetch-from-treat-as-public.tentative.https.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "fetch.tentative.https.window.js": [
-      "606443dc14ddf9730654f58a0ddf577b0678195c",
-      [
-       "fetch/private-network-access/fetch.tentative.https.window.html?include=baseline",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "variant",
-          "?include=baseline"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ]
-        ]
-       }
-      ],
-      [
-       "fetch/private-network-access/fetch.tentative.https.window.html?include=from-local",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "variant",
-          "?include=baseline"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ]
-        ]
-       }
-      ],
-      [
-       "fetch/private-network-access/fetch.tentative.https.window.html?include=from-private",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "variant",
-          "?include=baseline"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ]
-        ]
-       }
-      ],
-      [
-       "fetch/private-network-access/fetch.tentative.https.window.html?include=from-public",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "variant",
-          "?include=baseline"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ]
-        ]
-       }
-      ]
-     ],
-     "fetch.tentative.window.js": [
-      "8ee54c905629293255551d560b240c5ac7086707",
-      [
-       "fetch/private-network-access/fetch.tentative.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "iframe.tentative.https.window.js": [
-      "1e00c0af41a4395db82c2126744703f0582ee145",
-      [
-       "fetch/private-network-access/iframe.tentative.https.window.html?include=from-local",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ],
-         [
-          "variant",
-          "?include=from-treat-as-public"
-         ],
-         [
-          "variant",
-          "?include=grandparent"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ],
-      [
-       "fetch/private-network-access/iframe.tentative.https.window.html?include=from-private",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ],
-         [
-          "variant",
-          "?include=from-treat-as-public"
-         ],
-         [
-          "variant",
-          "?include=grandparent"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ],
-      [
-       "fetch/private-network-access/iframe.tentative.https.window.html?include=from-public",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ],
-         [
-          "variant",
-          "?include=from-treat-as-public"
-         ],
-         [
-          "variant",
-          "?include=grandparent"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ],
-      [
-       "fetch/private-network-access/iframe.tentative.https.window.html?include=from-treat-as-public",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ],
-         [
-          "variant",
-          "?include=from-treat-as-public"
-         ],
-         [
-          "variant",
-          "?include=grandparent"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ],
-      [
-       "fetch/private-network-access/iframe.tentative.https.window.html?include=grandparent",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ],
-         [
-          "variant",
-          "?include=from-treat-as-public"
-         ],
-         [
-          "variant",
-          "?include=grandparent"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ]
-     ],
-     "iframe.tentative.window.js": [
-      "441e0884d275adfd47146746575bdecca997abb6",
-      [
-       "fetch/private-network-access/iframe.tentative.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "nested-worker.tentative.https.window.js": [
-      "3eeb435badb2d00404e0e214e1d42c4be2817f8a",
-      [
-       "fetch/private-network-access/nested-worker.tentative.https.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "nested-worker.tentative.window.js": [
-      "6d246e1c76d6c5f603c3e29430ae0586fdb9f5ad",
-      [
-       "fetch/private-network-access/nested-worker.tentative.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "preflight-cache.https.tentative.window.js": [
-      "87dbf501f628a25fa299240da5d5856f4366d8cc",
-      [
-       "fetch/private-network-access/preflight-cache.https.tentative.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "redirect.tentative.https.window.js": [
-      "efbd8f31f936ad22aac5685e04676177b1dc31d7",
-      [
-       "fetch/private-network-access/redirect.tentative.https.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "service-worker-background-fetch.tentative.https.window.js": [
-      "8d1028cc5ee85ad24851801caf526d79a0fa3da4",
-      [
-       "fetch/private-network-access/service-worker-background-fetch.tentative.https.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ]
-     ],
-     "service-worker-fetch-document-treat-as-public.tentative.https.window.js": [
-      "6fc29ce4725b15b4d773c641e8fa93756e2399a5",
-      [
-       "fetch/private-network-access/service-worker-fetch-document-treat-as-public.tentative.https.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "service-worker-fetch-document.tentative.https.window.js": [
-      "ec380555a809b38543bb0f74fb59a8d546e785ef",
-      [
-       "fetch/private-network-access/service-worker-fetch-document.tentative.https.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "service-worker-fetch.tentative.https.window.js": [
-      "5fc5800ba042345789ffe0a78c77c9502d6acd44",
-      [
-       "fetch/private-network-access/service-worker-fetch.tentative.https.window.html?1-8",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "script",
-          "/common/subset-tests.js"
-         ],
-         [
-          "variant",
-          "?1-8"
-         ],
-         [
-          "variant",
-          "?9-last"
-         ]
-        ]
-       }
-      ],
-      [
-       "fetch/private-network-access/service-worker-fetch.tentative.https.window.html?9-last",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "script",
-          "/common/subset-tests.js"
-         ],
-         [
-          "variant",
-          "?1-8"
-         ],
-         [
-          "variant",
-          "?9-last"
-         ]
-        ]
-       }
-      ]
-     ],
-     "service-worker-update.tentative.https.window.js": [
-      "4882d235bb01c7498cf956ba5a46c0d496e66067",
-      [
-       "fetch/private-network-access/service-worker-update.tentative.https.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "service-worker.tentative.https.window.js": [
-      "046f662a1275a9b017784139e85b83f419e71098",
-      [
-       "fetch/private-network-access/service-worker.tentative.https.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "shared-worker-blob-fetch.tentative.https.window.js": [
-      "269abb7edc4ce9be544c08b6206d8a2994e45759",
-      [
-       "fetch/private-network-access/shared-worker-blob-fetch.tentative.https.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "shared-worker-blob-fetch.tentative.window.js": [
-      "d430ea7383771844bb8955e4c6be23c63e6adc59",
-      [
-       "fetch/private-network-access/shared-worker-blob-fetch.tentative.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "shared-worker-fetch.tentative.https.window.js": [
-      "e5f2b94920276e0360d1566e5d343886c4382b54",
-      [
-       "fetch/private-network-access/shared-worker-fetch.tentative.https.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "shared-worker-fetch.tentative.window.js": [
-      "9bc1a89beadc673afe783eb56b5e0b2560dbf408",
-      [
-       "fetch/private-network-access/shared-worker-fetch.tentative.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "shared-worker.tentative.https.window.js": [
-      "24ae10878281b153ba6a267a8b3cb3c30a38b628",
-      [
-       "fetch/private-network-access/shared-worker.tentative.https.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "shared-worker.tentative.window.js": [
-      "ffa8a360c7032138b89d48507b0d1dcb9a23d5a2",
-      [
-       "fetch/private-network-access/shared-worker.tentative.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "websocket.tentative.https.window.js": [
-      "0731896098bcefa614ebdf28765a04766b5e6cda",
-      [
-       "fetch/private-network-access/websocket.tentative.https.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "websocket.tentative.window.js": [
-      "a44cfaedec78b2570e868f3b81ac59575c76bc54",
-      [
-       "fetch/private-network-access/websocket.tentative.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "window-open-existing.tentative.window.js": [
-      "5a6cd4c5cfd20c931a37c4f98524a4a59c0d07c9",
-      [
-       "fetch/private-network-access/window-open-existing.tentative.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ]
-     ],
-     "window-open.tentative.https.window.js": [
-      "6793d1f3b4d9218975c7b08e165a729c00960df9",
-      [
-       "fetch/private-network-access/window-open.tentative.https.window.html?include=from-local",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ],
-         [
-          "variant",
-          "?include=from-treat-as-public"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ],
-      [
-       "fetch/private-network-access/window-open.tentative.https.window.html?include=from-private",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ],
-         [
-          "variant",
-          "?include=from-treat-as-public"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ],
-      [
-       "fetch/private-network-access/window-open.tentative.https.window.html?include=from-public",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ],
-         [
-          "variant",
-          "?include=from-treat-as-public"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ],
-      [
-       "fetch/private-network-access/window-open.tentative.https.window.html?include=from-treat-as-public",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ],
-         [
-          "variant",
-          "?include=from-treat-as-public"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ]
-     ],
-     "window-open.tentative.window.js": [
-      "5e2313d60a22bc7c3d2e3acb4dfbdebff711d539",
-      [
-       "fetch/private-network-access/window-open.tentative.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/dispatcher/dispatcher.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "timeout",
-          "long"
-         ]
-        ],
-        "timeout": "long"
-       }
-      ]
-     ],
-     "worker-blob-fetch.tentative.window.js": [
-      "e119746b8a6b298a2c57bde63f03a59d8e72d477",
-      [
-       "fetch/private-network-access/worker-blob-fetch.tentative.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "worker-fetch.tentative.https.window.js": [
-      "89e0c3cf1f35f0cf741957c3eb0bff38a4705d93",
-      [
-       "fetch/private-network-access/worker-fetch.tentative.https.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "worker-fetch.tentative.window.js": [
-      "4d6b12f06715a8aaa88e2a290531713c036df3c1",
-      [
-       "fetch/private-network-access/worker-fetch.tentative.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "worker.tentative.https.window.js": [
-      "a0f19314ee386c67445afa149faa301938ff1110",
-      [
-       "fetch/private-network-access/worker.tentative.https.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "worker.tentative.window.js": [
-      "118c0992544265603671862af5511f6e7220af28",
-      [
-       "fetch/private-network-access/worker.tentative.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "xhr-from-treat-as-public.tentative.https.window.js": [
-      "3aae3050d97d900c51ad6a3b31de67db6442deea",
-      [
-       "fetch/private-network-access/xhr-from-treat-as-public.tentative.https.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ],
-     "xhr.https.tentative.window.js": [
-      "4dc5da9912f1012bf72a9e689acfbc125d7c2923",
-      [
-       "fetch/private-network-access/xhr.https.tentative.window.html?include=from-local",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ]
-        ]
-       }
-      ],
-      [
-       "fetch/private-network-access/xhr.https.tentative.window.html?include=from-private",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ]
-        ]
-       }
-      ],
-      [
-       "fetch/private-network-access/xhr.https.tentative.window.html?include=from-public",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/subset-tests-by-key.js"
-         ],
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ],
-         [
-          "variant",
-          "?include=from-local"
-         ],
-         [
-          "variant",
-          "?include=from-private"
-         ],
-         [
-          "variant",
-          "?include=from-public"
-         ]
-        ]
-       }
-      ]
-     ],
-     "xhr.tentative.window.js": [
-      "fa307dc559a76cb3cd3f70f76a3c904f4602a442",
-      [
-       "fetch/private-network-access/xhr.tentative.window.html",
-       {
-        "script_metadata": [
-         [
-          "script",
-          "/common/utils.js"
-         ],
-         [
-          "script",
-          "resources/support.sub.js"
-         ]
-        ]
-       }
-      ]
-     ]
-    },
     "range": {
      "blob.any.js": [
       "7bcd4b9d11f3ebc66ddcaad8196431f5e85c4912",
diff --git a/third_party/blink/web_tests/external/wpt/badging/resources/badge_iframe.html b/third_party/blink/web_tests/external/wpt/badging/resources/badge_iframe.html
new file mode 100644
index 0000000..29e8b529
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/badging/resources/badge_iframe.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>iframe to call badge methods</title>
+<script src="message-handler.js"></script>
+<h2>badge iframe</h2>
diff --git a/third_party/blink/web_tests/external/wpt/badging/resources/message-handler.js b/third_party/blink/web_tests/external/wpt/badging/resources/message-handler.js
new file mode 100644
index 0000000..c308e6f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/badging/resources/message-handler.js
@@ -0,0 +1,18 @@
+"use strict";
+this.addEventListener("message", async (event) => {
+  const { method, value } = event.data;
+  const postMessageData = { method };
+  try {
+    await navigator[method](value);
+    postMessageData.status = "success";
+  } catch (e) {
+    postMessageData.status = "error";
+    postMessageData.exceptionType = e.name;
+    postMessageData.message = e.message;
+  } finally {
+    event.source.postMessage(postMessageData, "*");
+  }
+});
+
+const target = this.parent ? this.parent : this;
+target.postMessage("ready", "*");
diff --git a/third_party/blink/web_tests/external/wpt/badging/resources/setAppBadge_iframe.html b/third_party/blink/web_tests/external/wpt/badging/resources/setAppBadge_iframe.html
deleted file mode 100644
index 8738099..0000000
--- a/third_party/blink/web_tests/external/wpt/badging/resources/setAppBadge_iframe.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8" />
-<title>setAppBadge iframe</title>
-<script>
-  async function callSetAppBadge() {
-    const postMessageData = { message: "callSetAppBadge" };
-
-    try {
-      await navigator.setAppBadge();
-      postMessageData.status = "success";
-    } catch (e) {
-      if (e instanceof DOMException) {
-        postMessageData.status = "error";
-        postMessageData.exceptionType = e.name;
-      } else {
-        postMessageData.status = "unknown_error";
-        postMessageData.error = e.toString();
-      }
-    } finally {
-      window.parent.postMessage(postMessageData, "*");
-    }
-  }
-
-  window.addEventListener("message", async (event) => {
-    switch (event.data) {
-      case "callSetAppBadge":
-        await callSetAppBadge();
-        break;
-      default:
-        throw new Error(`Unexpected message: ${event.data}`);
-    }
-  });
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/badging/setAppBadge_cross_origin.sub.https-expected.txt b/third_party/blink/web_tests/external/wpt/badging/setAppBadge_cross_origin.sub.https-expected.txt
index f1208e0..afde8233 100644
--- a/third_party/blink/web_tests/external/wpt/badging/setAppBadge_cross_origin.sub.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/badging/setAppBadge_cross_origin.sub.https-expected.txt
@@ -1,5 +1,15 @@
 This is a testharness.js-based test.
 [FAIL] Test that calling setAppBadge in a cross-origin iframe throws a SecurityError
-  assert_equals: setAppBadge should have rejected with an error expected "error" but got "success"
+  promise_test: Unhandled rejection with value: object "TypeError: iframe.postMessage is not a function"
+[FAIL] Test that calling clearAppBadge in a cross-origin iframe throws a SecurityError
+  promise_test: Unhandled rejection with value: object "TypeError: iframe.postMessage is not a function"
+[FAIL] Test that calling setAppBadge in a same-origin iframe succeeds
+  promise_test: Unhandled rejection with value: object "TypeError: iframe.postMessage is not a function"
+[FAIL] Test that calling clearAppBadge in a same-origin iframe succeeds
+  promise_test: Unhandled rejection with value: object "TypeError: iframe.postMessage is not a function"
+[FAIL] Test calling setAppBadge and clearAppBadge in a same-origin iframe after setting badge on the top level frame
+  promise_test: Unhandled rejection with value: object "TypeError: iframe.postMessage is not a function"
+[FAIL] Test badge behavior in multiple same-origin iframes
+  promise_test: Unhandled rejection with value: object "TypeError: iframe.postMessage is not a function"
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/badging/setAppBadge_cross_origin.sub.https.html b/third_party/blink/web_tests/external/wpt/badging/setAppBadge_cross_origin.sub.https.html
index 7e54887..55ca1e1 100644
--- a/third_party/blink/web_tests/external/wpt/badging/setAppBadge_cross_origin.sub.https.html
+++ b/third_party/blink/web_tests/external/wpt/badging/setAppBadge_cross_origin.sub.https.html
@@ -3,62 +3,166 @@
 <title>Test cross-origin and same-origin use of setAppBadge</title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<iframe id="testIframe"></iframe>
+<body></body>
 <script>
-  const iframe = document.getElementById("testIframe");
-
-  function sendMessageToIframe(message) {
+  function callMethodThroughIframe(iframe, data) {
     return new Promise((resolve) => {
       window.addEventListener("message", function listener(event) {
-        const { messageId } = event.data;
-        if (event.data.message !== message) return;
+        if (event.data.method !== data.method) return;
         window.removeEventListener("message", listener);
         resolve(event);
       });
-      iframe.contentWindow.postMessage("callSetAppBadge", "*");
+      iframe.postMessage(data, "*");
     });
   }
 
   function loadIframe(src) {
+    const iframe = document.createElement("iframe");
     return new Promise((resolve) => {
-      iframe.addEventListener("load", resolve);
+      window.addEventListener("message", function readyListener(ev) {
+        if (ev.data === "ready") {
+          window.removeEventListener("message", readyListener);
+          resolve(iframe);
+        }
+      });
       iframe.src = src;
+      document.body.appendChild(iframe);
     });
   }
 
-  test(() => {
-    assert_true(
-      "setAppBadge" in navigator,
-      "navigator.setAppBadge should be available"
-    );
-  }, "Test that navigator.setAppBadge is available");
-
   promise_test(async () => {
-    await loadIframe(
-      `https://{{hosts[][]}}:{{ports[https][1]}}/badging/resources/setAppBadge_iframe.html`
+    const iframe = await loadIframe(
+      `https://{{hosts[][]}}:{{ports[https][1]}}/badging/resources/badge_iframe.html`
     );
-    const event = await sendMessageToIframe("callSetAppBadge");
-    const { exceptionType, status } = event.data;
-    assert_equals(
-      status,
-      "error",
-      "setAppBadge should have rejected with an error"
-    );
+
+    const event = await callMethodThroughIframe(iframe, {
+      method: "setAppBadge",
+      value: 1,
+    });
+
+    const { exceptionType } = event.data;
+
     assert_equals(
       exceptionType,
       "SecurityError",
       "setAppBadge should throw a SecurityError when called in a cross-origin iframe"
     );
+    iframe.remove();
   }, "Test that calling setAppBadge in a cross-origin iframe throws a SecurityError");
 
   promise_test(async () => {
-    await loadIframe("./resources/setAppBadge_iframe.html");
-    const event = await sendMessageToIframe("callSetAppBadge");
-    const { status } = event.data;
+    const iframe = await loadIframe(
+      `https://{{hosts[][]}}:{{ports[https][1]}}/badging/resources/badge_iframe.html`
+    );
+
+    const event = await callMethodThroughIframe(iframe, {
+      method: "clearAppBadge",
+    });
+
     assert_equals(
-      status,
+      event.data.exceptionType,
+      "SecurityError",
+      "clearAppBadge should throw a SecurityError when called in a cross-origin iframe"
+    );
+    iframe.remove();
+  }, "Test that calling clearAppBadge in a cross-origin iframe throws a SecurityError");
+
+  promise_test(async () => {
+    const iframe = await loadIframe("./resources/badge_iframe.html");
+    const event = await callMethodThroughIframe(iframe, {
+      method: "setAppBadge",
+      value: 1,
+    });
+
+    assert_equals(
+      event.data.status,
       "success",
       "setAppBadge should succeed when called in a same-origin iframe"
     );
+    iframe.remove();
   }, "Test that calling setAppBadge in a same-origin iframe succeeds");
+
+  promise_test(async () => {
+    const iframe = await loadIframe("./resources/badge_iframe.html");
+    const event = await callMethodThroughIframe(iframe, {
+      method: "clearAppBadge",
+    });
+
+    assert_equals(
+      event.data.status,
+      "success",
+      "clearAppBadge should succeed when called in a same-origin iframe"
+    );
+    iframe.remove();
+  }, "Test that calling clearAppBadge in a same-origin iframe succeeds");
+
+  promise_test(async () => {
+    // Set badge on top level frame
+    await navigator.setAppBadge(1);
+
+    // Load same-origin iframe
+    const iframe = await loadIframe("./resources/badge_iframe.html");
+
+    // Set badge in iframe
+    let event = await callMethodThroughIframe(iframe, {
+      method: "setAppBadge",
+      value: 1,
+    });
+    assert_equals(
+      event.data.status,
+      "success",
+      "setAppBadge should succeed when called in a same-origin iframe"
+    );
+
+    // Clear badge in iframe
+    event = await callMethodThroughIframe(iframe, {
+      method: "clearAppBadge",
+    });
+    assert_equals(
+      event.data.status,
+      "success",
+      "clearAppBadge should succeed when called in a same-origin iframe"
+    );
+    iframe.remove();
+  }, "Test calling setAppBadge and clearAppBadge in a same-origin iframe after setting badge on the top level frame");
+
+  promise_test(async () => {
+    // Load two same-origin iframes
+    const iframe1 = await loadIframe("./resources/badge_iframe.html");
+    const iframe2 = await loadIframe("./resources/badge_iframe.html");
+
+    // Set badge in the first iframe
+    let event1 = await callMethodThroughIframe(iframe1, {
+      method: "setAppBadge",
+      value: 1,
+    });
+    assert_equals(
+      event1.data.status,
+      "success",
+      "setAppBadge should succeed when called in the first same-origin iframe"
+    );
+
+    // Set badge in the second iframe
+    let event2 = await callMethodThroughIframe(iframe2, {
+      method: "setAppBadge",
+      value: 2,
+    });
+    assert_equals(
+      event2.data.status,
+      "success",
+      "setAppBadge should succeed when called in the second same-origin iframe"
+    );
+
+    // Clear badge in the first iframe
+    event1 = await callMethodThroughIframe(iframe1, {
+      method: "clearAppBadge",
+    });
+    assert_equals(
+      event1.data.status,
+      "success",
+      "clearAppBadge should succeed when called in the first same-origin iframe"
+    );
+    iframe1.remove();
+    iframe2.remove();
+  }, "Test badge behavior in multiple same-origin iframes");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/abs.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/abs.https.any.js
index c94d8acd..240a29c 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/abs.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/abs.https.any.js
@@ -654,11 +654,5 @@
   }
 ];
 
-if (navigator.ml) {
-  absTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getAbsPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    absTests, buildAndExecuteGraph, getAbsPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/add.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/add.https.any.js
index 8fa8176f..f381433 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/add.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/add.https.any.js
@@ -998,10 +998,4 @@
   }
 ];
 
-if (navigator.ml) {
-  addTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(addTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/arg_min_max.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/arg_min_max.https.any.js
index 33105b7..436c06b2 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/arg_min_max.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/arg_min_max.https.any.js
@@ -1824,10 +1824,5 @@
   }
 ];
 
-if (navigator.ml) {
-  argMinMaxTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    argMinMaxTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/averagePool2d.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/averagePool2d.https.any.js
index 3637f50d..6370127 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/averagePool2d.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/averagePool2d.https.any.js
@@ -1744,10 +1744,5 @@
   }
 ];
 
-if (navigator.ml) {
-  averagePool2dTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    averagePool2dTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/batch_normalization.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/batch_normalization.https.any.js
index dd23ccec..3f7fd84 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/batch_normalization.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/batch_normalization.https.any.js
@@ -1366,10 +1366,5 @@
   }
 ];
 
-if (navigator.ml) {
-  batchNormTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    batchNormTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/cast.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/cast.https.any.js
index 0219420..e981fb0 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/cast.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/cast.https.any.js
@@ -1492,11 +1492,5 @@
   }
 ];
 
-if (navigator.ml) {
-  castTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getCastPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    castTests, buildAndExecuteGraph, getCastPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/ceil.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/ceil.https.any.js
index 20d8a4d..7f411f8 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/ceil.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/ceil.https.any.js
@@ -456,11 +456,5 @@
   }
 ];
 
-if (navigator.ml) {
-  ceilTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getCeilPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    ceilTests, buildAndExecuteGraph, getCeilPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/clamp.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/clamp.https.any.js
index b1e338d..a51530e2 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/clamp.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/clamp.https.any.js
@@ -1925,10 +1925,4 @@
   },
 ];
 
-if (navigator.ml) {
-  clampTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(clampTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/concat.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/concat.https.any.js
index 821a85e..ac9bad3c 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/concat.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/concat.https.any.js
@@ -2373,10 +2373,4 @@
   }
 ];
 
-if (navigator.ml) {
-  concatTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(concatTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/constant-reshape-optimization.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/constant-reshape-optimization.https.any.js
index 3428772e..4b9f4ba1 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/constant-reshape-optimization.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/constant-reshape-optimization.https.any.js
@@ -86,11 +86,5 @@
   }
 }];
 
-if (navigator.ml) {
-  tests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getInstanceNormPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    tests, buildAndExecuteGraph, getInstanceNormPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/conv2d.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/conv2d.https.any.js
index 9962f21..11ee0564 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/conv2d.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/conv2d.https.any.js
@@ -2113,10 +2113,5 @@
   }
 ];
 
-if (navigator.ml) {
-  conv2dTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    conv2dTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/conv_transpose2d.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/conv_transpose2d.https.any.js
index 4e5525a..4abf564 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/conv_transpose2d.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/conv_transpose2d.https.any.js
@@ -3245,10 +3245,5 @@
   }
 ];
 
-if (navigator.ml) {
-  convTranspose2dTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    convTranspose2dTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/cos.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/cos.https.any.js
index 7804749..57e7d99 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/cos.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/cos.https.any.js
@@ -526,11 +526,5 @@
   }
 ];
 
-if (navigator.ml) {
-  cosTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getCosPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    cosTests, buildAndExecuteGraph, getCosPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/cumulative_sum.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/cumulative_sum.https.any.js
index 4264b14e..f6b495f 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/cumulative_sum.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/cumulative_sum.https.any.js
@@ -258,11 +258,6 @@
   }
 ];
 
-if (navigator.ml) {
-  cumulativeSumTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getCumulativeSumPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    cumulativeSumTests, buildAndExecuteGraph,
+    getCumulativeSumPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any.js
index 150cc92..9f568e6 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any.js
@@ -1467,11 +1467,6 @@
   }
 ];
 
-if (navigator.ml) {
-  dequantizeLinearTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getDequantizeLinearPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    dequantizeLinearTests, buildAndExecuteGraph,
+    getDequantizeLinearPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/div.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/div.https.any.js
index 8749f9f..868f4ce 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/div.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/div.https.any.js
@@ -963,11 +963,5 @@
   }
 ];
 
-if (navigator.ml) {
-  divTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getDivPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    divTests, buildAndExecuteGraph, getDivPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/elu.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/elu.https.any.js
index b9692986..ca414827 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/elu.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/elu.https.any.js
@@ -728,10 +728,4 @@
   }
 ];
 
-if (navigator.ml) {
-  eluTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(eluTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/equal.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/equal.https.any.js
index 08d48cf5..b41137ac 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/equal.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/equal.https.any.js
@@ -976,10 +976,4 @@
   }
 ];
 
-if (navigator.ml) {
-  equalTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(equalTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/erf.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/erf.https.any.js
index 752623b..8d01d7d 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/erf.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/erf.https.any.js
@@ -528,11 +528,5 @@
   }
 ];
 
-if (navigator.ml) {
-  erfTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getErfPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    erfTests, buildAndExecuteGraph, getErfPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/exp.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/exp.https.any.js
index 179d0e95..97f6a40 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/exp.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/exp.https.any.js
@@ -636,11 +636,5 @@
   }
 ];
 
-if (navigator.ml) {
-  expTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getExpPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    expTests, buildAndExecuteGraph, getExpPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/expand.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/expand.https.any.js
index b17c9c6..84c64f1 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/expand.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/expand.https.any.js
@@ -1328,10 +1328,4 @@
   }
 ];
 
-if (navigator.ml) {
-  expandTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(expandTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/floor.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/floor.https.any.js
index ccb0be8..b2155ae 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/floor.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/floor.https.any.js
@@ -456,11 +456,5 @@
   }
 ];
 
-if (navigator.ml) {
-  floorTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getFloorPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    floorTests, buildAndExecuteGraph, getFloorPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gather.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gather.https.any.js
index 08a14f3b..4df2408 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gather.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gather.https.any.js
@@ -1701,10 +1701,4 @@
   }
 ];
 
-if (navigator.ml) {
-  gatherTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(gatherTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gatherElements.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gatherElements.https.any.js
index 565332aa..670f8299 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gatherElements.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gatherElements.https.any.js
@@ -402,10 +402,5 @@
   }
 ];
 
-if (navigator.ml) {
-  gatherElementsTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    gatherElementsTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gatherND.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gatherND.https.any.js
index 434410f..d64c998 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gatherND.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gatherND.https.any.js
@@ -571,10 +571,5 @@
   }
 ];
 
-if (navigator.ml) {
-  gatherNDTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    gatherNDTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gelu.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gelu.https.any.js
index 9c06af3..cf1db1a 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gelu.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gelu.https.any.js
@@ -502,10 +502,4 @@
   }
 ];
 
-if (navigator.ml) {
-  geluTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(geluTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gemm.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gemm.https.any.js
index f9f15d65..2b72a0c 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gemm.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gemm.https.any.js
@@ -2410,10 +2410,4 @@
   }
 ];
 
-if (navigator.ml) {
-  gemmTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(gemmTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/greater.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/greater.https.any.js
index fe194149..683f9b7 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/greater.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/greater.https.any.js
@@ -980,10 +980,4 @@
   }
 ];
 
-if (navigator.ml) {
-  greaterTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(greaterTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/greater_or_equal.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/greater_or_equal.https.any.js
index 648b3d9..818948a 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/greater_or_equal.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/greater_or_equal.https.any.js
@@ -975,10 +975,5 @@
   }
 ];
 
-if (navigator.ml) {
-  greaterOrEqualTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    greaterOrEqualTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gru.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gru.https.any.js
index 06ff4a5..429ac34 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gru.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gru.https.any.js
@@ -2004,12 +2004,5 @@
   }
 ];
 
-if (navigator.ml) {
-  gruTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getGruPrecisionTolerance, test);
-  });
-
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    gruTests, buildAndExecuteGraph, getGruPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gru_cell.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gru_cell.https.any.js
index 8d2c599..23b31b32 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gru_cell.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/gru_cell.https.any.js
@@ -607,11 +607,5 @@
   }
 ];
 
-if (navigator.ml) {
-  gruCellTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getGruCellPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    gruCellTests, buildAndExecuteGraph, getGruCellPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/hard_sigmoid.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/hard_sigmoid.https.any.js
index 5ad5a815..081bec64 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/hard_sigmoid.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/hard_sigmoid.https.any.js
@@ -1343,10 +1343,5 @@
   }
 ];
 
-if (navigator.ml) {
-  hardSigmoidTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    hardSigmoidTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/hard_swish.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/hard_swish.https.any.js
index 02d902c..afad6df 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/hard_swish.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/hard_swish.https.any.js
@@ -645,10 +645,5 @@
   }
 ];
 
-if (navigator.ml) {
-  hardSwishTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    hardSwishTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/identity.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/identity.https.any.js
index a68d0be7cd..a7b9688 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/identity.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/identity.https.any.js
@@ -520,10 +520,5 @@
   }
 ];
 
-if (navigator.ml) {
-  identityTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    identityTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/instance_normalization.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/instance_normalization.https.any.js
index 0011a97..743022a6f 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/instance_normalization.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/instance_normalization.https.any.js
@@ -628,11 +628,5 @@
   }
 ];
 
-if (navigator.ml) {
-  instanceNormTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getInstanceNormPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    instanceNormTests, buildAndExecuteGraph, getInstanceNormPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/is_infinite.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/is_infinite.https.any.js
index a5c25435..3e05159 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/is_infinite.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/is_infinite.https.any.js
@@ -352,12 +352,5 @@
   },
 ]
 
-if (navigator.ml) {
-  isInfiniteTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getZeroULPTolerance, test,
-        /*cast_to_supported_type=*/true);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    isInfiniteTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/is_nan.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/is_nan.https.any.js
index ef656ee..5cbc90b 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/is_nan.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/is_nan.https.any.js
@@ -285,12 +285,4 @@
   },
 ]
 
-if (navigator.ml) {
-  isNaNTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getZeroULPTolerance, test,
-        /*cast_to_supported_type=*/true);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(isNaNTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/l2Pool2d.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/l2Pool2d.https.any.js
index bb4d3d79..92997c11 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/l2Pool2d.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/l2Pool2d.https.any.js
@@ -1357,10 +1357,5 @@
   }
 ];
 
-if (navigator.ml) {
-  l2Pool2dTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    l2Pool2dTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/layer_normalization.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/layer_normalization.https.any.js
index d0f4f9a..7ac8139 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/layer_normalization.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/layer_normalization.https.any.js
@@ -1100,11 +1100,5 @@
   }
 ];
 
-if (navigator.ml) {
-  layerNormTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getLayerNormPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    layerNormTests, buildAndExecuteGraph, getLayerNormPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/leaky_relu.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/leaky_relu.https.any.js
index 44ba712..72ab4d0 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/leaky_relu.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/leaky_relu.https.any.js
@@ -874,10 +874,5 @@
   }
 ];
 
-if (navigator.ml) {
-  leakyReluTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    leakyReluTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lesser.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lesser.https.any.js
index e5f4548..66862997 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lesser.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lesser.https.any.js
@@ -987,10 +987,4 @@
   }
 ];
 
-if (navigator.ml) {
-  lesserTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(lesserTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lesser_or_equal.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lesser_or_equal.https.any.js
index ed5dad2..2f1ed6e 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lesser_or_equal.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lesser_or_equal.https.any.js
@@ -1094,10 +1094,5 @@
   }
 ];
 
-if (navigator.ml) {
-  lesserOrEqualTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    lesserOrEqualTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/linear.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/linear.https.any.js
index 794981d..758a85d 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/linear.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/linear.https.any.js
@@ -1014,10 +1014,5 @@
   }
 ];
 
-if (navigator.ml) {
-  linearTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    linearTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/log.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/log.https.any.js
index 055d600e..ffb62e7b 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/log.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/log.https.any.js
@@ -509,11 +509,5 @@
   }
 ];
 
-if (navigator.ml) {
-  logTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getLogPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    logTests, buildAndExecuteGraph, getLogPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_and.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_and.https.any.js
index ccb91c0..c232fe6 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_and.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_and.https.any.js
@@ -412,10 +412,5 @@
   }
 ];
 
-if (navigator.ml) {
-  logicalAndTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    logicalAndTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_not.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_not.https.any.js
index e5ce2db..c1dc6edd 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_not.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_not.https.any.js
@@ -203,10 +203,5 @@
   }
 ];
 
-if (navigator.ml) {
-  logicalNotTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    logicalNotTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_or.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_or.https.any.js
index b57cb77a..ab486bcb 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_or.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_or.https.any.js
@@ -412,10 +412,5 @@
   }
 ];
 
-if (navigator.ml) {
-  logicalOrTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    logicalOrTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_xor.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_xor.https.any.js
index bb6546a..5b206d7 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_xor.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/logical_xor.https.any.js
@@ -412,10 +412,5 @@
 }
 ];
 
-if (navigator.ml) {
-  logicalXorTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    logicalXorTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lstm.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lstm.https.any.js
index 8c0ed85..b887e50f 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lstm.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lstm.https.any.js
@@ -1914,11 +1914,5 @@
   }
 ];
 
-if (navigator.ml) {
-  lstmTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getLstmPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    lstmTests, buildAndExecuteGraph, getLstmPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lstm_cell.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lstm_cell.https.any.js
index 345c516..f5901d3 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lstm_cell.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/lstm_cell.https.any.js
@@ -784,11 +784,5 @@
   }
 ];
 
-if (navigator.ml) {
-  lstmCellTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getLstmCellPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    lstmCellTests, buildAndExecuteGraph, getLstmCellPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/matmul.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/matmul.https.any.js
index f5f79e3a..0e13391 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/matmul.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/matmul.https.any.js
@@ -1095,11 +1095,5 @@
   }
 ];
 
-if (navigator.ml) {
-  matmulTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getMatmulPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    matmulTests, buildAndExecuteGraph, getMatmulPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/max.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/max.https.any.js
index 07d600a..da6f9621 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/max.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/max.https.any.js
@@ -920,10 +920,4 @@
   }
 ];
 
-if (navigator.ml) {
-  maxTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(maxTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/maxPool2d.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/maxPool2d.https.any.js
index 6fecb3bf..d9a6b0b 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/maxPool2d.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/maxPool2d.https.any.js
@@ -1207,10 +1207,5 @@
   }
 ];
 
-if (navigator.ml) {
-  maxPool2dTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    maxPool2dTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/min.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/min.https.any.js
index 41e8e43..8476d2b 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/min.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/min.https.any.js
@@ -930,10 +930,4 @@
   }
 ];
 
-if (navigator.ml) {
-  minTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(minTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/mlNumber.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/mlNumber.https.any.js
index df778183..a987158 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/mlNumber.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/mlNumber.https.any.js
@@ -267,11 +267,5 @@
   },
 ];
 
-if (navigator.ml) {
-  mlNumberTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getClampPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    mlNumberTests, buildAndExecuteGraph, getClampPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/mul.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/mul.https.any.js
index a026584..cf919b4 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/mul.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/mul.https.any.js
@@ -914,10 +914,4 @@
   }
 ];
 
-if (navigator.ml) {
-  mulTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(mulTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/neg.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/neg.https.any.js
index 02ce3961..ca6d200 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/neg.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/neg.https.any.js
@@ -635,11 +635,5 @@
   }
 ];
 
-if (navigator.ml) {
-  negTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getNegPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    negTests, buildAndExecuteGraph, getNegPrecisionTolerance, test);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/not_equal.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/not_equal.https.any.js
index 7d7b3e0..58b0af2 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/not_equal.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/not_equal.https.any.js
@@ -977,10 +977,5 @@
   }
 ];
 
-if (navigator.ml) {
-  notEqualTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    notEqualTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/pad.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/pad.https.any.js
index 55c6077..f1b9151 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/pad.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/pad.https.any.js
@@ -1249,10 +1249,4 @@
   }
 ];
 
-if (navigator.ml) {
-  padTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(padTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/pow.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/pow.https.any.js
index cf895f4..1d96fb8 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/pow.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/pow.https.any.js
@@ -981,11 +981,5 @@
   }
 ];
 
-if (navigator.ml) {
-  powTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getPowPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    powTests, buildAndExecuteGraph, getPowPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/prelu.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/prelu.https.any.js
index 5f64ff6..3de7353 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/prelu.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/prelu.https.any.js
@@ -1240,10 +1240,4 @@
   }
 ];
 
-if (navigator.ml) {
-  preluTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(preluTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.js
index 0e747e7..1db0c11 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.js
@@ -3918,10 +3918,5 @@
   },
 ];
 
-if (navigator.ml) {
-  subgraphTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    subgraphTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/quantizeLinear.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/quantizeLinear.https.any.js
index 276cdb85..25a3432 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/quantizeLinear.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/quantizeLinear.https.any.js
@@ -1168,11 +1168,6 @@
   }
 ];
 
-if (navigator.ml) {
-  quantizeLinearTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getQuantizeLinearPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    quantizeLinearTests, buildAndExecuteGraph,
+    getQuantizeLinearPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reciprocal.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reciprocal.https.any.js
index 40a17940..ab4801b8 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reciprocal.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reciprocal.https.any.js
@@ -552,11 +552,5 @@
   }
 ];
 
-if (navigator.ml) {
-  reciprocalTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getReciprocalPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    reciprocalTests, buildAndExecuteGraph, getReciprocalPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_l1.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_l1.https.any.js
index 9465777..985d562 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_l1.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_l1.https.any.js
@@ -1186,10 +1186,5 @@
   }
 ];
 
-if (navigator.ml) {
-  reduceL1Tests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    reduceL1Tests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_l2.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_l2.https.any.js
index 2a4e94a..3111861 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_l2.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_l2.https.any.js
@@ -1126,10 +1126,5 @@
   }
 ];
 
-if (navigator.ml) {
-  reduceL2Tests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    reduceL2Tests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_log_sum.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_log_sum.https.any.js
index 6d98832..cf12825 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_log_sum.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_log_sum.https.any.js
@@ -1073,10 +1073,5 @@
   }
 ];
 
-if (navigator.ml) {
-  reduceLogSumTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    reduceLogSumTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_log_sum_exp.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_log_sum_exp.https.any.js
index 6770b74..60467a0 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_log_sum_exp.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_log_sum_exp.https.any.js
@@ -1210,10 +1210,5 @@
   }
 ];
 
-if (navigator.ml) {
-  reduceLogSumExpTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    reduceLogSumExpTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_max.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_max.https.any.js
index dc08e1c..d89defa 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_max.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_max.https.any.js
@@ -993,10 +993,5 @@
   }
 ];
 
-if (navigator.ml) {
-  reduceMaxTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    reduceMaxTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_mean.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_mean.https.any.js
index a402c25..8275bee 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_mean.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_mean.https.any.js
@@ -1154,10 +1154,5 @@
   }
 ];
 
-if (navigator.ml) {
-  reduceMeanTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    reduceMeanTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_min.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_min.https.any.js
index 8e16045..22f9f9f 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_min.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_min.https.any.js
@@ -993,10 +993,5 @@
   }
 ];
 
-if (navigator.ml) {
-  reduceMinTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    reduceMinTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_product.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_product.https.any.js
index cb1f16d..f6205e4 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_product.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_product.https.any.js
@@ -1033,10 +1033,5 @@
   }
 ];
 
-if (navigator.ml) {
-  reduceProductTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    reduceProductTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_sum.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_sum.https.any.js
index d4120ac..6197112 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_sum.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_sum.https.any.js
@@ -1128,10 +1128,5 @@
   }
 ];
 
-if (navigator.ml) {
-  reduceSumTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    reduceSumTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_sum_square.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_sum_square.https.any.js
index 167f4f3..b56b6d7 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_sum_square.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_sum_square.https.any.js
@@ -1214,10 +1214,5 @@
   }
 ];
 
-if (navigator.ml) {
-  reduceSumSquareTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    reduceSumSquareTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/relu.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/relu.https.any.js
index d6fda23..c601707 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/relu.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/relu.https.any.js
@@ -666,10 +666,4 @@
   }
 ];
 
-if (navigator.ml) {
-  reluTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(reluTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/resample2d.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/resample2d.https.any.js
index 7872bd2..5f13dc0b 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/resample2d.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/resample2d.https.any.js
@@ -517,10 +517,5 @@
   }
 ];
 
-if (navigator.ml) {
-  resample2dTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    resample2dTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reshape.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reshape.https.any.js
index d9fa87f..2d27425f 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reshape.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reshape.https.any.js
@@ -2361,10 +2361,4 @@
   }
 ];
 
-if (navigator.ml) {
-  reshapeTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(reshapeTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reverse.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reverse.https.any.js
index 9d6fccad..3401c0b 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reverse.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reverse.https.any.js
@@ -262,10 +262,4 @@
   }
 ];
 
-if (navigator.ml) {
-  reverseTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(reverseTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/round_even.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/round_even.https.any.js
index e054d2e..2ed3456 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/round_even.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/round_even.https.any.js
@@ -242,11 +242,5 @@
   },
 ]
 
-if (navigator.ml) {
-  roundEvenTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getRoundEvenPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
\ No newline at end of file
+webnn_conformance_test(
+    roundEvenTests, buildAndExecuteGraph, getRoundEvenPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/scatterElements.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/scatterElements.https.any.js
index a388ad1..3bc6662 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/scatterElements.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/scatterElements.https.any.js
@@ -281,10 +281,5 @@
   }
 ];
 
-if (navigator.ml) {
-  scatterElementsTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    scatterElementsTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/scatterND.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/scatterND.https.any.js
index 919639b..1384e28 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/scatterND.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/scatterND.https.any.js
@@ -163,10 +163,5 @@
   }
 ];
 
-if (navigator.ml) {
-  scatterNDTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    scatterNDTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sigmoid.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sigmoid.https.any.js
index a8a310e..17b29e8 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sigmoid.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sigmoid.https.any.js
@@ -629,10 +629,5 @@
   }
 ];
 
-if (navigator.ml) {
-  sigmoidTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    sigmoidTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sign.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sign.https.any.js
index d61ce38..9781d099 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sign.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sign.https.any.js
@@ -187,11 +187,5 @@
   },
 ];
 
-if (navigator.ml) {
-  signTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getSignPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    signTests, buildAndExecuteGraph, getSignPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sin.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sin.https.any.js
index 1f9a5eaa..e363d745 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sin.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sin.https.any.js
@@ -532,11 +532,5 @@
   }
 ];
 
-if (navigator.ml) {
-  sinTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getSinPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    sinTests, buildAndExecuteGraph, getSinPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/slice.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/slice.https.any.js
index b1a30fc8..479340e 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/slice.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/slice.https.any.js
@@ -625,10 +625,4 @@
   }
 ];
 
-if (navigator.ml) {
-  sliceTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(sliceTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/softmax.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/softmax.https.any.js
index 2d9f28d..4e6c091 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/softmax.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/softmax.https.any.js
@@ -364,10 +364,5 @@
   }
 ];
 
-if (navigator.ml) {
-  softmaxTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    softmaxTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/softplus.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/softplus.https.any.js
index ba8b8f3..d07263ed 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/softplus.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/softplus.https.any.js
@@ -507,10 +507,5 @@
   }
 ];
 
-if (navigator.ml) {
-  softplusTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    softplusTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/softsign.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/softsign.https.any.js
index 9c7c4d1..b578345 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/softsign.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/softsign.https.any.js
@@ -646,10 +646,5 @@
   }
 ];
 
-if (navigator.ml) {
-  softsignTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    softsignTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/split.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/split.https.any.js
index a6695e20..e51f5b6 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/split.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/split.https.any.js
@@ -918,10 +918,4 @@
   }
 ];
 
-if (navigator.ml) {
-  splitTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(splitTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sqrt.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sqrt.https.any.js
index f56dde6..369412f2 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sqrt.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sqrt.https.any.js
@@ -514,11 +514,5 @@
   }
 ];
 
-if (navigator.ml) {
-  sqrtTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getSqrtPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    sqrtTests, buildAndExecuteGraph, getSqrtPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sub.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sub.https.any.js
index d93acf5..10b66b0b2 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sub.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/sub.https.any.js
@@ -1113,10 +1113,4 @@
   }
 ];
 
-if (navigator.ml) {
-  subTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(subTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/subgraph.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/subgraph.https.any.js
index 6775b91..990aa45 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/subgraph.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/subgraph.https.any.js
@@ -2564,10 +2564,5 @@
   },
 ];
 
-if (navigator.ml) {
-  subgraphTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    subgraphTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/tan.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/tan.https.any.js
index 79194b3..6e156807 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/tan.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/tan.https.any.js
@@ -532,11 +532,5 @@
   }
 ];
 
-if (navigator.ml) {
-  tanTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getTanPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    tanTests, buildAndExecuteGraph, getTanPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/tanh.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/tanh.https.any.js
index 6d61fd5..aa6bcce 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/tanh.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/tanh.https.any.js
@@ -585,10 +585,4 @@
   }
 ];
 
-if (navigator.ml) {
-  tanhTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(tanhTests, buildAndExecuteGraph, getPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/tile.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/tile.https.any.js
index fae0c07..83f6cf26 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/tile.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/tile.https.any.js
@@ -162,10 +162,4 @@
   },
 ];
 
-if (navigator.ml) {
-  tileTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(tileTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/transpose.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/transpose.https.any.js
index e50317d..dd5263e 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/transpose.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/transpose.https.any.js
@@ -695,10 +695,5 @@
   }
 ];
 
-if (navigator.ml) {
-  transposeTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(buildAndExecuteGraph, getZeroULPTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    transposeTests, buildAndExecuteGraph, getZeroULPTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/triangular.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/triangular.https.any.js
index 2e5ea0dd..21788bd5 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/triangular.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/triangular.https.any.js
@@ -1307,11 +1307,5 @@
   }
 ];
 
-if (navigator.ml) {
-  triangularTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getTriangularPrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    triangularTests, buildAndExecuteGraph, getTriangularPrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/where.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/where.https.any.js
index 1100fdd..0c3e03e 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/where.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/where.https.any.js
@@ -1837,11 +1837,5 @@
   }
 ];
 
-if (navigator.ml) {
-  whereTests.filter(isTargetTest).forEach((test) => {
-    webnn_conformance_test(
-        buildAndExecuteGraph, getWherePrecisionTolerance, test);
-  });
-} else {
-  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
-}
+webnn_conformance_test(
+    whereTests, buildAndExecuteGraph, getWherePrecisionTolerance);
diff --git a/third_party/blink/web_tests/external/wpt/webnn/resources/utils.js b/third_party/blink/web_tests/external/wpt/webnn/resources/utils.js
index eb15b32..cdf1fe9 100644
--- a/third_party/blink/web_tests/external/wpt/webnn/resources/utils.js
+++ b/third_party/blink/web_tests/external/wpt/webnn/resources/utils.js
@@ -199,6 +199,17 @@
 const variant = searchParams.get('device') || location.search.substring(1);
 const contextOptions = kContextOptionsForVariant[variant];
 
+async function getContext() {
+  let context;
+  try {
+    context = await navigator.ml.createContext(contextOptions);
+  } catch (e) {
+    throw new AssertionError(
+        `Unable to create context for ${variant} variant. ${e}`);
+  }
+  return context;
+}
+
 const tcNameArray = searchParams.getAll('tc');
 
 function isTargetTest(test) {
@@ -1284,34 +1295,26 @@
   return minimumDataTypeSet[operatorName][outputsName];
 }
 
-function getMinimumDataTypeSetJson() {
-  const xhr = new XMLHttpRequest();
-  xhr.open('GET', '../resources/minimum_datatype_set.json', false);
-
+async function getMinimumDataTypeSetJson() {
   try {
-    xhr.send();
+    const response = await fetch('/webnn/resources/minimum_datatype_set.json');
 
-    if (xhr.status !== 200) {
-      throw new Error(`HTTP error! Status: ${xhr.status}`);
+    if (!response.ok) {
+      throw new Error(`HTTP error! Status: ${response.status}`);
     }
 
-    const text = xhr.responseText;
+    const text = await response.text();
     const jsonText =
         text.replace(/\/\/.*|\/\*[\s\S]*?\*\//g, '');  // Remove comments
-    const data = JSON.parse(jsonText);
-    return data;
+    minimumDataTypeSet = JSON.parse(jsonText);
   } catch (error) {
-    throw new AssertionError(
-        `Error fetching and parsing JSON, ${error.message}`);
+    throw new Error(`Error fetching and parsing JSON: ${error.message}`);
   }
+  return minimumDataTypeSet;
 }
 
 function isMinimumTest(test) {
   let isMinimum = false;
-  if (minimumDataTypeSet === undefined) {
-    minimumDataTypeSet = getMinimumDataTypeSetJson();
-  }
-
   const graphResources = test.graph;
   const inputsResources = graphResources.inputs;
 
@@ -1373,31 +1376,44 @@
   return isMinimum;
 }
 
-const webnn_conformance_test =
-    (buildAndExecuteGraphFunc, toleranceFunc, testResources) => {
-      promise_test(
-          async () => {
-            let context;
-            try {
-              context = await navigator.ml.createContext(contextOptions);
-            } catch (e) {
-              throw new AssertionError(
-                  `Unable to create context for ${variant} variant. ${e}`);
-            }
-            if (!validateContextSupportsGraph(context, testResources.graph) &&
-                !isMinimumTest(testResources)) {
-              // Skip run the non-minimum test that isn't supported by the
-              // context
-              return;
-            }
-            const builder = new MLGraphBuilder(context);
-            const {result, intermediateOperands} =
-                await buildAndExecuteGraphFunc(
-                    context, builder, testResources.graph);
-            assertResultsEquals(
-                toleranceFunc, result, testResources.graph,
-                intermediateOperands);
-          },
-          `${isMinimumTest(testResources) ? '[required]' : '[optional]'} ${
-              testResources.name}`);
-    };
+// This array is to save skipped tests which are optional tests unsupported by
+// the context. It's helpful to debug to get detail skipped tests in browser
+// console by typing testsToSkip after running tests.
+const testsToSkip = [];
+
+async function webnn_conformance_test(
+    tests, buildAndExecuteGraphFunc, toleranceFunc) {
+  if (navigator.ml === undefined) {
+    test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
+  } else {
+    const testsToRun = [];
+    promise_setup(async () => {
+      // Create a context for checking whether tests are supported.
+      const context = await getContext();
+      minimumDataTypeSet = await getMinimumDataTypeSetJson();
+      tests.filter(isTargetTest).forEach((test) => {
+        if (validateContextSupportsGraph(context, test.graph) ||
+            isMinimumTest(test)) {
+          testsToRun.push(test);
+        } else {
+          // This test is optional so it can be skipped.
+          testsToSkip.push(test);
+        }
+      });
+    });
+
+    promise_test(async () => {
+      testsToRun.map((test) => {
+        promise_test(async () => {
+          // Create a context for each test.
+          const context = await getContext();
+          const builder = new MLGraphBuilder(context);
+          const {result, intermediateOperands} =
+              await buildAndExecuteGraphFunc(context, builder, test.graph);
+          assertResultsEquals(
+              toleranceFunc, result, test.graph, intermediateOperands);
+        }, `${isMinimumTest(test) ? '[required]' : '[optional]'} ${test.name}`);
+      });
+    });
+  }
+}
diff --git a/third_party/blink/web_tests/http/tests/devtools/network/network-choose-preview-view-expected.txt b/third_party/blink/web_tests/http/tests/devtools/network/network-choose-preview-view-expected.txt
index 56da3e5..d1fdf20 100644
--- a/third_party/blink/web_tests/http/tests/devtools/network/network-choose-preview-view-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/network/network-choose-preview-view-expected.txt
@@ -22,10 +22,10 @@
 Testing with MimeType: text/xml, and StatusCode: 200
 Content: <bar><foo/></bar>
 
-ResourceType(xhr): SearchableView > widget shadow-xml-view source-code
-ResourceType(fetch): SearchableView > widget shadow-xml-view source-code
-ResourceType(document): SearchableView > widget shadow-xml-view source-code
-ResourceType(other): SearchableView > widget shadow-xml-view source-code
+ResourceType(xhr): SearchableView > shadow-xml-view source-code widget
+ResourceType(fetch): SearchableView > shadow-xml-view source-code widget
+ResourceType(document): SearchableView > shadow-xml-view source-code widget
+ResourceType(other): SearchableView > shadow-xml-view source-code widget
 
 XML MIME But JSON
 Testing with MimeType: text/xml, and StatusCode: 200
@@ -87,10 +87,10 @@
 Testing with MimeType: text/xml, and StatusCode: 500
 Content: <bar><foo/></bar>
 
-ResourceType(xhr): SearchableView > widget shadow-xml-view source-code
-ResourceType(fetch): SearchableView > widget shadow-xml-view source-code
-ResourceType(document): SearchableView > widget shadow-xml-view source-code
-ResourceType(other): SearchableView > widget shadow-xml-view source-code
+ResourceType(xhr): SearchableView > shadow-xml-view source-code widget
+ResourceType(fetch): SearchableView > shadow-xml-view source-code widget
+ResourceType(document): SearchableView > shadow-xml-view source-code widget
+ResourceType(other): SearchableView > shadow-xml-view source-code widget
 
 Unknown MIME Text With Error 500
 Testing with MimeType: text/foobar, and StatusCode: 500
diff --git a/third_party/blink/web_tests/http/tests/devtools/network/preview-searchable-expected.txt b/third_party/blink/web_tests/http/tests/devtools/network/preview-searchable-expected.txt
index 088cc5f..5bbe72f 100644
--- a/third_party/blink/web_tests/http/tests/devtools/network/preview-searchable-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/network/preview-searchable-expected.txt
@@ -2,10 +2,12 @@
 
 
 Running: plainTextTest
+URL: data:text/plain,foo%20bar%0Afoo%20bar
 Is Searchable: false
 Type: RequestHTMLView
 
 Running: jsonTest
+URL: data:application/json,%5B533%2C3223%5D
 Is Searchable: true
 Type: JSONView
 Should have found and highlighted all: 533
@@ -18,14 +20,16 @@
 
 
 Running: jsonSpecialMimeTest
+URL: data:application/vnd.document+json,%7B%22foo0foo%22%3A%20123%7D
 Is Searchable: true
 Type: JSONView
 Should have found and highlighted all: foo
-Normal search found 2 results in dom.
+Normal search found 1 results in dom.
 CodeMirror search found 0 results in dom.
 
 
 Running: xmlMultipleSearchTest
+URL: data:text/xml,%3Cbar%3E%3Cfoo%2F%3Etest%3C%2Fbar%3E
 Is Searchable: true
 Type: XMLView
 Should have found and highlighted all: bar
@@ -46,6 +50,7 @@
 
 
 Running: xmlSingleSearchTest
+URL: data:text/xml,%3Cbar%3E%3C%2Fbar%3E
 Is Searchable: true
 Type: XMLView
 Should have found and highlighted all: bar
@@ -54,22 +59,24 @@
 
 
 Running: xmlCommentSearchTest
+URL: data:text/xml,%3Cbar%3E%3C!--%20TEST%20--%3E%3C%2Fbar%3E
 Is Searchable: true
 Type: XMLView
 Should have found and highlighted all: TEST
-Normal search found 0 results in dom.
+Normal search found 1 results in dom.
 CodeMirror search found 0 results in dom.
 
 Should have found and highlighted all: /bar
-Normal search found 0 results in dom.
+Normal search found 1 results in dom.
 CodeMirror search found 0 results in dom.
 
 Should have found and highlighted all: bar
-Normal search found 1 results in dom.
+Normal search found 2 results in dom.
 CodeMirror search found 0 results in dom.
 
 
 Running: xmlCDATASearchTest
+URL: data:text/xml,%3Ca%3E%3C!%5BCDATA%5BGGG%5D%5D%3E%3Cg%20tee%3D%22gee%22%3Etee%3C%2Fg%3E%3C%2Fa%3E
 Is Searchable: true
 Type: XMLView
 Should have found and highlighted all: GGG
@@ -86,6 +93,7 @@
 
 
 Running: xmlMimeTypeJsonTest
+URL: data:text/xml,%7B%22foo0%22%3A%20%22barr%22%2C%20%22barr%22%3A%20%22fooo%22%7D
 Is Searchable: true
 Type: JSONView
 Should have found and highlighted all: fooo
diff --git a/third_party/blink/web_tests/http/tests/devtools/network/preview-searchable.js b/third_party/blink/web_tests/http/tests/devtools/network/preview-searchable.js
index ec1f5ac..cfd58bdc 100644
--- a/third_party/blink/web_tests/http/tests/devtools/network/preview-searchable.js
+++ b/third_party/blink/web_tests/http/tests/devtools/network/preview-searchable.js
@@ -2,19 +2,22 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {TestRunner} from 'test_runner';
-import {NetworkTestRunner} from 'network_test_runner';
-
 import * as Common from 'devtools/core/common/common.js';
 import * as Platform from 'devtools/core/platform/platform.js';
 import * as Network from 'devtools/panels/network/network.js';
 import * as SourceFrame from 'devtools/ui/legacy/components/source_frame/source_frame.js';
 import * as UI from 'devtools/ui/legacy/legacy.js';
+import {NetworkTestRunner} from 'network_test_runner';
+import {TestRunner} from 'test_runner';
 
 (async function() {
-  TestRunner.addResult(`Tests that resources with JSON MIME types are previewed with the JSON viewer.\n`);
+  TestRunner.addResult(
+      `Tests that resources with JSON MIME types are previewed with the JSON viewer.\n`);
   await TestRunner.showPanel('network');
 
+  /**
+   * @param {UI.SearchableView.SearchableView} view
+   */
   async function testSearches(view, searches) {
     await new Promise(resolve => setTimeout(resolve, 0));
     for (var search of searches) {
@@ -22,17 +25,20 @@
       view.regexButton.toggled = false;
       view.caseSensitiveButton.toggled = false;
       view.showSearchField();
+      await new Promise(r => requestAnimationFrame(r));
       TestRunner.addResult('Should have found and highlighted all: ' + search);
 
-      var foundItems = view.element.childTextNodes()
-                           .filter(node => node.parentElement.classList.contains('highlighted-search-result'))
-                           .map(node => node.parentElement);
-      TestRunner.addResult('Normal search found ' + foundItems.length + ' results in dom.');
+      const searchResults = view.contentElement.querySelector('.search-results-matches')?.textContent?.match(/^(\d+) of (\d+)$/);
+      TestRunner.addResult(
+          'Normal search found ' + searchResults?.[2] + ' results in dom.');
 
-      foundItems = view.element.childTextNodes()
-                       .filter(node => node.parentElement.classList.contains('cm-search-highlight-start'))
+      const foundItems = view.element.childTextNodes()
+                       .filter(
+                           node => node.parentElement.classList.contains(
+                               'cm-search-highlight-start'))
                        .map(node => node.parentElement);
-      TestRunner.addResult('CodeMirror search found ' + foundItems.length + ' results in dom.');
+      TestRunner.addResult(
+          'CodeMirror search found ' + foundItems.length + ' results in dom.');
       TestRunner.addResult('');
     }
   }
@@ -49,24 +55,28 @@
     if (isSearchable)
       compontentView = searchableView.searchProvider;
 
-    if (compontentView instanceof SourceFrame.ResourceSourceFrame.ResourceSourceFrame) {
+    if (compontentView instanceof
+        SourceFrame.ResourceSourceFrame.ResourceSourceFrame) {
       typeName = 'ResourceSourceFrame';
       compontentView.ensureContentLoaded();
       if (!compontentView.loaded) {
         // try again when content is loaded.
         TestRunner.addSniffer(
-            compontentView, 'setContent', previewViewHandled.bind(this, searches, callback, view));
+            compontentView, 'setContent',
+            previewViewHandled.bind(this, searches, callback, view));
         return;
       }
     } else if (compontentView instanceof SourceFrame.XMLView.XMLView) {
       typeName = 'XMLView';
     } else if (compontentView instanceof SourceFrame.JSONView.JSONView) {
       typeName = 'JSONView';
-    } else if (compontentView instanceof Network.RequestHTMLView.RequestHTMLView) {
+    } else if (
+        compontentView instanceof Network.RequestHTMLView.RequestHTMLView) {
       typeName = 'RequestHTMLView';
     } else if (compontentView instanceof UI.EmptyWidget.EmptyWidget) {
       typeName = 'EmptyWidget';
-    } else if (compontentView instanceof Network.RequestHTMLView.RequestHTMLView) {
+    } else if (
+        compontentView instanceof Network.RequestHTMLView.RequestHTMLView) {
       typeName = 'RequestHTMLView';
     }
 
@@ -82,10 +92,12 @@
 
   function trySearches(request, searches, callback) {
     var networkPanel = Network.NetworkPanel.NetworkPanel.instance();
-    TestRunner.addSniffer(Network.RequestPreviewView.RequestPreviewView.prototype, 'doShowPreview', async function() {
-      previewViewHandled(searches, callback, await this.contentViewPromise);
-      networkPanel.hideRequestPanel();
-    });
+    TestRunner.addSniffer(
+        Network.RequestPreviewView.RequestPreviewView.prototype,
+        'doShowPreview', async function() {
+          previewViewHandled(searches, callback, await this.contentViewPromise);
+          networkPanel.hideRequestPanel();
+        });
     networkPanel.onRequestSelected({data: request});
     networkPanel.showRequestPanel();
     var itemView = networkPanel.networkItemView;
@@ -94,8 +106,10 @@
 
   function testType(contentType, content, searches, callback) {
     var url = 'data:' + contentType + ',' + encodeURIComponent(content);
+    TestRunner.addResult('URL: ' + url);
     NetworkTestRunner.makeSimpleXHR('GET', url, true, function() {
-      var request = NetworkTestRunner.findRequestsByURLPattern(new RegExp(Platform.StringUtilities.escapeForRegExp(url)))[0];
+      var request = NetworkTestRunner.findRequestsByURLPattern(
+          new RegExp(Platform.StringUtilities.escapeForRegExp(url)))[0];
       request.setResourceType(Common.ResourceType.resourceTypes.Document);
       trySearches(request, searches, callback);
     });
@@ -109,22 +123,31 @@
       testType('application/json', '[533,3223]', ['533', '322'], next);
     },
     function jsonSpecialMimeTest(next) {
-      testType('application/vnd.document+json', '{"foo0foo": 123}', ['foo'], next);
+      testType(
+          'application/vnd.document+json', '{"foo0foo": 123}', ['foo'], next);
     },
     function xmlMultipleSearchTest(next) {
-      testType('text/xml', '<bar><foo/>test</bar>', ['bar', 'foo', 'bar', 'test'], next);
+      testType(
+          'text/xml', '<bar><foo/>test</bar>', ['bar', 'foo', 'bar', 'test'],
+          next);
     },
     function xmlSingleSearchTest(next) {
       testType('text/xml', '<bar></bar>', ['bar'], next);
     },
     function xmlCommentSearchTest(next) {
-      testType('text/xml', '<bar><!-- TEST --></bar>', ['TEST', '/bar', 'bar'], next);
+      testType(
+          'text/xml', '<bar><!-- TEST --></bar>', ['TEST', '/bar', 'bar'],
+          next);
     },
     function xmlCDATASearchTest(next) {
-      testType('text/xml', '<a><![CDATA[GGG]]><g tee="gee">tee</g></a>', ['GGG', 'tee', 'CDATA'], next);
+      testType(
+          'text/xml', '<a><![CDATA[GGG]]><g tee="gee">tee</g></a>',
+          ['GGG', 'tee', 'CDATA'], next);
     },
     function xmlMimeTypeJsonTest(next) {
-      testType('text/xml', '{"foo0": "barr", "barr": "fooo"}', ['fooo', 'bar'], next);
+      testType(
+          'text/xml', '{"foo0": "barr", "barr": "fooo"}', ['fooo', 'bar'],
+          next);
     }
   ]);
 })();
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/debugger/instrumentation-reload.js b/third_party/blink/web_tests/http/tests/inspector-protocol/debugger/instrumentation-reload.js
index a44de7df..b2c00e8 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/debugger/instrumentation-reload.js
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/debugger/instrumentation-reload.js
@@ -16,8 +16,10 @@
   const navigated = dp.Page.onceFrameNavigated();
   const reloadPromise = dp.Page.reload();
 
+  // Note that we won't actually wait for the resume, since it might not
+  // actually resume anything if the reload finished before the resume
+  // message is received.
   dp.Debugger.resume({terminateOnresume: false});
-  await dp.Debugger.onceResumed();
   testRunner.log(`resumed`);
 
   await reloadPromise;
diff --git a/third_party/blink/web_tests/platform/linux/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_cpu-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_cpu-expected.txt
deleted file mode 100644
index 1bc6218..0000000
--- a/third_party/blink/web_tests/platform/linux/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_cpu-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: Failed to register a ServiceWorker for scope ('https://web-platform.test:8444/webnn/conformance_tests/does/not/exist') with script ('https://web-platform.test:8444/webnn/conformance_tests/subgraph.https.any.worker.js?cpu'): ServiceWorker script evaluation failed
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/arg_min_max.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/arg_min_max.https.any_cpu-expected.txt
index eff0ebf..70b2279 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/arg_min_max.https.any_cpu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/arg_min_max.https.any_cpu-expected.txt
@@ -1,5 +1,4 @@
 This is a testharness.js-based test.
-Found 2 FAIL, 0 TIMEOUT, 0 NOTRUN.
 [FAIL] [optional] argMin uint8 4D tensor, axis=1, all options
   promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'argMin' on 'MLGraphBuilder': Unsupported data type uint8 for argument input, must be one of [float32, float16, int32]."
 [FAIL] [optional] argMax uint8 4D tensor, axis=1, all options
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/clamp.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/clamp.https.any_cpu-expected.txt
index 0af77a1..d2bb12c0 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/clamp.https.any_cpu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/clamp.https.any_cpu-expected.txt
@@ -1,5 +1,4 @@
 This is a testharness.js-based test.
-Found 3 FAIL, 0 TIMEOUT, 0 NOTRUN.
 [FAIL] [required] minValue as Infinity
   promise_test: Unhandled rejection with value: object "UnknownError: Failed to execute 'build' on 'MLGraphBuilder': Model compilation error."
 [FAIL] [required] maxValue as -Infinity
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_cpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_cpu-expected.txt
new file mode 100644
index 0000000..810d813
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_cpu-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] [required] quantized convTranspose2d
+  assert_less_than_equal: assert_array_approx_equals_ulp: test quantizeLinear dequantizeLinear dequantizeLinear dequantizeLinear convTranspose2d quantizeLinear dequantizeLinear float32 actual 0.03529411926865578 should be close enough to expected 0.03921568766236305 by ULP distance: expected a number less than or equal to 8n but got 1052688n
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_cpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_cpu-expected.txt
new file mode 100644
index 0000000..7f70526
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_cpu-expected.txt
@@ -0,0 +1,9 @@
+This is a testharness.js-based test.
+[FAIL] [required] batchNormalization options.axis=0 + gelu
+  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': batchNormalization argument mean must be constant."
+[FAIL] [required] batchNormalization options.axis=0 + softplus
+  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': batchNormalization argument mean must be constant."
+[FAIL] [required] batchNormalization options.axis=0  + softmax
+  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': batchNormalization argument mean must be constant."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/arg_min_max.https.any_npu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/arg_min_max.https.any_npu-expected.txt
index eff0ebf..70b2279 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/arg_min_max.https.any_npu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/arg_min_max.https.any_npu-expected.txt
@@ -1,5 +1,4 @@
 This is a testharness.js-based test.
-Found 2 FAIL, 0 TIMEOUT, 0 NOTRUN.
 [FAIL] [optional] argMin uint8 4D tensor, axis=1, all options
   promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'argMin' on 'MLGraphBuilder': Unsupported data type uint8 for argument input, must be one of [float32, float16, int32]."
 [FAIL] [optional] argMax uint8 4D tensor, axis=1, all options
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/clamp.https.any_npu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/clamp.https.any_npu-expected.txt
index 0af77a1..d2bb12c0 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/clamp.https.any_npu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/clamp.https.any_npu-expected.txt
@@ -1,5 +1,4 @@
 This is a testharness.js-based test.
-Found 3 FAIL, 0 TIMEOUT, 0 NOTRUN.
 [FAIL] [required] minValue as Infinity
   promise_test: Unhandled rejection with value: object "UnknownError: Failed to execute 'build' on 'MLGraphBuilder': Model compilation error."
 [FAIL] [required] maxValue as -Infinity
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_npu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_npu-expected.txt
new file mode 100644
index 0000000..810d813
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_npu-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] [required] quantized convTranspose2d
+  assert_less_than_equal: assert_array_approx_equals_ulp: test quantizeLinear dequantizeLinear dequantizeLinear dequantizeLinear convTranspose2d quantizeLinear dequantizeLinear float32 actual 0.03529411926865578 should be close enough to expected 0.03921568766236305 by ULP distance: expected a number less than or equal to 8n but got 1052688n
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_npu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_npu-expected.txt
new file mode 100644
index 0000000..7f70526
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_npu-expected.txt
@@ -0,0 +1,9 @@
+This is a testharness.js-based test.
+[FAIL] [required] batchNormalization options.axis=0 + gelu
+  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': batchNormalization argument mean must be constant."
+[FAIL] [required] batchNormalization options.axis=0 + softplus
+  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': batchNormalization argument mean must be constant."
+[FAIL] [required] batchNormalization options.axis=0  + softmax
+  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': batchNormalization argument mean must be constant."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/arg_min_max.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/arg_min_max.https.any_gpu-expected.txt
index eff0ebf..70b2279 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/arg_min_max.https.any_gpu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/arg_min_max.https.any_gpu-expected.txt
@@ -1,5 +1,4 @@
 This is a testharness.js-based test.
-Found 2 FAIL, 0 TIMEOUT, 0 NOTRUN.
 [FAIL] [optional] argMin uint8 4D tensor, axis=1, all options
   promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'argMin' on 'MLGraphBuilder': Unsupported data type uint8 for argument input, must be one of [float32, float16, int32]."
 [FAIL] [optional] argMax uint8 4D tensor, axis=1, all options
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/clamp.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/clamp.https.any_gpu-expected.txt
index 0af77a1..d2bb12c0 100644
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/clamp.https.any_gpu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/clamp.https.any_gpu-expected.txt
@@ -1,5 +1,4 @@
 This is a testharness.js-based test.
-Found 3 FAIL, 0 TIMEOUT, 0 NOTRUN.
 [FAIL] [required] minValue as Infinity
   promise_test: Unhandled rejection with value: object "UnknownError: Failed to execute 'build' on 'MLGraphBuilder': Model compilation error."
 [FAIL] [required] maxValue as -Infinity
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_gpu-expected.txt
new file mode 100644
index 0000000..810d813
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_gpu-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] [required] quantized convTranspose2d
+  assert_less_than_equal: assert_array_approx_equals_ulp: test quantizeLinear dequantizeLinear dequantizeLinear dequantizeLinear convTranspose2d quantizeLinear dequantizeLinear float32 actual 0.03529411926865578 should be close enough to expected 0.03921568766236305 by ULP distance: expected a number less than or equal to 8n but got 1052688n
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_gpu-expected.txt
new file mode 100644
index 0000000..7f70526
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_gpu-expected.txt
@@ -0,0 +1,9 @@
+This is a testharness.js-based test.
+[FAIL] [required] batchNormalization options.axis=0 + gelu
+  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': batchNormalization argument mean must be constant."
+[FAIL] [required] batchNormalization options.axis=0 + softplus
+  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': batchNormalization argument mean must be constant."
+[FAIL] [required] batchNormalization options.axis=0  + softmax
+  promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'build' on 'MLGraphBuilder': batchNormalization argument mean must be constant."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_cpu-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_cpu-expected.txt
deleted file mode 100644
index 1bc6218..0000000
--- a/third_party/blink/web_tests/platform/mac/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_cpu-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: Failed to register a ServiceWorker for scope ('https://web-platform.test:8444/webnn/conformance_tests/does/not/exist') with script ('https://web-platform.test:8444/webnn/conformance_tests/subgraph.https.any.worker.js?cpu'): ServiceWorker script evaluation failed
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/identity.https.any.serviceworker_cpu-expected.txt b/third_party/blink/web_tests/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/identity.https.any.serviceworker_cpu-expected.txt
deleted file mode 100644
index 3b5c655d..0000000
--- a/third_party/blink/web_tests/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/identity.https.any.serviceworker_cpu-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: Failed to register a ServiceWorker for scope ('https://web-platform.test:8444/webnn/conformance_tests/does/not/exist') with script ('https://web-platform.test:8444/webnn/conformance_tests/identity.https.any.worker.js?cpu'): ServiceWorker script evaluation failed
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_cpu-expected.txt b/third_party/blink/web_tests/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_cpu-expected.txt
deleted file mode 100644
index 4d5b9f04..0000000
--- a/third_party/blink/web_tests/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_cpu-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: Failed to register a ServiceWorker for scope ('https://web-platform.test:8444/webnn/conformance_tests/does/not/exist') with script ('https://web-platform.test:8444/webnn/conformance_tests/qdq_subgraph.https.any.worker.js?cpu'): ServiceWorker script evaluation failed
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/identity.https.any.serviceworker_npu-expected.txt b/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/identity.https.any.serviceworker_npu-expected.txt
deleted file mode 100644
index 24445a314..0000000
--- a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/identity.https.any.serviceworker_npu-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: Failed to register a ServiceWorker for scope ('https://web-platform.test:8444/webnn/conformance_tests/does/not/exist') with script ('https://web-platform.test:8444/webnn/conformance_tests/identity.https.any.worker.js?npu'): ServiceWorker script evaluation failed
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_npu-expected.txt b/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_npu-expected.txt
deleted file mode 100644
index f3e40ec..0000000
--- a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_npu-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: Failed to register a ServiceWorker for scope ('https://web-platform.test:8444/webnn/conformance_tests/does/not/exist') with script ('https://web-platform.test:8444/webnn/conformance_tests/qdq_subgraph.https.any.worker.js?npu'): ServiceWorker script evaluation failed
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_npu-expected.txt b/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_npu-expected.txt
deleted file mode 100644
index 6ff50e4f..0000000
--- a/third_party/blink/web_tests/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_npu-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: Failed to register a ServiceWorker for scope ('https://web-platform.test:8444/webnn/conformance_tests/does/not/exist') with script ('https://web-platform.test:8444/webnn/conformance_tests/subgraph.https.any.worker.js?npu'): ServiceWorker script evaluation failed
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/identity.https.any.serviceworker_gpu-expected.txt b/third_party/blink/web_tests/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/identity.https.any.serviceworker_gpu-expected.txt
deleted file mode 100644
index 666c3e3..0000000
--- a/third_party/blink/web_tests/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/identity.https.any.serviceworker_gpu-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: Failed to register a ServiceWorker for scope ('https://web-platform.test:8444/webnn/conformance_tests/does/not/exist') with script ('https://web-platform.test:8444/webnn/conformance_tests/identity.https.any.worker.js?gpu'): ServiceWorker script evaluation failed
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_gpu-expected.txt b/third_party/blink/web_tests/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_gpu-expected.txt
deleted file mode 100644
index 3b9ebbd..0000000
--- a/third_party/blink/web_tests/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_gpu-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: Failed to register a ServiceWorker for scope ('https://web-platform.test:8444/webnn/conformance_tests/does/not/exist') with script ('https://web-platform.test:8444/webnn/conformance_tests/qdq_subgraph.https.any.worker.js?gpu'): ServiceWorker script evaluation failed
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_gpu-expected.txt b/third_party/blink/web_tests/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_gpu-expected.txt
deleted file mode 100644
index 85f1822..0000000
--- a/third_party/blink/web_tests/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_gpu-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: Failed to register a ServiceWorker for scope ('https://web-platform.test:8444/webnn/conformance_tests/does/not/exist') with script ('https://web-platform.test:8444/webnn/conformance_tests/subgraph.https.any.worker.js?gpu'): ServiceWorker script evaluation failed
-Harness: the test ran to completion.
-
diff --git a/third_party/compiler-rt/src b/third_party/compiler-rt/src
index a3af83e..ea7aaf0 160000
--- a/third_party/compiler-rt/src
+++ b/third_party/compiler-rt/src
@@ -1 +1 @@
-Subproject commit a3af83ed8e5d578ae8322b8b7fa43f1cfea3663a
+Subproject commit ea7aaf02e41e13ac174f2d0e4c5eeeac75d11f71
diff --git a/third_party/crossbench b/third_party/crossbench
index 3ad7c2e..cef36a9 160000
--- a/third_party/crossbench
+++ b/third_party/crossbench
@@ -1 +1 @@
-Subproject commit 3ad7c2eb738d81b7e8ea2e969b1d6edc37cbceb5
+Subproject commit cef36a9dc0bed6520f6189ef4d3f09c6e8a6d6f8
diff --git a/third_party/dawn b/third_party/dawn
index 37c5c1c..0567736 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit 37c5c1c45b3e5b8118fc680e38ed92d44bd55c44
+Subproject commit 0567736dfb04b0dfb51d764201800724aa8df8d2
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 1078b45..ec221ff 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 1078b4549e245586e70f90ee347980fbfef7054a
+Subproject commit ec221ff5e18d06f8db6cadd7d233439efacdbd25
diff --git a/third_party/jetstream/main b/third_party/jetstream/main
index 4c0b48a..ba180b5 160000
--- a/third_party/jetstream/main
+++ b/third_party/jetstream/main
@@ -1 +1 @@
-Subproject commit 4c0b48a3c380689bf41409207794e71d4d44a188
+Subproject commit ba180b5cec3c9e4053669dc0e3265c2ab1e40669
diff --git a/third_party/llvm-libc/src b/third_party/llvm-libc/src
index 03855c3..91a1661 160000
--- a/third_party/llvm-libc/src
+++ b/third_party/llvm-libc/src
@@ -1 +1 @@
-Subproject commit 03855c3d7eeef29b35cc8fb8c486167da6aaade1
+Subproject commit 91a16614cd8b9f6715907d2c3e45eb55436cdef0
diff --git a/third_party/perfetto b/third_party/perfetto
index 4f78c4a..c488393 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit 4f78c4ad8ce6ee3a476fe2397b2f42d58ecdaaf2
+Subproject commit c4883939f306a5046cb251340523adabdddd2d3c
diff --git a/third_party/skia b/third_party/skia
index 2465eda..a78bee5 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 2465eda3f62ad18a562cc34cdf431396511b0af5
+Subproject commit a78bee58f354c41997d86844df79cd91b859f28a
diff --git a/third_party/spirv-headers/src b/third_party/spirv-headers/src
index 402d0b3..54ae32bc 160000
--- a/third_party/spirv-headers/src
+++ b/third_party/spirv-headers/src
@@ -1 +1 @@
-Subproject commit 402d0b3f024f8b1e2fbe297e16fc52023df164df
+Subproject commit 54ae32bce772b29a253b18583b86ab813ed1887c
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps
index 1dd8333d..8415cc8 160000
--- a/third_party/vulkan-deps
+++ b/third_party/vulkan-deps
@@ -1 +1 @@
-Subproject commit 1dd8333d656b309c77345de7cb6b87047c1eb833
+Subproject commit 8415cc875465a6fd098cf369fb1025d5a8814797
diff --git a/third_party/webrtc b/third_party/webrtc
index a9fbc3c..ae9031c 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit a9fbc3c6ef95cff58f1c1dd392f63bfa7d597837
+Subproject commit ae9031c67165219fd3a4b3390fe5c43f60b231aa
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml
index c7030e8..670af42 100644
--- a/tools/metrics/histograms/metadata/autofill/histograms.xml
+++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -5248,16 +5248,6 @@
   </summary>
 </histogram>
 
-<histogram name="Autofill.ProfileImport.HomeAndWorkSupersetEditedType"
-    enum="AutofillSettingsVisibleTypes" expires_after="2026-05-01">
-  <owner>fleimgruber@google.com</owner>
-  <owner>chrome-autofill-alerts@google.com</owner>
-  <summary>
-    Logs that a specific type was edited in a home/work superset prompt. This
-    metric is emitted once the user-provided import decision is final.
-  </summary>
-</histogram>
-
 <histogram name="Autofill.ProfileImport.HomeAndWorkSupersetProfileDecision"
     enum="AutofillProfileImportDecision" expires_after="2026-05-01">
   <owner>jsobiech@google.com</owner>
@@ -5303,17 +5293,6 @@
   </summary>
 </histogram>
 
-<histogram name="Autofill.ProfileImport.MigrateProfileEditedType"
-    enum="AutofillSettingsVisibleTypes" expires_after="2026-02-22">
-  <owner>koerber@google.com</owner>
-  <owner>fleimgruber@google.com</owner>
-  <owner>src/components/autofill/OWNERS</owner>
-  <summary>
-    Logs that a specific type was edited in a profile migration prompt. This
-    metric is emitted once the user-provided import decision is final.
-  </summary>
-</histogram>
-
 <histogram name="Autofill.ProfileImport.NewProfileDecision"
     enum="AutofillProfileImportDecision" expires_after="M126">
   <owner>koerber@google.com</owner>
@@ -5350,18 +5329,6 @@
   </token>
 </histogram>
 
-<histogram name="Autofill.ProfileImport.NewProfileEditedType"
-    enum="AutofillSettingsVisibleTypes" expires_after="2026-02-22">
-  <owner>koerber@google.com</owner>
-  <owner>src/components/autofill/OWNERS</owner>
-  <summary>
-    Logs that a specific type was edited in a new profile save prompt that was
-    shown to the user when a new address profile is observed in a form
-    submission. This metric is emitted once the user-provided import decision is
-    final.
-  </summary>
-</histogram>
-
 <histogram name="Autofill.ProfileImport.PhoneNumberParsed" enum="Boolean"
     expires_after="2026-02-10">
   <owner>fleimgruber@google.com</owner>
@@ -5482,18 +5449,6 @@
   </token>
 </histogram>
 
-<histogram name="Autofill.ProfileImport.UpdateProfileEditedType"
-    enum="AutofillSettingsVisibleTypes" expires_after="2026-02-22">
-  <owner>battre@chromium.org</owner>
-  <owner>src/components/autofill/OWNERS</owner>
-  <summary>
-    Logs that a specific type was edited in a profile update prompt that was
-    shown to the user when a profile similar to an already existing profile was
-    observed in a form submission. This metric is emitted once the user-provided
-    import decision is final.
-  </summary>
-</histogram>
-
 <histogram
     name="Autofill.ProfileImport.UpdateProfileNumberOfAffectedFields.{Decision}"
     units="fields" expires_after="2026-02-22">
@@ -5538,25 +5493,39 @@
 
 <!-- LINT.IfChange(Autofill.ProfileImport.EditedType.ImportTypes) -->
 
-<histogram name="Autofill.ProfileImport.{ImportType}.EditedType"
+<histogram name="Autofill.ProfileImport.{ImportType}EditedType"
     enum="MandatoryReauthAuthEvent" expires_after="2026-06-01">
   <owner>sygiet@google.com</owner>
   <owner>pawelstus@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
     Logs that a specific type was edited in a save/update/migrate/merge prompt.
+    This metric is emitted once the user-provided import decision is final.
 
     {ImportType}
   </summary>
   <token key="ImportType">
+    <variant name="HomeAndWorkSuperset"
+        summary="Logs that a specific type was edited in a home/work superset
+                 prompt."/>
     <variant name="HomeWorkNameEmailMerge"
         summary="Logs that a specific type was edited in a
-                 `kAccountNameEmail` and H/W superset prompt. This metric is
-                 emitted once the user-provided import decision is final."/>
+                 `kAccountNameEmail` and H/W superset prompt."/>
+    <variant name="MigrateProfile"
+        summary="Logs that a specific type was edited in a profile migration
+                 prompt."/>
     <variant name="NameEmailSuperset"
         summary="Logs that a specific type was edited in a
-                 `kAccountNameEmail` superset prompt. This metric is emitted
-                 once the user-provided import decision is final."/>
+                 `kAccountNameEmail` superset prompt."/>
+    <variant name="NewProfile"
+        summary="Logs that a specific type was edited in a new profile save
+                 prompt that was shown to the user when a new address profile
+                 is observed in a form submission."/>
+    <variant name="UpdateProfile"
+        summary="Logs that a specific type was edited in a profile update
+                 prompt that was shown to the user when a profile similar to
+                 an already existing profile was observed in a form
+                 submission."/>
   </token>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml
index 3282e4b..a18649e4 100644
--- a/tools/metrics/histograms/metadata/chromeos/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -282,7 +282,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Apps.IntentPickerDestinationPlatform"
-    enum="ArcIntentHandlerDestinationPlatform" expires_after="2025-09-14">
+    enum="ArcIntentHandlerDestinationPlatform" expires_after="2026-09-14">
   <owner>ovn@google.com</owner>
   <owner>lt-web-apps-team@google.com</owner>
   <summary>
@@ -2405,7 +2405,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Intents.IntentPickerAction"
-    enum="IntentPickerDialogAction" expires_after="2025-06-01">
+    enum="IntentPickerDialogAction" expires_after="2026-09-14">
   <owner>ovn@google.com</owner>
   <owner>lt-web-apps-team@google.com</owner>
   <summary>
@@ -2413,16 +2413,22 @@
     action button) when the user navigates to a page whose URL can be handled by
     an installed app. This metric is recorded when the dialog is closed and
     records the user action which caused it to close.
+
+    Warning: this histogram was expired from 2025-06-01 to 2025-09-03; data may
+    be missing.
   </summary>
 </histogram>
 
 <histogram name="ChromeOS.Intents.IntentPickerIconEvent"
-    enum="IntentPickerIconEvent" expires_after="2025-06-01">
+    enum="IntentPickerIconEvent" expires_after="2026-09-14">
   <owner>ovn@google.com</owner>
   <owner>lt-web-apps-team@google.com</owner>
   <summary>
     Records events associated with the intent picker icon in the omnibox.
     Recorded when the icon is shown or interacted with.
+
+    Warning: this histogram was expired from 2025-06-01 to 2025-09-03; data may
+    be missing.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/password/enums.xml b/tools/metrics/histograms/metadata/password/enums.xml
index f3d1051d..d65ebae02 100644
--- a/tools/metrics/histograms/metadata/password/enums.xml
+++ b/tools/metrics/histograms/metadata/password/enums.xml
@@ -1247,7 +1247,7 @@
   <int value="8"
       label=":-X Unknown password typed, no saved credentials existed and
              site is blocklisted by the smart bubble"/>
-  <int value="9" label=":-) User used manual fallback to fill the form"/>
+  <int value="9" label=":-| User used manual fallback to fill the form"/>
 </enum>
 
 <enum name="PasswordManagerFillingSource">
diff --git a/tools/metrics/histograms/metadata/signin/enums.xml b/tools/metrics/histograms/metadata/signin/enums.xml
index e801cc9c..93e8b56e 100644
--- a/tools/metrics/histograms/metadata/signin/enums.xml
+++ b/tools/metrics/histograms/metadata/signin/enums.xml
@@ -739,6 +739,8 @@
   <int value="48" label="Edu Coexistence Login Handler"/>
   <int value="49" label="Edu Account Login Handler"/>
   <int value="50" label="Chromeos Family Link User Metrics provider"/>
+  <int value="51" label="Enterprise Identity Service"/>
+  <int value="52" label="Promotion Eligibility Checker"/>
 </enum>
 
 <!-- LINT.ThenChange(//components/signin/public/identity_manager/oauth_consumer_ids.h:OAuthConsumerId) -->
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 6cd461f..abbc383e 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -6,7 +6,7 @@
         },
         "win": {
             "hash": "597b5d7d406a89b4237451ec94545ad23cc77980",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/4f78c4ad8ce6ee3a476fe2397b2f42d58ecdaaf2/trace_processor_shell.exe"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/3b87105308b74ac610094f5649821afa7cdeee03/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "d2819bf77c3920780f2b33cc43f328d24cc1e427",
@@ -22,7 +22,7 @@
         },
         "linux": {
             "hash": "b1296477ed3d348b1e367a5569467c6815146fb2",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/4f78c4ad8ce6ee3a476fe2397b2f42d58ecdaaf2/trace_processor_shell"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/3b87105308b74ac610094f5649821afa7cdeee03/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/ui/accessibility/extensions/strings/accessibility_extensions_strings_ar.xtb b/ui/accessibility/extensions/strings/accessibility_extensions_strings_ar.xtb
index 6b8ce1a..f1014a3 100644
--- a/ui/accessibility/extensions/strings/accessibility_extensions_strings_ar.xtb
+++ b/ui/accessibility/extensions/strings/accessibility_extensions_strings_ar.xtb
@@ -26,7 +26,7 @@
 <translation id="3622586652998721735">تعيين كمخطط تلقائي</translation>
 <translation id="3812541808639806898">‏عارض النص "Alt" للصورة</translation>
 <translation id="381767806621926835">‏انقر بزر الماوس الأيمن على أي شيء يعمل بخاصية "longdesc" أو "aria-describedat" للدخول إلى الوصف المفصل.</translation>
-<translation id="4023902424053835668">تصفح نص صفحات الويب باستخدام مفاتيح الأسهم.</translation>
+<translation id="4023902424053835668">تصفح نص صفحات الويب باستخدام مفاتيح الأسهم</translation>
 <translation id="4388820049312272371">أبرز موضع المؤشر بومضة سريعة.</translation>
 <translation id="4394049700291259645">إيقاف</translation>
 <translation id="4769065380738716500">تم استبدال الصور بواسطة النص البديل</translation>
diff --git a/ui/aura/window_occlusion_tracker.cc b/ui/aura/window_occlusion_tracker.cc
index f1425f8..e954a2c 100644
--- a/ui/aura/window_occlusion_tracker.cc
+++ b/ui/aura/window_occlusion_tracker.cc
@@ -289,6 +289,11 @@
   return tracked_window_iter->second;
 }
 
+const std::vector<raw_ptr<WindowTreeHost>>&
+WindowOcclusionTracker::GetObservingWindowTreeHostsForTest() const {
+  return window_tree_host_observations_.sources();
+}
+
 WindowOcclusionTracker::WindowOcclusionTracker() = default;
 
 WindowOcclusionTracker::~WindowOcclusionTracker() = default;
@@ -741,39 +746,55 @@
   RootWindowState& root_window_state = root_windows_[root_window];
   ++root_window_state.num_tracked_windows;
   MarkRootWindowStateAsDirty(&root_window_state);
+  auto* host = root_window->GetHost();
+  CHECK(host);
 
   // It's only useful to track the host if |window| is the first tracked window
   // under |root_window|.  All windows under the same root have the same host.
-  if (root_window_state.num_tracked_windows == 1) {
+  if (!window_tree_host_observations_.IsObservingSource(host)) {
+    if (num_tracked_windows_count_check_) {
+      DCHECK_EQ(root_window_state.num_tracked_windows, 1);
+    }
     AddObserverToWindowAndDescendants(root_window);
-    auto* host = root_window->GetHost();
-    if (host) {
-      window_tree_host_observations_.AddObservation(host);
-      if (!NativeWindowOcclusionTracker::
-              IsNativeWindowOcclusionTrackingAlwaysEnabled(host)) {
-        NativeWindowOcclusionTracker::EnableNativeWindowOcclusionTracking(host);
-      }
+    window_tree_host_observations_.AddObservation(host);
+    if (!NativeWindowOcclusionTracker::
+            IsNativeWindowOcclusionTrackingAlwaysEnabled(host)) {
+      NativeWindowOcclusionTracker::EnableNativeWindowOcclusionTracking(host);
     }
   }
   MaybeComputeOcclusion();
 }
 
 void WindowOcclusionTracker::TrackedWindowRemovedFromRoot(Window* window) {
-  Window* const root_window = window->GetRootWindow();
-  DCHECK(root_window);
+  if (!maybe_removed_host_) {
+    return;
+  }
+  WindowTreeHost* host_to_remove = maybe_removed_host_;
+  maybe_removed_host_ = nullptr;
+  auto* root_window = host_to_remove->window();
+
+  for (auto tracked : tracked_windows_) {
+    auto* tracked_window = tracked.first;
+    if (root_window == tracked_window->GetRootWindow()) {
+      // Host exists.
+      return;
+    }
+  }
+
   auto root_window_state_it = root_windows_.find(root_window);
   CHECK(root_window_state_it != root_windows_.end());
-  --root_window_state_it->second.num_tracked_windows;
-  if (root_window_state_it->second.num_tracked_windows == 0) {
-    RemoveObserverFromWindowAndDescendants(root_window);
-    root_windows_.erase(root_window_state_it);
-    WindowTreeHost* host = root_window->GetHost();
-    window_tree_host_observations_.RemoveObservation(host);
+  if (num_tracked_windows_count_check_) {
+    DCHECK_EQ(0, root_window_state_it->second.num_tracked_windows);
+  }
 
-    if (!NativeWindowOcclusionTracker::
-            IsNativeWindowOcclusionTrackingAlwaysEnabled(host)) {
-      NativeWindowOcclusionTracker::DisableNativeWindowOcclusionTracking(host);
-    }
+  RemoveObserverFromWindowAndDescendants(root_window);
+  root_windows_.erase(root_window_state_it);
+  window_tree_host_observations_.RemoveObservation(host_to_remove);
+
+  if (!NativeWindowOcclusionTracker::
+          IsNativeWindowOcclusionTrackingAlwaysEnabled(host_to_remove)) {
+    NativeWindowOcclusionTracker::DisableNativeWindowOcclusionTracking(
+        host_to_remove);
   }
 }
 
@@ -1019,11 +1040,23 @@
 void WindowOcclusionTracker::OnWindowRemovingFromRootWindow(Window* window,
                                                             Window* new_root) {
   DCHECK(window->GetRootWindow());
-  if (WindowIsTracked(window))
-    TrackedWindowRemovedFromRoot(window);
+  if (WindowIsTracked(window)) {
+    Window* const root_window = window->GetRootWindow();
+    DCHECK(root_window);
+    maybe_removed_host_ = root_window->GetHost();
+
+    auto root_window_state_it = root_windows_.find(root_window);
+
+    CHECK(root_window_state_it != root_windows_.end());
+    --root_window_state_it->second.num_tracked_windows;
+  }
   RemoveObserverFromWindowAndDescendants(window);
 }
 
+void WindowOcclusionTracker::OnWindowRemoved(Window* window) {
+  TrackedWindowRemovedFromRoot(window);
+}
+
 void WindowOcclusionTracker::OnWindowLayerRecreated(Window* window) {
   ui::LayerAnimator* animator = window->layer()->GetAnimator();
 
diff --git a/ui/aura/window_occlusion_tracker.h b/ui/aura/window_occlusion_tracker.h
index 273486d..7376de7 100644
--- a/ui/aura/window_occlusion_tracker.h
+++ b/ui/aura/window_occlusion_tracker.h
@@ -181,6 +181,13 @@
 
   bool IsPaused() const { return num_pause_occlusion_tracking_; }
 
+  const std::vector<raw_ptr<WindowTreeHost>>&
+  GetObservingWindowTreeHostsForTest() const;
+
+  void set_num_tracked_windows_count_check_for_test(bool check) {
+    num_tracked_windows_count_check_ = check;
+  }
+
  private:
   friend class test::WindowOcclusionTrackerTestApi;
   friend class Env;
@@ -192,6 +199,7 @@
   struct RootWindowState {
     // Number of Windows whose occlusion state is tracked under this root
     // Window.
+    // TODO(crbug.com/435754476): Remove this in m142.
     int num_tracked_windows = 0;
 
     // Whether the occlusion state of tracked Windows under this root is stale.
@@ -381,6 +389,7 @@
   void OnWindowAddedToRootWindow(Window* window) override;
   void OnWindowRemovingFromRootWindow(Window* window,
                                       Window* new_root) override;
+  void OnWindowRemoved(Window* window) override;
   void OnWindowLayerRecreated(Window* window) override;
   void OnWindowOpaqueRegionsForOcclusionChanged(Window* window) override;
 
@@ -413,6 +422,10 @@
   // Root Windows of Windows in |tracked_windows_|.
   base::flat_map<Window*, RootWindowState> root_windows_;
 
+  // This is an indicator that WindowTreeHost may not longer have to be observed
+  // when a window is being removed or moved from the window tree host.
+  raw_ptr<WindowTreeHost> maybe_removed_host_ = nullptr;
+
   // Number of times that occlusion has been recomputed in this process. We keep
   // track of this for tests.
   int num_times_occlusion_recomputed_ = 0;
@@ -438,6 +451,8 @@
   // Optional factory to create occlusion change builder.
   OcclusionChangeBuilderFactory occlusion_change_builder_factory_;
 
+  bool num_tracked_windows_count_check_ = DCHECK_IS_ON();
+
   // Stores the window for which the occlusion tracker is computing the
   // occlusion based on target bounds, opacity, transform, and visibility
   // values. If the occlusion tracker is not computing for a specific window
diff --git a/ui/aura/window_occlusion_tracker_unittest.cc b/ui/aura/window_occlusion_tracker_unittest.cc
index 5d3e924..5687827e7 100644
--- a/ui/aura/window_occlusion_tracker_unittest.cc
+++ b/ui/aura/window_occlusion_tracker_unittest.cc
@@ -14,6 +14,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/aura/env.h"
 #include "ui/aura/test/aura_test_base.h"
+#include "ui/aura/test/test_window_builder.h"
 #include "ui/aura/test/test_window_delegate.h"
 #include "ui/aura/test/test_windows.h"
 #include "ui/aura/test/window_occlusion_tracker_test_api.h"
@@ -2975,6 +2976,54 @@
   EXPECT_FALSE(delegate_a->is_expecting_call());
 }
 
+TEST_F(WindowOcclusionTrackerTest, DoNotCountTwice) {
+  auto* window_occlusion_tracker =
+      Env::GetInstance()->GetWindowOcclusionTracker();
+
+  class TestObserver : public WindowObserver {
+   public:
+    explicit TestObserver(aura::Window* window) : window_(window) {
+      window->AddObserver(this);
+    }
+    ~TestObserver() override {
+      if (window_) {
+        window_->RemoveObserver(this);
+      }
+    }
+    // WindowObserver:
+    void OnWindowDestroying(Window* window) override {
+      window_->RemoveObserver(this);
+      window_ = nullptr;
+    }
+    void OnWindowParentChanged(Window* window, Window* parent) override {
+      window_->TrackOcclusionState();
+    }
+    raw_ptr<Window> window_;
+  };
+
+  window_occlusion_tracker->set_num_tracked_windows_count_check_for_test(false);
+  {
+    auto w = test::TestWindowBuilder().SetShow(true).Build();
+    TestObserver obs(w.get());
+    root_window()->AddChild(w.get());
+  }
+  auto& sources =
+      window_occlusion_tracker->GetObservingWindowTreeHostsForTest();
+  EXPECT_EQ(0u, sources.size());
+
+  // This test requires DCHECK enabled.
+#if defined(GTEST_HAS_DEATH_TEST) && DCHECK_IS_ON()
+  window_occlusion_tracker->set_num_tracked_windows_count_check_for_test(true);
+  EXPECT_DEATH(
+      {
+        auto w = test::TestWindowBuilder().SetShow(true).Build();
+        TestObserver obs(w.get());
+        root_window()->AddChild(w.get());
+      },
+      "DCHECK failed.*num_tracked_windows.*");
+#endif
+}
+
 // Run tests with LAYER_TEXTURE_LAYER type or LAYER_SOLID_COLOR type.
 INSTANTIATE_TEST_SUITE_P(All,
                          WindowOcclusionTrackerOpacityTest,
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
index ffc609c..10ad57b 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
@@ -194,7 +194,7 @@
 <translation id="2500392669976258912">الغوجاراتية الصوتية</translation>
 <translation id="2515586267016047495">Alt</translation>
 <translation id="2517472476991765520">فحص</translation>
-<translation id="252641322760726369">انقر مع الاستمرار على ملف ثم انقر على الرمز <ph name="ICON" /> واختَر "<ph name="PIN_COMMAND" />" للوصول سريعًا إلى هذا الملف في الرف.</translation>
+<translation id="252641322760726369">يرجى النقر مع الاستمرار على ملف ثم النقر على الرمز <ph name="ICON" /> واختيار "<ph name="PIN_COMMAND" />" للوصول سريعًا إلى هذا الملف في الرف.</translation>
 <translation id="2534460670861217804">‏خادم وكيل HTTP الآمن</translation>
 <translation id="2541377937973966830">محتوى هذا الملف للقراءة فقط. وبعض النشاطات غير متاحة فيه.</translation>
 <translation id="2542049655219295786">‏جدول من Google</translation>
@@ -422,7 +422,7 @@
 <translation id="4398096759193130964">يمكنك استعادة العناصر أو سحبها إلى مجلد جديد خارج "المهملات".</translation>
 <translation id="4401287888955153199">استخراج الكل</translation>
 <translation id="4410695710508688828">تعذّرت عملية استخراج الملفات. <ph name="ERROR_MESSAGE" /></translation>
-<translation id="4414834425328380570">سيتم حذف "<ph name="FILE_NAME" />" ولن تتمكّن من استعادته.</translation>
+<translation id="4414834425328380570">سيتم حذف "<ph name="FILE_NAME" />" وستتعذّر استعادته.</translation>
 <translation id="4418686080762064601">إنشاء اختصار للملفات</translation>
 <translation id="4425149324548788773">ملفاتي</translation>
 <translation id="4432921877815220091">الشبكة <ph name="NETWORK_INDEX" /> من إجمالي الشبكات البالغ عددها <ph name="NETWORK_COUNT" />، شبكة "<ph name="NETWORK_NAME" />"، يمكنك تفعيل الشبكة بعد إعداد الجهاز، هذه الشبكة يديرها المشرف</translation>
@@ -511,7 +511,7 @@
 <translation id="4992066212339426712">إعادة الصوت</translation>
 <translation id="5010406651457630570">أجهزة الكمبيوتر</translation>
 <translation id="5011233892417813670">Chromebook</translation>
-<translation id="5024856940085636730">توجد عملية تستغرق وقتًا أكثر من المتوقع. هل ترغب في إيقافها؟</translation>
+<translation id="5024856940085636730">توجد عملية تستغرق وقتًا أكثر من المتوقع. هل لديك رغبة في إيقافها؟</translation>
 <translation id="5036159836254554629">‏إدارة المشاركة في نظام Parallels Desktop</translation>
 <translation id="5038625366300922036">مشاهدة المزيد...</translation>
 <translation id="5044852990838351217">الأرمينية</translation>
@@ -1050,7 +1050,7 @@
 <translation id="9007990314804111233">‏سجِّل الدخول إلى حسابك على Microsoft</translation>
 <translation id="9017798300203431059">روسية صوتية</translation>
 <translation id="9034924485347205037">‏ملفات نظام التشغيل Linux</translation>
-<translation id="9035012421917565900">لا يمكن نقل العناصر مرة أخرى إلى '<ph name="DESTINATION_NAME" />'، لذلك لن تتمكن من التراجع عن هذا الإجراء.</translation>
+<translation id="9035012421917565900">لا يمكن نقل العناصر مرة أخرى إلى "<ph name="DESTINATION_NAME" />"، لذلك لن تتمكن من التراجع عن هذا الإجراء.</translation>
 <translation id="9035689366572880647">إدخال رقم التعريف الشخصي الحالي</translation>
 <translation id="9038620279323455325">الملف الذي يحمل الاسم "<ph name="FILE_NAME" />" موجود من قبل. يُرجى اختيار اسم مختلف.</translation>
 <translation id="9046895021617826162">تعذّر الاتصال</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
index 29f58b7..08b8aa55 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
@@ -508,7 +508,7 @@
 <translation id="4987699874727873250">אנגלית (הודו)</translation>
 <translation id="4988205478593450158">הקובץ <ph name="FILE_NAME" /> יימחק. להמשיך?</translation>
 <translation id="498902553138568924">פרפר אדום</translation>
-<translation id="4992066212339426712">ביטול השתקה</translation>
+<translation id="4992066212339426712">ביטול ההשתקה</translation>
 <translation id="5010406651457630570">מחשבים</translation>
 <translation id="5011233892417813670">Chromebook</translation>
 <translation id="5024856940085636730">הפעולה נמשכת זמן רב מהצפוי. רוצה לבטל אותה?</translation>
@@ -664,7 +664,7 @@
 <translation id="613750717151263950">יפנית עם מקלדת אמריקאית</translation>
 <translation id="6138894911715675297"><ph name="NETWORK_TYPE" />, אין רשת</translation>
 <translation id="6146563240635539929">סרטונים</translation>
-<translation id="6150853954427645995">כדי לשמור קובץ זה לשימוש אופליין, יש לחזור למצב אונליין, ללחוץ לחיצה ימנית על הקובץ ולבחור את האפשרות <ph name="OFFLINE_CHECKBOX_NAME" />.</translation>
+<translation id="6150853954427645995">כדי לשמור את הקובץ הזה לשימוש במצב אופליין, עליך לחזור למצב אונליין, ללחוץ לחיצה ימנית על הקובץ ולבחור באפשרות <ph name="OFFLINE_CHECKBOX_NAME" />.</translation>
 <translation id="6164412158936057769">פרפרים</translation>
 <translation id="6165508094623778733">למידע נוסף</translation>
 <translation id="6170470584681422115">כריך</translation>
diff --git a/ui/strings/translations/ui_strings_ar.xtb b/ui/strings/translations/ui_strings_ar.xtb
index 57d8c9f9..7501189 100644
--- a/ui/strings/translations/ui_strings_ar.xtb
+++ b/ui/strings/translations/ui_strings_ar.xtb
@@ -127,8 +127,8 @@
 <translation id="4895877746940133817"><ph name="TYPE_1" />، <ph name="TYPE_2" />، <ph name="TYPE_3" /></translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{ثانية واحدة}zero{# من الثواني}two{ثانيتان (#)}few{# ثوانٍ}many{# ثانية}other{# من الثواني}}</translation>
 <translation id="4971687151119236543">المقطع الصوتي السابق للوسائط</translation>
-<translation id="5046499563572181734">انقر هنا</translation>
-<translation id="5076340679995252485">ل&amp;صق</translation>
+<translation id="5046499563572181734">يُرجى النقر هنا</translation>
+<translation id="5076340679995252485">&amp;لصق</translation>
 <translation id="520299402983819650"><ph name="QUANTITY" /> بيتابايت</translation>
 <translation id="5278860589123563674">تعذّر الإرسال</translation>
 <translation id="5283101102242354279">لتفعيل إضافة في وضع التصفّح المتخفي، يُرجى اتّباع الخطوات الآتية:</translation>
diff --git a/ui/strings/translations/ui_strings_iw.xtb b/ui/strings/translations/ui_strings_iw.xtb
index 936bcd3..d8db258 100644
--- a/ui/strings/translations/ui_strings_iw.xtb
+++ b/ui/strings/translations/ui_strings_iw.xtb
@@ -167,7 +167,7 @@
 <translation id="6364916375976753737">גלילה שמאלה</translation>
 <translation id="63712816010840859">‏אם המסך הנוכחי הוא לא מסך מגע, צריך ללחוץ על Esc.</translation>
 <translation id="6394627529324717982">פסיק</translation>
-<translation id="6397363302884558537">יש להפסיק לדבר</translation>
+<translation id="6397363302884558537">‏Stop Speaking (עצירת ההקראה)</translation>
 <translation id="6404817160109697034">{SECONDS,plural, =1{לפני שנ‘ אחת}one{לפני # שנ‘}two{לפני # שנ‘}other{לפני # שנ‘}}</translation>
 <translation id="6430678249303439055">חסימת כל ההודעות מהאפליקציה הזו</translation>
 <translation id="6483402905448010557">{SECONDS,plural, =1{לפני שנייה אחת}one{לפני # שניות}two{לפני # שניות}other{לפני # שניות}}</translation>
diff --git a/ui/views/focus/focus_manager.cc b/ui/views/focus/focus_manager.cc
index 0d996ec..b10a679 100644
--- a/ui/views/focus/focus_manager.cc
+++ b/ui/views/focus/focus_manager.cc
@@ -89,8 +89,19 @@
         (is_left || is_right)) {
       bool next = is_right;
       View::Views views;
-      focused_view_->parent()->GetViewsInGroup(focused_view_->GetGroup(),
-                                               &views);
+
+      // Default to the parent if no owner is set.
+      View* group_owner = focused_view_->parent();
+      // Search for the owner in the focused view's hierarchy.
+      for (View* potential_owner = focused_view_->parent();
+           potential_owner != nullptr;
+           potential_owner = potential_owner->parent()) {
+        if (potential_owner->GetOwnedGroup() == focused_view_->GetGroup()) {
+          group_owner = potential_owner;
+          break;
+        }
+      }
+      group_owner->GetViewsInGroup(focused_view_->GetGroup(), &views);
       // Remove any views except current, which are disabled or hidden.
       std::erase_if(views, [this](View* v) {
         return v != focused_view_ &&
diff --git a/ui/views/focus/focus_manager_unittest.cc b/ui/views/focus/focus_manager_unittest.cc
index 2ae70896..36571772 100644
--- a/ui/views/focus/focus_manager_unittest.cc
+++ b/ui/views/focus/focus_manager_unittest.cc
@@ -28,6 +28,7 @@
 #include "ui/views/accessible_pane_view.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
 #include "ui/views/buildflags.h"
+#include "ui/views/controls/button/radio_button.h"
 #include "ui/views/controls/focus_ring.h"
 #include "ui/views/focus/focus_manager_delegate.h"
 #include "ui/views/focus/focus_manager_factory.h"
@@ -570,6 +571,109 @@
   EXPECT_EQ(v3, focus_manager->GetFocusedView());
 }
 
+// Verifies that focus traversal wraps to the first view in a radio button group
+// when the last view is focused. It skips the view that is not part of the
+// radio button group.
+TEST_F(FocusManagerTest, RadioButtonGroupTraversalWrapsToFirstView) {
+  FocusManager* focus_manager = GetFocusManager();
+
+  // Create a radio button group ID.
+  const int kRadioGroupID = 1;
+
+  // Create 2 nested views.
+  views::View* grandparent_view = new View;
+  views::View* parent_view = new View;
+  grandparent_view->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+  parent_view->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+  GetContentsView()->AddChildViewRaw(grandparent_view);
+  grandparent_view->AddChildViewRaw(parent_view);
+  grandparent_view->SetOwnedGroup(kRadioGroupID);
+
+  // Create 3 radio buttons in a radio button group.
+  auto* radio1 = parent_view->AddChildView(
+      std::make_unique<RadioButton>(u"Option 1", kRadioGroupID));
+  radio1->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+
+  auto* radio2 = parent_view->AddChildView(
+      std::make_unique<RadioButton>(u"Option 2", kRadioGroupID));
+  radio2->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+
+  auto* radio3 = parent_view->AddChildView(
+      std::make_unique<RadioButton>(u"Option 3", kRadioGroupID));
+  radio3->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+
+  // This view is not in the radio button group.
+  auto* other_view = GetContentsView()->AddChildView(std::make_unique<View>());
+  other_view->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+
+  // Focus the first radio button.
+  radio1->RequestFocus();
+  EXPECT_EQ(radio1, focus_manager->GetFocusedView());
+
+  const ui::KeyEvent down_key(ui::EventType::kKeyPressed, ui::VKEY_DOWN,
+                              ui::EF_NONE);
+  focus_manager->OnKeyEvent(down_key);
+  EXPECT_EQ(radio2, focus_manager->GetFocusedView());
+
+  focus_manager->OnKeyEvent(down_key);
+  EXPECT_EQ(radio3, focus_manager->GetFocusedView());
+
+  // Focus should wrap within the group and not go to other_view.
+  focus_manager->OnKeyEvent(down_key);
+  EXPECT_EQ(radio1, focus_manager->GetFocusedView());
+
+  const ui::KeyEvent up_key(ui::EventType::kKeyPressed, ui::VKEY_UP,
+                            ui::EF_NONE);
+  focus_manager->OnKeyEvent(up_key);
+
+  EXPECT_EQ(radio3, focus_manager->GetFocusedView());
+}
+
+// Verifies that group traversal algorithm assumes that the direct parent of the
+// currently focused view is the group owner when the owner is not explicitly
+// set. In this case the group traversal won't visit the third radio button
+// because it's not the direct sibling of the other buttons of the same group.
+TEST_F(FocusManagerTest, RadioButtonGroupOwnerUndefined) {
+  FocusManager* focus_manager = GetFocusManager();
+
+  // Create a radio button group ID.
+  const int kRadioGroupID = 1;
+
+  // Create 2 nested views.
+  views::View* grandparent_view = new View;
+  views::View* parent_view = new View;
+  grandparent_view->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+  parent_view->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+  GetContentsView()->AddChildViewRaw(grandparent_view);
+  grandparent_view->AddChildViewRaw(parent_view);
+
+  // Create 3 radio buttons in a radio button group.
+  auto* radio1 = parent_view->AddChildView(
+      std::make_unique<RadioButton>(u"Option 1", kRadioGroupID));
+  radio1->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+
+  auto* radio2 = parent_view->AddChildView(
+      std::make_unique<RadioButton>(u"Option 2", kRadioGroupID));
+  radio2->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+
+  auto* radio3 = grandparent_view->AddChildView(
+      std::make_unique<RadioButton>(u"Option 3", kRadioGroupID));
+  radio3->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+
+  // Focus the first radio button.
+  radio1->RequestFocus();
+  EXPECT_EQ(radio1, focus_manager->GetFocusedView());
+
+  const ui::KeyEvent down_key(ui::EventType::kKeyPressed, ui::VKEY_DOWN,
+                              ui::EF_NONE);
+  focus_manager->OnKeyEvent(down_key);
+  EXPECT_EQ(radio2, focus_manager->GetFocusedView());
+
+  // Focus should wrap within the group and not go to radio3.
+  focus_manager->OnKeyEvent(down_key);
+  EXPECT_EQ(radio1, focus_manager->GetFocusedView());
+}
+
 // Verifies the stored focus view tracks the focused view.
 TEST_F(FocusManagerTest, ImplicitlyStoresFocus) {
   views::View* v1 = new View;
diff --git a/ui/views/view.cc b/ui/views/view.cc
index 92179a2..d2e87ee 100644
--- a/ui/views/view.cc
+++ b/ui/views/view.cc
@@ -1061,10 +1061,23 @@
   }
 }
 
+void View::SetOwnedGroup(int group_id) {
+  // Don't change the owned group once it's set.
+  DCHECK(owned_group_ == -1 || owned_group_ == group_id);
+  if (owned_group_ != group_id) {
+    owned_group_ = group_id;
+    OnPropertyChanged(&owned_group_, kPropertyEffectsNone);
+  }
+}
+
 int View::GetGroup() const {
   return group_;
 }
 
+int View::GetOwnedGroup() const {
+  return owned_group_;
+}
+
 base::CallbackListSubscription View::AddGroupChangedCallback(
     PropertyChangedCallback callback) {
   return AddPropertyChangedCallback(&group_, callback);
@@ -3916,6 +3929,7 @@
 ADD_PROPERTY_METADATA(View::FocusBehavior, FocusBehavior)
 ADD_PROPERTY_METADATA(bool, FlipCanvasOnPaintForRTLUI)
 ADD_PROPERTY_METADATA(int, Group)
+ADD_PROPERTY_METADATA(int, OwnedGroup)
 ADD_PROPERTY_METADATA(int, Height)
 ADD_PROPERTY_METADATA(int, ID)
 ADD_READONLY_PROPERTY_METADATA(bool, IsDrawn);
diff --git a/ui/views/view.h b/ui/views/view.h
index ff4bee2..ca6e170c 100644
--- a/ui/views/view.h
+++ b/ui/views/view.h
@@ -949,9 +949,17 @@
   // Groups are currently used to implement radio button mutual exclusion.
   // The group id is immutable once it's set.
   void SetGroup(int gid);
+
+  // Sets the group this view owns. Immutable once set.
+  void SetOwnedGroup(int group_id);
+
   // Returns the group id of the view, or -1 if the id is not set yet.
   int GetGroup() const;
 
+  // Returns the group id of the group that the view owns or -1 if the view does
+  // not own a group.
+  int GetOwnedGroup() const;
+
   // Adds a callback associated with the above |Group| property. The callback
   // will be invoked whenever the property changes.
   [[nodiscard]] base::CallbackListSubscription AddGroupChangedCallback(
@@ -2393,6 +2401,14 @@
   // to find other radio buttons.
   int group_ = -1;
 
+  // The id of the group that this view owns. Some view subclasses use this id
+  // to find the common parent of the group. One example in Chrome is
+  // `CombinedSelectorRadioButton` that is in a `CombinedSelectorRowView` which
+  // is in a `CombinedSelectorListView`. In this example
+  // `CombinedSelectorRadioButton` is not the direct parent of the radio button,
+  // but it is its group owner.
+  int owned_group_ = -1;
+
   // Tree operations -----------------------------------------------------------
 
   // The widget that this view is attached to. This is null if the view is not
@@ -2710,6 +2726,7 @@
 VIEW_BUILDER_PROPERTY(bool, FlipCanvasOnPaintForRTLUI)
 VIEW_BUILDER_PROPERTY(views::View::FocusBehavior, FocusBehavior)
 VIEW_BUILDER_PROPERTY(int, Group)
+VIEW_BUILDER_PROPERTY(int, OwnedGroup)
 VIEW_BUILDER_PROPERTY(int, ID)
 VIEW_BUILDER_PROPERTY(bool, Mirrored)
 VIEW_BUILDER_PROPERTY(bool, NotifyEnterExitOnChild)
diff --git a/v8 b/v8
index 690a363..254cf97 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit 690a3636521bf575064d1bc06f50151cda708cfe
+Subproject commit 254cf97a6ad2660647784e5faf9e70a34d2cd054