diff --git a/DEPS b/DEPS
index 5870648..6afef834 100644
--- a/DEPS
+++ b/DEPS
@@ -308,11 +308,11 @@
   # 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': '96d567763cde6fce93437285efeffbe518734435',
+  'src_internal_revision': 'b1e2057843d44a48732728aaf6989b20398c18c4',
   # 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': 'd5a6b6af6d12b261a917c19a3504193c2472ae63',
+  'skia_revision': '767c4ce9e29cb4ef69b48ca0c83048381fe14235',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -320,11 +320,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '1724ab3641c825d2ed6fc76e20c3d20301e73696',
+  'angle_revision': '5ac8def8003e71514d7a6301b86031ae91506b89',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '518a9f63228dceb1c77d778f694bd319909075ab',
+  'swiftshader_revision': '42f6e059416806f28b7078b5ca67856b28a2cbb0',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -364,7 +364,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling HarfBuzz
   # and whatever else without interference from each other.
-  'harfbuzz_revision': '7d936359a27abb2d7cb14ecc102463bb15c11843',
+  'harfbuzz_revision': '31695252eb6ed25096893aec7f848889dad874bc',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Emoji Segmenter
   # and whatever else without interference from each other.
@@ -400,7 +400,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': '9d9a7262df8a7db685524e449c0c08fc3f5f0e8c',
+  'devtools_frontend_revision': 'dbb61cf4b27a8ca13ac62ce7b72c22ad2664b460',
   # 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.
@@ -424,7 +424,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': 'd07825efa003125c46a2819c37081dbde0528277',
+  'dawn_revision': '6a6f6d3d7fd705597a8a94c2d1e041b8b8e70b43',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -528,7 +528,7 @@
   # 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':    'a351f26463daf1887755e0cd622b0d8bf753cd9f',
+  'llvm_libc_revision':    '03f822d2a88c8f68f6a92c5cb3e79ccc3002e8a9',
   # 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.
@@ -540,7 +540,7 @@
 
   # If you change this, also update the libc++ revision in
   # //buildtools/deps_revisions.gni.
-  'libcxx_revision':       '07572e7b169225ef3a999584cba9d9004631ae66',
+  'libcxx_revision':       'c03062d6c9382e7eeb455660308f4d2652b700bd',
 
   # GN CIPD package version.
   'gn_version': 'git_revision:5964f499767097d81dbe034e8b541c3988168073',
@@ -1206,7 +1206,7 @@
       'packages': [
           {
               'package': 'chromium/chrome/android/orderfiles/arm64',
-              'version': 'IhWwwYw-VCiROoqjoUgb7gl8tB4cR7gBZz_HHd7OxxsC',
+              'version': '0PEwB7IiCdtg-tOJoAqtd4d2Om-PJxaanBnveBg6yzoC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -1624,7 +1624,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    'fe18f1532fab7fddfaac4b6fb1b53dd222e0a532',
+    '67e6fd873fde1ac55a0929ce4c057d52e7405449',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -2028,7 +2028,7 @@
   # Tools used when building Chrome for Chrome OS. This affects both the Simple
   # Chrome workflow, as well as the chromeos-chrome ebuild.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'eec00b35328af2e160bfc59e1c7f85c75cf049dd',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '48222691c960596767a373b752130b684ab0f776',
       'condition': 'checkout_chromeos',
   },
 
@@ -2610,7 +2610,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + 'ec42dd387c2ab14c7369136e86898be936248315',
+    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '46644e5dfbad39286dbb24876d2b0d29fc83fb22',
 
   'src/base/tracing/test/data': {
     'bucket': 'perfetto',
@@ -2936,7 +2936,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@53bfad22ed15add63473fce8301a2863436117d0',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@8b33d336e1abd821451118bfc47ef163b8becb1a',
   'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@19246e3fbc095586e0e325b378ea351aababeb7c',
   '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@6146b3d9ad4fcc5fb512209d348e97ce03749169',
@@ -2945,7 +2945,7 @@
   'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@0db9a0d55e33f8b63b733f37dc59eb441d51abf0',
   'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@8542e6dcfc6daef20d561220f1d91a02c25d95b2',
   'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@c010c19e796035e92fb3b0462cb887518a41a7c1',
-  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@2e94023f2581aaa7f5a4d6fe0ee670d9b5e10187',
+  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@c715441d1d69d96db0105e44ddac21c0720922ea',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'cb0597213b0fcb999caa9ed08c2f88dc45eb7d50',
@@ -2988,7 +2988,7 @@
     Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'),
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'bfe531707560d16644de452e51e2c4fe40c46b91',
+    Var('webrtc_git') + '/src.git' + '@' + '7442f8c253a726265aad5e24b035e53e4d5249a1',
 
   # 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.
@@ -3132,7 +3132,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'd1V1uSQKXBnmAmF6mB8rlMMTbYZauHHH21fm1dDlZ8kC',
+        'version': 'RwR_Hp7QUH1iqzD5-FrG-NmFBRMSO2ubbLcjT6A7K60C',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3143,7 +3143,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'q-cz8ZklqFZn8e0chZJTYNODJ4vUr3P2UaZmuJW0SFUC',
+        'version': 'GTbV-XYywBlbLYAP7kULtrtudRn5plkKVycuJcWFJBUC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3759,7 +3759,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        'fd52a146a6011abcc1c9c18a07f113fa192a9161',
+        '99015ee32eeab799c1a93c516c179cdff36cd173',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 3752c87..f62212c5 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -1209,7 +1209,6 @@
 generate_jni("browser_jni_headers") {
   sources = [
     "java/src/org/chromium/android_webview/AndroidProtocolHandler.java",
-    "java/src/org/chromium/android_webview/AwBackForwardCacheSettings.java",
     "java/src/org/chromium/android_webview/AwBrowserContext.java",
     "java/src/org/chromium/android_webview/AwBrowserContextStore.java",
     "java/src/org/chromium/android_webview/AwBrowserMainParts.java",
diff --git a/android_webview/browser/BUILD.gn b/android_webview/browser/BUILD.gn
index d8119be..5d7a8f35 100644
--- a/android_webview/browser/BUILD.gn
+++ b/android_webview/browser/BUILD.gn
@@ -26,8 +26,6 @@
     "android_protocol_handler.cc",
     "android_protocol_handler.h",
     "aw_apk_type.h",
-    "aw_back_forward_cache_settings.cc",
-    "aw_back_forward_cache_settings.h",
     "aw_backforward_cache_not_restored_reason.h",
     "aw_browser_context.cc",
     "aw_browser_context.h",
diff --git a/android_webview/browser/aw_back_forward_cache_settings.cc b/android_webview/browser/aw_back_forward_cache_settings.cc
deleted file mode 100644
index f7464dd..0000000
--- a/android_webview/browser/aw_back_forward_cache_settings.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "android_webview/browser/aw_back_forward_cache_settings.h"
-
-#include <memory>
-
-// Must come after all headers that specialize FromJniType() / ToJniType().
-#include "android_webview/browser_jni_headers/AwBackForwardCacheSettings_jni.h"
-
-namespace android_webview {
-
-AwBackForwardCacheSettings
-AwBackForwardCacheSettings::FromJavaAwBackForwardCacheSettings(
-    JNIEnv* env,
-    const base::android::JavaRef<jobject>& java_back_forward_cache_settings) {
-  return AwBackForwardCacheSettings(
-      Java_AwBackForwardCacheSettings_getTimeoutInSeconds(
-          env, java_back_forward_cache_settings),
-      Java_AwBackForwardCacheSettings_getMaxPagesInCache(
-          env, java_back_forward_cache_settings));
-}
-
-AwBackForwardCacheSettings::AwBackForwardCacheSettings(int timeout_in_seconds,
-                                                       int max_pages_in_cache)
-    : timeout_in_seconds_(timeout_in_seconds),
-      max_pages_in_cache_(max_pages_in_cache) {}
-
-}  // namespace android_webview
-
-DEFINE_JNI(AwBackForwardCacheSettings)
diff --git a/android_webview/browser/aw_back_forward_cache_settings.h b/android_webview/browser/aw_back_forward_cache_settings.h
deleted file mode 100644
index c42c409..0000000
--- a/android_webview/browser/aw_back_forward_cache_settings.h
+++ /dev/null
@@ -1,32 +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 ANDROID_WEBVIEW_BROWSER_AW_BACK_FORWARD_CACHE_SETTINGS_H_
-#define ANDROID_WEBVIEW_BROWSER_AW_BACK_FORWARD_CACHE_SETTINGS_H_
-
-#include "base/android/jni_weak_ref.h"
-#include "base/android/scoped_java_ref.h"
-
-namespace android_webview {
-
-class AwBackForwardCacheSettings {
- public:
-  static AwBackForwardCacheSettings FromJavaAwBackForwardCacheSettings(
-      JNIEnv* env,
-      const base::android::JavaRef<jobject>& java_back_forward_cache_settings);
-
-  AwBackForwardCacheSettings(int timeout_in_seconds, int max_pages_in_cache);
-  ~AwBackForwardCacheSettings() = default;
-
-  int timeout_in_seconds() const { return timeout_in_seconds_; }
-  int max_pages_in_cache() const { return max_pages_in_cache_; }
-
- private:
-  const int timeout_in_seconds_;
-  const int max_pages_in_cache_;
-};
-
-}  // namespace android_webview
-
-#endif  // ANDROID_WEBVIEW_BROWSER_AW_BACK_FORWARD_CACHE_SETTINGS_H_
diff --git a/android_webview/browser/aw_settings.cc b/android_webview/browser/aw_settings.cc
index cad6855..472416b 100644
--- a/android_webview/browser/aw_settings.cc
+++ b/android_webview/browser/aw_settings.cc
@@ -210,7 +210,8 @@
   UpdateAttributionBehaviorLocked(env, obj);
   UpdateSpeculativeLoadingAllowedLocked(env, obj);
   UpdateBackForwardCacheEnabledLocked(env, obj);
-  UpdateBackForwardCacheSettingsLocked(env, obj);
+  UpdateBackForwardCacheSettingsTimeoutLocked(env, obj);
+  UpdateBackForwardCacheSettingsMaxPagesInCacheLocked(env, obj);
   UpdateGeolocationEnabledLocked(env, obj);
 }
 
@@ -511,36 +512,36 @@
   }
 }
 
-void AwSettings::UpdateBackForwardCacheSettingsLocked(
+void AwSettings::UpdateBackForwardCacheSettingsTimeoutLocked(
     JNIEnv* env,
     const JavaRef<jobject>& obj) {
-  auto settings_obj = Java_AwSettings_getBackForwardCacheSettings(env, obj);
-  if (!settings_obj) {
-    return;
-  }
-  AwBackForwardCacheSettings settings =
-      AwBackForwardCacheSettings::FromJavaAwBackForwardCacheSettings(
-          env, settings_obj);
+  int timeout_in_seconds =
+      Java_AwSettings_getBackForwardCacheSettingsTimeout(env, obj);
   if (web_contents()) {
-    if (!aw_back_forward_cache_settings_.has_value() ||
-        settings.max_pages_in_cache() !=
-            aw_back_forward_cache_settings_->max_pages_in_cache()) {
+    if (timeout_in_seconds != back_forward_cache_timeout_in_seconds_) {
       web_contents()
           ->GetController()
           .GetBackForwardCache()
-          .SetEmbedderSuppliedCacheSize(settings.max_pages_in_cache());
-    }
-    if (!aw_back_forward_cache_settings_.has_value() ||
-        settings.timeout_in_seconds() !=
-            aw_back_forward_cache_settings_->timeout_in_seconds()) {
-      web_contents()
-          ->GetController()
-          .GetBackForwardCache()
-          .SetEmbedderSuppliedTimeToLive(
-              base::Seconds(settings.timeout_in_seconds()));
+          .SetEmbedderSuppliedTimeToLive(base::Seconds(timeout_in_seconds));
     }
   }
-  aw_back_forward_cache_settings_.emplace(settings);
+  back_forward_cache_timeout_in_seconds_ = timeout_in_seconds;
+}
+
+void AwSettings::UpdateBackForwardCacheSettingsMaxPagesInCacheLocked(
+    JNIEnv* env,
+    const JavaRef<jobject>& obj) {
+  int max_pages_in_cache =
+      Java_AwSettings_getBackForwardCacheSettingsMaxPagesInCache(env, obj);
+  if (web_contents()) {
+    if (max_pages_in_cache != back_forward_cache_max_pages_in_cache_) {
+      web_contents()
+          ->GetController()
+          .GetBackForwardCache()
+          .SetEmbedderSuppliedCacheSize(max_pages_in_cache);
+    }
+  }
+  back_forward_cache_max_pages_in_cache_ = max_pages_in_cache;
 }
 
 void AwSettings::UpdateGeolocationEnabledLocked(JNIEnv* env,
diff --git a/android_webview/browser/aw_settings.h b/android_webview/browser/aw_settings.h
index 5587793..1970037 100644
--- a/android_webview/browser/aw_settings.h
+++ b/android_webview/browser/aw_settings.h
@@ -5,7 +5,6 @@
 #ifndef ANDROID_WEBVIEW_BROWSER_AW_SETTINGS_H_
 #define ANDROID_WEBVIEW_BROWSER_AW_SETTINGS_H_
 
-#include "android_webview/browser/aw_back_forward_cache_settings.h"
 #include "base/android/jni_weak_ref.h"
 #include "base/android/scoped_java_ref.h"
 #include "content/public/browser/web_contents_observer.h"
@@ -130,7 +129,10 @@
   void UpdateBackForwardCacheEnabledLocked(
       JNIEnv* env,
       const base::android::JavaRef<jobject>& obj);
-  void UpdateBackForwardCacheSettingsLocked(
+  void UpdateBackForwardCacheSettingsTimeoutLocked(
+      JNIEnv* env,
+      const base::android::JavaRef<jobject>& obj);
+  void UpdateBackForwardCacheSettingsMaxPagesInCacheLocked(
       JNIEnv* env,
       const base::android::JavaRef<jobject>& obj);
   void UpdateGeolocationEnabledLocked(
@@ -184,7 +186,8 @@
   SpeculativeLoadingAllowedFlags speculative_loading_allowed_flags_{
       SpeculativeLoadingAllowedFlags::SPECULATIVE_LOADING_DISABLED};
   bool bfcache_enabled_in_java_settings_{false};
-  std::optional<AwBackForwardCacheSettings> aw_back_forward_cache_settings_;
+  int back_forward_cache_timeout_in_seconds_{0};
+  int back_forward_cache_max_pages_in_cache_{0};
   bool geolocation_enabled_{false};
 
   // Whether the settings that would affect the initial page scale is set to a
diff --git a/android_webview/java/src/org/chromium/android_webview/AwBackForwardCacheSettings.java b/android_webview/java/src/org/chromium/android_webview/AwBackForwardCacheSettings.java
index 40e2e70d..ed3670d 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwBackForwardCacheSettings.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwBackForwardCacheSettings.java
@@ -8,7 +8,10 @@
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JNINamespace;
 
-/** Settings for toggling back/forward cache behavior. */
+/**
+ * Settings for toggling back/forward cache behavior. This class is only needed to maintain
+ * compatibility with the first version of the API and should be removed once the API is stable.
+ */
 @JNINamespace("android_webview")
 @NullMarked
 public class AwBackForwardCacheSettings extends AwSupportLibIsomorphic {
diff --git a/android_webview/java/src/org/chromium/android_webview/AwSettings.java b/android_webview/java/src/org/chromium/android_webview/AwSettings.java
index c6e7e57c..52fbcfc 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwSettings.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwSettings.java
@@ -52,7 +52,6 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 import java.util.Map;
-import java.util.Objects;
 
 /**
  * Stores Android WebView specific settings that does not need to be synced to WebKit.
@@ -215,7 +214,8 @@
     private boolean mBackForwardCacheEnabled;
     private boolean mHasCalledSetBackForwardCacheEnabledBefore;
 
-    private @Nullable AwBackForwardCacheSettings mAwBackForwardCacheSettings;
+    private int mBackForwardCacheTimeoutInSeconds;
+    private int mBackForwardCacheMaxPagesInCache;
 
     private boolean mCssHexAlphaColorEnabled;
     private boolean mScrollTopLeftInteropEnabled;
@@ -363,9 +363,14 @@
                     AwSettings.this::updateBackForwardCacheEnabledOnUiThreadLocked);
         }
 
-        void updateBackForwardCacheSettings() {
+        void updateBackForwardCacheSettingsTimeout() {
             runOnUiThreadBlockingAndLocked(
-                    AwSettings.this::updateBackForwardCacheSettingsOnUiThreadLocked);
+                    AwSettings.this::updateBackForwardCacheSettingsTimeoutOnUiThreadLocked);
+        }
+
+        void updateBackForwardCacheSettingsMaxPagesInCache() {
+            runOnUiThreadBlockingAndLocked(
+                    AwSettings.this::updateBackForwardCacheSettingsMaxPagesInCacheOnUiThreadLocked);
         }
 
         void updateGeolocationEnabled() {
@@ -1853,26 +1858,45 @@
         }
     }
 
-    public void setBackForwardCacheSettings(AwBackForwardCacheSettings backForwardCacheSettings) {
-        if (TRACE) Log.i(TAG, "setBackForwardCacheSettings=" + backForwardCacheSettings);
-        assert backForwardCacheSettings != null;
+    public void setBackForwardCacheTimeoutInSeconds(int timeoutInSeconds) {
+        if (TRACE) Log.i(TAG, "setBackForwardCacheTimeoutInSeconds=" + timeoutInSeconds);
         // Setting BackForwardCacheSettings implicitly enables BFCache as well.
         setBackForwardCacheEnabled(true);
         synchronized (mAwSettingsLock) {
-            if (Objects.equals(mAwBackForwardCacheSettings, backForwardCacheSettings)) {
+            if (mBackForwardCacheTimeoutInSeconds == timeoutInSeconds) {
                 return;
             }
-            mAwBackForwardCacheSettings = backForwardCacheSettings;
-            mEventHandler.updateBackForwardCacheSettings();
+            mBackForwardCacheTimeoutInSeconds = timeoutInSeconds;
+            mEventHandler.updateBackForwardCacheSettingsTimeout();
+        }
+    }
+
+    public void setBackForwardCacheMaxPagesInCache(int maxPagesInCache) {
+        if (TRACE) Log.i(TAG, "setBackForwardCacheMaxPagesInCache=" + maxPagesInCache);
+        // Setting BackForwardCacheSettings implicitly enables BFCache as well.
+        setBackForwardCacheEnabled(true);
+        synchronized (mAwSettingsLock) {
+            if (mBackForwardCacheMaxPagesInCache == maxPagesInCache) {
+                return;
+            }
+            mBackForwardCacheMaxPagesInCache = maxPagesInCache;
+            mEventHandler.updateBackForwardCacheSettingsMaxPagesInCache();
         }
     }
 
     @CalledByNative
-    @Nullable
-    public AwBackForwardCacheSettings getBackForwardCacheSettings() {
+    public int getBackForwardCacheSettingsTimeout() {
         synchronized (mAwSettingsLock) {
             assert Thread.holdsLock(mAwSettingsLock);
-            return mAwBackForwardCacheSettings;
+            return mBackForwardCacheTimeoutInSeconds;
+        }
+    }
+
+    @CalledByNative
+    public int getBackForwardCacheSettingsMaxPagesInCache() {
+        synchronized (mAwSettingsLock) {
+            assert Thread.holdsLock(mAwSettingsLock);
+            return mBackForwardCacheMaxPagesInCache;
         }
     }
 
@@ -2180,19 +2204,25 @@
     private void updateBackForwardCacheEnabledOnUiThreadLocked() {
         assert mEventHandler.mHandler != null;
         ThreadUtils.assertOnUiThread();
-        if (mNativeAwSettings != 0) {
-            AwSettingsJni.get()
-                    .updateBackForwardCacheEnabledLocked(mNativeAwSettings, AwSettings.this);
-        }
+        if (mNativeAwSettings == 0) return;
+        AwSettingsJni.get().updateBackForwardCacheEnabledLocked(mNativeAwSettings, AwSettings.this);
     }
 
-    private void updateBackForwardCacheSettingsOnUiThreadLocked() {
+    private void updateBackForwardCacheSettingsTimeoutOnUiThreadLocked() {
         assert mEventHandler.mHandler != null;
         ThreadUtils.assertOnUiThread();
-        if (mNativeAwSettings != 0) {
-            AwSettingsJni.get()
-                    .updateBackForwardCacheSettingsLocked(mNativeAwSettings, AwSettings.this);
-        }
+        if (mNativeAwSettings == 0) return;
+        AwSettingsJni.get()
+                .updateBackForwardCacheSettingsTimeoutLocked(mNativeAwSettings, AwSettings.this);
+    }
+
+    private void updateBackForwardCacheSettingsMaxPagesInCacheOnUiThreadLocked() {
+        assert mEventHandler.mHandler != null;
+        ThreadUtils.assertOnUiThread();
+        if (mNativeAwSettings == 0) return;
+        AwSettingsJni.get()
+                .updateBackForwardCacheSettingsMaxPagesInCacheLocked(
+                        mNativeAwSettings, AwSettings.this);
     }
 
     private void updateGeolocationEnabledOnUiThreadLocked() {
@@ -2353,7 +2383,10 @@
 
         void updateBackForwardCacheEnabledLocked(long nativeAwSettings, AwSettings caller);
 
-        void updateBackForwardCacheSettingsLocked(long nativeAwSettings, AwSettings caller);
+        void updateBackForwardCacheSettingsTimeoutLocked(long nativeAwSettings, AwSettings caller);
+
+        void updateBackForwardCacheSettingsMaxPagesInCacheLocked(
+                long nativeAwSettings, AwSettings caller);
 
         boolean isForceDarkApplied(long nativeAwSettings, AwSettings caller);
 
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
index e0be009ea..8f63a834 100644
--- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
+++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -381,9 +381,6 @@
                 "Schedules tasks related to the navigation network responses on a higher "
                         + "priority task queue."),
         Flag.baseFeature(
-                ContentFeatures.EARLY_ESTABLISH_GPU_CHANNEL,
-                "Enable establishing the GPU channel early in renderer startup."),
-        Flag.baseFeature(
                 ContentFeatures.GIN_JAVA_BRIDGE_MOJO_SKIP_CLEAR_OBJECTS_ON_MAIN_DOCUMENT_READY,
                 "Skips clearing objects on main document ready."),
         Flag.baseFeature(
@@ -400,10 +397,6 @@
                 "Changes behavior of User-Agent Client Hints to send blank headers "
                         + "when the User-Agent string is overriden"),
         Flag.baseFeature(
-                BlinkFeatures.ESTABLISH_GPU_CHANNEL_ASYNC,
-                "Enables establishing the GPU channel asnchronously when requesting a new "
-                        + "layer tree frame sink."),
-        Flag.baseFeature(
                 BlinkFeatures.PREFETCH_FONT_LOOKUP_TABLES,
                 "If enabled, font lookup tables will be prefetched on renderer startup."),
         Flag.baseFeature(
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwBackForwardCacheTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwBackForwardCacheTest.java
index 1bb1f68..86194a3 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwBackForwardCacheTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwBackForwardCacheTest.java
@@ -24,7 +24,6 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.UseParametersRunnerFactory;
 
-import org.chromium.android_webview.AwBackForwardCacheSettings;
 import org.chromium.android_webview.AwContents;
 import org.chromium.android_webview.AwContentsStatics;
 import org.chromium.android_webview.AwSettings;
@@ -191,11 +190,8 @@
     @LargeTest
     @Feature({"AndroidWebView"})
     public void testBFCacheEnabledThroughSettings() throws Exception, Throwable {
-        mAwContents
-                .getSettings()
-                .setBackForwardCacheSettings(
-                        new AwBackForwardCacheSettings(
-                                /* timeoutInSeconds= */ 600, /* maxPagesInCache= */ 3));
+        mAwContents.getSettings().setBackForwardCacheMaxPagesInCache(3);
+        mAwContents.getSettings().setBackForwardCacheTimeoutInSeconds(600);
         mActivityTestRule.loadUrlSync(
                 mAwContents, mContentsClient.getOnPageFinishedHelper(), mInitialUrl);
         navigateForwardAndBack();
@@ -227,11 +223,8 @@
     @Feature({"AndroidWebView"})
     public void testBFCacheWithMultiplePages_MoreThanSettings() throws Exception, Throwable {
         // Only allow 1 page in BFCache at a time.
-        mAwContents
-                .getSettings()
-                .setBackForwardCacheSettings(
-                        new AwBackForwardCacheSettings(
-                                /* timeoutInSeconds= */ 600, /* maxPagesInCache= */ 1));
+        mAwContents.getSettings().setBackForwardCacheMaxPagesInCache(1);
+        mAwContents.getSettings().setBackForwardCacheTimeoutInSeconds(600);
         // Navigate three times.
         mActivityTestRule.loadUrlSync(
                 mAwContents, mContentsClient.getOnPageFinishedHelper(), mInitialUrl);
@@ -252,6 +245,33 @@
     @Test
     @LargeTest
     @Feature({"AndroidWebView"})
+    public void testBFCacheWithTimeout() throws Exception, Throwable {
+        mAwContents.getSettings().setBackForwardCacheEnabled(true);
+        mAwContents.getSettings().setBackForwardCacheTimeoutInSeconds(1);
+
+        // Navigate to the initial page.
+        mActivityTestRule.loadUrlSync(
+                mAwContents, mContentsClient.getOnPageFinishedHelper(), mInitialUrl);
+
+        // Navigate forward to put the initial page in BFCache.
+        navigateForward();
+
+        // Wait for the cache entry to expire.
+        Thread.sleep(1100);
+
+        // Navigate back. The page should be evicted due to timeout and not restored from BFCache.
+        navigateBack();
+        Assert.assertNotEquals("\"null\"", getNotRestoredReasons());
+        Assert.assertFalse(isPageShowPersisted());
+
+        // Verify that BFCache still works for subsequent navigations.
+        navigateForwardAndBack();
+        Assert.assertTrue(isPageShowPersisted());
+    }
+
+    @Test
+    @LargeTest
+    @Feature({"AndroidWebView"})
     @CommandLineFlags.Add({"disable-features=WebViewBackForwardCache"})
     public void testBackNavigationFollowsSettings() throws Exception, Throwable {
         mAwContents.getSettings().setBackForwardCacheEnabled(true);
diff --git a/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/WebSettingsBoundaryInterface.java b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/WebSettingsBoundaryInterface.java
index 7c1401b5..726551e5 100644
--- a/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/WebSettingsBoundaryInterface.java
+++ b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/WebSettingsBoundaryInterface.java
@@ -166,4 +166,8 @@
     // LINT.ThenChange(/android_webview/java/src/org/chromium/android_webview/AwSettings.java:AwSettingsHyperlinkContextMenuItems)
 
     void setHyperlinkContextMenuItems(@HyperlinkContextMenuItems int hyperlinkMenuItems);
+
+    void setBackForwardCacheSettingsTimeout(int timeout);
+
+    void setBackForwardCacheSettingsMaxPagesInCache(int pagesInCache);
 }
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebSettingsAdapter.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebSettingsAdapter.java
index 2099125..7e734d9 100644
--- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebSettingsAdapter.java
+++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebSettingsAdapter.java
@@ -8,7 +8,6 @@
 
 import android.webkit.WebSettings;
 
-import org.chromium.android_webview.AwBackForwardCacheSettings;
 import org.chromium.android_webview.AwDarkMode;
 import org.chromium.android_webview.AwSettings;
 import org.chromium.android_webview.common.MediaIntegrityApiStatus;
@@ -482,10 +481,9 @@
                     BoundaryInterfaceReflectionUtil.castToSuppLibClass(
                             WebViewBackForwardCacheSettingsBoundaryInterface.class,
                             backForwardCacheSettings);
-            mAwSettings.setBackForwardCacheSettings(
-                    new AwBackForwardCacheSettings(
-                            boundaryInterface.getTimeoutInSeconds(),
-                            boundaryInterface.getMaxPagesInCache()));
+            mAwSettings.setBackForwardCacheMaxPagesInCache(boundaryInterface.getMaxPagesInCache());
+            mAwSettings.setBackForwardCacheTimeoutInSeconds(
+                    boundaryInterface.getTimeoutInSeconds());
         }
     }
 
@@ -496,7 +494,8 @@
             recordApiCall(ApiCall.GET_BACK_FORWARD_CACHE_SETTINGS);
             return BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
                     new SupportLibWebViewBackForwardCacheSettingsAdapter(
-                            mAwSettings.getBackForwardCacheSettings()));
+                            mAwSettings.getBackForwardCacheSettingsMaxPagesInCache(),
+                            mAwSettings.getBackForwardCacheSettingsTimeout()));
         }
     }
 
@@ -575,4 +574,24 @@
             mAwSettings.setHyperlinkContextMenuItems(awMenuItems);
         }
     }
+
+    @Override
+    public void setBackForwardCacheSettingsTimeout(int timeout) {
+        try (TraceEvent ignored =
+                TraceEvent.scoped(
+                        "WebView.APICall.AndroidX.BACK_FORWARD_CACHE_SETTINGS_SET_TIMEOUT_IN_SECONDS")) {
+            recordApiCall(ApiCall.BACK_FORWARD_CACHE_SETTINGS_SET_TIMEOUT_IN_SECONDS);
+            mAwSettings.setBackForwardCacheTimeoutInSeconds(timeout);
+        }
+    }
+
+    @Override
+    public void setBackForwardCacheSettingsMaxPagesInCache(int pagesInCache) {
+        try (TraceEvent ignored =
+                TraceEvent.scoped(
+                        "WebView.APICall.AndroidX.BACK_FORWARD_CACHE_SETTINGS_SET_MAX_PAGES_IN_CACHE")) {
+            recordApiCall(ApiCall.BACK_FORWARD_CACHE_SETTINGS_SET_MAX_PAGES_IN_CACHE);
+            mAwSettings.setBackForwardCacheMaxPagesInCache(pagesInCache);
+        }
+    }
 }
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebSettingsNoOpAdapter.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebSettingsNoOpAdapter.java
index da417ef..3ed1f3f3 100644
--- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebSettingsNoOpAdapter.java
+++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebSettingsNoOpAdapter.java
@@ -238,4 +238,14 @@
     public void setHyperlinkContextMenuItems(@HyperlinkContextMenuItems int items) {
         recordApiCall(ApiCall.SET_HYPERLINK_CONTEXT_MENU_ITEMS);
     }
+
+    @Override
+    public void setBackForwardCacheSettingsTimeout(int timeout) {
+        recordApiCall(ApiCall.BACK_FORWARD_CACHE_SETTINGS_SET_TIMEOUT_IN_SECONDS);
+    }
+
+    @Override
+    public void setBackForwardCacheSettingsMaxPagesInCache(int pagesInCache) {
+        recordApiCall(ApiCall.BACK_FORWARD_CACHE_SETTINGS_SET_MAX_PAGES_IN_CACHE);
+    }
 }
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewBackForwardCacheSettingsAdapter.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewBackForwardCacheSettingsAdapter.java
index 3b2033f..7f88e9bb 100644
--- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewBackForwardCacheSettingsAdapter.java
+++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewBackForwardCacheSettingsAdapter.java
@@ -16,23 +16,20 @@
 
 /**
  * Adapter between WebViewBackForwardCacheSettingsBoundaryInterface and AwBackForwardCacheSettings.
- *
- * <p>Once created, instances are kept alive by the peer AwBackForwardCacheSettings.
  */
 @Lifetime.Temporary
 class SupportLibWebViewBackForwardCacheSettingsAdapter
         implements WebViewBackForwardCacheSettingsBoundaryInterface {
+
     private final AwBackForwardCacheSettings mAwBackForwardCacheSettings;
 
-    SupportLibWebViewBackForwardCacheSettingsAdapter(AwBackForwardCacheSettings settings) {
-        mAwBackForwardCacheSettings = settings;
+    SupportLibWebViewBackForwardCacheSettingsAdapter(
+            AwBackForwardCacheSettings awBackForwardCacheSettings) {
+        mAwBackForwardCacheSettings = awBackForwardCacheSettings;
     }
 
-    SupportLibWebViewBackForwardCacheSettingsAdapter(
-            WebViewBackForwardCacheSettingsBoundaryInterface settings) {
-        mAwBackForwardCacheSettings =
-                new AwBackForwardCacheSettings(
-                        settings.getTimeoutInSeconds(), settings.getMaxPagesInCache());
+    SupportLibWebViewBackForwardCacheSettingsAdapter(int maxPagesInCache, int timeoutInSeconds) {
+        this(new AwBackForwardCacheSettings(timeoutInSeconds, maxPagesInCache));
     }
 
     @Override
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java
index f185830..33a14191 100644
--- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java
+++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java
@@ -128,6 +128,7 @@
                 Features.ADD_QUIC_HINTS_V1,
                 Features.ON_NAVIGATION_COMPLETED_NON_COMMITTED,
                 Features.COMMITTED_NAVIGATION_GET_PAGE_NON_NULL,
+                Features.BACK_FORWARD_CACHE_SETTINGS_V2 + Features.DEV_SUFFIX,
                 // Add new features above. New features must include `+ Features.DEV_SUFFIX`
                 // when they're initially added (this can be removed in a future CL). The final
                 // feature should have a trailing comma for cleaner diffs.
@@ -471,7 +472,7 @@
         int HAS_ORIGIN_MATCHED_HEADER = 152;
         int CLEAR_ORIGIN_MATCHED_HEADER = 153;
         int CLEAR_ALL_ORIGIN_MATCHED_HEADERS = 154;
-        int SET_BACK_FORWARD_CACHE_SETTINGS = 155;
+        @Deprecated int SET_BACK_FORWARD_CACHE_SETTINGS = 155;
         int GET_BACK_FORWARD_CACHE_SETTINGS = 156;
         int BACK_FORWARD_CACHE_SETTINGS_GET_TIMEOUT_IN_SECONDS = 157;
         int BACK_FORWARD_CACHE_SETTINGS_GET_MAX_PAGES_IN_CACHE = 158;
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb
index 8f21cbcc..e12ffd30 100644
--- a/ash/strings/ash_strings_af.xtb
+++ b/ash/strings/ash_strings_af.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">Volgende lessenaar: <ph name="DESK_NAME" />. Lessenaar <ph name="DESK_INDEX" /> van <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Neem ’n vinnige toer om uit te vind hoe om verskillende goed op jou <ph name="PRODUCT_NAME" /> te doen. Kom met 5 stappe aan die gang.</translation>
 <translation id="8239034820133090126">Aktiveer lessenaar aan die regterkant</translation>
+<translation id="8241650983304689286">Voeg oortjie by nuwe verdeelde aansig</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, seinsterkte <ph name="SIGNAL_STRENGTH" />, foonbattery <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Wys alle Google Drive-inhoud</translation>
 <translation id="8257510091797044096">Stel jou toestel op</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb
index 80eef0f0..1c5341ef 100644
--- a/ash/strings/ash_strings_am.xtb
+++ b/ash/strings/ash_strings_am.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">ቀጣዩ ዴስክ፦ <ph name="DESK_NAME" />። <ph name="DESK_INDEX" /> ዴስክ ከ<ph name="DESK_COUNT" />።</translation>
 <translation id="8238817965863339552">የእርስዎን <ph name="PRODUCT_NAME" /> እንዴት መጠቀም እንደሚችሉ ለማወቅ ፈጣን ጉብኝት ያድርጉ። በ5 ደረጃዎች ይጀምሩ እና ያሂዱ።</translation>
 <translation id="8239034820133090126">ዴስክን በቀኝ በኩል አግብር</translation>
+<translation id="8241650983304689286">በአዲስ የተከፋፈለ ዕይታ ላይ ትር ያክሉ</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />፣ የሲግናል ጥንካሬ <ph name="SIGNAL_STRENGTH" />፣ የስልክ ባትሪ <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">ሁሉንም የGoogle Drive ይዘት አሳይ</translation>
 <translation id="8257510091797044096">መሣሪያዎን ያዋቅሩ</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index 911836f..5dd3ce38 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -2189,6 +2189,7 @@
 <translation id="8237964652943995219">سطح المكتب التالي: <ph name="DESK_NAME" />. سطح المكتب <ph name="DESK_INDEX" /> من <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">يمكنك التعرّف سريعًا على طريقة استخدام جهاز <ph name="PRODUCT_NAME" />. ابدأ استخدام جهازك باتّباع 5 خطوات.</translation>
 <translation id="8239034820133090126">تفعيل سطح المكتب على يسار الشاشة</translation>
+<translation id="8241650983304689286">إضافة علامة التبويب إلى وضع تقسيم العرض الجديد</translation>
 <translation id="8247060538831475781">حالة الاتصال <ph name="CONNECTION_STATUS" />، قوة الإشارة <ph name="SIGNAL_STRENGTH" />، بطارية الهاتف <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">‏عرض كل محتوى Google Drive</translation>
 <translation id="8257510091797044096">ضبط إعدادات جهازك</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb
index b371c4ee..9e6c6647 100644
--- a/ash/strings/ash_strings_as.xtb
+++ b/ash/strings/ash_strings_as.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">পৰৱৰ্তী ডেস্ক: <ph name="DESK_NAME" />। <ph name="DESK_COUNT" />ৰ ভিতৰত <ph name="DESK_INDEX" /> তম ডেস্ক।</translation>
 <translation id="8238817965863339552">আপোনাৰ <ph name="PRODUCT_NAME" /> কেনেকৈ ব্যৱহাৰ কৰিব লাগে জানিবলৈ এক ক্ষিপ্ৰ আভাস লাভ কৰক। ৫ টা পদক্ষেপত কাৰ্যক্ষম কৰি তোলক।</translation>
 <translation id="8239034820133090126">সোঁফালৰ ডেস্ক সক্ৰিয় কৰক</translation>
+<translation id="8241650983304689286">নতুন বিভাজিত ভিউত টেব যোগ দিয়ক</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, ছিগনেলৰ ক্ষমতা <ph name="SIGNAL_STRENGTH" />, ফ’নৰ বেটাৰী <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Google Driveৰ আটাইবোৰ সমল দেখুৱাওক</translation>
 <translation id="8257510091797044096">আপোনাৰ ডিভাইচটো ছেট আপ কৰক</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb
index 6f0c60f..6d707ee 100644
--- a/ash/strings/ash_strings_az.xtb
+++ b/ash/strings/ash_strings_az.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Növbəti masa: <ph name="DESK_NAME" />. Masa <ph name="DESK_INDEX" />/<ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552"><ph name="PRODUCT_NAME" /> istifadəsi haqqında məlumat üçün nəzər salın. 5 addımlıq təlimat.</translation>
 <translation id="8239034820133090126">Sağdakı masanı aktivləşdirin</translation>
+<translation id="8241650983304689286">Yeni bölünmüş görünüşə tab əlavə edin</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, Siqnal Gücü <ph name="SIGNAL_STRENGTH" />, Telefonun Batareyası <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Bütün Google Disk kontentini göstərin</translation>
 <translation id="8257510091797044096">Cihazı ayarlayın</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb
index bcaaf042..cf4a49e 100644
--- a/ash/strings/ash_strings_be.xtb
+++ b/ash/strings/ash_strings_be.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Наступны працоўны стол: <ph name="DESK_NAME" />. Працоўны стол <ph name="DESK_INDEX" /> з <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Каб даведацца, як працаваць з вашай прыладай (<ph name="PRODUCT_NAME" />), прайдзіце кароткае навучанне, якое складаецца з 5 крокаў.</translation>
 <translation id="8239034820133090126">Актываваць працоўны стол справа</translation>
+<translation id="8241650983304689286">Дадаць укладку на новы падзелены экран</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, магутнасць сігналу – <ph name="SIGNAL_STRENGTH" />, зарад акумулятара тэлефона – <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Паказаць усё змесціва на Google Дыску</translation>
 <translation id="8257510091797044096">Наладзіць прыладу</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb
index 69d673e..4e8aef4 100644
--- a/ash/strings/ash_strings_bg.xtb
+++ b/ash/strings/ash_strings_bg.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Следващ работен кът: <ph name="DESK_NAME" />. Работен кът <ph name="DESK_INDEX" /> от <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Направете бърза обиколка, за да научите как да се придвижвате в своя <ph name="PRODUCT_NAME" />. Подгответе се за работа в 5 стъпки.</translation>
 <translation id="8239034820133090126">Активиране на работния кът отдясно</translation>
+<translation id="8241650983304689286">Добавяне на раздела към нов разделен изглед</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, сила на сигнала <ph name="SIGNAL_STRENGTH" />, батерия на телефона <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Показване на цялото съдържание от Google Диск</translation>
 <translation id="8257510091797044096">Настройване на устройството ви</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb
index b07af2e..6707365 100644
--- a/ash/strings/ash_strings_bn.xtb
+++ b/ash/strings/ash_strings_bn.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">পরবর্তী ডেস্ক: <ph name="DESK_NAME" />। <ph name="DESK_COUNT" />টির মধ্যে <ph name="DESK_INDEX" /> নম্বর ডেস্ক।</translation>
 <translation id="8238817965863339552">আপনার <ph name="PRODUCT_NAME" /> সম্পর্কে আরও ভালোভাবে বুঝে নিতে দ্রুত এই ওভারভিউ দেখুন। এগিয়ে যান ও ৫টি ধাপ সম্পূর্ণ করুন।</translation>
 <translation id="8239034820133090126">ডানদিকের ডেস্ক চালু করুন</translation>
+<translation id="8241650983304689286">নতুন 'স্প্লিট ভিউ'তে ট্যাব যোগ করুন</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, সিগন্যাল: <ph name="SIGNAL_STRENGTH" />, ফোনের ব্যাটারি <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Google Drive-এ থাকা সব কন্টেন্ট দেখুন</translation>
 <translation id="8257510091797044096">আপনার ডিভাইস সেট-আপ করুন</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb
index 3956950..55085c1 100644
--- a/ash/strings/ash_strings_bs.xtb
+++ b/ash/strings/ash_strings_bs.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Sljedeća radna površina: <ph name="DESK_NAME" />. Radna površina <ph name="DESK_INDEX" /> od <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Krenite u kratki obilazak da saznate kako se kretati na uređaju <ph name="PRODUCT_NAME" />. Izvršite pokretanje u 5 koraka.</translation>
 <translation id="8239034820133090126">Aktiviraj desnu radnu površinu</translation>
+<translation id="8241650983304689286">Dodaj karticu u novi podijeljeni prikaz</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, jačina signala <ph name="SIGNAL_STRENGTH" />, baterija telefona <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Prikaz svog sadržaja s Google Diska</translation>
 <translation id="8257510091797044096">Postavite uređaj</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb
index 6fa82ac..d9f949a 100644
--- a/ash/strings/ash_strings_ca.xtb
+++ b/ash/strings/ash_strings_ca.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Escriptori següent: <ph name="DESK_NAME" />. Escriptori <ph name="DESK_INDEX" /> de <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Aprèn a navegar pel teu <ph name="PRODUCT_NAME" /> amb una visita ràpida. Posa't en marxa en 5 passos.</translation>
 <translation id="8239034820133090126">Activa l'escriptori a la dreta</translation>
+<translation id="8241650983304689286">Afegeix la pestanya a la nova vista dividida</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, <ph name="SIGNAL_STRENGTH" /> d'intensitat del senyal, <ph name="BATTERY_STATUS" /> de bateria al telèfon</translation>
 <translation id="825129991941217170">Mostra tot el contingut de Google Drive</translation>
 <translation id="8257510091797044096">Configura el dispositiu</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb
index 1f15825..e4f4efc 100644
--- a/ash/strings/ash_strings_cs.xtb
+++ b/ash/strings/ash_strings_cs.xtb
@@ -2189,6 +2189,7 @@
 <translation id="8237964652943995219">Další plocha: <ph name="DESK_NAME" />. Plocha <ph name="DESK_INDEX" /> z <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Projděte si rychlou prohlídku a naučte se v zařízení <ph name="PRODUCT_NAME" /> orientovat. K rozjezdu stačí pět kroků.</translation>
 <translation id="8239034820133090126">Aktivovat plochu vpravo</translation>
+<translation id="8241650983304689286">Přidat kartu do nového rozděleného zobrazení</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, síla signálu: <ph name="SIGNAL_STRENGTH" />, baterie telefonu: <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Zobrazit veškerý obsah na Disku Google</translation>
 <translation id="8257510091797044096">Nastavení zařízení</translation>
diff --git a/ash/strings/ash_strings_cy.xtb b/ash/strings/ash_strings_cy.xtb
index 03c5b5fe..e44b4b8 100644
--- a/ash/strings/ash_strings_cy.xtb
+++ b/ash/strings/ash_strings_cy.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Desg nesaf: <ph name="DESK_NAME" />. Desg <ph name="DESK_INDEX" /> o <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Ewch ar daith gyflym i ddysgu sut i lywio'ch <ph name="PRODUCT_NAME" />. Gallwch gychwyn arni mewn 5 cam.</translation>
 <translation id="8239034820133090126">Gweithredu'r ddesg ar y dde</translation>
+<translation id="8241650983304689286">Ychwanegu tab at wedd hollt newydd</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, Cryfder y Signal <ph name="SIGNAL_STRENGTH" />, Batri'r Ffôn <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Dangos holl gynnwys Google Drive</translation>
 <translation id="8257510091797044096">Gosod eich dyfais</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index 6352322..a76c695e 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Næste skrivebord: <ph name="DESK_NAME" />. Skrivebord <ph name="DESK_INDEX" /> af <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Få et hurtigt overblik over, hvordan du finder rundt på din <ph name="PRODUCT_NAME" />. Kom godt i gang med 5 trin.</translation>
 <translation id="8239034820133090126">Aktivér skrivebordet til højre</translation>
+<translation id="8241650983304689286">Føj fane til ny opdelt visning</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, signalstyrke <ph name="SIGNAL_STRENGTH" />, telefonbatteri <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Vis alt Google Drev-indhold</translation>
 <translation id="8257510091797044096">Konfigurer din enhed</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb
index 3a37436..95a7c44b 100644
--- a/ash/strings/ash_strings_de.xtb
+++ b/ash/strings/ash_strings_de.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Nächster Desktop: <ph name="DESK_NAME" />. Desktop <ph name="DESK_INDEX" /> von <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Sieh dir eine kurze Einführung zur Bedienung deines <ph name="PRODUCT_NAME" /> an. Nach 5 Schritten bist du startklar.</translation>
 <translation id="8239034820133090126">Desktop rechts aktivieren</translation>
+<translation id="8241650983304689286">Tab zu neuer geteilter Ansicht hinzufügen</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, Signalstärke bei <ph name="SIGNAL_STRENGTH" />, Smartphone-Akku bei <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Alle Google Drive-Inhalte anzeigen</translation>
 <translation id="8257510091797044096">Gerät einrichten</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb
index b57a524..babf6ab 100644
--- a/ash/strings/ash_strings_el.xtb
+++ b/ash/strings/ash_strings_el.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Επόμενο γραφείο: <ph name="DESK_NAME" />. Γραφείο <ph name="DESK_INDEX" /> από <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Κάντε μια γρήγορη περιήγηση για να εξοικειωθείτε με το <ph name="PRODUCT_NAME" />. Ξεκινήστε με 5 βήματα.</translation>
 <translation id="8239034820133090126">Ενεργοποίηση γραφείου στα δεξιά</translation>
+<translation id="8241650983304689286">Προσθήκη καρτέλας σε νέα προβολή διαχωρισμού οθόνης</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, Ισχύς σήματος <ph name="SIGNAL_STRENGTH" />, Μπαταρία τηλεφώνου <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Εμφάνιση όλου του περιεχομένου του Google Drive</translation>
 <translation id="8257510091797044096">Ρύθμιση της συσκευής</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb
index 62ec0d66..00a2515 100644
--- a/ash/strings/ash_strings_en-GB.xtb
+++ b/ash/strings/ash_strings_en-GB.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Next desk: <ph name="DESK_NAME" />. Desk <ph name="DESK_INDEX" /> of <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Take a quick tour to learn how to get around your <ph name="PRODUCT_NAME" />. Get up and running in five steps.</translation>
 <translation id="8239034820133090126">Activate desk on right</translation>
+<translation id="8241650983304689286">Add tab to new split view</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, signal strength <ph name="SIGNAL_STRENGTH" />, phone battery <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Show all Google Drive content</translation>
 <translation id="8257510091797044096">Set up your device</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb
index 668fb01..f2065e30d08b 100644
--- a/ash/strings/ash_strings_es-419.xtb
+++ b/ash/strings/ash_strings_es-419.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">Siguiente escritorio: <ph name="DESK_NAME" />; escritorio <ph name="DESK_INDEX" /> de <ph name="DESK_COUNT" /></translation>
 <translation id="8238817965863339552">Realiza un recorrido rápido para obtener más información sobre tu <ph name="PRODUCT_NAME" />. Comienza en 5 pasos.</translation>
 <translation id="8239034820133090126">Activar el escritorio de la derecha</translation>
+<translation id="8241650983304689286">Agregar pestaña a la nueva vista dividida</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, intensidad de la señal: <ph name="SIGNAL_STRENGTH" />, nivel de batería del teléfono: <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Mostrar todo el contenido de Google Drive</translation>
 <translation id="8257510091797044096">Configura el dispositivo</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb
index 99e266e6..301a303 100644
--- a/ash/strings/ash_strings_es.xtb
+++ b/ash/strings/ash_strings_es.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">Siguiente escritorio: <ph name="DESK_NAME" />. Escritorio <ph name="DESK_INDEX" /> de <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Con una visita rápida puedes aprender cómo funciona tu <ph name="PRODUCT_NAME" />. Empieza a usarlo en 5 pasos.</translation>
 <translation id="8239034820133090126">Activar escritorio de la derecha</translation>
+<translation id="8241650983304689286">Añadir pestaña a la nueva vista dividida</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, intensidad de la señal: <ph name="SIGNAL_STRENGTH" />, batería del teléfono: <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Mostrar todo el contenido de Google Drive</translation>
 <translation id="8257510091797044096">Configurar tu dispositivo</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb
index 8b90408..aa7f412 100644
--- a/ash/strings/ash_strings_et.xtb
+++ b/ash/strings/ash_strings_et.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">Järgmine töölaud: <ph name="DESK_NAME" />. Töölaud <ph name="DESK_INDEX" />/<ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Vaadake kiiret tutvustust <ph name="PRODUCT_NAME" />is navigeerimise kohta. Viie toiminguga saate tööd alustada.</translation>
 <translation id="8239034820133090126">Aktiveerige parempoolne töölaud</translation>
+<translation id="8241650983304689286">Vahelehe lisamine uuele poolitatud vaatele</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, signaalitugevus: <ph name="SIGNAL_STRENGTH" />, telefoni aku: <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Kuva kogu Google Drive'i sisu</translation>
 <translation id="8257510091797044096">Seadistage oma seade</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb
index f6f8aad..59d3700 100644
--- a/ash/strings/ash_strings_eu.xtb
+++ b/ash/strings/ash_strings_eu.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">Hurrengo lan-eremua: <ph name="DESK_NAME" />. <ph name="DESK_INDEX" />/<ph name="DESK_COUNT" /> lan-eremua.</translation>
 <translation id="8238817965863339552">Egin txango bizkor bat <ph name="PRODUCT_NAME" /> erabiltzen ikasteko. Izan dena prest 5 urratsetan.</translation>
 <translation id="8239034820133090126">Aktibatu eskuineko lan-eremua</translation>
+<translation id="8241650983304689286">Gehitu fitxa ikuspegi zatitu berrian</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />. Seinalearen indarra: <ph name="SIGNAL_STRENGTH" />. Telefonoaren bateria: <ph name="BATTERY_STATUS" />.</translation>
 <translation id="825129991941217170">Erakutsi Google Drive-ko eduki guztia</translation>
 <translation id="8257510091797044096">Konfiguratu gailua</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index f9390af..4440002 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">میز کار بعدی: <ph name="DESK_NAME" />. میز کار <ph name="DESK_INDEX" /> از <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">برای آشنایی با نحوه کار کردن با <ph name="PRODUCT_NAME" />، گشتی سریع بزنید. کار با دستگاه را در ۵ مرحله شروع کنید.</translation>
 <translation id="8239034820133090126">فعال کردن میز کار در سمت راست</translation>
+<translation id="8241650983304689286">افزودن زبانه به «نمای دونیمه» جدید</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />، قدرت سیگنال <ph name="SIGNAL_STRENGTH" />، باتری تلفن<ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">‏نشان دادن کل محتوای Google Drive</translation>
 <translation id="8257510091797044096">راه‌اندازی دستگاه</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb
index 08ad243b..09a7a27 100644
--- a/ash/strings/ash_strings_fi.xtb
+++ b/ash/strings/ash_strings_fi.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Seuraava työpöytä: <ph name="DESK_NAME" />. Työpöytä <ph name="DESK_INDEX" />/<ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Katso lyhyt esittely siitä, miten <ph name="PRODUCT_NAME" /> toimii. Aloita käyttö viisivaiheisilla ohjeilla.</translation>
 <translation id="8239034820133090126">Aktivoi oikealla oleva työpöytä</translation>
+<translation id="8241650983304689286">Lisää välilehti uuteen jaettuun näkymään</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, signaalin vahvuus <ph name="SIGNAL_STRENGTH" />, puhelimen akun varaus <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Näytä kaikki Google Driven sisältö</translation>
 <translation id="8257510091797044096">Ota laite käyttöön</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index f5ba530..1e91488 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -2189,6 +2189,7 @@
 <translation id="8237964652943995219">Susunod na desk: <ph name="DESK_NAME" />. Desk <ph name="DESK_INDEX" /> ng <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Mag-quick tour para malaman kung paano i-explore ang iyong <ph name="PRODUCT_NAME" />. Makapagsimula sa 5 hakbang.</translation>
 <translation id="8239034820133090126">I-activate ang desk sa kanan</translation>
+<translation id="8241650983304689286">Magdagdag ng tab sa bagong split view</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, Lakas ng Signal <ph name="SIGNAL_STRENGTH" />, Baterya ng Telepono <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Ipakita ang lahat ng content ng Google Drive</translation>
 <translation id="8257510091797044096">I-set up ang iyong device</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb
index 48df044..bb5876a 100644
--- a/ash/strings/ash_strings_fr-CA.xtb
+++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -2189,6 +2189,7 @@
 <translation id="8237964652943995219">Bureau suivant : <ph name="DESK_NAME" />. Bureau <ph name="DESK_INDEX" /> de <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Regardez une présentation rapide pour vous familiariser avec votre <ph name="PRODUCT_NAME" />. Configurez votre appareil en cinq étapes.</translation>
 <translation id="8239034820133090126">Activer le bureau à droite</translation>
+<translation id="8241650983304689286">Ajouter un onglet au nouvel affichage partagé</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, force du signal : <ph name="SIGNAL_STRENGTH" />, pile du téléphone <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Afficher tout le contenu de Google Disque</translation>
 <translation id="8257510091797044096">Configurer votre appareil</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb
index 3b56db2..592c9b9 100644
--- a/ash/strings/ash_strings_fr.xtb
+++ b/ash/strings/ash_strings_fr.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">Bureau suivant : <ph name="DESK_NAME" />. Bureau <ph name="DESK_INDEX" /> sur <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Découvrez rapidement comment utiliser votre <ph name="PRODUCT_NAME" />. Lancez-vous en cinq étapes.</translation>
 <translation id="8239034820133090126">Activer le bureau à droite</translation>
+<translation id="8241650983304689286">Ajouter l'onglet à une nouvelle vue fractionnée</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, force du signal : <ph name="SIGNAL_STRENGTH" />, batterie du téléphone à <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Afficher tout le contenu Google Drive</translation>
 <translation id="8257510091797044096">Configurer votre appareil</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb
index f2fd22c..3eb74f1 100644
--- a/ash/strings/ash_strings_gl.xtb
+++ b/ash/strings/ash_strings_gl.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">Escritorio seguinte: <ph name="DESK_NAME" />. Escritorio <ph name="DESK_INDEX" /> de <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Fai unha visita rápida para familiarizarte co teu dispositivo <ph name="PRODUCT_NAME" />. Comeza a usalo en cinco pasos.</translation>
 <translation id="8239034820133090126">Activar escritorio da dereita</translation>
+<translation id="8241650983304689286">Engadir pestana á nova vista dividida</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, intensidade do sinal do <ph name="SIGNAL_STRENGTH" />, batería do teléfono ao <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Mostrar todo o contido de Google Drive</translation>
 <translation id="8257510091797044096">Configurar o teu dispositivo</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb
index 19325b0..1cb20a1 100644
--- a/ash/strings/ash_strings_gu.xtb
+++ b/ash/strings/ash_strings_gu.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">આગલી ડેસ્ક: <ph name="DESK_NAME" />. <ph name="DESK_COUNT" />માંથી ડેસ્ક <ph name="DESK_INDEX" />.</translation>
 <translation id="8238817965863339552">તમારી <ph name="PRODUCT_NAME" />ને જાણવા એક ઝટપટ ટૂર કરો. તો ચાલો અને ઝડપથી 5 પગલાં પૂરા કરો.</translation>
 <translation id="8239034820133090126">જમણી બાજુએ ડેસ્કને સક્રિય કરો</translation>
+<translation id="8241650983304689286">નવા વિભાજિત વ્યૂમાં ટૅબ ઉમેરો</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, સિગ્નલની સશક્તતા <ph name="SIGNAL_STRENGTH" />, ફોનની બૅટરી <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Google Driveનું તમામ કન્ટેન્ટ બતાવો</translation>
 <translation id="8257510091797044096">તમારા ડિવાઇસનું સેટઅપ કરો</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index 72b1a31..1db58a4 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">अगला डेस्क: <ph name="DESK_NAME" />. <ph name="DESK_COUNT" /> में से <ph name="DESK_INDEX" /> डेस्क.</translation>
 <translation id="8238817965863339552"><ph name="PRODUCT_NAME" /> इस्तेमाल करने का तरीका फटाफट देखें. सिर्फ़ पांच चरणों में इसे इस्तेमाल करने का तरीका जानें.</translation>
 <translation id="8239034820133090126">दाईं ओर मौजूद डेस्क को चालू करें</translation>
+<translation id="8241650983304689286">नए स्प्लिट व्यू में देखने के लिए टैब जोड़ें</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, सिग्नल की क्षमता <ph name="SIGNAL_STRENGTH" />, फ़ोन की बैटरी <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Google Drive में मौजूद सारा कॉन्टेंट दिखाएं</translation>
 <translation id="8257510091797044096">अपना डिवाइस सेट अप करें</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb
index 559d987..e9a18a38 100644
--- a/ash/strings/ash_strings_hr.xtb
+++ b/ash/strings/ash_strings_hr.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Sljedeća radna površina: <ph name="DESK_NAME" />. Radna površina <ph name="DESK_INDEX" />. od <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Krenite u kratki obilazak i naučite upotrebljavati značajke svojeg uređaja <ph name="PRODUCT_NAME" />. Pokrenite se u pet koraka.</translation>
 <translation id="8239034820133090126">Aktiviranje radne površine zdesna</translation>
+<translation id="8241650983304689286">Dodaj karticu u novi podijeljeni prikaz</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, jačina signala <ph name="SIGNAL_STRENGTH" />, telefonska baterija <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Prikaži sav sadržaj Google diska</translation>
 <translation id="8257510091797044096">Postavljanje uređaja</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb
index d17207d..d40e699 100644
--- a/ash/strings/ash_strings_hu.xtb
+++ b/ash/strings/ash_strings_hu.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">Következő asztal: <ph name="DESK_NAME" />. <ph name="DESK_COUNT" />/<ph name="DESK_INDEX" />. asztal.</translation>
 <translation id="8238817965863339552">Tekintse át gyorsan, hogy hogyan navigálhat <ph name="PRODUCT_NAME" /> eszközén. Öt lépés után használatba is veheti eszközét.</translation>
 <translation id="8239034820133090126">Asztal aktiválása a jobb oldalon</translation>
+<translation id="8241650983304689286">Lap hozzáadása új osztott nézethez</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, jelerősség: <ph name="SIGNAL_STRENGTH" />, a telefon akkumulátora: <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Az összes Google Drive-tartalom megjelenítése</translation>
 <translation id="8257510091797044096">Az eszköz beállítása</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb
index 1de29c6..f7ea779 100644
--- a/ash/strings/ash_strings_hy.xtb
+++ b/ash/strings/ash_strings_hy.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Հաջորդ աշխատասեղանը՝ <ph name="DESK_NAME" />։ Աշխատասեղան <ph name="DESK_INDEX" />՝ <ph name="DESK_COUNT" />-ից։</translation>
 <translation id="8238817965863339552">Դիտեք այս ուղեցույցը՝ իմանալու, թե ինչպես օգտագործել <ph name="PRODUCT_NAME" />-ը։ Սկսեք 5 քայլից։</translation>
 <translation id="8239034820133090126">Միացնել աջ աշխատասեղանը</translation>
+<translation id="8241650983304689286">Ավելացնել ներդիրը տրոհված նոր էկրանում</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, ազդանշանի ուժգնությունը՝ <ph name="SIGNAL_STRENGTH" />, մարտկոցի լիցքը՝ <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Ցույց տալ Google Drive-ի ամբողջ բովանդակությունը</translation>
 <translation id="8257510091797044096">Կարգավորեք ձեր սարքը</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb
index 638c90b..599b10b 100644
--- a/ash/strings/ash_strings_id.xtb
+++ b/ash/strings/ash_strings_id.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Desktop virtual berikutnya: <ph name="DESK_NAME" />. Desktop virtual <ph name="DESK_INDEX" /> dari <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Ikuti tur singkat untuk mempelajari cara mengoperasikan <ph name="PRODUCT_NAME" /> Anda. Siap digunakan dalam 5 langkah.</translation>
 <translation id="8239034820133090126">Aktifkan desktop di sisi kanan</translation>
+<translation id="8241650983304689286">Tambahkan tab ke tampilan terpisah baru</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, Kekuatan Sinyal <ph name="SIGNAL_STRENGTH" />, Baterai Ponsel <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Tampilkan semua konten Google Drive</translation>
 <translation id="8257510091797044096">Siapkan perangkat Anda</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb
index 59fa22a..f2d4b91 100644
--- a/ash/strings/ash_strings_is.xtb
+++ b/ash/strings/ash_strings_is.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Næsta skrifborð: <ph name="DESK_NAME" />. Skrifborð <ph name="DESK_INDEX" /> af <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Horfðu á stutta kynningu til að læra á grunnatriði <ph name="PRODUCT_NAME" />. Komdu þér á rétta braut í fimm skrefum.</translation>
 <translation id="8239034820133090126">Virkja skrifborð til hægri</translation>
+<translation id="8241650983304689286">Bæta flipa við nýjan tvískiptan skjá</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, <ph name="SIGNAL_STRENGTH" /> sendistyrkur, <ph name="BATTERY_STATUS" /> hleðsla á rafhlöðu símans</translation>
 <translation id="825129991941217170">Sýna allt innihald Google Drive</translation>
 <translation id="8257510091797044096">Settu tækið upp</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb
index cfff433..0a306ff3 100644
--- a/ash/strings/ash_strings_it.xtb
+++ b/ash/strings/ash_strings_it.xtb
@@ -2187,6 +2187,7 @@
 <translation id="8237964652943995219">Scrivania successiva: <ph name="DESK_NAME" />. Scrivania <ph name="DESK_INDEX" /> di <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Fai un rapido tour per scoprire come usare il tuo <ph name="PRODUCT_NAME" />. Puoi iniziare a usarlo in 5 passaggi.</translation>
 <translation id="8239034820133090126">Attiva scrivania a destra</translation>
+<translation id="8241650983304689286">Aggiungi scheda alla nuova visualizzazione divisa</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, intensità del segnale <ph name="SIGNAL_STRENGTH" />, batteria del telefono <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Mostra tutti i contenuti di Google Drive</translation>
 <translation id="8257510091797044096">Configura il tuo dispositivo</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index 93e08e5..f573f96 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -2192,6 +2192,7 @@
 <translation id="8237964652943995219">שולחן העבודה הווירטואלי הבא: <ph name="DESK_NAME" />. שולחן עבודה וירטואלי <ph name="DESK_INDEX" /> מתוך <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">סיור מהיר שמסביר איך להתמצא ב-<ph name="PRODUCT_NAME" />. ‏5 שלבים ונכנסים לעניינים.</translation>
 <translation id="8239034820133090126">הפעלת שולחן העבודה הווירטואלי בצד ימין</translation>
+<translation id="8241650983304689286">הוספת הכרטיסייה לתצוגה מפוצלת חדשה</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, עוצמת האות: <ph name="SIGNAL_STRENGTH" />, סוללת הטלפון <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">‏הצגת כל התוכן מ-Google Drive</translation>
 <translation id="8257510091797044096">הגדרת המכשיר שלך</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index 3d0730d..fd80c41 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">次のデスク: <ph name="DESK_NAME" />。デスク <ph name="DESK_INDEX" />/<ph name="DESK_COUNT" />。</translation>
 <translation id="8238817965863339552"><ph name="PRODUCT_NAME" /> について学べるクイックツアーをお試しください。5 つのステップでご利用を開始できます。</translation>
 <translation id="8239034820133090126">右側のデスクを有効にする</translation>
+<translation id="8241650983304689286">新しい分割ビューにタブを追加</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />、信号強度 <ph name="SIGNAL_STRENGTH" />、電池残量 <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Google ドライブのすべてのコンテンツを表示</translation>
 <translation id="8257510091797044096">デバイスをセットアップする</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb
index 3b2c301..e230f87 100644
--- a/ash/strings/ash_strings_ka.xtb
+++ b/ash/strings/ash_strings_ka.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">შემდეგი სამუშაო მაგიდა: <ph name="DESK_NAME" />. სამუშაო მაგიდა <ph name="DESK_INDEX" /> / <ph name="DESK_COUNT" />-დან.</translation>
 <translation id="8238817965863339552">გაიარეთ სწრაფი ტური, <ph name="PRODUCT_NAME" />-ის შესახებ მეტი რომ შეიტყოთ. მოამზადეთ ის გამოსაყენებლად 5 ნაბიჯის გავლით.</translation>
 <translation id="8239034820133090126">სამუშაო მაგიდის გააქტიურება მარჯვნივ</translation>
+<translation id="8241650983304689286">დაამატეთ ჩანართი გაყოფის ახალ ხედში</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, სიგნალის სიძლიერე: <ph name="SIGNAL_STRENGTH" />, ტელეფონის ბატარეა: <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Google Drive-ის ყველა კონტენტის ჩვენება</translation>
 <translation id="8257510091797044096">თქვენი მოწყობილობის დაყენება</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb
index 1c7a0cc..f251930 100644
--- a/ash/strings/ash_strings_kk.xtb
+++ b/ash/strings/ash_strings_kk.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Келесі жұмыс үстелі: <ph name="DESK_NAME" />. <ph name="DESK_INDEX" />/<ph name="DESK_COUNT" /> жұмыс үстелі.</translation>
 <translation id="8238817965863339552"><ph name="PRODUCT_NAME" /> құрылғысын пайдалану жолын білу үшін қысқаша шолу жасаңыз. 5 қадаммен жұмысты бастаңыз.</translation>
 <translation id="8239034820133090126">Оң жақтағы жұмыс үстелін іске қосу</translation>
+<translation id="8241650983304689286">Қойындыны жаңа бөлінген көрініске қосу</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, сигнал күші: <ph name="SIGNAL_STRENGTH" />, телефонның батарея заряды: <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Google Drive контентін түгел көрсету</translation>
 <translation id="8257510091797044096">Құрылғы параметрлерін реттеу</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb
index 95846a5..74f0c83 100644
--- a/ash/strings/ash_strings_km.xtb
+++ b/ash/strings/ash_strings_km.xtb
@@ -2189,6 +2189,7 @@
 <translation id="8237964652943995219">តុបន្ទាប់៖ <ph name="DESK_NAME" />។ តុទី <ph name="DESK_INDEX" /> នៃ <ph name="DESK_COUNT" />។</translation>
 <translation id="8238817965863339552">មើលការណែនាំត្រួសៗ ដើម្បីស្វែងយល់អំពីរបៀបប្រើប្រាស់ <ph name="PRODUCT_NAME" /> របស់អ្នក។ រៀបចំ និងដំណើរការក្នុង 5 ជំហាន។</translation>
 <translation id="8239034820133090126">បើកដំណើរការ​តុ​នៅ​ខាងស្ដាំ</translation>
+<translation id="8241650983304689286">បញ្ចូល​ផ្ទាំងទៅ​ទិដ្ឋភាព​បំបែកថ្មី</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, កម្លាំង​រលកសញ្ញា <ph name="SIGNAL_STRENGTH" />, ថ្មទូរសព្ទ <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">បង្ហាញ​ខ្លឹមសារ Google ថាស​ទាំងអស់</translation>
 <translation id="8257510091797044096">រៀបចំឧបករណ៍របស់អ្នក</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb
index 551887d2..687623d6 100644
--- a/ash/strings/ash_strings_kn.xtb
+++ b/ash/strings/ash_strings_kn.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">ಮುಂದಿನ ಡೆಸ್ಕ್: <ph name="DESK_NAME" />. ಒಟ್ಟು <ph name="DESK_COUNT" /> ರಲ್ಲಿ ಡೆಸ್ಕ್‌ <ph name="DESK_INDEX" />.</translation>
 <translation id="8238817965863339552">ನಿಮ್ಮ <ph name="PRODUCT_NAME" /> ಅನ್ನು ಹೇಗೆ ನಿರ್ವಹಿಸುವುದು ಎಂಬುದನ್ನು ತಿಳಿಯಲು ತ್ವರಿತ ಪ್ರವಾಸವನ್ನು ವೀಕ್ಷಿಸಿ. ಇದು ಕೇವಲ 5 ಹಂತಗಳಲ್ಲಿ ತಕ್ಷಣವೇ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ.</translation>
 <translation id="8239034820133090126">ಬಲಭಾಗದಲ್ಲಿರುವ ಡೆಸ್ಕ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
+<translation id="8241650983304689286">ಹೊಸ ಸ್ಪ್ಲಿಟ್ ವೀಕ್ಷಣೆಗೆ ಟ್ಯಾಬ್ ಅನ್ನು ಸೇರಿಸಿ</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, ಸಿಗ್ನಲ್ ಸಾಮರ್ಥ್ಯ <ph name="SIGNAL_STRENGTH" />, ಫೋನ್ ಬ್ಯಾಟರಿ <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">ಎಲ್ಲಾ Google Drive ಕಂಟೆಂಟ್‌ ಅನ್ನು ತೋರಿಸಿ</translation>
 <translation id="8257510091797044096">ನಿಮ್ಮ ಸಾಧನವನ್ನು ಸೆಟಪ್ ಮಾಡಿ</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index ea9cff4a..2ad7fff 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">다음 데스크는 <ph name="DESK_NAME" />입니다. 데스크 <ph name="DESK_COUNT" />개 중 <ph name="DESK_INDEX" />번째입니다.</translation>
 <translation id="8238817965863339552"><ph name="PRODUCT_NAME" />을 사용하는 방법을 간단히 둘러보세요. 5단계 만에 간편하게 설정하고 시작할 수 있습니다.</translation>
 <translation id="8239034820133090126">오른쪽 데스크를 활성화합니다.</translation>
+<translation id="8241650983304689286">새 분할 보기에 탭 추가</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, 신호 강도 <ph name="SIGNAL_STRENGTH" />, 휴대전화 배터리 <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">모든 Google Drive 콘텐츠 표시</translation>
 <translation id="8257510091797044096">기기 설정하기</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb
index 883f739..d166651 100644
--- a/ash/strings/ash_strings_ky.xtb
+++ b/ash/strings/ash_strings_ky.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Кийинки иш такта: <ph name="DESK_NAME" />. <ph name="DESK_COUNT" /> иш тактанын ичинен <ph name="DESK_INDEX" />-иш такта.</translation>
 <translation id="8238817965863339552"><ph name="PRODUCT_NAME" /> түзмөгүңүздү колдонуу боюнча кеңештерди алыңыз. Аны 5 кадам менен тууралап аласыз.</translation>
 <translation id="8239034820133090126">Оң жактагы иш тактаны иштетүү</translation>
+<translation id="8241650983304689286">Өтмөктү жаңы бөлүп көрүү режимине кошуу</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, Сигналдын күчү <ph name="SIGNAL_STRENGTH" />, Телефондун батареясы <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Google Drive'дагы бардык контентти көрсөтүү</translation>
 <translation id="8257510091797044096">Түзмөгүңүздү тууралап алыңыз</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb
index b7dca47..e4cf03f 100644
--- a/ash/strings/ash_strings_lo.xtb
+++ b/ash/strings/ash_strings_lo.xtb
@@ -874,6 +874,7 @@
 <translation id="397105322502079400">ກໍາລັງຄິດ​ໄລ່...</translation>
 <translation id="397726367135689299">ການສາກແບັດເຕີຣີອາດບໍ່ສະຖຽນ.</translation>
 <translation id="3977512764614765090">ແບັດເຕີຣີຢູ່ທີ່ <ph name="PERCENTAGE" />% ແລະ ກຳລັງສາກ.</translation>
+<translation id="3978162107953847778">ແຊກລິ້ງຈາກບ່ອນຕ່າງໆ ເຊັ່ນ: ປະຫວັດການທ່ອງເວັບ ແລະ Google Drive ຂອງທ່ານ. ທ່ານສາມາດແຊກອີໂມຈິ, ໄຟລ໌ຮູບ ແລະ ອື່ນໆໄດ້ນຳ. <ph name="LINK_TO_LEARN_MORE" /></translation>
 <translation id="3982013579989864579">ປ່ຽນເອົ້າພຸດສຽງບໍ?</translation>
 <translation id="3984536049089846927">ໜ້າຕໍ່ໄປ</translation>
 <translation id="3986082989454912832">ຮັບສາຍ</translation>
@@ -1600,6 +1601,7 @@
 <translation id="6260038345397266744"><ph name="TITLE" />. <ph name="DESCRIPTION" /></translation>
 <translation id="6267036997247669271"><ph name="NAME" />: ກຳລັງເປີດນຳໃຊ້...</translation>
 <translation id="6274202259872570803">Screencast</translation>
+<translation id="6274422179279280249">ແຊກລິ້ງ, ອີໂມຈິ ແລະ ອື່ນໆ. ທ່ານສາມາດຂໍຄວາມຊ່ວຍເຫຼືອໃນການຂຽນດ້ວຍ Google AI ໄດ້ນຳ. <ph name="LINK_TO_LEARN_MORE" /></translation>
 <translation id="6276708887952587684">ເບິ່ງແຫຼ່ງທີ່ມາຂອງຫນ້າ</translation>
 <translation id="6285871695023807425">ເພີ່ມໃສ່ປະຕິທິນ</translation>
 <translation id="6288235558961782912">ສາມາດເພີ່ມ <ph name="USER_EMAIL_ADDRESS" /> ຄືນໃໝ່ໃນພາຍຫຼັງໄດ້ໂດຍມີການອະນຸຍາດຂອງພໍ່ແມ່.</translation>
@@ -2190,6 +2192,7 @@
 <translation id="8237964652943995219">ໂຕະຕໍ່ໄປ: <ph name="DESK_NAME" />. ໂຕະທີ <ph name="DESK_INDEX" /> ຈາກທັງໝົດ <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">ເບິ່ງຄຳແນະນຳສັ້ນໆເພື່ອສຶກສາວິທີໄປຫາພາກສ່ວນຕ່າງໆຂອງ <ph name="PRODUCT_NAME" /> ຂອງທ່ານ. ເລີ່ມຕົ້ນ ແລະ ພ້ອມໃຊ້ໄດ້ໃນ 5 ຂັ້ນຕອນ.</translation>
 <translation id="8239034820133090126">ເປີດນຳໃຊ້ໂຕະຢູ່ທາງຂວາ</translation>
+<translation id="8241650983304689286">ເພີ່ມແຖບໄປໃສ່ມຸມມອງແບບແຍກໃໝ່</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, ຄວາມແຮງສັນຍານ <ph name="SIGNAL_STRENGTH" />, ແບັດເຕີຣີໂທລະສັບ <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">ສະແດງເນື້ອຫາ Google Drive ທັງໝົດ</translation>
 <translation id="8257510091797044096">ຕັ້ງຄ່າອຸປະກອນຂອງທ່ານ</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb
index 920ad76..f338b6a 100644
--- a/ash/strings/ash_strings_lt.xtb
+++ b/ash/strings/ash_strings_lt.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Kitas darbalaukis: „<ph name="DESK_NAME" />“. <ph name="DESK_INDEX" /> darbalaukis iš <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Peržiūrėkite trumpą apžvalgą, kad žinotumėte, kaip naudotis „<ph name="PRODUCT_NAME" />“. Pradėkite atlikę penkis veiksmus.</translation>
 <translation id="8239034820133090126">Suaktyvinti darbalaukį dešinėje</translation>
+<translation id="8241650983304689286">Pridėti skirtuką prie naujo išskaidyto rodinio</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, signalo stiprumas <ph name="SIGNAL_STRENGTH" />, telefono akumuliatorius <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Rodyti visą „Google“ disko turinį</translation>
 <translation id="8257510091797044096">Nustatykite savo įrenginį</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb
index c5e19c8..2d985cc 100644
--- a/ash/strings/ash_strings_lv.xtb
+++ b/ash/strings/ash_strings_lv.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Nākamā darbvieta: <ph name="DESK_NAME" />. <ph name="DESK_INDEX" />. darbvieta no <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Skatiet īsu ceļvedi par pārvietošanos ierīcē (<ph name="PRODUCT_NAME" />). Sāciet darbu, veicot 5 darbības.</translation>
 <translation id="8239034820133090126">Aktivizēt darbvietu labajā pusē</translation>
+<translation id="8241650983304689286">Pievienot cilni jaunam dalītajam skatam</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, signāla stiprums: <ph name="SIGNAL_STRENGTH" />, tālruņa akumulatora statuss: <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Rādīt visu Google diska saturu</translation>
 <translation id="8257510091797044096">Ierīces iestatīšana</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb
index 8892b89..7886e41a 100644
--- a/ash/strings/ash_strings_mk.xtb
+++ b/ash/strings/ash_strings_mk.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">Следна работна површина: <ph name="DESK_NAME" />. Работна површина <ph name="DESK_INDEX" /> од <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Разгледајте накратко за да дознаете како се користи вашиот уред <ph name="PRODUCT_NAME" />. Подгответе се во 5 чекори.</translation>
 <translation id="8239034820133090126">Активирајте работна површина оддесно</translation>
+<translation id="8241650983304689286">Додајте картичка во новиот поделен приказ</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, јачина на сигналот: <ph name="SIGNAL_STRENGTH" />, батерија на телефонот: <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Прикажи ги сите содржини во Google Drive</translation>
 <translation id="8257510091797044096">Поставете го уредот</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index 98fd760..c82f15e6 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">അടുത്ത ഡെസ്‌ക്: <ph name="DESK_NAME" />. <ph name="DESK_COUNT" /> ഡെസ്‌ക്കുകളിൽ <ph name="DESK_INDEX" />-ാമത്തേത്.</translation>
 <translation id="8238817965863339552">നിങ്ങളുടെ <ph name="PRODUCT_NAME" /> എന്നതിനെ കുറിച്ച് മനസ്സിലാക്കാൻ ഒരു ദ്രുത ടൂർ നടത്തുക. വെറും 5 ഘട്ടങ്ങൾ മാത്രം.</translation>
 <translation id="8239034820133090126">വലതുവശത്തുള്ള ഡെസ്‌ക് സജീവമാക്കുക</translation>
+<translation id="8241650983304689286">പുതിയ വിഭജിത കാഴ്ചയിലേക്ക് ടാബ് ചേർക്കുക</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, സിഗ്‌നൽ ശക്തി <ph name="SIGNAL_STRENGTH" />, ഫോൺ ബാറ്ററി <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">എല്ലാ Google Drive ഉള്ളടക്കവും കാണിക്കുക</translation>
 <translation id="8257510091797044096">നിങ്ങളുടെ ഉപകരണം സജ്ജീകരിക്കുക</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb
index ef0940b5..a9e4af1 100644
--- a/ash/strings/ash_strings_mn.xtb
+++ b/ash/strings/ash_strings_mn.xtb
@@ -152,10 +152,10 @@
 <translation id="147310119694673958">Утасны батарей <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="1475340220124222168">Сүлжээний цэгийг асаана уу/унтраана уу. Сүлжээний цэг асаалттай байна. 1 төхөөрөмж холбогдсон.</translation>
 <translation id="1479685784053141667">Харилцагч үүсгэх</translation>
-<translation id="1479909375538722835">Хөвж буй хандалтын цэс</translation>
+<translation id="1479909375538722835">Хөвж буй хүртээмжтэй цэс</translation>
 <translation id="1483493594462132177">Илгээх</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
-<translation id="1486307154719069822">Дуу хоолойгоор бичихийн тусламжтай та дуу хоолойгоо ашиглан бичих боломжтой. Та текстийн талбарт байх үедээ дуу хоолойгоор бичих товчлуурыг дарах эсвэл дэлгэцийн доод талд байх микрофоны дүрс тэмдгийг сонгоно уу. Таны дуу хоолойгоор бичих хэлийг <ph name="LANGUAGE" /> болгож тохируулсан. Яриаг боловсруулахаар Google рүү илгээдэг. Та дуу хоолойгоор бичих хэлийг хүссэн үедээ Тохиргоо &gt; Хандалт дотор өөрчлөх боломжтой.</translation>
+<translation id="1486307154719069822">Дуу хоолойгоор бичихийн тусламжтай та дуу хоолойгоо ашиглан бичих боломжтой. Та текстийн талбарт байх үедээ дуу хоолойгоор бичих товчлуурыг дарах эсвэл дэлгэцийн доод талд байх микрофоны дүрс тэмдгийг сонгоно уу. Таны дуу хоолойгоор бичих хэлийг <ph name="LANGUAGE" /> болгож тохируулсан. Яриаг боловсруулахаар Google рүү илгээдэг. Та дуу хоолойгоор бичих хэлийг хүссэн үедээ Тохиргоо &gt; Хүртээмж дотор өөрчлөх боломжтой.</translation>
 <translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" />-г <ph name="SECOND_ITEM_TITLE" />-р сольсон</translation>
 <translation id="1500926532737552529">Бүх зөвлөмжийг харуулах</translation>
 <translation id="1501946871587957338">Аудио эх сурвалжийг сэлгэх үү?</translation>
@@ -196,7 +196,7 @@
 <translation id="1620510694547887537">Камер</translation>
 <translation id="1623768535032616219">Google Classroom-г хураах</translation>
 <translation id="163032029566320584"><ph name="UNAVAILABLE_DLC" /> боломжгүй байна.</translation>
-<translation id="1632985212731562677">Сэлгүүрийг Тохиргоо &gt; Хандалт хэсэгт идэвхгүй болгох боломжтой.</translation>
+<translation id="1632985212731562677">Сэлгүүрийг Тохиргоо &gt; Хүртээмж хэсэгт идэвхгүй болгох боломжтой.</translation>
 <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> төхөөрөмж</translation>
 <translation id="1639239467298939599">Ачаалж байна</translation>
 <translation id="1647986356840967552">Өмнөх хуудас</translation>
@@ -377,7 +377,7 @@
 <translation id="2341729377289034582">Босоо чиглэлээр түгжсэн</translation>
 <translation id="2345226652884463045">Засах текстийг сонгохын тулд enter эсвэл хайлт + хоосон зай авах товчлуурыг дарна уу.</translation>
 <translation id="2349785431103945039">Сүлжээний цэгийн дэлгэрэнгүйг харуулна уу. Сүлжээний цэг ашиглахын тулд хөдөлгөөнт холбооны сүлжээнд холбогдоно уу.</translation>
-<translation id="2350794187831162545"><ph name="LANGUAGE" /> яриаг одоо дотоодод боловсруулах бөгөөд энэ нь офлайнаар ажиллана. Та Дуу хоолойгоор бичих онцлогийн хэлээ Тохиргоо &gt; Хандалт хэсэгт өөрчлөх боломжтой.</translation>
+<translation id="2350794187831162545"><ph name="LANGUAGE" /> яриаг одоо дотоодод боловсруулах бөгөөд энэ нь офлайнаар ажиллана. Та Дуу хоолойгоор бичих онцлогийн хэлээ Тохиргоо &gt; Хүртээмж хэсэгт өөрчлөх боломжтой.</translation>
 <translation id="2352467521400612932">Мэдрэгч үзэгний тохиргоо</translation>
 <translation id="2354174487190027830"><ph name="NAME" /> идэвхжүүлж байна</translation>
 <translation id="2359808026110333948">Цааш</translation>
@@ -438,7 +438,7 @@
 <translation id="2509468283778169019">CAPS LOCK асаалттай байна</translation>
 <translation id="2514415433888497495"><ph name="CAPTURE_MEDIUM" />-г зогсооно уу. <ph name="CAPTURE_MEDIUM" /> нь <ph name="CAPTURE_STATE" /></translation>
 <translation id="2515586267016047495">Alt</translation>
-<translation id="2515962024736506925">Хандалтын сонголтуудыг нээх</translation>
+<translation id="2515962024736506925">Хүртээмжтэй сонголтуудыг нээх</translation>
 <translation id="2516416533263263796">Төвлөрөх горим асаалттай байна. 10 минут үлдсэн</translation>
 <translation id="2516637483312286228">Тоглоомын тохиргоог засах</translation>
 <translation id="252054055865191167">Тэмдэглэгч багаж</translation>
@@ -1179,7 +1179,7 @@
 <translation id="493076006037866439">Дэлгэцийг жижгэрүүлэх</translation>
 <translation id="4932733599132424254">Огноо</translation>
 <translation id="4936329710968938986">Бүгд, унтраалттай</translation>
-<translation id="4937170330762390348">Дуу хоолойгоор бичихийн тусламжтай та дуу хоолойгоо ашиглан бичих боломжтой. Та текстийн талбарт байх үедээ дуу хоолойгоор бичих товчлуурыг дарах эсвэл дэлгэцийн доод талд байх микрофоны дүрс тэмдгийг сонгоно уу. Таны дуу хоолойгоор бичих хэлийг <ph name="LANGUAGE" /> болгож тохируулсан. Ярианы файлуудыг татах бөгөөд ингэснээр та дуу хоолойгоор бичихийг офлайн үед ашиглах боломжтой. Та дуу хоолойгоор бичих хэлийг хүссэн үедээ Тохиргоо &gt; Хандалт дотор өөрчлөх боломжтой.</translation>
+<translation id="4937170330762390348">Дуу хоолойгоор бичихийн тусламжтай та дуу хоолойгоо ашиглан бичих боломжтой. Та текстийн талбарт байх үедээ дуу хоолойгоор бичих товчлуурыг дарах эсвэл дэлгэцийн доод талд байх микрофоны дүрс тэмдгийг сонгоно уу. Таны дуу хоолойгоор бичих хэлийг <ph name="LANGUAGE" /> болгож тохируулсан. Ярианы файлуудыг татах бөгөөд ингэснээр та дуу хоолойгоор бичихийг офлайн үед ашиглах боломжтой. Та дуу хоолойгоор бичих хэлийг хүссэн үедээ Тохиргоо &gt; Хүртээмж дотор өөрчлөх боломжтой.</translation>
 <translation id="4938176435186993759">Бүх зөвлөмжийг нуух</translation>
 <translation id="4945196315133970626">Мэдэгдлийг унтраах</translation>
 <translation id="4946376291507881335">Зураг авах</translation>
@@ -2097,7 +2097,7 @@
 <translation id="7942349550061667556">Улаан</translation>
 <translation id="7943516765291457328">Ойролцоох сүлжээний цэгүүд байгаа эсэхийг скан хийхийн тулд Bluetooth-г асаана уу</translation>
 <translation id="7944023924886109030">Өнөөдрийн бүх арга хэмжээг харах</translation>
-<translation id="7945357288295809525">Хандалтын тохиргоог харуулах, "<ph name="ENABLED_FEATURES" />" идэвхжүүлсэн.</translation>
+<translation id="7945357288295809525">Хүртээмжтэй тохиргоог харуулах, "<ph name="ENABLED_FEATURES" />" идэвхжүүлсэн.</translation>
 <translation id="7946681191253332687">Аюулгүй байдлын өргөтгөсөн шинэчлэлт боломжтой</translation>
 <translation id="7947798320695032612"><ph name="APP_NAME" /> таны <ph name="DEVICE_NAME" />-г ашиглах хүсэлтэй байна</translation>
 <translation id="7951630946012935453">Гарын гэрлийг бүдгэрүүлэх</translation>
@@ -2131,7 +2131,7 @@
 <translation id="8029629653277878342">Нэмэлт аюулгүй байдлын үүднээс ПИН эсвэл нууц үг шаардлагатай</translation>
 <translation id="8030169304546394654">Салгасан</translation>
 <translation id="8036504271468642248">Өмнөх өгүүлбэр</translation>
-<translation id="8042893070933512245">Хандалтын тохиргооны цэсийг нээх</translation>
+<translation id="8042893070933512245">Хүртээмжтэй тохиргооны цэсийг нээх</translation>
 <translation id="8044457332620420407">Гарын арын гэрэл унтраалттай байна</translation>
 <translation id="8048123526339889627">Bluetooth тохиргоо</translation>
 <translation id="8049189770492311300">Хугацаа хэмжигч</translation>
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">Дараагийн дэлгэц: <ph name="DESK_NAME" />. <ph name="DESK_COUNT" />-н <ph name="DESK_INDEX" />-р дэлгэц.</translation>
 <translation id="8238817965863339552">Өөрийн <ph name="PRODUCT_NAME" />-н эргэн тойронд хэрхэн очихыг мэдэж авахын тулд шуурхай аялал хийнэ үү. 5 алхмаар ажиллуулж эхлээрэй.</translation>
 <translation id="8239034820133090126">Дэлгэцийг баруун талд идэвхжүүлэх</translation>
+<translation id="8241650983304689286">Шинэ хуваасан харагдах байдалд таб нэмэх</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, дохионы хүч <ph name="SIGNAL_STRENGTH" />, утасны батарей <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Google Драйвын бүх контентыг харуулах</translation>
 <translation id="8257510091797044096">Төхөөрөмжөө тохируулах</translation>
@@ -2286,7 +2287,7 @@
 <translation id="8619138598101195078">Дууны түвшнийг багасгах</translation>
 <translation id="862543346640737572">Эможи болон GIF</translation>
 <translation id="8627191004499078455"><ph name="DEVICE_NAME" />-д холбогдсон</translation>
-<translation id="8631727435199967028">Хандалтын тохиргоо</translation>
+<translation id="8631727435199967028">Хүртээмжтэй тохиргоо</translation>
 <translation id="8634326941504371857">Таны энэ төхөөрөмж болон Google Драйв дээрх файлууд</translation>
 <translation id="8637598503828012618"><ph name="CONNECTION_STATUS" />, дохионы хүч <ph name="SIGNAL_STRENGTH" />, таны администратор удирддаг</translation>
 <translation id="8638637208069328956">Микрофоныг асаах/унтраах</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb
index 41ccb8b..c0f3841 100644
--- a/ash/strings/ash_strings_mr.xtb
+++ b/ash/strings/ash_strings_mr.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">पुढील डेस्‍क: <ph name="DESK_NAME" />. <ph name="DESK_COUNT" /> पैकी <ph name="DESK_INDEX" /> डेस्‍क.</translation>
 <translation id="8238817965863339552">तुमचे <ph name="PRODUCT_NAME" /> कसे वापरावे हे जाणून घेण्यासाठी झटपट टूर घ्या. ५ पायऱ्यांमध्ये वापरण्यास सुरुवात करा.</translation>
 <translation id="8239034820133090126">उजवीकडील डेस्‍क अ‍ॅक्टिव्हेट करा</translation>
+<translation id="8241650983304689286">नवीन स्प्लिट दृश्यामध्ये टॅब जोडा</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, सिग्नल क्षमता <ph name="SIGNAL_STRENGTH" />, फोन बॅटरी <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Google Drive मधील संपूर्ण आशय दाखवा</translation>
 <translation id="8257510091797044096">तुमचे डिव्हाइस सेट करा</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb
index 89875890..3404deb 100644
--- a/ash/strings/ash_strings_ms.xtb
+++ b/ash/strings/ash_strings_ms.xtb
@@ -875,6 +875,7 @@
 <translation id="397105322502079400">Mengira...</translation>
 <translation id="397726367135689299">Pengecasan bateri mungkin tidak boleh dipercayai.</translation>
 <translation id="3977512764614765090">Kuasa bateri pada tahap <ph name="PERCENTAGE" />% dan sedang dicas.</translation>
+<translation id="3978162107953847778">Sisipkan pautan dari tempat seperti sejarah penyemakan imbas dan Google Drive anda. Anda juga boleh menyisipkan emoji, fail imej dan pelbagai lagi. <ph name="LINK_TO_LEARN_MORE" /></translation>
 <translation id="3982013579989864579">Tukar output audio?</translation>
 <translation id="3984536049089846927">Halaman seterusnya</translation>
 <translation id="3986082989454912832">Jawab</translation>
@@ -1600,6 +1601,7 @@
 <translation id="6260038345397266744"><ph name="TITLE" />. <ph name="DESCRIPTION" /></translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Mengaktifkan...</translation>
 <translation id="6274202259872570803">Rakaman skrin</translation>
+<translation id="6274422179279280249">Sisipkan pautan, emoji dan pelbagai lagi. Anda juga boleh mendapatkan bantuan menulis menggunakan Google AI. <ph name="LINK_TO_LEARN_MORE" /></translation>
 <translation id="6276708887952587684">Lihat sumber halaman</translation>
 <translation id="6285871695023807425">Tambahkan pada Calendar</translation>
 <translation id="6288235558961782912"><ph name="USER_EMAIL_ADDRESS" /> boleh ditambahkan semula kemudian dengan kebenaran ibu bapa.</translation>
@@ -2190,6 +2192,7 @@
 <translation id="8237964652943995219">Meja seterusnya: <ph name="DESK_NAME" />. Meja <ph name="DESK_INDEX" /> daripada <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Buat jelajah pantas untuk mengetahui cara menavigasi <ph name="PRODUCT_NAME" /> anda. Mulakan penggunaan dengan 5 langkah.</translation>
 <translation id="8239034820133090126">Aktifkan meja di sebelah kanan</translation>
+<translation id="8241650983304689286">Tambahkan tab pada paparan pisah baharu</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, Kekuatan Isyarat <ph name="SIGNAL_STRENGTH" />, Bateri Telefon <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Paparkan semua kandungan Google Drive</translation>
 <translation id="8257510091797044096">Sediakan peranti anda</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb
index cd58b14..d61eea9 100644
--- a/ash/strings/ash_strings_my.xtb
+++ b/ash/strings/ash_strings_my.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">လာမည့်မျက်နှာပြင်- <ph name="DESK_NAME" />။ မျက်နှာပြင် <ph name="DESK_COUNT" /> ခုအနက် <ph name="DESK_INDEX" />။</translation>
 <translation id="8238817965863339552">သင့် <ph name="PRODUCT_NAME" /> သုံးနည်းလေ့လာရန် လမ်းညွှန်အကျဉ်းချုပ်ကို ကြည့်ပါ။ အဆင့် ၅ ဆင့်ဖြင့် စတင်ပြီးလုပ်ဆောင်နိုင်သည်။</translation>
 <translation id="8239034820133090126">ညာဘက်မျက်နှာပြင်ကို ဖွင့်ရန်</translation>
+<translation id="8241650983304689286">တဘ်ကို မျက်နှာပြင်ခွဲ၍ ပြသခြင်းအသစ်သို့ ထည့်ရန်</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />၊ လိုင်းဆွဲအား <ph name="SIGNAL_STRENGTH" />၊ ဖုန်းဘက်ထရီ <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Google Drive အကြောင်းအရာအားလုံး ပြပါ</translation>
 <translation id="8257510091797044096">သင့်စက်ကို စနစ်ထည့်သွင်းရန်</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb
index d617aae..274f027 100644
--- a/ash/strings/ash_strings_ne.xtb
+++ b/ash/strings/ash_strings_ne.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">अर्को डेस्क: <ph name="DESK_NAME" />। <ph name="DESK_COUNT" /> वटामध्ये <ph name="DESK_INDEX" /> औँ डेस्क।</translation>
 <translation id="8238817965863339552"><ph name="PRODUCT_NAME" /> प्रयोग गर्ने तरिका सिक्न केही समय खर्चेर यसका सुविधाहरू हेर्नुहोस्। ५ वटा चरणमै सेटअप गरी प्रयोग गर्न थाल्नुहोस्।</translation>
 <translation id="8239034820133090126">डेस्क दायाँतिर एक्टिभेट गर्नुहोस्</translation>
+<translation id="8241650983304689286">नयाँ स्प्लिट भ्यूमा ट्याब हाल्नुहोस्</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, सिग्नलको क्षमता <ph name="SIGNAL_STRENGTH" />, फोनको ब्याट्री <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Google Drive मा भएका सबै सामग्री देखाउनुहोस्</translation>
 <translation id="8257510091797044096">आफ्नो डिभाइस सेटअप गर्नुहोस्</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb
index 713878c8..af37c1f 100644
--- a/ash/strings/ash_strings_nl.xtb
+++ b/ash/strings/ash_strings_nl.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Volgend bureau: <ph name="DESK_NAME" />. Bureau <ph name="DESK_INDEX" /> van <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Volg een korte rondleiding voor meer informatie over hoe je je <ph name="PRODUCT_NAME" /> gebruikt. Ga aan de slag in 5 stappen.</translation>
 <translation id="8239034820133090126">Bureau aan de rechterkant activeren</translation>
+<translation id="8241650983304689286">Tabblad toevoegen aan nieuwe gesplitste weergave</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, signaalsterkte <ph name="SIGNAL_STRENGTH" />, telefoonbatterij <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Alle Google Drive-content tonen</translation>
 <translation id="8257510091797044096">Je apparaat instellen</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb
index b7528d0..6749c756 100644
--- a/ash/strings/ash_strings_no.xtb
+++ b/ash/strings/ash_strings_no.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Neste skrivebord: <ph name="DESK_NAME" />. Skrivebord <ph name="DESK_INDEX" /> av <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Få en rask innføring i hvordan du finner frem på <ph name="PRODUCT_NAME" />. Kom i gang på fem trinn.</translation>
 <translation id="8239034820133090126">Aktiver skrivebordet til høyre</translation>
+<translation id="8241650983304689286">Legg til fanen i en ny delt visning</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" /> – signalstyrke <ph name="SIGNAL_STRENGTH" /> – telefonbatterinivå <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Vis alt innhold i Google Disk</translation>
 <translation id="8257510091797044096">Konfigurer enheten</translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb
index 2835f83f..efd75ce 100644
--- a/ash/strings/ash_strings_or.xtb
+++ b/ash/strings/ash_strings_or.xtb
@@ -2189,6 +2189,7 @@
 <translation id="8237964652943995219">ପରବର୍ତ୍ତୀ ଡେସ୍କ: <ph name="DESK_NAME" />। <ph name="DESK_COUNT" />ରୁ <ph name="DESK_INDEX" /> ଡେସ୍କ।</translation>
 <translation id="8238817965863339552">ଆପଣଙ୍କ <ph name="PRODUCT_NAME" />କୁ କିପରି ବ୍ୟବହାର କରିବେ ତାହା ଜାଣିବା ପାଇଁ ଏକ କୁଇକ ଟୁର ନିଅନ୍ତୁ। 5 ଷ୍ଟେପରେ ଚାଲୁ କରନ୍ତୁ।</translation>
 <translation id="8239034820133090126">ଡାହାଣ ପଟ ଡେସ୍କକୁ ସକ୍ରିୟ କରନ୍ତୁ</translation>
+<translation id="8241650983304689286">ନୂଆ ସ୍ପ୍ଲିଟ ଭ୍ୟୁରେ ଟାବ ଯୋଗ କରନ୍ତୁ</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, ସିଗ୍‍ନାଲ୍‍ର କ୍ଷମତା <ph name="SIGNAL_STRENGTH" />, ଫୋନ୍ ବ୍ୟାଟେରୀ <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">ସମସ୍ତ Google Drive ବିଷୟବସ୍ତୁ ଦେଖାନ୍ତୁ</translation>
 <translation id="8257510091797044096">ଆପଣଙ୍କ ଡିଭାଇସ ସେଟ ଅପ କରନ୍ତୁ</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb
index 760d582..30985f17 100644
--- a/ash/strings/ash_strings_pa.xtb
+++ b/ash/strings/ash_strings_pa.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">ਅਗਲਾ ਡੈਸਕ: <ph name="DESK_NAME" />. <ph name="DESK_COUNT" /> ਵਿੱਚੋਂ ਡੈਸਕ <ph name="DESK_INDEX" />.</translation>
 <translation id="8238817965863339552">ਆਪਣੇ <ph name="PRODUCT_NAME" /> ਨੂੰ ਚੰਗੀ ਤਰ੍ਹਾਂ ਸਮਝਣ ਲਈ ਨਵੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਬਾਰੇ ਜਾਣੋ। ਅੱਗੇ ਵਧੋ ਅਤੇ 5 ਪੜਾਵਾਂ ਨੂੰ ਪੂਰਾ ਕਰੋ।</translation>
 <translation id="8239034820133090126">ਡੈਸਕ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਕਿਰਿਆਸ਼ੀਲ ਕਰੋ</translation>
+<translation id="8241650983304689286">ਨਵੇਂ ਸਪਲਿਟ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਟੈਬ ਸ਼ਾਮਲ ਕਰੋ</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, ਸਿਗਨਲ ਦੀ ਤੀਬਰਤਾ <ph name="SIGNAL_STRENGTH" />, ਫ਼ੋਨ ਦੀ ਬੈਟਰੀ <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">ਸਾਰੀ Google Drive ਸਮੱਗਰੀ ਦਿਖਾਓ</translation>
 <translation id="8257510091797044096">ਆਪਣੇ ਡੀਵਾਈਸ ਦਾ ਸੈੱਟਅੱਪ ਕਰੋ</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index 90aa8b1b..4f94815 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -2189,6 +2189,7 @@
 <translation id="8237964652943995219">Następne biurko: <ph name="DESK_NAME" />. Biurko <ph name="DESK_INDEX" /> z <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Obejrzyj krótką prezentację, aby dowiedzieć się, jak korzystać z urządzenia <ph name="PRODUCT_NAME" />. Zacznij w 5 krokach.</translation>
 <translation id="8239034820133090126">Aktywuj biurko po prawej</translation>
+<translation id="8241650983304689286">Dodaj kartę do nowego widoku dzielonego</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, siła sygnału: <ph name="SIGNAL_STRENGTH" />, bateria telefonu: <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Pokaż całą zawartość Dysku Google</translation>
 <translation id="8257510091797044096">Skonfiguruj urządzenie</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb
index 8311469..1bf925e0 100644
--- a/ash/strings/ash_strings_pt-BR.xtb
+++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Próximo espaço de trabalho: <ph name="DESK_NAME" />. Espaço de trabalho <ph name="DESK_INDEX" /> de <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Faça um tour rápido para aprender a usar o <ph name="PRODUCT_NAME" />. Comece a aproveitar em cinco etapas.</translation>
 <translation id="8239034820133090126">Ativar o espaço de trabalho à direita</translation>
+<translation id="8241650983304689286">Adicionar guia à nova visualização dividida</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, intensidade do sinal em <ph name="SIGNAL_STRENGTH" />, bateria do smartphone em <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Mostrar todo o conteúdo do Google Drive</translation>
 <translation id="8257510091797044096">Configurar o dispositivo</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb
index 55850ae..83a165a 100644
--- a/ash/strings/ash_strings_pt-PT.xtb
+++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Espaço de trabalho seguinte: <ph name="DESK_NAME" />. Espaço de trabalho <ph name="DESK_INDEX" /> de <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Faça uma visita guiada rápida para saber como usar o <ph name="PRODUCT_NAME" />. Fique a postos para começar em 5 passos.</translation>
 <translation id="8239034820133090126">Ativar espaço de trabalho à direita</translation>
+<translation id="8241650983304689286">Adicionar separador à nova vista dividida</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, intensidade do sinal: <ph name="SIGNAL_STRENGTH" />, bateria do telemóvel: <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Mostrar todo o conteúdo do Google Drive</translation>
 <translation id="8257510091797044096">Configurar o dispositivo</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb
index 3178b9e..0ab47258 100644
--- a/ash/strings/ash_strings_ro.xtb
+++ b/ash/strings/ash_strings_ro.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Desktopul următor: <ph name="DESK_NAME" />. Desktopul <ph name="DESK_INDEX" /> din <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Fă un tur rapid pentru a afla cum să navighezi pe <ph name="PRODUCT_NAME" />. Finalizează configurarea în cinci pași.</translation>
 <translation id="8239034820133090126">Activează desktopul din dreapta</translation>
+<translation id="8241650983304689286">Adaugă o filă la noua afișare împărțită</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, puterea semnalului: <ph name="SIGNAL_STRENGTH" />, bateria telefonului: <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Afișează tot conținutul din Google Drive</translation>
 <translation id="8257510091797044096">Configurează-ți dispozitivul</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index 39f1a8b..0b70bd0 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Следующий рабочий стол: <ph name="DESK_NAME" />. Номер рабочего стола: <ph name="DESK_INDEX" /> из <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Посмотрите краткий обзор и узнайте, как работать с устройством (<ph name="PRODUCT_NAME" />). Обучение состоит из 5 шагов.</translation>
 <translation id="8239034820133090126">Включить рабочий стол справа</translation>
+<translation id="8241650983304689286">Добавить вкладку для параллельного просмотра</translation>
 <translation id="8247060538831475781">Статус подключения – "<ph name="CONNECTION_STATUS" />", уровень сигнала – <ph name="SIGNAL_STRENGTH" />, заряд батареи – <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Показать все результаты поиска на Google Диске</translation>
 <translation id="8257510091797044096">Настроить устройство</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb
index facf0620..e14389c 100644
--- a/ash/strings/ash_strings_si.xtb
+++ b/ash/strings/ash_strings_si.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">ඊළඟ මේසය: <ph name="DESK_NAME" />. මේස <ph name="DESK_COUNT" /> න් <ph name="DESK_INDEX" />.</translation>
 <translation id="8238817965863339552">ඔබේ <ph name="PRODUCT_NAME" /> වටා යන ආකාරය දැන ගැනීමට ඉක්මන් සංචාරයක් කරන්න. අවදි වීම සහ පියවර 5කින් ධාවනය වීම.</translation>
 <translation id="8239034820133090126">දකුණු පස ඇති මේසය සක්‍රිය කරන්න</translation>
+<translation id="8241650983304689286">නව බෙදීම් දසුනට පටිත්ත එක් කරන්න</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, සංඥා ප්‍රබලතාව <ph name="SIGNAL_STRENGTH" />, දුරකථන බැටරිය <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">සියලු Google Drive අන්තර්ගතය පෙන්වන්න</translation>
 <translation id="8257510091797044096">ඔබේ උපාංගය පිහිටුවන්න</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb
index 1d1d7a8..7c9d39d41 100644
--- a/ash/strings/ash_strings_sk.xtb
+++ b/ash/strings/ash_strings_sk.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Nasledujúca plocha: <ph name="DESK_NAME" />. <ph name="DESK_INDEX" />. plocha z <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Absolvujte krátku prehliadku a zistite tak, ako sa v zariadení <ph name="PRODUCT_NAME" /> orientovať. Naučte sa v piatich krokoch, ako ho začať používať.</translation>
 <translation id="8239034820133090126">Aktivácia plochy vpravo</translation>
+<translation id="8241650983304689286">Pridať kartu do nového rozdeleného zobrazenia</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, sila signálu <ph name="SIGNAL_STRENGTH" />, batéria telefónu <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Zobraziť všetok obsah na Disku Google</translation>
 <translation id="8257510091797044096">Nastavenie zariadenia</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb
index e8f8883..098e3d10 100644
--- a/ash/strings/ash_strings_sl.xtb
+++ b/ash/strings/ash_strings_sl.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Naslednje namizje: <ph name="DESK_NAME" />. Namizje <ph name="DESK_INDEX" /> od <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">V kratki predstavitvi si oglejte, kako uporabljati napravo <ph name="PRODUCT_NAME" />. Uporabljati jo lahko začnete v 5 korakih.</translation>
 <translation id="8239034820133090126">Aktiviranje namizja na desni</translation>
+<translation id="8241650983304689286">Dodajanje zavihka v novi razdeljeni pogled</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, moč signala je <ph name="SIGNAL_STRENGTH" />, stanje baterije telefona je <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Pokaži vso vsebino v Googlu Drive</translation>
 <translation id="8257510091797044096">Nastavitev naprave</translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb
index 4791dd2..6f56172 100644
--- a/ash/strings/ash_strings_sq.xtb
+++ b/ash/strings/ash_strings_sq.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Tavolina e radhës e punës: <ph name="DESK_NAME" />. Tavolina e punës <ph name="DESK_INDEX" /> nga <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Kryej një turne të shpejtë për të mësuar se si të lëvizësh nëpër <ph name="PRODUCT_NAME" />. Bëhu gati dhe fillo me 5 hapa.</translation>
 <translation id="8239034820133090126">Aktivizo tavolinën e punës në të djathtë</translation>
+<translation id="8241650983304689286">Shto skedën te pamja e re të ndarë</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, fuqia e sinjalit <ph name="SIGNAL_STRENGTH" />, bateria e telefonit <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Shfaq të gjitha përmbajtjet e "Diskut të Google"</translation>
 <translation id="8257510091797044096">Konfiguro pajisjen tënde</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb
index 551c334..2574bc3 100644
--- a/ash/strings/ash_strings_sr-Latn.xtb
+++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -2192,6 +2192,7 @@
 <translation id="8237964652943995219">Sledeća radna površina: <ph name="DESK_NAME" />. <ph name="DESK_INDEX" />. radna površina od <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Krenite u kratak obilazak da biste saznali kako da se krećete po <ph name="PRODUCT_NAME" />-u. Počnite sa radom u 5 koraka.</translation>
 <translation id="8239034820133090126">Aktiviraj radnu površinu na desnoj strani</translation>
+<translation id="8241650983304689286">Dodaj karticu u novi podeljeni prikaz</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, jačina signala <ph name="SIGNAL_STRENGTH" />, baterija telefona <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Pregledajte sav sadržaj Google diska</translation>
 <translation id="8257510091797044096">Podesite uređaj</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb
index 622a552b..d7bcf898 100644
--- a/ash/strings/ash_strings_sr.xtb
+++ b/ash/strings/ash_strings_sr.xtb
@@ -2192,6 +2192,7 @@
 <translation id="8237964652943995219">Следећа радна површина: <ph name="DESK_NAME" />. <ph name="DESK_INDEX" />. радна површина од <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Крените у кратак обилазак да бисте сазнали како да се крећете по <ph name="PRODUCT_NAME" />-у. Почните са радом у 5 корака.</translation>
 <translation id="8239034820133090126">Активирај радну површину на десној страни</translation>
+<translation id="8241650983304689286">Додај картицу у нови подељени приказ</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, јачина сигнала <ph name="SIGNAL_STRENGTH" />, батерија телефона <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Прегледајте сав садржај Google диска</translation>
 <translation id="8257510091797044096">Подесите уређај</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb
index e0e788d..be79b26e 100644
--- a/ash/strings/ash_strings_sv.xtb
+++ b/ash/strings/ash_strings_sv.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Nästa skrivbord: <ph name="DESK_NAME" />. Skrivbord <ph name="DESK_INDEX" /> av <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Ta en snabbtitt på hur du navigerar på <ph name="PRODUCT_NAME" />. Kom igång i fem steg.</translation>
 <translation id="8239034820133090126">Aktivera skrivbordet till höger</translation>
+<translation id="8241650983304689286">Lägg till fliken i en ny delad vy</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, signalstyrka <ph name="SIGNAL_STRENGTH" />, telefonens batterinivå <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Visa allt Google Drive-innehåll</translation>
 <translation id="8257510091797044096">Konfigurera enheten</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb
index 8274dbd..6fd68c08 100644
--- a/ash/strings/ash_strings_sw.xtb
+++ b/ash/strings/ash_strings_sw.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">Eneokazi linalofuata: <ph name="DESK_NAME" />. Eneokazi la <ph name="DESK_INDEX" /> kati ya <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Pata mwongozo wa haraka kuhusu jinsi ya kutumia <ph name="PRODUCT_NAME" /> yako. Anza kutumia kwa kufuata hatua 5.</translation>
 <translation id="8239034820133090126">Washa eneokazi la upande wa kulia</translation>
+<translation id="8241650983304689286">Weka kichupo kwenye mwonekano mpya wa madirisha yaliyogawanywa</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, Uthabiti wa Mtandao <ph name="SIGNAL_STRENGTH" />, Betri ya Simu <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Onyesha maudhui yote ya Hifadhi ya Google</translation>
 <translation id="8257510091797044096">Weka mipangilio ya kifaa chako</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index 9d7fe39..bc3a6c3 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">அடுத்த டெஸ்க்: <ph name="DESK_NAME" />. டெஸ்க் <ph name="DESK_INDEX" />/<ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552"><ph name="PRODUCT_NAME" /> ஐ எப்படிப் பயன்படுத்துவது என்று தெரிந்துகொள்ள முன்னோட்டத்தைப் பாருங்கள். 5 படிகளில் அமைத்து பயன்படுத்தத் தொடங்கலாம்.</translation>
 <translation id="8239034820133090126">வலதுபுறத்தில் உள்ள டெஸ்க்கை இயக்கு</translation>
+<translation id="8241650983304689286">புதிய காட்சிப் பிரிப்பில் பக்கத்தைச் சேர்</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, சிக்னல் வலிமை: <ph name="SIGNAL_STRENGTH" />, மொபைல் பேட்டரி: <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Google Drive உள்ளடக்கம் அனைத்தையும் காட்டும்</translation>
 <translation id="8257510091797044096">சாதனத்தை அமைத்தல்</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index 596c343..d92d5b5c 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -2191,6 +2191,7 @@
 <translation id="8237964652943995219">తర్వాతి డెస్క్: <ph name="DESK_NAME" />. <ph name="DESK_COUNT" /> డెస్క్‌లలో <ph name="DESK_INDEX" />‌వది.</translation>
 <translation id="8238817965863339552"><ph name="PRODUCT_NAME" />ను ఎలా ఉపయోగించాలో తెలుసుకోవడానికి ఒక క్విక్ టూర్ చేయండి. కేవలం 5 దశల్లో సెటప్ చేసి, దీనిని ఉపయోగించండి.</translation>
 <translation id="8239034820133090126">కుడి వైపున ఉన్న డెస్క్‌ను యాక్టివేట్ చేయండి</translation>
+<translation id="8241650983304689286">కొత్త స్ప్లిట్ వీక్షణకు ట్యాబ్‌ను జోడించండి</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, సిగ్నల్ సామర్థ్యం <ph name="SIGNAL_STRENGTH" />, ఫోన్ బ్యాటరీ <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Google Drive కంటెంట్ అంతటినీ చూపండి</translation>
 <translation id="8257510091797044096">మీ పరికరాన్ని సెటప్ చేయండి</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 47b66acd4..d29af19e 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -2185,6 +2185,7 @@
 <translation id="8237964652943995219">เดสก์ถัดไป: <ph name="DESK_NAME" /> เดสก์ที่ <ph name="DESK_INDEX" /> จาก <ph name="DESK_COUNT" /></translation>
 <translation id="8238817965863339552">ดูการแนะนำสั้นๆ เพื่อเรียนรู้วิธีการไปยังส่วนต่างๆ ของ <ph name="PRODUCT_NAME" /> เริ่มต้นใช้งานได้ใน 5 ขั้นตอน</translation>
 <translation id="8239034820133090126">เปิดใช้งานเดสก์ทางด้านขวา</translation>
+<translation id="8241650983304689286">เพิ่มแท็บไปยังมุมมองแบบแยกใหม่</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, ความแรงสัญญาณ <ph name="SIGNAL_STRENGTH" />, แบตเตอรี่โทรศัพท์ <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">แสดงเนื้อหา Google ไดรฟ์ทั้งหมด</translation>
 <translation id="8257510091797044096">ตั้งค่าอุปกรณ์</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index c8919ff..345c6d8 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Sonraki masa: <ph name="DESK_NAME" />. Masa <ph name="DESK_INDEX" />/<ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552"><ph name="PRODUCT_NAME" /> cihazınızı nasıl kullanacağınızı öğrenmek için kısa turumuza katılın. Cihazınızı 5 adımda kullanmaya başlayın.</translation>
 <translation id="8239034820133090126">Sağdaki masayı etkinleştir</translation>
+<translation id="8241650983304689286">Sekmeyi yeni bölünmüş görünüme ekle</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, <ph name="SIGNAL_STRENGTH" /> Sinyal Gücü, <ph name="BATTERY_STATUS" /> Telefon Pili</translation>
 <translation id="825129991941217170">Tüm Google Drive içeriklerini göster</translation>
 <translation id="8257510091797044096">Cihazınızı ayarlayın</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb
index ea1f52f..4f2a734c 100644
--- a/ash/strings/ash_strings_uk.xtb
+++ b/ash/strings/ash_strings_uk.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Наступний робочий стіл: <ph name="DESK_NAME" />. Робочий стіл <ph name="DESK_INDEX" /> із <ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Ознайомтеся з коротким оглядом <ph name="PRODUCT_NAME" />. Щоб почати роботу, виконайте 5 кроків.</translation>
 <translation id="8239034820133090126">Активувати робочий стіл праворуч</translation>
+<translation id="8241650983304689286">Додати вкладку на новий розділений екран</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, рівень сигналу – <ph name="SIGNAL_STRENGTH" />, рівень заряду акумулятора телефона – <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Показати весь контент із Google Диска</translation>
 <translation id="8257510091797044096">Налаштування пристрою</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb
index f622890..edc0182 100644
--- a/ash/strings/ash_strings_ur.xtb
+++ b/ash/strings/ash_strings_ur.xtb
@@ -2189,6 +2189,7 @@
 <translation id="8237964652943995219">اگلا ڈیسک: <ph name="DESK_NAME" /> <ph name="DESK_COUNT" /> میں سے <ph name="DESK_INDEX" /> ڈیسک</translation>
 <translation id="8238817965863339552">اپنے <ph name="PRODUCT_NAME" /> کے استعمال کا طریقہ جاننے کے لیے مختصر ٹؤر لیں۔ آگے بڑھے اور 5 اقدام مکمل کریں۔</translation>
 <translation id="8239034820133090126">دائیں ڈیسک کی طرف فعال کریں</translation>
+<translation id="8241650983304689286">نئے اسپلٹ ویو میں ٹیب شامل کریں</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />، سگنل کی مضبوطی <ph name="SIGNAL_STRENGTH" />، فون کی بیٹری <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">‏‫Google Drive کا تمام مواد دکھائیں</translation>
 <translation id="8257510091797044096">اپنا آلہ سیٹ اپ کریں</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb
index 77916c8..b52d2c18 100644
--- a/ash/strings/ash_strings_uz.xtb
+++ b/ash/strings/ash_strings_uz.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Keyingi ish stoli: <ph name="DESK_NAME" />. Ish stoli: <ph name="DESK_INDEX" />/<ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552"><ph name="PRODUCT_NAME" /> qurilmasidan qanday foydalanishni oʻrganish uchun tezkor tanishtiruvdan foydalaning. 5 ta bosqichda hammasi bilan tanishing.</translation>
 <translation id="8239034820133090126">Oʻngdagi ish stolini faollashtirish</translation>
+<translation id="8241650983304689286">Yangi ajratilgan rejimga varaq kiritish</translation>
 <translation id="8247060538831475781">Ulanish: <ph name="CONNECTION_STATUS" />, Signal darajasi: <ph name="SIGNAL_STRENGTH" />, Telefon quvvati: <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Google Drive barcha natijalari</translation>
 <translation id="8257510091797044096">Qurilmangizni sozlang</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb
index e630ed1..31f47628 100644
--- a/ash/strings/ash_strings_vi.xtb
+++ b/ash/strings/ash_strings_vi.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Không gian làm việc tiếp theo: <ph name="DESK_NAME" />. Không gian làm việc số <ph name="DESK_INDEX" />/<ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Xem hướng dẫn nhanh để biết cách thao tác trên <ph name="PRODUCT_NAME" />. Thiết lập và sử dụng trong 5 bước.</translation>
 <translation id="8239034820133090126">Kích hoạt không gian làm việc ở bên phải</translation>
+<translation id="8241650983304689286">Thêm thẻ vào chế độ xem phân tách mới</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, Cường độ tín hiệu <ph name="SIGNAL_STRENGTH" />, Pin điện thoại <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Hiện tất cả nội dung trên Google Drive</translation>
 <translation id="8257510091797044096">Thiết lập thiết bị của bạn</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb
index 8890bc6..162c71c9 100644
--- a/ash/strings/ash_strings_zh-CN.xtb
+++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -2188,6 +2188,7 @@
 <translation id="8237964652943995219">下一个桌面:<ph name="DESK_NAME" />。第 <ph name="DESK_INDEX" /> 个桌面(共 <ph name="DESK_COUNT" /> 个)。</translation>
 <translation id="8238817965863339552">不妨观看快速导览,了解如何玩转 <ph name="PRODUCT_NAME" />。只需 5 步,即可启动并运行。</translation>
 <translation id="8239034820133090126">启用右侧桌面</translation>
+<translation id="8241650983304689286">向新的拆分视图中添加标签页</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />,信号强度为 <ph name="SIGNAL_STRENGTH" />,剩余电量为 <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">显示所有 Google 云端硬盘内容</translation>
 <translation id="8257510091797044096">设置设备</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb
index bdcca8cf..086745bf 100644
--- a/ash/strings/ash_strings_zh-HK.xtb
+++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -2188,6 +2188,7 @@
 <translation id="8237964652943995219">下一個桌面:<ph name="DESK_NAME" />。第 <ph name="DESK_INDEX" /> 個桌面,共 <ph name="DESK_COUNT" /> 個。</translation>
 <translation id="8238817965863339552">請觀看快速導覽,瞭解如何操作 <ph name="PRODUCT_NAME" />。只需 5 個步驟就能開始運作。</translation>
 <translation id="8239034820133090126">啟用右側桌面</translation>
+<translation id="8241650983304689286">將分頁加入新的分割檢視畫面</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />,訊號強度係 <ph name="SIGNAL_STRENGTH" />,手機電量係 <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">顯示所有「Google 雲端硬碟」內容</translation>
 <translation id="8257510091797044096">設定你的裝置</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb
index 32b6ca328..12db661 100644
--- a/ash/strings/ash_strings_zh-TW.xtb
+++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -2186,6 +2186,7 @@
 <translation id="8237964652943995219">下一個桌面:<ph name="DESK_NAME" />。第 <ph name="DESK_INDEX" /> 個桌面,共 <ph name="DESK_COUNT" /> 個。</translation>
 <translation id="8238817965863339552">請觀看快速導覽,瞭解如何操作 <ph name="PRODUCT_NAME" />。只要 5 個步驟,就能輕鬆上手。</translation>
 <translation id="8239034820133090126">啟動右側桌面</translation>
+<translation id="8241650983304689286">將分頁加入新的分割畫面</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />,訊號強度 <ph name="SIGNAL_STRENGTH" />,手機電量:<ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">顯示所有 Google 雲端硬碟內容</translation>
 <translation id="8257510091797044096">設定裝置</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb
index a9d878a..745f8de 100644
--- a/ash/strings/ash_strings_zu.xtb
+++ b/ash/strings/ash_strings_zu.xtb
@@ -2190,6 +2190,7 @@
 <translation id="8237964652943995219">Itafula elilandelayo: <ph name="DESK_NAME" />. Itafula <ph name="DESK_INDEX" /> kwangu-<ph name="DESK_COUNT" />.</translation>
 <translation id="8238817965863339552">Ake uthathe uhambo oluncane ukuze ufunde indlela yokusebenzisa i-<ph name="PRODUCT_NAME" /> yakho. Sukuma ugijime ngezinyathelo eziyi-5.</translation>
 <translation id="8239034820133090126">Yenza kusebenze ideski ngakwesokudla</translation>
+<translation id="8241650983304689286">Engeza ithebhu ekubukeni okusha okuhlukanisiwe</translation>
 <translation id="8247060538831475781">I-<ph name="CONNECTION_STATUS" />, Amandla esignali angu-<ph name="SIGNAL_STRENGTH" />, iphethwe umlawuli wakho <ph name="BATTERY_STATUS" /></translation>
 <translation id="825129991941217170">Bonisa konke okuqukethwe kweGoogle Drive</translation>
 <translation id="8257510091797044096">Setha idivayisi yakho</translation>
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/OptionalViewElement.java b/base/test/android/javatests/src/org/chromium/base/test/transit/OptionalViewElement.java
index e468aa6..e6a8d88 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/transit/OptionalViewElement.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/OptionalViewElement.java
@@ -56,7 +56,8 @@
     }
 
     private ViewCarryOn<ViewT> createViewCarryOn() {
-        ViewCarryOn<ViewT> carryOn = new ViewCarryOn<>(mViewSpec, mOptions);
+        ViewCarryOn<ViewT> carryOn =
+                new ViewCarryOn<>(mOwner.determineActivityElement(), mViewSpec, mOptions);
         mCarryOns.add(carryOn);
         return carryOn;
     }
@@ -75,23 +76,23 @@
     }
 
     public TripBuilder performViewActionTo(ViewAction action) {
-        return waitForView().viewElement.performViewActionTo(action);
+        return waitForView().viewElement.performViewActionTo(action).withContext(mOwner);
     }
 
     public TripBuilder clickTo() {
-        return waitForView().viewElement.clickTo();
+        return waitForView().viewElement.clickTo().withContext(mOwner);
     }
 
     public TripBuilder longPressTo() {
-        return waitForView().viewElement.longPressTo();
+        return waitForView().viewElement.longPressTo().withContext(mOwner);
     }
 
     public TripBuilder clickEvenIfPartiallyOccludedTo() {
-        return waitForView().viewElement.clickEvenIfPartiallyOccludedTo();
+        return waitForView().viewElement.clickEvenIfPartiallyOccludedTo().withContext(mOwner);
     }
 
     public TripBuilder typeTextTo(String text) {
-        return waitForView().viewElement.typeTextTo(text);
+        return waitForView().viewElement.typeTextTo(text).withContext(mOwner);
     }
 
     /** Create a Condition fulfilled when this OptionalViewElement is present. */
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/ViewCarryOn.java b/base/test/android/javatests/src/org/chromium/base/test/transit/ViewCarryOn.java
index 4f5222d..dbdd27b 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/transit/ViewCarryOn.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/ViewCarryOn.java
@@ -6,6 +6,8 @@
 
 import android.view.View;
 
+import org.chromium.build.annotations.Nullable;
+
 /**
  * A {@link CarryOn} that contains a single {@link ViewElement}.
  *
@@ -13,9 +15,21 @@
  */
 public class ViewCarryOn<ViewT extends View> extends CarryOn {
     public final ViewElement<ViewT> viewElement;
+    public final @Nullable ActivityElement<?> activityElement;
 
-    public ViewCarryOn(ViewSpec<ViewT> viewSpec, ViewElement.Options options) {
+    public ViewCarryOn(
+            @Nullable ActivityElement<?> ownerActivityElement,
+            ViewSpec<ViewT> viewSpec,
+            ViewElement.Options options) {
         super();
+        if (ownerActivityElement != null) {
+            // Restrict searching the view to one specific Activity. Avoids matching the View
+            // in other Activities.
+            activityElement = declareActivity(ownerActivityElement.getActivityClass());
+            activityElement.requireToBeInSameTask(ownerActivityElement.get());
+        } else {
+            activityElement = null;
+        }
         viewElement = declareView(viewSpec.getViewClass(), viewSpec.getViewMatcher(), options);
     }
 
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 931c7854..9ce90cdb 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -257,6 +257,15 @@
   }
 }
 
+if (target_os == "chromeos") {
+  declare_args() {
+    # Setting this value selects a specific CPU type among the broader
+    # class selected by target_cpu. For example, a build with
+    # target_cpu="arm64" may set cros_target_cpu_arch="armv8-a+crc+crypto").
+    cros_target_cpu_arch = ""
+  }
+}
+
 declare_args() {
   # Turn off the --call-graph-profile-sort flag for lld by default. Enable
   # selectively for targets where it's beneficial.
@@ -1292,6 +1301,11 @@
         ldflags += [ "-m64" ]
       }
       cflags += [ "-msse3" ]
+      if (target_os == "chromeos" && cros_target_cpu_arch != "" &&
+          current_cpu == target_cpu) {
+        cflags += [ "-march=$cros_target_cpu_arch" ]
+        ldflags += [ "-march=$cros_target_cpu_arch" ]
+      }
     } else if (current_cpu == "x86") {
       if (is_clang && !is_android && !is_chromeos_device) {
         cflags += [ "--target=i386-unknown-linux-gnu" ]
@@ -1321,6 +1335,11 @@
         cflags += [ "--target=aarch64-linux-gnu" ]
         ldflags += [ "--target=aarch64-linux-gnu" ]
       }
+      if (target_os == "chromeos" && cros_target_cpu_arch != "" &&
+          current_cpu == target_cpu) {
+        cflags += [ "-march=$cros_target_cpu_arch" ]
+        ldflags += [ "-march=$cros_target_cpu_arch" ]
+      }
     } else if (current_cpu == "mipsel") {
       ldflags += [ "-Wl,--hash-style=sysv" ]
       if (custom_toolchain == "") {
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni
index f9f13cce..77784abd 100644
--- a/buildtools/deps_revisions.gni
+++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@
 declare_args() {
   # Used to cause full rebuilds on libc++ rolls. This should be kept in sync
   # with the libcxx_revision var in //DEPS.
-  libcxx_revision = "07572e7b169225ef3a999584cba9d9004631ae66"
+  libcxx_revision = "c03062d6c9382e7eeb455660308f4d2652b700bd"
 }
diff --git a/buildtools/third_party/libc++/__assertion_handler b/buildtools/third_party/libc++/__assertion_handler
index 275d562..0f60c02 100644
--- a/buildtools/third_party/libc++/__assertion_handler
+++ b/buildtools/third_party/libc++/__assertion_handler
@@ -20,14 +20,10 @@
 // Based on CHECK_WILL_STREAM() defined in base/check.h
 #if defined(OFFICIAL_BUILD) && !defined(DCHECK_ALWAYS_ON)
 
-_LIBCPP_BEGIN_NAMESPACE_STD
-
 [[noreturn]] inline _LIBCPP_HIDE_FROM_ABI void __libcpp_hardening_failure() {
   __builtin_trap();
 }
 
-_LIBCPP_END_NAMESPACE_STD
-
 // TODO(hardening): use `__builtin_verbose_trap(message)` once that becomes available.
 #  define _LIBCPP_ASSERTION_HANDLER(message) ((void)message, __libcpp_hardening_failure())
 
diff --git a/buildtools/third_party/libc++/libcxx_headers.gni b/buildtools/third_party/libc++/libcxx_headers.gni
index cc2a751..fbba1fa 100644
--- a/buildtools/third_party/libc++/libcxx_headers.gni
+++ b/buildtools/third_party/libc++/libcxx_headers.gni
@@ -11,7 +11,7 @@
 import("//buildtools/deps_revisions.gni")
 
 assert(
-    libcxx_revision == "07572e7b169225ef3a999584cba9d9004631ae66",
+    libcxx_revision == "c03062d6c9382e7eeb455660308f4d2652b700bd",
     "libcxx_headers.gni and third_party/libc++ are out of sync.$0x0A$0x0AIf you were messing around with the libc++ repository, run:$0x0A`buildtools/third_party/libc++/generate_libcxx_headers.py`$0x0A$0x0AIf the script doesn't resolve the error, file a bug to msta@ with reproduction details.$0x0A")
 
 libcxx_headers = [
diff --git a/chrome/VERSION b/chrome/VERSION
index ed3563f..c2006bbc 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=145
 MINOR=0
-BUILD=7569
+BUILD=7570
 PATCH=0
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 390dc2e..2da05b3 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -102,6 +102,7 @@
   "java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java",
   "java/src/org/chromium/chrome/browser/app/tabmodel/AsyncTabParamsManagerSingleton.java",
   "java/src/org/chromium/chrome/browser/app/tabmodel/ChromeNextTabPolicySupplier.java",
+  "java/src/org/chromium/chrome/browser/app/tabmodel/CombinedTabRestorer.java",
   "java/src/org/chromium/chrome/browser/app/tabmodel/CustomTabsTabModelOrchestrator.java",
   "java/src/org/chromium/chrome/browser/app/tabmodel/DefaultTabModelSelectorFactory.java",
   "java/src/org/chromium/chrome/browser/app/tabmodel/HeadlessBrowserControlsStateProvider.java",
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
index bb2496c9..730da63a 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
@@ -61,6 +61,7 @@
 import org.chromium.chrome.browser.tasks.tab_management.TabListModel.CardProperties.ModelType;
 import org.chromium.chrome.browser.tasks.tab_management.TabProperties.TabActionState;
 import org.chromium.chrome.browser.tasks.tab_management.TabProperties.UiType;
+import org.chromium.chrome.browser.tasks.tab_management.TabSwitcherMessageManager.MessageType;
 import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
 import org.chromium.chrome.browser.undo_tab_close_snackbar.UndoBarExplicitTrigger;
 import org.chromium.chrome.tab_ui.R;
@@ -461,7 +462,10 @@
         if (emptyViewParent != null) {
             mTabListEmptyCoordinator =
                     new TabListEmptyCoordinator(
-                            emptyViewParent, mModelList, this::runOnItemAnimatorFinished);
+                            mRecyclerView,
+                            emptyViewParent,
+                            mModelList,
+                            this::runOnItemAnimatorFinished);
         }
         mTabListHighlighter = new TabListHighlighter(mModelList);
         mTabListMergeAnimationManager = new TabListMergeAnimationManager(mRecyclerView);
@@ -983,7 +987,7 @@
     /**
      * @see TabListMediator#specialItemExistsInModel(int)
      */
-    boolean specialItemExists(@TabSwitcherMessageManager.MessageType int itemIdentifier) {
+    boolean specialItemExists(@MessageType int itemIdentifier) {
         return mMediator.specialItemExistsInModel(itemIdentifier);
     }
 
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java
index b7434e3..ec9ecd2 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java
@@ -5,14 +5,17 @@
 package org.chromium.chrome.browser.tasks.tab_management;
 
 import static org.chromium.build.NullUtil.assumeNonNull;
+import static org.chromium.chrome.browser.tasks.tab_management.TabSwitcherMessageManager.isOnlyArchivedMsg;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.TextView;
 
 import androidx.annotation.DrawableRes;
+import androidx.annotation.Px;
 import androidx.annotation.StringRes;
 
 import org.chromium.base.Callback;
@@ -34,13 +37,14 @@
 class TabListEmptyCoordinator {
     public final long ILLUSTRATION_ANIMATION_DURATION_MS = 700L;
 
+    private final TabListRecyclerView mRecyclerView;
     private final ViewGroup mRootView;
     private final Context mContext;
     private final TabListModel mModel;
     private final ListObserver<Void> mListObserver;
     private final Callback<Runnable> mRunOnItemAnimatorFinished;
 
-    private @Nullable View mEmptyView;
+    private @Nullable ViewGroup mEmptyView;
     private TextView mEmptyStateHeading;
     private TextView mEmptyStateSubheading;
     private ImageView mImageView;
@@ -49,7 +53,11 @@
     private @Nullable TabListEmptyIllustrationAnimationManager mIllustrationAnimationManager;
 
     public TabListEmptyCoordinator(
-            ViewGroup rootView, TabListModel model, Callback<Runnable> runOnItemAnimatorFinished) {
+            TabListRecyclerView recyclerView,
+            ViewGroup rootView,
+            TabListModel model,
+            Callback<Runnable> runOnItemAnimatorFinished) {
+        mRecyclerView = recyclerView;
         mRootView = rootView;
         mContext = rootView.getContext();
         mRunOnItemAnimatorFinished = runOnItemAnimatorFinished;
@@ -130,7 +138,7 @@
     }
 
     private boolean isInEmptyState() {
-        return mModel.size() == 0 && mIsTabSwitcherShowing;
+        return (mModel.isEmpty() || isOnlyArchivedMsg(mModel)) && mIsTabSwitcherShowing;
     }
 
     private void updateEmptyView() {
@@ -145,6 +153,7 @@
                                             ILLUSTRATION_ANIMATION_DURATION_MS);
                                 }
                                 setEmptyViewVisibility(View.VISIBLE);
+                                fixMargins();
                             }
                         });
             } else {
@@ -154,6 +163,23 @@
         }
     }
 
+    private void fixMargins() {
+        ViewGroup.MarginLayoutParams params =
+                (ViewGroup.MarginLayoutParams) assumeNonNull(mEmptyView).getLayoutParams();
+        Resources resources = mContext.getResources();
+        @Px int rowMargin = resources.getDimensionPixelSize(R.dimen.default_list_row_padding);
+
+        if (isOnlyArchivedMsg(mModel)) {
+            View msgCard = mRecyclerView.getChildAt(0);
+
+            // Account for the height of the message card.
+            params.topMargin = msgCard.getHeight() + rowMargin;
+        } else {
+            params.topMargin = 0;
+        }
+        mEmptyView.setLayoutParams(params);
+    }
+
     private void transformIllustrationIfPresent() {
         if (mIllustrationAnimationManager != null) {
             mIllustrationAnimationManager.initialTransformation();
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
index 12b323d3..a28da786 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -14,6 +14,7 @@
 import static org.chromium.chrome.browser.tasks.tab_management.TabProperties.TAB_GROUP_COLOR_VIEW_PROVIDER;
 import static org.chromium.chrome.browser.tasks.tab_management.TabProperties.TAB_ID;
 import static org.chromium.chrome.browser.tasks.tab_management.TabProperties.THUMBNAIL_FETCHER;
+import static org.chromium.chrome.browser.tasks.tab_management.TabSwitcherMessageManager.isOnlyArchivedMsg;
 import static org.chromium.chrome.browser.tasks.tab_management.UiTypeHelper.isLargeMessageCard;
 import static org.chromium.chrome.browser.tasks.tab_management.UiTypeHelper.isMessageCard;
 
@@ -1613,6 +1614,10 @@
         if (existingIndex != TabModel.INVALID_TAB_INDEX) return existingIndex;
 
         int newIndex = getInsertionIndexOfTab(tab, onlyShowRelatedTabs);
+
+        // Tabs should be inserted only after the archived message card.
+        if (newIndex == 0 && isOnlyArchivedMsg(mModelList)) newIndex++;
+
         if (newIndex == TabList.INVALID_TAB_INDEX) return newIndex;
 
         Tab currentTab = TabModelUtils.getCurrentTab(getCurrentTabModelChecked());
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManager.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManager.java
index 861afabf..0510b96 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManager.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManager.java
@@ -5,6 +5,8 @@
 package org.chromium.chrome.browser.tasks.tab_management;
 
 import static org.chromium.build.NullUtil.assumeNonNull;
+import static org.chromium.chrome.browser.tasks.tab_management.MessageCardViewProperties.MESSAGE_TYPE;
+import static org.chromium.chrome.browser.tasks.tab_management.TabSwitcherMessageManager.MessageType.ARCHIVED_TABS_MESSAGE;
 import static org.chromium.chrome.browser.tasks.tab_management.UiTypeHelper.messageTypeToUiType;
 
 import android.app.Activity;
@@ -108,7 +110,7 @@
     private final MultiWindowModeStateDispatcher.MultiWindowModeObserver mMultiWindowModeObserver =
             isInMultiWindowMode -> {
                 if (isInMultiWindowMode) {
-                    removeAllAppendedMessage();
+                    onAllTabsClosed();
                 } else {
                     restoreAllAppendedMessage();
                 }
@@ -299,7 +301,7 @@
         TabListCoordinator currentTabListCoordinator = mTabListCoordinatorSupplier.get();
         if (currentTabListCoordinator != tabListCoordinator) return;
 
-        removeAllAppendedMessage();
+        onAllTabsClosed();
 
         mTabListCoordinatorSupplier.set(null);
         mPriceWelcomeMessageReviewActionProviderSupplier.set(null);
@@ -423,7 +425,7 @@
     /** Called after resetting the list of tabs. */
     public void afterReset(int tabCount) {
         onTabGroupModelFilterChanged(mCurrentTabGroupModelFilterSupplier.get(), null);
-        removeAllAppendedMessage();
+        onAllTabsClosed();
         if (tabCount > 0) {
             appendMessagesTo(tabCount);
         }
@@ -556,10 +558,10 @@
     }
 
     /**
-     * Remove all the message items in the model list. Right now this is used when all tabs are
-     * closed in the grid tab switcher.
+     * Remove message items in the model list. Right now this is used when all tabs are closed in
+     * the grid tab switcher.
      */
-    private void removeAllAppendedMessage() {
+    private void onAllTabsClosed() {
         TabListCoordinator tabListCoordinator = mTabListCoordinatorSupplier.get();
         if (tabListCoordinator == null) return;
 
@@ -567,8 +569,6 @@
         tabListCoordinator.removeSpecialListItem(UiType.PRICE_MESSAGE, MessageType.PRICE_MESSAGE);
         tabListCoordinator.removeSpecialListItem(
                 UiType.INCOGNITO_REAUTH_PROMO_MESSAGE, MessageType.INCOGNITO_REAUTH_PROMO_MESSAGE);
-        tabListCoordinator.removeSpecialListItem(
-                UiType.ARCHIVED_TABS_MESSAGE, MessageType.ARCHIVED_TABS_MESSAGE);
 
         // TODO(crbug.com/441040016): Refactor the lifecycle of the TabGroupSuggestionMessageService
         // so that we don't need to pass a dismiss runnable.
@@ -702,7 +702,7 @@
         TabGroupModelFilter tabGroupModelFilter = mCurrentTabGroupModelFilterSupplier.get();
         assumeNonNull(tabGroupModelFilter);
         if (tabGroupModelFilter.getTabModel().getCount() == numTabsToRemove) {
-            removeAllAppendedMessage();
+            onAllTabsClosed();
         }
     }
 
@@ -711,4 +711,10 @@
         assumeNonNull(tabGroupModelFilter);
         return assumeNonNull(tabGroupModelFilter.getTabModel().getProfile());
     }
+
+    /** Check to see if a {@link TabListModel} only contains the Archived Message card. */
+    public static boolean isOnlyArchivedMsg(TabListModel model) {
+        return model.size() == 1
+                && model.get(0).model.containsKeyEqualTo(MESSAGE_TYPE, ARCHIVED_TABS_MESSAGE);
+    }
 }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManagerUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManagerUnitTest.java
index d5ea7c1d..d1ffe232 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManagerUnitTest.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManagerUnitTest.java
@@ -235,7 +235,7 @@
                 .removeSpecialListItem(
                         UiType.INCOGNITO_REAUTH_PROMO_MESSAGE,
                         MessageType.INCOGNITO_REAUTH_PROMO_MESSAGE);
-        verify(mTabListCoordinator)
+        verify(mTabListCoordinator, never())
                 .removeSpecialListItem(
                         UiType.ARCHIVED_TABS_MESSAGE, MessageType.ARCHIVED_TABS_MESSAGE);
         verify(mMessageUpdateObserver).onRemoveAllAppendedMessage();
@@ -259,7 +259,7 @@
                 .removeSpecialListItem(
                         UiType.INCOGNITO_REAUTH_PROMO_MESSAGE,
                         MessageType.INCOGNITO_REAUTH_PROMO_MESSAGE);
-        verify(mTabListCoordinator)
+        verify(mTabListCoordinator, never())
                 .removeSpecialListItem(
                         UiType.ARCHIVED_TABS_MESSAGE, MessageType.ARCHIVED_TABS_MESSAGE);
         verify(mMessageUpdateObserver).onRemoveAllAppendedMessage();
@@ -285,7 +285,7 @@
                 .removeSpecialListItem(
                         UiType.INCOGNITO_REAUTH_PROMO_MESSAGE,
                         MessageType.INCOGNITO_REAUTH_PROMO_MESSAGE);
-        verify(mTabListCoordinator)
+        verify(mTabListCoordinator, never())
                 .removeSpecialListItem(
                         UiType.ARCHIVED_TABS_MESSAGE, MessageType.ARCHIVED_TABS_MESSAGE);
         verify(mTabListCoordinator)
@@ -321,7 +321,7 @@
                 .removeSpecialListItem(
                         UiType.INCOGNITO_REAUTH_PROMO_MESSAGE,
                         MessageType.INCOGNITO_REAUTH_PROMO_MESSAGE);
-        verify(mTabListCoordinator)
+        verify(mTabListCoordinator, never())
                 .removeSpecialListItem(
                         UiType.ARCHIVED_TABS_MESSAGE, MessageType.ARCHIVED_TABS_MESSAGE);
         verify(mMessageUpdateObserver).onRemoveAllAppendedMessage();
@@ -340,7 +340,7 @@
                 .removeSpecialListItem(
                         UiType.INCOGNITO_REAUTH_PROMO_MESSAGE,
                         MessageType.INCOGNITO_REAUTH_PROMO_MESSAGE);
-        verify(mTabListCoordinator)
+        verify(mTabListCoordinator, never())
                 .removeSpecialListItem(
                         UiType.ARCHIVED_TABS_MESSAGE, MessageType.ARCHIVED_TABS_MESSAGE);
         verify(mTabListCoordinator)
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
index 3f65040..15e997b 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
@@ -1787,6 +1787,35 @@
     }
 
     @Test
+    public void testTabAddition_withArchivedTabsMessagePresent() {
+        mModelList.clear();
+        PropertyModel model = mock(PropertyModel.class);
+        when(model.get(CARD_TYPE)).thenReturn(MESSAGE);
+        when(model.get(MESSAGE_TYPE)).thenReturn(ARCHIVED_TABS_MESSAGE);
+        when(model.containsKeyEqualTo(MESSAGE_TYPE, ARCHIVED_TABS_MESSAGE)).thenReturn(true);
+        mMediator.addSpecialItemToModel(0, UiType.ARCHIVED_TABS_MESSAGE, model);
+
+        assertThat(mModelList.size(), equalTo(1));
+
+        Tab newTab = prepareTab(TAB3_ID, TAB3_TITLE, TAB3_URL);
+        doReturn(newTab).when(mTabGroupModelFilter).getRepresentativeTabAt(0);
+        doReturn(1).when(mTabGroupModelFilter).getIndividualTabAndGroupCount();
+        doReturn(Arrays.asList(newTab)).when(mTabGroupModelFilter).getRelatedTabList(eq(TAB3_ID));
+
+        mTabModelObserverCaptor
+                .getValue()
+                .didAddTab(
+                        newTab,
+                        TabLaunchType.FROM_CHROME_UI,
+                        TabCreationState.LIVE_IN_FOREGROUND,
+                        false);
+
+        assertThat(mModelList.size(), equalTo(2));
+        assertThat(mModelList.get(0).model.get(MESSAGE_TYPE), equalTo(ARCHIVED_TABS_MESSAGE));
+        assertThat(mModelList.get(1).model.get(TabProperties.TAB_ID), equalTo(TAB3_ID));
+    }
+
+    @Test
     public void tabMergeIntoGroup() {
         // Assume that moveTab in TabModel is finished. Selected tab in the group becomes mTab1.
         doReturn(mTab1).when(mTabModel).getTabAt(POSITION2);
diff --git a/chrome/android/java/res/layout/new_tab_page_layout.xml b/chrome/android/java/res/layout/new_tab_page_layout.xml
index b509364..6e3de085 100644
--- a/chrome/android/java/res/layout/new_tab_page_layout.xml
+++ b/chrome/android/java/res/layout/new_tab_page_layout.xml
@@ -37,7 +37,7 @@
         android:layout_marginStart="@dimen/mvt_container_lateral_margin"
         android:layout_marginEnd="@dimen/mvt_container_lateral_margin"
         android:layout="@layout/composeplate_view_layout"
-        android:visibility="gone" />
+        />
 
     <ViewStub
         android:id="@+id/composeplate_view_v2_stub"
@@ -47,7 +47,7 @@
         android:layout_marginStart="@dimen/mvt_container_lateral_margin"
         android:layout_marginEnd="@dimen/mvt_container_lateral_margin"
         android:layout="@layout/composeplate_view_layout_v2"
-        android:visibility="gone" />
+        />
 
     <!-- Query tiles -->
     <FrameLayout
@@ -78,7 +78,7 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout="@layout/home_modules_recycler_view_layout"
-        android:visibility="gone" />
+        />
 
     <!-- Single tab card -->
     <ViewStub
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/CombinedTabRestorer.java b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/CombinedTabRestorer.java
new file mode 100644
index 0000000..3c8850e3
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/CombinedTabRestorer.java
@@ -0,0 +1,297 @@
+// 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.
+
+package org.chromium.chrome.browser.app.tabmodel;
+
+import static org.chromium.build.NullUtil.assumeNonNull;
+
+import android.os.SystemClock;
+
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+import org.chromium.chrome.browser.app.tabmodel.TabRestorer.TabRestorerDelegate;
+import org.chromium.chrome.browser.tab.StorageLoadedData;
+import org.chromium.chrome.browser.tab.TabId;
+import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
+
+/**
+ * A thin wrapper around two {@link TabRestorer}s, one for regular tabs and one for incognito tabs.
+ * This class has its own delegate interface that only emits signals when both the regular and
+ * incognito tab restorers have finished a stage.
+ */
+@NullMarked
+class CombinedTabRestorer {
+    /** Delegate for the {@link CombinedTabRestorer}. */
+    public interface CombinedTabRestorerDelegate {
+        /**
+         * Called once both the regular and incognito tab restorer have been loaded.
+         *
+         * @param loadedTabCount The number of tabs that were loaded.
+         */
+        void onLoadFinished(int loadedTabCount);
+
+        /** Called once both the regular and incognito tab restorer have been cancelled. */
+        void onCancelled();
+
+        /** Called once both the regular and incognito tab restorer have been finished. */
+        void onRestoreFinished();
+
+        /**
+         * Called when the details of a tab have been read {@see
+         * TabPersistentStoreObserver#onDetailsRead}.
+         */
+        void onDetailsRead(
+                int index,
+                @TabId int tabId,
+                String url,
+                boolean isStandardActiveIndex,
+                boolean isIncognitoActiveIndex,
+                boolean isIncognito,
+                boolean fromMerge);
+    }
+
+    private final TabRestorerDelegate mDelegate;
+    private final TabRestorer mRegularTabRestorer;
+    private final @Nullable TabRestorer mIncognitoTabRestorer;
+    private final long mLoadStartTime;
+
+    /**
+     * Tracks the state of a tab restorer. This is used to determine when to send the signals to the
+     * {@link CombinedTabRestorerDelegate}.
+     */
+    private static class RestoreState {
+        private boolean mIsCancelled;
+        private boolean mIsFinished;
+        private boolean mIsLoadFinished;
+
+        RestoreState() {}
+
+        void setLoadFinished() {
+            mIsLoadFinished = true;
+        }
+
+        void setCancelled() {
+            mIsCancelled = true;
+        }
+
+        void setFinished() {
+            mIsFinished = true;
+        }
+
+        void setAll() {
+            mIsLoadFinished = true;
+            mIsCancelled = true;
+            mIsFinished = true;
+        }
+
+        boolean isLoadFinished() {
+            return mIsLoadFinished;
+        }
+
+        boolean isCancelled() {
+            return mIsCancelled;
+        }
+
+        boolean isFinishedOrCancelled() {
+            return (mIsFinished || mIsCancelled);
+        }
+    }
+
+    private class TabRestorerDelegateImpl implements TabRestorerDelegate {
+        private final CombinedTabRestorerDelegate mOrchestratorDelegate;
+        private final RestoreState mRegularState = new RestoreState();
+        private final RestoreState mIncognitoState = new RestoreState();
+        private int mRestoredTabCount;
+
+        TabRestorerDelegateImpl(
+                CombinedTabRestorerDelegate delegate, boolean restoreIncognitoTabs) {
+            mOrchestratorDelegate = delegate;
+            if (!restoreIncognitoTabs) {
+                mIncognitoState.setAll();
+            }
+        }
+
+        @Override
+        public void onDataLoaded(boolean incognito, int count) {
+            mRestoredTabCount += count;
+            RestoreState state = incognito ? mIncognitoState : mRegularState;
+            state.setLoadFinished();
+
+            if (mRegularState.isLoadFinished() && mIncognitoState.isLoadFinished()) {
+                long duration = SystemClock.elapsedRealtime() - mLoadStartTime;
+                RecordHistogram.recordTimesHistogram(
+                        "Tabs.TabStateStore.LoadAllTabsDuration", duration);
+                mOrchestratorDelegate.onLoadFinished(mRestoredTabCount);
+            }
+        }
+
+        @Override
+        public void onCancelled(boolean incognito) {
+            RestoreState state = incognito ? mIncognitoState : mRegularState;
+            assert state.isLoadFinished();
+            state.setCancelled();
+
+            if (mRegularState.isCancelled() && mIncognitoState.isCancelled()) {
+                mOrchestratorDelegate.onCancelled();
+                return;
+            }
+            // If only one of the tab restorers is cancelled it is a successful load. Either send
+            // the finished signal or start the remaining tab restorer.
+            sendOnFinishedOrStartRemainingTabRestorer();
+        }
+
+        @Override
+        public void onFinished(boolean incognito) {
+            RestoreState state = incognito ? mIncognitoState : mRegularState;
+            assert state.isLoadFinished();
+            state.setFinished();
+
+            sendOnFinishedOrStartRemainingTabRestorer();
+        }
+
+        @Override
+        public void onDetailsRead(
+                int index,
+                @TabId int tabId,
+                String url,
+                boolean isStandardActiveIndex,
+                boolean isIncognitoActiveIndex,
+                boolean isIncognito,
+                boolean fromMerge) {
+            mOrchestratorDelegate.onDetailsRead(
+                    index,
+                    tabId,
+                    url,
+                    isStandardActiveIndex,
+                    isIncognitoActiveIndex,
+                    isIncognito,
+                    fromMerge);
+        }
+
+        private void sendOnFinishedOrStartRemainingTabRestorer() {
+            // If both tab restorers are done (finished or cancelled) send the signal that the
+            // restore is finished. The special case of both being cancelled is handled by the
+            // callers of this method.
+            if (mRegularState.isFinishedOrCancelled() && mIncognitoState.isFinishedOrCancelled()) {
+                mOrchestratorDelegate.onRestoreFinished();
+                return;
+            }
+
+            if (mRegularState.isFinishedOrCancelled()) {
+                assert !mIncognitoState.isFinishedOrCancelled();
+                assumeNonNull(mIncognitoTabRestorer);
+                mIncognitoTabRestorer.start(/* restoreActiveTabImmediately= */ false);
+            } else if (mIncognitoState.isFinishedOrCancelled()) {
+                assert !mRegularState.isFinishedOrCancelled();
+                mRegularTabRestorer.start(/* restoreActiveTabImmediately= */ false);
+            } else {
+                assert false : "Not reached.";
+            }
+        }
+    }
+
+    /**
+     * @param restoreIncognitoTabs Whether to restore incognito tabs.
+     * @param delegate The delegate to be notified of events from the tab restorers.
+     * @param tabCreatorManager The tab creator manager to create the tabs.
+     */
+    CombinedTabRestorer(
+            boolean restoreIncognitoTabs,
+            CombinedTabRestorerDelegate delegate,
+            TabCreatorManager tabCreatorManager) {
+        mDelegate = new TabRestorerDelegateImpl(delegate, restoreIncognitoTabs);
+        mRegularTabRestorer =
+                new TabRestorer(
+                        /* incognito= */ false,
+                        mDelegate,
+                        tabCreatorManager.getTabCreator(/* incognito= */ false));
+        mIncognitoTabRestorer =
+                restoreIncognitoTabs
+                        ? new TabRestorer(
+                                /* incognito= */ true,
+                                mDelegate,
+                                tabCreatorManager.getTabCreator(/* incognito= */ true))
+                        : null;
+        mLoadStartTime = SystemClock.elapsedRealtime();
+    }
+
+    /**
+     * Should be called when the data for one of the models has been loaded.
+     *
+     * @param data The data loaded from storage.
+     * @param incognito Whether the data is for the incognito tab restorer.
+     */
+    void onDataLoaded(StorageLoadedData data, boolean incognito) {
+        if (incognito) {
+            assumeNonNull(mIncognitoTabRestorer);
+            mIncognitoTabRestorer.onDataLoaded(data);
+        } else {
+            mRegularTabRestorer.onDataLoaded(data);
+        }
+    }
+
+    /**
+     * Starts the restoration of the currently selected model. The other model will be started once
+     * the selected model has finished loading. These operations can be cancelled together or
+     * separately.
+     *
+     * @param isIncognitoSelected Whether the incognito tab restorer should be started.
+     * @param restoreActiveTabImmediately Whether the active tab should be restored immediately. If
+     *     false another tab may have already been created and activated so this should just restore
+     *     the active tab as if it were any other tab.
+     */
+    void start(boolean isIncognitoSelected, boolean restoreActiveTabImmediately) {
+        if (isIncognitoSelected && mIncognitoTabRestorer != null) {
+            mIncognitoTabRestorer.start(restoreActiveTabImmediately);
+        } else {
+            mRegularTabRestorer.start(restoreActiveTabImmediately);
+        }
+    }
+
+    /** Cancels the restoration of both the regular and incognito tab restorers. */
+    void cancel() {
+        mRegularTabRestorer.cancel();
+        if (mIncognitoTabRestorer != null) {
+            mIncognitoTabRestorer.cancel();
+        }
+    }
+
+    /**
+     * Cancels the restoration of the tab restorer as specified by the incognito parameter.
+     *
+     * @param incognito Whether to cancel the incognito or regular tab restorer.
+     */
+    void cancelLoadingTabs(boolean incognito) {
+        if (!incognito) {
+            mRegularTabRestorer.cancel();
+        } else if (mIncognitoTabRestorer != null) {
+            mIncognitoTabRestorer.cancel();
+        }
+    }
+
+    /**
+     * Restores the tab state for the given URL.
+     *
+     * @param url The URL to restore the tab state for.
+     */
+    void restoreTabStateForUrl(String url) {
+        boolean success = mRegularTabRestorer.restoreTabStateForUrl(url);
+        if (!success && mIncognitoTabRestorer != null) {
+            mIncognitoTabRestorer.restoreTabStateForUrl(url);
+        }
+    }
+
+    /**
+     * Restores the tab state for the given tab ID.
+     *
+     * @param tabId The tab ID to restore the tab state for.
+     */
+    void restoreTabStateForId(@TabId int tabId) {
+        boolean success = mRegularTabRestorer.restoreTabStateForId(tabId);
+        if (!success && mIncognitoTabRestorer != null) {
+            mIncognitoTabRestorer.restoreTabStateForId(tabId);
+        }
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabRestorer.java b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabRestorer.java
index ffa4323..5b7dab7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabRestorer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabRestorer.java
@@ -18,7 +18,7 @@
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabId;
 import org.chromium.chrome.browser.tab.TabState;
-import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
+import org.chromium.chrome.browser.tabmodel.TabCreator;
 import org.chromium.chrome.browser.tabmodel.TabGroupVisualDataStore;
 
 import java.lang.annotation.ElementType;
@@ -64,17 +64,29 @@
 
     interface TabRestorerDelegate {
         /**
-         * Called when all the data is loaded.
+         * Called when all the data is loaded. This is guaranteed to be called before onCancelled or
+         * onFinished.
          *
+         * @param incognito Whether the data is for incognito tabs.
          * @param restoredTabCount The number of tabs that were restored.
          */
-        void onDataLoaded(int restoredTabCount);
+        void onDataLoaded(boolean incognito, int restoredTabCount);
 
-        /** Called when the tab restorer is cancelled. */
-        void onCancelled();
+        /**
+         * Called when the tab restorer is cancelled. It is guaranteed that only one of onCancelled
+         * or onFinished will be called.
+         *
+         * @param incognito Whether the tab restorer is for incognito tabs.
+         */
+        void onCancelled(boolean incognito);
 
-        /** Called when all tabs have been created. */
-        void onFinished();
+        /**
+         * Called when all tabs have been created. It is guaranteed that only one of onCancelled or
+         * onFinished will be called.
+         *
+         * @param incognito Whether the tab restorer is for incognito tabs.
+         */
+        void onFinished(boolean incognito);
 
         /**
          * Called when the details of a tab have been read {@see
@@ -90,8 +102,9 @@
                 boolean fromMerge);
     }
 
+    private final boolean mIncognito;
     private final TabRestorerDelegate mDelegate;
-    private final TabCreatorManager mTabCreatorManager;
+    private final TabCreator mTabCreator;
     private final List<Integer> mTabIdsToIgnore = new ArrayList<>();
 
     private @State int mState = State.EMPTY;
@@ -106,12 +119,14 @@
     private int mIndex;
 
     /**
+     * @param incognito Whether the tab restorer is for incognito tabs.
      * @param delegate The delegate to notify when the tab restorer for certain events.
-     * @param tabCreatorManager The tab creator manager to use to create tabs.
+     * @param tabCreator The tab creator to use to create tabs.
      */
-    TabRestorer(TabRestorerDelegate delegate, TabCreatorManager tabCreatorManager) {
+    TabRestorer(boolean incognito, TabRestorerDelegate delegate, TabCreator tabCreator) {
+        mIncognito = incognito;
         mDelegate = delegate;
-        mTabCreatorManager = tabCreatorManager;
+        mTabCreator = tabCreator;
     }
 
     /**
@@ -126,7 +141,7 @@
         // Special case for when cancellation happened during loading. In this case we cancel as
         // soon as loading has finished.
         if (mState == State.CANCELLED) {
-            mDelegate.onDataLoaded(restoredTabCount);
+            mDelegate.onDataLoaded(mIncognito, restoredTabCount);
             cancelInternal();
             return;
         }
@@ -134,14 +149,14 @@
         // Start was already called before the load finished. Start immediately.
         if (mState == State.RESTORE_ONCE_LOADED) {
             mState = State.LOADED;
-            mDelegate.onDataLoaded(restoredTabCount);
+            mDelegate.onDataLoaded(mIncognito, restoredTabCount);
             start(mRestoreActiveTabImmediately);
             return;
         }
 
         assert mState == State.EMPTY;
         mState = State.LOADED;
-        mDelegate.onDataLoaded(restoredTabCount);
+        mDelegate.onDataLoaded(mIncognito, restoredTabCount);
     }
 
     /**
@@ -193,9 +208,10 @@
      * second time.
      *
      * @param url The URL to restore the tab state for.
+     * @return Whether a tab was restored.
      */
-    public void restoreTabStateForUrl(String url) {
-        restoreTabStateByPredicate(
+    public boolean restoreTabStateForUrl(String url) {
+        return restoreTabStateByPredicate(
                 loadedTabState -> {
                     var contentsState = loadedTabState.tabState.contentsState;
                     return contentsState != null
@@ -210,9 +226,10 @@
      * a second time.
      *
      * @param tabId The tab ID to restore the tab state for.
+     * @return Whether a tab was restored.
      */
-    public void restoreTabStateForId(@TabId int tabId) {
-        restoreTabStateByPredicate(loadedTabState -> loadedTabState.tabId == tabId);
+    public boolean restoreTabStateForId(@TabId int tabId) {
+        return restoreTabStateByPredicate(loadedTabState -> loadedTabState.tabId == tabId);
     }
 
     /**
@@ -233,7 +250,7 @@
     private void cancelInternal() {
         if (mData != null) {
             cleanupStorageLoadedData();
-            mDelegate.onCancelled();
+            mDelegate.onCancelled(mIncognito);
         }
     }
 
@@ -249,7 +266,7 @@
         assert mState == State.FINISHING;
         mState = State.FINISHED;
         cleanupStorageLoadedData();
-        mDelegate.onFinished();
+        mDelegate.onFinished(mIncognito);
     }
 
     /** Cleans up the {@link StorageLoadedData}. */
@@ -262,12 +279,12 @@
         mData = null;
     }
 
-    private void restoreTabStateByPredicate(Predicate<LoadedTabState> predicate) {
+    private boolean restoreTabStateByPredicate(Predicate<LoadedTabState> predicate) {
         if (mData == null
                 || mState == State.CANCELLED
                 || mState == State.FINISHING
                 || mState == State.FINISHED) {
-            return;
+            return false;
         }
 
         LoadedTabState[] loadedTabStates = mData.getLoadedTabStates();
@@ -275,10 +292,11 @@
             LoadedTabState loadedTabState = loadedTabStates[i];
             if (!mTabIdsToIgnore.contains(loadedTabState.tabId) && predicate.test(loadedTabState)) {
                 mTabIdsToIgnore.add(loadedTabState.tabId);
-                restoreTab(loadedTabState, i, /* isIncognito= */ false, /* isActive= */ false);
-                return;
+                restoreTab(loadedTabState, i, /* isActive= */ false);
+                return true;
             }
         }
+        return false;
     }
 
     /**
@@ -299,11 +317,9 @@
                         ? activeTabIndex
                         : 0;
         LoadedTabState activeTabState = loadedTabStates[restoredActiveTabIndex];
-        // TODO(https://crbug.com/451614469): Handle incognito.
         restoreTab(
                 activeTabState,
                 restoredActiveTabIndex,
-                /* isIncognito= */ false,
                 /* isActive= */ true);
 
         if (loadedTabStates.length == 1) {
@@ -319,16 +335,15 @@
      *
      * @param loadedTabState The tab state to restore.
      * @param index The index of the tab to restore.
-     * @param isIncognito Whether the tab is in incognito mode.
      * @param isActive Whether the tab is the active tab.
      */
-    private void restoreTab(
-            LoadedTabState loadedTabState, int index, boolean isIncognito, boolean isActive) {
+    private void restoreTab(LoadedTabState loadedTabState, int index, boolean isActive) {
         assert mState == State.RESTORING;
         @TabId int tabId = loadedTabState.tabId;
-        Tab tab = resolveTab(loadedTabState.tabState, tabId, index, isIncognito);
+        Tab tab = resolveTab(loadedTabState.tabState, tabId, index);
         if (tab == null) return;
 
+        boolean isIncognito = mIncognito;
         mDelegate.onDetailsRead(
                 index,
                 tabId,
@@ -356,8 +371,7 @@
         while (batchSize > 0 && mIndex < finalIndex) {
             LoadedTabState loadedTabState = loadedTabStates[mIndex];
             if (!mTabIdsToIgnore.contains(loadedTabState.tabId)) {
-                // TODO(https://crbug.com/451614469): Handle incognito.
-                restoreTab(loadedTabState, mIndex, /* isIncognito= */ false, /* isActive= */ false);
+                restoreTab(loadedTabState, mIndex, /* isActive= */ false);
             }
 
             mIndex++;
@@ -371,14 +385,11 @@
         }
     }
 
-    private @Nullable Tab resolveTab(
-            TabState tabState, @TabId int tabId, int index, boolean isIncognito) {
+    private @Nullable Tab resolveTab(TabState tabState, @TabId int tabId, int index) {
         if (tabState.contentsState == null || tabState.contentsState.buffer().limit() <= 0) {
             return null;
         }
 
-        return mTabCreatorManager
-                .getTabCreator(isIncognito)
-                .createFrozenTab(tabState, tabId, index);
+        return mTabCreator.createFrozenTab(tabState, tabId, index);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabStateStore.java b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabStateStore.java
index 79d2b97..b079821 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabStateStore.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/TabStateStore.java
@@ -6,14 +6,11 @@
 
 import static org.chromium.build.NullUtil.assumeNonNull;
 
-import android.os.SystemClock;
-
 import org.chromium.base.ObserverList;
 import org.chromium.base.Token;
-import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
-import org.chromium.chrome.browser.app.tabmodel.TabRestorer.TabRestorerDelegate;
+import org.chromium.chrome.browser.app.tabmodel.CombinedTabRestorer.CombinedTabRestorerDelegate;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.CollectionSaveForwarder;
@@ -89,7 +86,7 @@
             };
 
     private @Nullable TabModelSelectorTabRegistrationObserver mTabRegistrationObserver;
-    private @Nullable TabRestorer mTabRestorer;
+    private @Nullable CombinedTabRestorer mCombinedTabRestorer;
     private @Nullable Runnable mInitRestoreOrchestratorForIncognito;
     private @Nullable StorageCollectionSynchronizer mIncognitoSynchronizer;
     private @Nullable StorageCollectionSynchronizer mRegularSynchronizer;
@@ -163,11 +160,11 @@
                 }
             };
 
-    private final TabRestorerDelegate mTabRestorerDelegate =
-            new TabRestorerDelegate() {
+    private final CombinedTabRestorerDelegate mCombinedTabRestorerDelegate =
+            new CombinedTabRestorerDelegate() {
                 @Override
-                public void onDataLoaded(int restoredTabCount) {
-                    onAllDataLoaded(restoredTabCount);
+                public void onLoadFinished(int loadedTabCount) {
+                    onAllDataLoaded(loadedTabCount);
                 }
 
                 @Override
@@ -176,7 +173,7 @@
                 }
 
                 @Override
-                public void onFinished() {
+                public void onRestoreFinished() {
                     onFinishedCreatingAllTabs();
                 }
 
@@ -262,39 +259,47 @@
 
     @Override
     public void loadState(boolean ignoreIncognitoFiles) {
-        assert mTabRestorer == null;
-        mTabRestorer = new TabRestorer(mTabRestorerDelegate, mTabCreatorManager);
-        // TODO(https://crbug.com/458335579): Handle including or ignoring incognito tabs.
-        long loadStartTime = SystemClock.elapsedRealtime();
-        boolean incognito = false;
-        mTabStateStorageService.loadAllData(
-                mWindowTag, incognito, data -> onDataLoaded(data, incognito, loadStartTime));
+        assert mCombinedTabRestorer == null;
+        mCombinedTabRestorer =
+                new CombinedTabRestorer(
+                        !ignoreIncognitoFiles, mCombinedTabRestorerDelegate, mTabCreatorManager);
+
+        boolean[] restoreOrder =
+                mTabModelSelector.isIncognitoSelected()
+                        ? new boolean[] {true, false}
+                        : new boolean[] {false, true};
+        for (boolean incognito : restoreOrder) {
+            if (incognito && ignoreIncognitoFiles) continue;
+            mTabStateStorageService.loadAllData(
+                    mWindowTag, incognito, data -> onDataLoaded(data, incognito));
+        }
     }
 
     @Override
     public void mergeState() {
         // This is only invoked for SDK versions less than API 31. Currently this is not supported.
         // TODO(https://crbug.com/463956290): Decide whether to support this behavior or limit the
-        // new system to API 31+.
+        // new system to API 31+. This could be accomplished with a separate queue of
+        // CombinedTabRestorers for merging.
         assert false;
     }
 
     @Override
     public void restoreTabs(boolean setActiveTab) {
-        assert mTabRestorer != null;
-        mTabRestorer.start(setActiveTab);
+        assert mCombinedTabRestorer != null;
+        mCombinedTabRestorer.start(mTabModelSelector.isIncognitoSelected(), setActiveTab);
     }
 
     @Override
     public void restoreTabStateForUrl(String url) {
-        if (mTabRestorer == null) return;
-        mTabRestorer.restoreTabStateForUrl(url);
+        if (mCombinedTabRestorer == null) return;
+        mCombinedTabRestorer.restoreTabStateForUrl(url);
     }
 
     @Override
     public void restoreTabStateForId(int id) {
-        if (mTabRestorer == null) return;
-        mTabRestorer.restoreTabStateForId(id);
+        if (mCombinedTabRestorer == null) return;
+        mCombinedTabRestorer.restoreTabStateForId(id);
     }
 
     @Override
@@ -309,10 +314,9 @@
     }
 
     private void cancelLoadingTabs(boolean incognito) {
-        // TODO(https://crbug.com/451614469): Handle incognito.
-        if (incognito || mTabRestorer == null) return;
+        if (mCombinedTabRestorer == null) return;
 
-        mTabRestorer.cancel();
+        mCombinedTabRestorer.cancelLoadingTabs(incognito);
     }
 
     @Override
@@ -324,9 +328,9 @@
             mTabRegistrationObserver.destroy();
         }
 
-        if (mTabRestorer != null) {
-            mTabRestorer.cancel();
-            mTabRestorer = null;
+        if (mCombinedTabRestorer != null) {
+            mCombinedTabRestorer.cancel();
+            mCombinedTabRestorer = null;
         }
 
         mTabModelSelector.getModel(false).removeObserver(mTabModelObserver);
@@ -429,14 +433,12 @@
     }
 
     /** Called when the data for one of the models has been loaded. */
-    private void onDataLoaded(StorageLoadedData data, boolean incognito, long loadStartTime) {
+    private void onDataLoaded(StorageLoadedData data, boolean incognito) {
         if (mIsDestroyed) {
             data.destroy();
             return;
         }
 
-        long duration = SystemClock.elapsedRealtime() - loadStartTime;
-        RecordHistogram.recordTimesHistogram("Tabs.TabStateStore.LoadAllTabsDuration", duration);
 
         if (ChromeFeatureList.sTabStorageSqlitePrototypeAuthoritativeReadSource.getValue()) {
             TabGroupVisualDataStore.cacheGroups(data.getGroupsData());
@@ -455,14 +457,14 @@
         }
 
         // TODO(ckitagawa): Change back to assert if the `mIsDestroyed` check is sufficient.
-        if (mTabRestorer != null) {
-            mTabRestorer.onDataLoaded(data);
+        if (mCombinedTabRestorer != null) {
+            mCombinedTabRestorer.onDataLoaded(data, incognito);
         }
     }
 
     /** Called after both the regular and incognito data has been loaded. */
-    private void onAllDataLoaded(int restoredTabCount) {
-        mRestoredTabCount = restoredTabCount;
+    private void onAllDataLoaded(int loadedTabCount) {
+        mRestoredTabCount = loadedTabCount;
         for (TabPersistentStoreObserver observer : mObservers) {
             observer.onInitialized(mRestoredTabCount);
         }
@@ -482,7 +484,7 @@
 
         if (mIsDestroyed) return;
 
-        mTabRestorer = null;
+        mCombinedTabRestorer = null;
 
         initCollectionTracking();
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
index 5ea16a3..2955994 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
@@ -294,6 +294,7 @@
             if (isMultiColumnSettingEnabled()) {
                 assert mMultiColumnSettings != null;
                 createMultiColumnTitleUpdater();
+                if (ChromeFeatureList.sSearchInSettings.isEnabled()) createSearchCoordinator();
             } else {
                 mTitleUpdater = new TitleUpdater();
                 fragmentManager.registerFragmentLifecycleCallbacks(
@@ -359,7 +360,6 @@
                                     createMultiColumTitleUpdaterInternal(
                                             v.findViewById(R.id.settings_title_in_detailed_pane));
                                     fm.unregisterFragmentLifecycleCallbacks(this);
-                                    createSearchCoordinator();
                                 }
                             },
                             false);
@@ -379,10 +379,9 @@
     }
 
     private void createSearchCoordinator() {
-        assert ChromeFeatureList.sSearchInSettings.isEnabled();
         Callback<Integer> updateFirstVisibleTitle =
                 isMultiColumnSettingEnabled()
-                        ? assumeNonNull(mMultiColumnTitleUpdater)::setFirstVisibleTitleIndex
+                        ? this::updateFirstVisibleTitle
                         : CallbackUtils.emptyCallback();
         mSearchCoordinator =
                 new SettingsSearchCoordinator(
@@ -395,6 +394,10 @@
         mSearchCoordinator.initializeSearchUi();
     }
 
+    private void updateFirstVisibleTitle(int index) {
+        assumeNonNull(mMultiColumnTitleUpdater).setFirstVisibleTitleIndex(index);
+    }
+
     private void onTitleTapped(@Nullable String entryName) {
         if (mSearchCoordinator != null) mSearchCoordinator.onTitleTapped(entryName);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninBridge.java
index 9efe8f0..7124453 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninBridge.java
@@ -6,7 +6,7 @@
 
 import static org.chromium.build.NullUtil.assumeNonNull;
 
-import android.annotation.SuppressLint;
+import android.accounts.AccountManager;
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
@@ -16,6 +16,7 @@
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JniType;
 
+import org.chromium.base.Callback;
 import org.chromium.base.ThreadUtils;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
@@ -42,10 +43,14 @@
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.AccountUtils;
 import org.chromium.components.signin.GAIAServiceType;
+import org.chromium.components.signin.SigninFeatureMap;
+import org.chromium.components.signin.SigninFeatures;
 import org.chromium.components.signin.base.AccountInfo;
+import org.chromium.components.signin.browser.WebSigninTrackerResult;
 import org.chromium.components.signin.identitymanager.IdentityManager;
 import org.chromium.components.signin.metrics.AccountConsistencyPromoAction;
 import org.chromium.components.signin.metrics.SigninAccessPoint;
+import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.url.GURL;
 
@@ -86,19 +91,24 @@
     /**
      * Starts a flow to add a Google account to the device.
      *
-     * @param windowAndroid The window to use for the flow.
+     * @param tab The target tab for the continueUrl navigation.
      * @param prefilledEmail The email address to prefill in the add account flow, or null if no
      *     email should be prefilled.
      * @param continueUrl The URL to navigate to after the account is added.
      */
-    // TODO(crbug.com/432009825): Remove when the redirection will be implemented.
-    @SuppressLint("UnusedVariable")
     @CalledByNative
     private static void startAddAccountFlow(
-            WindowAndroid windowAndroid,
+            Tab tab,
             @Nullable @JniType("std::string") String prefilledEmail,
             @JniType("GURL") GURL continueUrl) {
         ThreadUtils.assertOnUiThread();
+        WindowAndroid windowAndroid = tab.getWindowAndroid();
+        if (windowAndroid == null || !tab.isUserInteractable()) {
+            // The page is opened in the background, ignore the header. See
+            // https://crbug.com/1145031#c5 and https://crbug.com/323424409 for details.
+            return;
+        }
+        GURL initialTabURL = tab.getUrl();
         AccountManagerFacade accountManagerFacade = AccountManagerFacadeProvider.getInstance();
         accountManagerFacade.createAddAccountIntent(
                 prefilledEmail,
@@ -115,13 +125,55 @@
                     windowAndroid.showIntent(
                             intent,
                             (int resultCode, @Nullable Intent data) -> {
-                                // TODO(crbug.com/432009825): Wait for the Cookies to be available,
-                                // and navigate to the continue URL.
+                                @Nullable String addedAccountEmail =
+                                        data == null
+                                                ? prefilledEmail
+                                                : data.getStringExtra(
+                                                        AccountManager.KEY_ACCOUNT_NAME);
+                                if (SigninFeatureMap.isEnabled(
+                                                SigninFeatures.ENABLE_ADD_SESSION_REDIRECT)
+                                        && resultCode == Activity.RESULT_OK) {
+                                    waitForCookiesAndRedirect(
+                                            tab, addedAccountEmail, continueUrl, initialTabURL);
+                                }
                             },
                             null);
                 });
     }
 
+    /**
+     * Redirects to the continueUrl in the given tab if refresh tokens and cookies are minted for
+     * the account associated with the prefilledEmail.
+     */
+    private static void waitForCookiesAndRedirect(
+            Tab tab, @Nullable String prefilledEmail, GURL continueUrl, GURL initialTabURL) {
+        assert prefilledEmail != null;
+        new WebSigninBridge.Factory()
+                .createWithEmail(
+                        tab.getProfile(),
+                        prefilledEmail,
+                        createWebSigninBridgeCallback(tab, continueUrl, initialTabURL));
+    }
+
+    private static Callback<@WebSigninTrackerResult Integer> createWebSigninBridgeCallback(
+            Tab tab, GURL continueUrl, GURL initialTabURL) {
+        return (result) -> {
+            ThreadUtils.assertOnUiThread();
+            switch (result) {
+                case WebSigninTrackerResult.SUCCESS:
+                    if (!tab.isDestroyed() && tab.getUrl().equals(initialTabURL)) {
+                        tab.loadUrl(new LoadUrlParams(continueUrl));
+                    }
+                    break;
+                // TODO(crbug.com/456445865): Handle cases where WebSigninTracker returns an error.
+                case WebSigninTrackerResult.AUTH_ERROR:
+                    break;
+                case WebSigninTrackerResult.OTHER_ERROR:
+                    break;
+            }
+        };
+    }
+
     /** Opens account management screen. */
     @CalledByNative
     private static void openAccountManagementScreen(
diff --git a/chrome/android/javatests/BUILD.gn b/chrome/android/javatests/BUILD.gn
index ea31e8d..161660e 100644
--- a/chrome/android/javatests/BUILD.gn
+++ b/chrome/android/javatests/BUILD.gn
@@ -885,6 +885,7 @@
   sources = [
     "src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeIntentTest.java",
     "src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java",
+    "src/org/chromium/chrome/browser/notifications/TipsNotificationsTest.java",
     "src/org/chromium/chrome/browser/notifications/channels/SiteChannelsManagerTest.java",
   ]
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/TipsNotificationsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/TipsNotificationsTest.java
new file mode 100644
index 0000000..91b317d
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/TipsNotificationsTest.java
@@ -0,0 +1,179 @@
+// 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.
+
+package org.chromium.chrome.browser.notifications;
+
+import static androidx.test.espresso.Espresso.onView;
+import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
+import static androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
+import static androidx.test.espresso.matcher.ViewMatchers.withParent;
+import static androidx.test.espresso.matcher.ViewMatchers.withText;
+
+import static org.hamcrest.Matchers.allOf;
+
+import static org.chromium.ui.test.util.ViewUtils.onViewWaiting;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.widget.TextView;
+
+import androidx.appcompat.widget.Toolbar;
+import androidx.test.espresso.Espresso;
+import androidx.test.filters.MediumTest;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.util.Batch;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.Features.EnableFeatures;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.IntentHandler;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.browser.notifications.scheduler.TipsNotificationsFeatureType;
+import org.chromium.chrome.browser.notifications.tips.TipsPromoProperties.FeatureTipPromoData;
+import org.chromium.chrome.browser.notifications.tips.TipsUtils;
+import org.chromium.chrome.browser.tab.TabLaunchType;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
+
+/** Integration tests for tips notifications. */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@EnableFeatures({ChromeFeatureList.ANDROID_TIPS_NOTIFICATIONS})
+@Batch(Batch.PER_CLASS)
+public class TipsNotificationsTest {
+    @Rule
+    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
+
+    private Activity mActivity;
+
+    @Before
+    public void setUp() {
+        mActivityTestRule.startMainActivityOnBlankPage();
+        mActivity = mActivityTestRule.getActivity();
+    }
+
+    @Test
+    @MediumTest
+    public void testBottomSheetBackButtonAndDismiss() {
+        @TipsNotificationsFeatureType
+        int featureType = TipsNotificationsFeatureType.ENHANCED_SAFE_BROWSING;
+        FeatureTipPromoData data = TipsUtils.getFeatureTipPromoDataForType(mActivity, featureType);
+        showFeatureTipBottomSheet(featureType, data);
+
+        // Check that clicking the details button on the main page shows the detail page.
+        onView(
+                        allOf(
+                                withId(R.id.tips_promo_details_button),
+                                withText(R.string.tips_promo_bottom_sheet_negative_button_text)))
+                .check(matches(isDisplayed()))
+                .perform(click());
+        onViewWaiting(allOf(withId(R.id.details_page_title_text), withText(data.detailPageTitle)))
+                .check(matches(isDisplayed()));
+
+        // Check that clicking the back button on the detail page brings back the main page.
+        onView(withId(R.id.details_page_back_button))
+                .check(matches(isDisplayed()))
+                .perform(click());
+        onViewWaiting(allOf(withId(R.id.main_page_title_text), withText(data.mainPageTitle)))
+                .check(matches(isDisplayed()));
+
+        // Check that clicking the details button on the main page shows the detail page.
+        onView(
+                        allOf(
+                                withId(R.id.tips_promo_details_button),
+                                withText(R.string.tips_promo_bottom_sheet_negative_button_text)))
+                .check(matches(isDisplayed()))
+                .perform(click());
+        onViewWaiting(allOf(withId(R.id.details_page_title_text), withText(data.detailPageTitle)))
+                .check(matches(isDisplayed()));
+
+        // Check that backpress brings back the main page.
+        Espresso.pressBack();
+        onViewWaiting(allOf(withId(R.id.main_page_title_text), withText(data.mainPageTitle)))
+                .check(matches(isDisplayed()));
+
+        // Check that backpress dismisses the bottom sheet.
+        Espresso.pressBack();
+        onView(withId(R.id.bottom_sheet)).check(doesNotExist());
+    }
+
+    @Test
+    @MediumTest
+    public void testESBBottomSheetMainPageAccept() {
+        @TipsNotificationsFeatureType
+        int featureType = TipsNotificationsFeatureType.ENHANCED_SAFE_BROWSING;
+        FeatureTipPromoData data = TipsUtils.getFeatureTipPromoDataForType(mActivity, featureType);
+        showFeatureTipBottomSheet(featureType, data);
+
+        // Check that clicking the positive button on the main page opens up the safe browsing
+        // settings page.
+        onView(allOf(withId(R.id.tips_promo_settings_button), withText(data.positiveButtonText)))
+                .check(matches(isDisplayed()))
+                .perform(click());
+        onViewWaiting(
+                        allOf(
+                                withText(R.string.prefs_section_safe_browsing_title),
+                                isAssignableFrom(TextView.class),
+                                withParent(isAssignableFrom(Toolbar.class))))
+                .check(matches(isDisplayed()));
+    }
+
+    @Test
+    @MediumTest
+    public void testESBBottomSheetDetailPageAccept() {
+        @TipsNotificationsFeatureType
+        int featureType = TipsNotificationsFeatureType.ENHANCED_SAFE_BROWSING;
+        FeatureTipPromoData data = TipsUtils.getFeatureTipPromoDataForType(mActivity, featureType);
+        showFeatureTipBottomSheet(featureType, data);
+
+        // Check that clicking the details button on the main page shows the detail page.
+        onView(
+                        allOf(
+                                withId(R.id.tips_promo_details_button),
+                                withText(R.string.tips_promo_bottom_sheet_negative_button_text)))
+                .check(matches(isDisplayed()))
+                .perform(click());
+        onViewWaiting(allOf(withId(R.id.details_page_title_text), withText(data.detailPageTitle)))
+                .check(matches(isDisplayed()));
+
+        // Check that clicking the positive button on the detail page opens up the safe browsing
+        // settings page.
+        onView(
+                        allOf(
+                                withId(R.id.tips_promo_details_settings_button),
+                                withText(data.positiveButtonText)))
+                .check(matches(isDisplayed()))
+                .perform(click());
+        onViewWaiting(
+                        allOf(
+                                withText(R.string.prefs_section_safe_browsing_title),
+                                isAssignableFrom(TextView.class),
+                                withParent(isAssignableFrom(Toolbar.class))))
+                .check(matches(isDisplayed()));
+    }
+
+    private void showFeatureTipBottomSheet(
+            @TipsNotificationsFeatureType int featureType, FeatureTipPromoData data) {
+        Intent intent = IntentHandler.createTrustedOpenNewTabIntent(mActivity, false);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        intent.putExtra(IntentHandler.EXTRA_TIPS_NOTIFICATION_FEATURE_TYPE, featureType);
+        IntentHandler.setTabLaunchType(intent, TabLaunchType.FROM_TIPS_NOTIFICATIONS);
+        mActivity.startActivity(intent);
+
+        onViewWaiting(withId(R.id.bottom_sheet)).check(matches(isDisplayed()));
+        onView(allOf(withId(R.id.main_page_title_text), withText(data.mainPageTitle)))
+                .check(matches(isDisplayed()));
+        onView(allOf(withId(R.id.main_page_description_text), withText(data.mainPageDescription)))
+                .check(matches(isDisplayed()));
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/IncognitoNtpOmniboxAutofocusManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/IncognitoNtpOmniboxAutofocusManagerTest.java
index 468af066..b23f76d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/IncognitoNtpOmniboxAutofocusManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/IncognitoNtpOmniboxAutofocusManagerTest.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.ntp;
 
+import android.view.View;
+
 import androidx.test.espresso.Espresso;
 import androidx.test.espresso.action.ViewActions;
 import androidx.test.espresso.matcher.ViewMatchers;
@@ -12,7 +14,6 @@
 import org.hamcrest.Matchers;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -23,6 +24,7 @@
 import org.chromium.base.test.util.Criteria;
 import org.chromium.base.test.util.CriteriaHelper;
 import org.chromium.base.test.util.DisabledTest;
+import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Features.DisableFeatures;
 import org.chromium.base.test.util.Features.EnableFeatures;
 import org.chromium.base.test.util.Restriction;
@@ -41,6 +43,7 @@
 import org.chromium.chrome.test.transit.page.CtaPageStation;
 import org.chromium.chrome.test.transit.page.TabSwitcherActionMenuFacility;
 import org.chromium.chrome.test.transit.page.WebPageStation;
+import org.chromium.chrome.test.util.ChromeRenderTestRule;
 import org.chromium.chrome.test.util.NewTabPageTestUtils;
 import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.ui.KeyboardVisibilityDelegate;
@@ -48,14 +51,25 @@
 import org.chromium.ui.test.util.DeviceRestriction;
 
 /** Tests for {@link IncognitoNtpOmniboxAutofocusManager}. */
-@Ignore(
-        "crbug.com/465164165: Test class is flaky - disabling one test causes the next test to"
-                + " flake")
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
-@DisableFeatures(ChromeFeatureList.ANDROID_BOTTOM_TOOLBAR_V2)
 @Batch(Batch.PER_CLASS)
 public class IncognitoNtpOmniboxAutofocusManagerTest {
+    /**
+     * The maximum time to wait for omnibox focus and keyboard visibility. On some devices the
+     * software keyboard is slow to appear.
+     */
+    private static final long VERIFY_FOCUS_MAX_TIME_TO_POLL_MS = 30000L;
+
+    /** The polling interval to wait between checking for omnibox focus and keyboard visibility. */
+    private static final long VERIFY_FOCUS_POLLING_INTERVAL_MS = 50;
+
+    @Rule
+    public ChromeRenderTestRule mRenderTestRule =
+            ChromeRenderTestRule.Builder.withPublicCorpus()
+                    .setBugComponent(ChromeRenderTestRule.Component.UI_BROWSER_INCOGNITO)
+                    .build();
+
     @Rule
     public FreshCtaTransitTestRule mActivityTestRule =
             ChromeTransitTestRules.freshChromeTabbedActivityRule();
@@ -112,6 +126,7 @@
     @MediumTest
     @EnableFeatures(ChromeFeatureList.OMNIBOX_AUTOFOCUS_ON_INCOGNITO_NTP)
     @Restriction({DeviceFormFactor.TABLET_OR_DESKTOP, DeviceRestriction.RESTRICTION_TYPE_NON_AUTO})
+    @DisabledTest(message = "crbug.com/461578876: Disabled due to flakiness")
     public void whenReturnedAfterNavigating_autofocusFails_tabletOrDesktopNonAuto() {
         // Open an incognito NTP.
         IncognitoNewTabPageStation ntpPage = mInitialPage.openNewIncognitoTabOrWindowFast();
@@ -153,6 +168,7 @@
     @MediumTest
     @EnableFeatures(ChromeFeatureList.OMNIBOX_AUTOFOCUS_ON_INCOGNITO_NTP)
     @Restriction({DeviceFormFactor.TABLET_OR_DESKTOP, DeviceRestriction.RESTRICTION_TYPE_NON_AUTO})
+    @DisabledTest(message = "crbug.com/461578876: Disabled due to flakiness")
     public void whenLaunchAsNotNtpFirst_autofocusFails_tabletOrDesktopNonAuto() {
         // Open a non-NTP incognito tab.
         IncognitoNewTabPageStation ntpPage = mInitialPage.openNewIncognitoTabOrWindowFast();
@@ -193,7 +209,7 @@
     @MediumTest
     @EnableFeatures(ChromeFeatureList.OMNIBOX_AUTOFOCUS_ON_INCOGNITO_NTP)
     @Restriction({DeviceFormFactor.TABLET_OR_DESKTOP, DeviceRestriction.RESTRICTION_TYPE_NON_AUTO})
-    @DisabledTest(message = "crbug.com/465746228")
+    @DisabledTest(message = "crbug.com/461578876: Disabled due to flakiness")
     public void whenLaunchFromTabSwitcher_autofocusSucceeds_tabletOrDesktopNonAuto() {
         // Open an incognito tab.
         IncognitoNewTabPageStation ntpPage = mInitialPage.openNewIncognitoTabOrWindowFast();
@@ -236,6 +252,7 @@
     @MediumTest
     @EnableFeatures(ChromeFeatureList.OMNIBOX_AUTOFOCUS_ON_INCOGNITO_NTP + ":not_first_tab/true")
     @Restriction({DeviceFormFactor.TABLET_OR_DESKTOP, DeviceRestriction.RESTRICTION_TYPE_NON_AUTO})
+    @DisabledTest(message = "crbug.com/461578876: Disabled due to flakiness")
     public void
             whenVeryFirstTabOpened_andNotFirstTabEnabled_autofocusFails_tabletOrDesktopNonAuto() {
         // With the not_first_tab feature enabled, autofocus should be skipped on the first
@@ -291,6 +308,7 @@
     @MediumTest
     @EnableFeatures(ChromeFeatureList.OMNIBOX_AUTOFOCUS_ON_INCOGNITO_NTP + ":with_prediction/true")
     @Restriction({DeviceFormFactor.TABLET_OR_DESKTOP, DeviceRestriction.RESTRICTION_TYPE_NON_AUTO})
+    @DisabledTest(message = "crbug.com/461578876: Disabled due to flakiness")
     public void whenEnoughSpaceWithPrediction_autofocusSucceeds_tabletOrDesktopNonAuto() {
         IncognitoNtpOmniboxAutofocusManager.setAutofocusAllowedWithPredictionForTesting(true);
 
@@ -316,6 +334,7 @@
     @EnableFeatures(
             ChromeFeatureList.OMNIBOX_AUTOFOCUS_ON_INCOGNITO_NTP + ":with_hardware_keyboard/true")
     @Restriction({DeviceFormFactor.TABLET_OR_DESKTOP, DeviceRestriction.RESTRICTION_TYPE_NON_AUTO})
+    @DisabledTest(message = "crbug.com/461578876: Disabled due to flakiness")
     public void
             whenHardwareKeyboardAttached_andWithHardwareKeyboardEnabled_autofocusSucceeds_tabletOrDesktopNonAuto() {
         IncognitoNtpOmniboxAutofocusManager.setIsHardwareKeyboardAttachedForTesting(true);
@@ -342,6 +361,7 @@
     @EnableFeatures(
             ChromeFeatureList.OMNIBOX_AUTOFOCUS_ON_INCOGNITO_NTP + ":with_hardware_keyboard/true")
     @Restriction({DeviceFormFactor.TABLET_OR_DESKTOP, DeviceRestriction.RESTRICTION_TYPE_NON_AUTO})
+    @DisabledTest(message = "crbug.com/461578876: Disabled due to flakiness")
     public void
             whenHardwareKeyboardNotAttached_andWithHardwareKeyboardEnabled_autofocusFails_tabletOrDesktopNonAuto() {
         IncognitoNtpOmniboxAutofocusManager.setIsHardwareKeyboardAttachedForTesting(false);
@@ -373,6 +393,7 @@
             ChromeFeatureList.OMNIBOX_AUTOFOCUS_ON_INCOGNITO_NTP
                     + ":not_first_tab/true/with_prediction/true")
     @Restriction({DeviceFormFactor.TABLET_OR_DESKTOP, DeviceRestriction.RESTRICTION_TYPE_NON_AUTO})
+    @DisabledTest(message = "crbug.com/461578876: Disabled due to flakiness")
     public void
             whenVeryFirstTabOpenedAndEnoughSpaceWithPrediction_autofocusSucceeds_tabletOrDesktopNonAuto() {
         // There is enough free space on incognito NTP for prediction, it should autofocus.
@@ -413,6 +434,7 @@
     @MediumTest
     @EnableFeatures(ChromeFeatureList.OMNIBOX_AUTOFOCUS_ON_INCOGNITO_NTP)
     @Restriction({DeviceFormFactor.TABLET_OR_DESKTOP, DeviceRestriction.RESTRICTION_TYPE_NON_AUTO})
+    @DisabledTest(message = "crbug.com/461578876: Disabled due to flakiness")
     public void whenAccessibilityToggled_autofocusBehaviorChanges_tabletOrDesktopNonAuto() {
         // By default, accessibility is disabled. Autofocus should work.
         IncognitoNewTabPageStation ntpPage1 = mInitialPage.openNewIncognitoTabOrWindowFast();
@@ -457,6 +479,7 @@
     @MediumTest
     @EnableFeatures(ChromeFeatureList.OMNIBOX_AUTOFOCUS_ON_INCOGNITO_NTP)
     @Restriction({DeviceFormFactor.TABLET_OR_DESKTOP, DeviceRestriction.RESTRICTION_TYPE_NON_AUTO})
+    @DisabledTest(message = "crbug.com/461578876: Disabled due to flakiness")
     public void
             whenAutofocusManagerInitializedWithExistingTab_autofocusSucceeds_tabletOrDesktopNonAuto() {
         // Autofocus works on a new launched Incognito tab.
@@ -474,6 +497,36 @@
         verifyNonPhoneOmniboxFocusAndKeyboardVisibility(true, ntpPage);
     }
 
+    @Test
+    @MediumTest
+    @Feature({"RenderTest"})
+    @EnableFeatures(ChromeFeatureList.OMNIBOX_AUTOFOCUS_ON_INCOGNITO_NTP)
+    @DisableFeatures(ChromeFeatureList.ANDROID_BOTTOM_TOOLBAR_V2)
+    @Restriction(DeviceFormFactor.PHONE)
+    public void testRender_incognitoNtpWithOmniboxAutofocus_toolbarTop() throws Exception {
+        final Tab incognitoNtpTab = mActivityTestRule.loadUrlInNewTab(UrlConstants.NTP_URL, true);
+        verifyPhoneOmniboxFocusAndKeyboardVisibility(true, incognitoNtpTab);
+
+        View view = mActivityTestRule.getActivity().findViewById(android.R.id.content);
+        mRenderTestRule.render(view, "incognito_ntp_omnibox_autofocus_toolbar_top");
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"RenderTest"})
+    @EnableFeatures({
+        ChromeFeatureList.OMNIBOX_AUTOFOCUS_ON_INCOGNITO_NTP,
+        ChromeFeatureList.ANDROID_BOTTOM_TOOLBAR_V2 + ":force_bottom_for_focused_omnibox/true"
+    })
+    @Restriction(DeviceFormFactor.PHONE)
+    public void testRender_incognitoNtpWithOmniboxAutofocus_toolbarBottom() throws Exception {
+        final Tab incognitoNtpTab = mActivityTestRule.loadUrlInNewTab(UrlConstants.NTP_URL, true);
+        verifyPhoneOmniboxFocusAndKeyboardVisibility(true, incognitoNtpTab);
+
+        View view = mActivityTestRule.getActivity().findViewById(android.R.id.content);
+        mRenderTestRule.render(view, "incognito_ntp_omnibox_autofocus_toolbar_bottom");
+    }
+
     private void verifyPhoneOmniboxFocusAndKeyboardVisibility(boolean enabled, @Nullable Tab tab) {
         CriteriaHelper.pollUiThread(
                 () -> {
@@ -493,7 +546,9 @@
                                         .isKeyboardShowing(tab.getView()),
                                 Matchers.is(enabled));
                     }
-                });
+                },
+                VERIFY_FOCUS_MAX_TIME_TO_POLL_MS,
+                VERIFY_FOCUS_POLLING_INTERVAL_MS);
     }
 
     private void verifyNonPhoneOmniboxFocusAndKeyboardVisibility(
@@ -517,7 +572,9 @@
                                         .isKeyboardShowing(tab.getView()),
                                 Matchers.is(enabled));
                     }
-                });
+                },
+                VERIFY_FOCUS_MAX_TIME_TO_POLL_MS,
+                VERIFY_FOCUS_POLLING_INTERVAL_MS);
     }
 
     private void setAccessibilityEnabled(boolean enabled) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarTest.java
index cf9cbfa..57ea600d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarTest.java
@@ -26,10 +26,10 @@
 import android.view.View;
 import android.view.ViewGroup.MarginLayoutParams;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.core.app.ApplicationProvider;
+import androidx.test.filters.LargeTest;
 import androidx.test.filters.MediumTest;
 import androidx.test.platform.app.InstrumentationRegistry;
 
@@ -53,6 +53,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Features.DisableFeatures;
 import org.chromium.base.test.util.Features.EnableFeatures;
+import org.chromium.base.test.util.ImportantFormFactors;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.ui.KeyboardUtils;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
@@ -81,6 +82,8 @@
 import org.chromium.chrome.test.R;
 import org.chromium.chrome.test.transit.ChromeTransitTestRules;
 import org.chromium.chrome.test.transit.FreshCtaTransitTestRule;
+import org.chromium.chrome.test.transit.ntp.IncognitoNewTabPageStation;
+import org.chromium.chrome.test.transit.ntp.RegularNewTabPageStation;
 import org.chromium.chrome.test.transit.page.WebPageStation;
 import org.chromium.chrome.test.util.ChromeTabUtils;
 import org.chromium.chrome.test.util.MenuUtils;
@@ -639,6 +642,37 @@
         }
     }
 
+    @Test
+    @LargeTest
+    // Disable opening windows side-by-side because home button might not show up on small windows.
+    @EnableFeatures({
+        ChromeFeatureList.ROBUST_WINDOW_MANAGEMENT_EXPERIMENTAL + ":open_adjacently/false"
+    })
+    @ImportantFormFactors(DeviceFormFactor.TABLET_OR_DESKTOP)
+    public void testHomeButton_loadsNtpOnSameTab() {
+        WebPageStation webPage = mPage;
+        webPage.homeButtonElement.checkPresent();
+
+        RegularNewTabPageStation ntp =
+                webPage.homeButtonElement
+                        .clickTo()
+                        .arriveAt(RegularNewTabPageStation.newBuilder().initFrom(webPage).build());
+        ntp.homeButtonElement.checkPresent();
+
+        WebPageStation incognitoWebPage = ntp.openNewIncognitoTabOrWindowFast().loadAboutBlank();
+        incognitoWebPage.homeButtonElement.checkPresent();
+
+        IncognitoNewTabPageStation incognitoNtp =
+                incognitoWebPage
+                        .homeButtonElement
+                        .clickTo()
+                        .arriveAt(
+                                IncognitoNewTabPageStation.newBuilder()
+                                        .initFrom(incognitoWebPage)
+                                        .build());
+        incognitoNtp.homeButtonElement.checkPresent();
+    }
+
     private void setAccessibilityEnabled(boolean enabled) {
         ThreadUtils.runOnUiThreadBlocking(
                 () -> ChromeAccessibilityUtil.get().setAccessibilityEnabledForTesting(enabled));
@@ -682,8 +716,7 @@
                 });
     }
 
-    private void verifyTopControlsAccessibilityOrder(
-            @NonNull ToolbarPhone toolbar, @NonNull View ntpView) {
+    private void verifyTopControlsAccessibilityOrder(ToolbarPhone toolbar, View ntpView) {
         CriteriaHelper.pollUiThread(
                 () -> {
                     Criteria.checkThat(
@@ -697,8 +730,7 @@
                 });
     }
 
-    private void verifyBottomControlsAccessibilityOrder(
-            @NonNull ToolbarPhone toolbar, @NonNull View ntpView) {
+    private void verifyBottomControlsAccessibilityOrder(ToolbarPhone toolbar, View ntpView) {
         CriteriaHelper.pollUiThread(
                 () -> {
                     Criteria.checkThat(
@@ -712,8 +744,7 @@
                 });
     }
 
-    private void verifyAccessibilityOrderIsReset(
-            @NonNull ToolbarPhone toolbar, @Nullable View ntpView) {
+    private void verifyAccessibilityOrderIsReset(ToolbarPhone toolbar, View ntpView) {
         CriteriaHelper.pollUiThread(
                 () -> {
                     Criteria.checkThat(
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index de2f89a..18472181 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -7801,9 +7801,6 @@
       <message name="IDS_NTP_CONFIRM_MSG_RESTORE_ENTERPRISE_DEFAULTS" desc="The text label of the restore default shortcuts button when editing an enterprise shortcuts. (On the New Tab Page)">
         Restore organization shortcuts
       </message>
-      <message name="IDS_NTP_CUSTOM_BG_CHROME_WALLPAPERS" desc="The text label of the Chrome backgrounds option for background customization.(On the New Tab Page)">
-        Chrome backgrounds
-      </message>
       <message name="IDS_NTP_CUSTOM_BG_UPLOAD_AN_IMAGE" desc="The text label of the upload an image option for background customization. (On the New Tab Page)">
         Upload an image
       </message>
@@ -19758,6 +19755,13 @@
     <message name="IDS_TIPS_NOTIFICATIONS_BOTTOM_OMNIBOX_SUBTITLE" desc="Subtitle for the bottom omnibox tip notification.">
       Switch the position of your address bar for a customized browsing experience
     </message>
+
+    <!-- chrome://updater -->
+    <if expr="is_linux or is_macosx or is_win">
+      <message name="IDS_UPDATER_VIEW_RAW_DETAILS" desc="Title of the button to display the contents of a Chrome Updater log in JSON format">
+        Source
+      </message>
+    </if>
   </messages>
 </release>
 </grit>
diff --git a/chrome/app/generated_resources_grd/IDS_NTP_CUSTOM_BG_CHROME_WALLPAPERS.png.sha1 b/chrome/app/generated_resources_grd/IDS_NTP_CUSTOM_BG_CHROME_WALLPAPERS.png.sha1
deleted file mode 100644
index 1fe0de0..0000000
--- a/chrome/app/generated_resources_grd/IDS_NTP_CUSTOM_BG_CHROME_WALLPAPERS.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-e043dccf666255df4ea5d87b63a496ddfb90d47d
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_UPDATER_VIEW_RAW_DETAILS.png.sha1 b/chrome/app/generated_resources_grd/IDS_UPDATER_VIEW_RAW_DETAILS.png.sha1
new file mode 100644
index 0000000..7cbf6360
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_UPDATER_VIEW_RAW_DETAILS.png.sha1
@@ -0,0 +1 @@
+11c8db54a2c4da797d062053a3b0ac52e46e1335
\ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb
index 4df161f6..e7998d1 100644
--- a/chrome/app/resources/chromium_strings_am.xtb
+++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -330,7 +330,7 @@
 <translation id="4654936675281451226">Chromium ቅጾችን በተሻለ መልኩ ይረዳል እና እነሱን ይበልጥ በፍጥነት ራስ-ሙላ ሊያደርግልዎት ይችላል። ይህ ቅንብር በርቷል።</translation>
 <translation id="4665829708273112819">ማስጠንቀቂያ፦ Chromium ቅጥያዎች የአሰሳ ታሪክዎን እንዳይመዘግቡ መከልከል አይችልም። ይህን ቅጥያ ማንነት በማያሳውቅ ሁነት ላይ ለማሰናከል ይህን አማራጭ አይምረጡ።</translation>
 <translation id="4673151026126227699">እንዲሁም የChromium አጠቃቀም ሪፖርቶችን ካጋሩ፣ እነዚያ ሪፖርቶች እርስዎ የሚጎበኟቸውን ዩአርኤሎች ያካትታሉ</translation>
-<translation id="4677944499843243528">መገለጫው በሌላ ኮምፒውተር (<ph name="HOST_NAME" />) ላይ በሌላ የChromium ሂደት (<ph name="PROCESS_ID" />) የተያዘ ይመስላል። Chromium መገለጫው እንዳይበላሽ ቆልፎታል።  ሌሎች ሂደቶች ይህን መገለጫ እየተጠቀሙበት እንዳልሆኑ እርግጠኛ ከሆኑ መገለጫውን አስከፍተው Chromiumን ዳግም ማስጀመር ይችላሉ።</translation>
+<translation id="4677944499843243528">መገለጫው በሌላ ኮምፒውተር (<ph name="HOST_NAME" />) ላይ በሌላ የChromium ሂደት (<ph name="PROCESS_ID" />) የተያዘ ይመስላል። Chromium መገለጫው እንዳይበላሽ ቆልፎታል። ሌሎች ሂደቶች ይህን መገለጫ እየተጠቀሙበት እንዳልሆኑ እርግጠኛ ከሆኑ መገለጫውን አስከፍተው Chromiumን ዳግም ማስጀመር ይችላሉ።</translation>
 <translation id="4680828127924988555">መጫኑን ሰርዝ</translation>
 <translation id="469259825538636168">አንዳንድ የChromium ውሂብዎ በGoogle መለያዎ ውስጥ ገና አልተቀመጠም። ዘግተው ከመውጣትዎ በፊት ጥቂት ደቂቃዎች ለመጠበቅ ይሞክሩ። አሁን ዘግተው ከወጡ ይህ ውሂብ ይሰረዛል።</translation>
 <translation id="4708193446201257833">በመለያ ገብተው ሳለ በChromium ውስጥ ከGoogle መለያዎ የይለፍ ቃላትዎን እና ሌሎችንም መጠቀም ይችላሉ። <ph name="SHORTCUT" /> የGoogle አገልግሎቶች ቅንብሮችዎን መለወጥ ይችላል።</translation>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb
index 8e00614b..7803f20 100644
--- a/chrome/app/resources/chromium_strings_ar.xtb
+++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -43,6 +43,7 @@
 <translation id="1497802159252041924">حدث خطأ أثناء التثبيت: <ph name="INSTALL_ERROR" /></translation>
 <translation id="1518627427551567882">هذه الصفحة محمية</translation>
 <translation id="1524282610922162960">‏مشاركة علامة تبويب Chromium</translation>
+<translation id="154404805518949443">‏تسجيل الدخول إلى Chromium</translation>
 <translation id="1547469039832541117">يؤدي النقر على هذا الزر إلى إنهاء المهمّة المحدّدة.</translation>
 <translation id="1553461853655228091">‏يحتاج Chromium إلى إذن للوصول إلى الكاميرا من أجل إنشاء خريطة ثلاثية الأبعاد للبيئة المحيطة بك.</translation>
 <translation id="1555494096857516577">{NUM_EXTENSIONS,plural, =1{‏لم تعُد هذه الإضافة متوافقة. ينصح المتصفّح Chromium بإزالتها.}zero{‏لم تعُد هذه الإضافات متوافقة. ينصح المتصفّح Chromium بإزالتها.}two{‏لم تعُد هاتان الإضافتان متوافقتين. ينصح المتصفّح Chromium بإزالتهما.}few{‏لم تعُد هذه الإضافات متوافقة. ينصح المتصفّح Chromium بإزالتها.}many{‏لم تعُد هذه الإضافات متوافقة. ينصح المتصفّح Chromium بإزالتها.}other{‏لم تعُد هذه الإضافات متوافقة. ينصح المتصفّح Chromium بإزالتها.}}</translation>
@@ -230,6 +231,7 @@
 <translation id="3530103706039034513">‏سبق أن تم تسجيل الدخول إلى حساب "<ph name="EXISTING_USER" />".  للحصول على تجربة تصفّح منفصلة، سجِّل الدخول إلى Chromium في ملفك الشخصي باستخدام العنوان <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="3561853857681580870">‏لمشاركة شاشتك، يجب السماح بتسجيل الشاشة في Chromium ضِمن "إعدادات النظام" (System Settings).</translation>
 <translation id="3597003331831379823">تعذَّر إجراء عملية الإعداد باستخدام أذونات مميزة وعالية المستوى. <ph name="METAINSTALLER_ERROR" /></translation>
+<translation id="3600428265489994557">‏سجِّل الدخول إلى Chromium</translation>
 <translation id="3639635944603682591">‏ستُحذَف بيانات تصفُّح هذا المستخدم من هذا الجهاز. ولاسترداد البيانات، سجّل الدخول إلى Chromium بصفتك <ph name="USER_EMAIL" />.</translation>
 <translation id="364817392622123556">{COUNT,plural, =0{‏يتوفر تحديث جديد لبرنامج Chromium وسيتم تطبيقه عند إعادة التشغيل.}=1{‏يتوفر تحديث جديد لبرنامج Chromium وسيتم تطبيقه عند إعادة التشغيل. لن تتم إعادة فتح نافذة التصفح المتخفي.}two{‏يتوفر تحديث جديد لبرنامج Chromium وسيتم تطبيقه عند إعادة التشغيل. لن تتم إعادة فتح نافذتَي التصفح المتخفي.}few{‏يتوفر تحديث جديد لبرنامج Chromium وسيتم تطبيقه عند إعادة التشغيل. لن تتم إعادة فتح نوافذ التصفّح المتخفي البالغ عددها #.}many{‏يتوفر تحديث جديد لبرنامج Chromium وسيتم تطبيقه عند إعادة التشغيل. لن تتم إعادة فتح نوافذ التصفّح المتخفي البالغ عددها #.}other{‏يتوفر تحديث جديد لبرنامج Chromium وسيتم تطبيقه عند إعادة التشغيل. لن تتم إعادة فتح نوافذ التصفّح المتخفي البالغ عددها #.}}</translation>
 <translation id="3651803019964686660">‏لإرسال رقم من <ph name="ORIGIN" /> إلى هاتفك الذي يعمل بنظام التشغيل Android، يُرجى تسجيل الدخول إلى Chromium على الجهازَين.</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb
index 0a8cdb0..6ebdccb4 100644
--- a/chrome/app/resources/chromium_strings_id.xtb
+++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -43,6 +43,7 @@
 <translation id="1497802159252041924">Error saat penginstalan: <ph name="INSTALL_ERROR" /></translation>
 <translation id="1518627427551567882">Halaman ini dilindungi</translation>
 <translation id="1524282610922162960">Bagikan tab Chromium</translation>
+<translation id="154404805518949443">Login ke Chromium</translation>
 <translation id="1547469039832541117">Mengakhiri tugas yang dipilih.</translation>
 <translation id="1553461853655228091">Chromium memerlukan izin untuk mengakses kamera guna membuat peta 3D untuk area di sekeliling Anda.</translation>
 <translation id="1555494096857516577">{NUM_EXTENSIONS,plural, =1{Ekstensi ini tidak lagi didukung. Chromium merekomendasikan agar Anda menghapusnya.}other{Ekstensi ini tidak lagi didukung. Chromium merekomendasikan agar Anda menghapusnya.}}</translation>
@@ -230,6 +231,7 @@
 <translation id="3530103706039034513"><ph name="EXISTING_USER" /> sudah login.  Agar penjelajahan Anda tetap terpisah, login ke Chromium di profil Anda sendiri sebagai <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="3561853857681580870">Untuk membagikan layar Anda, izinkan perekaman layar untuk Chromium di Setelan Sistem.</translation>
 <translation id="3597003331831379823">Gagal menjalankan penyiapan dengan hak istimewa yang ditingkatkan. <ph name="METAINSTALLER_ERROR" /></translation>
+<translation id="3600428265489994557">Login ke Chromium</translation>
 <translation id="3639635944603682591">Data browsing pengguna ini akan dihapus dari perangkat ini. Untuk memulihkan data, login ke Chromium sebagai <ph name="USER_EMAIL" />.</translation>
 <translation id="364817392622123556">{COUNT,plural, =0{Update baru untuk Chromium telah tersedia dan akan diterapkan segera setelah diluncurkan kembali.}=1{Update baru untuk Chromium telah tersedia dan akan diterapkan segera setelah diluncurkan kembali. Jendela Samaran Anda tidak akan dibuka kembali.}other{Update baru untuk Chromium telah tersedia dan akan diterapkan segera setelah diluncurkan kembali. # jendela Samaran Anda tidak akan dibuka kembali.}}</translation>
 <translation id="3651803019964686660">Untuk mengirimkan nomor dari <ph name="ORIGIN" /> ke ponsel Android Anda, login ke Chromium di kedua perangkat.</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb
index 48713a4..6128a3bb 100644
--- a/chrome/app/resources/chromium_strings_ko.xtb
+++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -44,6 +44,7 @@
 <translation id="1497802159252041924">설치 오류: <ph name="INSTALL_ERROR" /></translation>
 <translation id="1518627427551567882">보호된 페이지입니다.</translation>
 <translation id="1524282610922162960">Chromium 탭 공유</translation>
+<translation id="154404805518949443">Chromium에 로그인</translation>
 <translation id="1547469039832541117">강조 표시된 작업을 종료합니다.</translation>
 <translation id="1553461853655228091">Chromium에서 주변 3D 지도를 만들려면 카메라 액세스 권한이 필요합니다.</translation>
 <translation id="1555494096857516577">{NUM_EXTENSIONS,plural, =1{이 확장 프로그램은 더 이상 지원되지 않습니다. Chromium에서는 삭제할 것을 권장합니다.}other{이 확장 프로그램은 더 이상 지원되지 않습니다. Chromium에서는 삭제할 것을 권장합니다.}}</translation>
@@ -231,6 +232,7 @@
 <translation id="3530103706039034513"><ph name="EXISTING_USER" /> 계정은 이미 로그인되어 있습니다.  방문 기록을 별도로 보관하려면 내 프로필에서 <ph name="USER_EMAIL_ADDRESS" /> 주소로 Chromium에 로그인하세요.</translation>
 <translation id="3561853857681580870">화면을 공유하려면 시스템 설정에서 Chromium의 화면 녹화를 허용하세요.</translation>
 <translation id="3597003331831379823">승격된 권한으로 설정을 실행할 수 없습니다. <ph name="METAINSTALLER_ERROR" /></translation>
+<translation id="3600428265489994557">Chromium에 로그인하세요</translation>
 <translation id="3639635944603682591">선택한 사용자의 인터넷 사용 기록이 이 기기에서 삭제됩니다. 데이터를 복구하려면 <ph name="USER_EMAIL" />(으)로 Chromium에 로그인하세요.</translation>
 <translation id="364817392622123556">{COUNT,plural, =0{새 Chromium 업데이트가 있습니다. Chromium을 다시 실행하면 업데이트가 바로 적용됩니다.}=1{새 Chromium 업데이트가 있습니다. Chromium을 다시 실행하면 업데이트가 바로 적용됩니다. 시크릿 창이 다시 열리지 않습니다.}other{새 Chromium 업데이트가 있습니다. Chromium을 다시 실행하면 업데이트가 바로 적용됩니다. 시크릿 창 #개가 다시 열리지 않습니다.}}</translation>
 <translation id="3651803019964686660"><ph name="ORIGIN" />에서 Android 휴대전화로 번호를 전송하려면 두 기기 모두에서 Chromium에 로그인하세요.</translation>
diff --git a/chrome/app/resources/chromium_strings_mn.xtb b/chrome/app/resources/chromium_strings_mn.xtb
index 68b66ca..3804a5d0 100644
--- a/chrome/app/resources/chromium_strings_mn.xtb
+++ b/chrome/app/resources/chromium_strings_mn.xtb
@@ -45,6 +45,7 @@
 <translation id="1497802159252041924">Суулгалтын алдаа: <ph name="INSTALL_ERROR" /></translation>
 <translation id="1518627427551567882">Энэ хуудсыг хамгаалагдсан байна</translation>
 <translation id="1524282610922162960">Chromium-н таб хуваалцах</translation>
+<translation id="154404805518949443">Chromium-д нэвтрэх</translation>
 <translation id="1547469039832541117">Тодруулсан ажлыг дуусгана.</translation>
 <translation id="1553461853655228091">Орчин тойрны тань 3D газрын зургийг үүсгэхийн тулд таны камерт хандах зөвшөөрөл Chromium-д шаардлагатай</translation>
 <translation id="1555494096857516577">{NUM_EXTENSIONS,plural, =1{Энэ өргөтгөлийг дэмжихээ больсон. Chromium танд үүнийг хасахыг зөвлөж байна.}other{Эдгээр өргөтгөлийг дэмжихээ больсон. Chromium танд эдгээрийг хасахыг зөвлөж байна.}}</translation>
@@ -230,6 +231,7 @@
 <translation id="3530103706039034513"><ph name="EXISTING_USER" /> аль хэдийн нэвтэрсэн байна.  Хөтчийн үзэлтээ тусдаа байлгахын тулд Chromium-д <ph name="USER_EMAIL_ADDRESS" />-р өөрийн профайлаар нэвтэрнэ үү.</translation>
 <translation id="3561853857681580870">Дэлгэцээ хуваалцахын тулд Системийн тохиргоонд Chromium-д дэлгэцийн үйлдэл бичихийг зөвшөөрнө үү.</translation>
 <translation id="3597003331831379823">Нэмэлт эрхтэйгээр тохируулгыг ажиллуулж чадсангүй. <ph name="METAINSTALLER_ERROR" /></translation>
+<translation id="3600428265489994557">Chromium-д нэвтрэх</translation>
 <translation id="3639635944603682591">Энэ хэрэглэгчийн хөтчийн өгөгдлийг энэ төхөөрөмжөөс устгана. Өгөгдлийг сэргээхийн тулд Chromium-д <ph name="USER_EMAIL" />-р нэвтэрнэ үү.</translation>
 <translation id="364817392622123556">{COUNT,plural, =0{Chromium-н шинэ шинэчлэлт боломжтой байгаа бөгөөд таныг дахин ачаалах үед түүнийг хэрэгжүүлэх болно.}=1{Chromium-н шинэ шинэчлэлт боломжтой байгаа бөгөөд таныг дахин ачаалах үед түүнийг хэрэгжүүлэх болно. Таны нууцлалтай цонхыг дахин нээхгүй.}other{Chromium-н шинэ шинэчлэлт боломжтой байгаа бөгөөд таныг дахин ачаалах үед түүнийг хэрэгжүүлэх болно. Таны # нууцлалтай цонхыг дахин нээхгүй.}}</translation>
 <translation id="3651803019964686660"><ph name="ORIGIN" />-с Android утсандаа дугаар илгээхийн тулд хоёр төхөөрөмжийнхөө аль алинаас нь Chromium-д нэвтэрнэ үү.</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb
index 4cc6adf..2b5384a 100644
--- a/chrome/app/resources/chromium_strings_sl.xtb
+++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -45,6 +45,7 @@
 <translation id="1497802159252041924">Napaka pri namestitvi: <ph name="INSTALL_ERROR" /></translation>
 <translation id="1518627427551567882">Ta stran je zaščitena</translation>
 <translation id="1524282610922162960">Deljenje zavihka v Chromiumu</translation>
+<translation id="154404805518949443">Prijava v Chromium</translation>
 <translation id="1547469039832541117">Konča označeno opravilo.</translation>
 <translation id="1553461853655228091">Chromium potrebuje dovoljenje za dostop do fotoaparata zaradi ustvarjanja tridimenzionalnega zemljevida okolice.</translation>
 <translation id="1555494096857516577">{NUM_EXTENSIONS,plural, =1{Ta razširitev ni več podprta. Chromium priporoča, da jo odstranite.}one{Te razširitve niso več podprte. Chromium priporoča, da jih odstranite.}two{Te razširitve niso več podprte. Chromium priporoča, da jih odstranite.}few{Te razširitve niso več podprte. Chromium priporoča, da jih odstranite.}other{Te razširitve niso več podprte. Chromium priporoča, da jih odstranite.}}</translation>
@@ -232,6 +233,7 @@
 <translation id="3530103706039034513">Uporabnik <ph name="EXISTING_USER" /> je že prijavljen.  Če želite ločiti brskanje, se v Chromiumu prijavite v svoj profil kot <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="3561853857681580870">Če želite deliti zaslon, v sistemskih nastavitvah omogočite snemanje zaslona za Chromium.</translation>
 <translation id="3597003331831379823">Nastavitve s povečanimi pravicami ni bilo mogoče izvesti. <ph name="METAINSTALLER_ERROR" /></translation>
+<translation id="3600428265489994557">Prijava v Chromium</translation>
 <translation id="3639635944603682591">Podatki brskanja te osebe bodo izbrisani iz te naprave. Če želite podatke obnoviti, se prijavite v Chromium kot <ph name="USER_EMAIL" />.</translation>
 <translation id="364817392622123556">{COUNT,plural, =0{Na voljo je nova posodobitev za Chromium, ki bo nameščena, takoj ko ga znova zaženete.}=1{Na voljo je nova posodobitev za Chromium, ki bo nameščena, takoj ko ga znova zaženete. Anonimno okno se ne bo znova odprlo.}one{Na voljo je nova posodobitev za Chromium, ki bo nameščena, takoj ko ga znova zaženete. # anonimno okno se ne bo znova odprlo.}two{Na voljo je nova posodobitev za Chromium, ki bo nameščena, takoj ko ga znova zaženete. # anonimni okni se ne bosta znova odprli.}few{Na voljo je nova posodobitev za Chromium, ki bo nameščena, takoj ko ga znova zaženete. # anonimna okna se ne bodo znova odprla.}other{Na voljo je nova posodobitev za Chromium, ki bo nameščena, takoj ko ga znova zaženete. # anonimnih oken se ne bo znova odprlo.}}</translation>
 <translation id="3651803019964686660">Če želite telefonsko številko iz <ph name="ORIGIN" /> poslati v telefon Android, se prijavite v Chromium v obeh napravah.</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb
index a99f8c7..a79938e 100644
--- a/chrome/app/resources/generated_resources_af.xtb
+++ b/chrome/app/resources/generated_resources_af.xtb
@@ -11985,6 +11985,7 @@
 <translation id="9215742531438648683">Deïnstalleer Google Play Winkel</translation>
 <translation id="9218430445555521422">Stel as verstek</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (ongesteunde app)</translation>
+<translation id="9219103736887031265">Prente</translation>
 <translation id="9219572436491982747">Data wat na Google toe gestuur word, kan gesien word deur mense wat kontrolering uitvoer om Chrome AI se tegnologie te verbeter</translation>
 <translation id="9219741625496141320">Blaaierdata is outomaties uitgevee</translation>
 <translation id="9220525904950070496">Verwyder rekening</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 13283907..b3bda06 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -6746,7 +6746,7 @@
 <translation id="5621350029086078628">ይህ የሙከራ ሰው ሠራሽ አስተውሎት ባህሪ ነው።</translation>
 <translation id="5622357006621202569">ቀጣይነት ያለው ከእንግዶች ጋር የUSB መሣሪያ ማጋራትን ያንቁ።</translation>
 <translation id="562250930904332809">&amp;Disable የቀጥታ መግለጫ ጽሁፍ</translation>
-<translation id="5623282979409330487">ይህ ጥጣቢያ የእንቅስቃሴ ዳሳሾችዎን እየደረሰ ነውው።</translation>
+<translation id="5623282979409330487">ይህ ጣቢያ የእንቅስቃሴ ዳሳሾችዎን እየደረሰ ነው።</translation>
 <translation id="5623842676595125836">ምዝግብ ማስታወሻ</translation>
 <translation id="5624120631404540903">የይለፍ ቃሎችን አስተዳድር</translation>
 <translation id="5624959475330585145">ደህንነታቸው ያልተጠበቁ ግንኙነቶችን ከመጠቀምዎ በፊት ይጠይቁ</translation>
@@ -11988,6 +11988,7 @@
 <translation id="9215742531438648683">Google Play መደብርን ያራግፉ</translation>
 <translation id="9218430445555521422">እንደ ነባሪ አቀናብር</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (የማይደገፍ መተግበሪያ)</translation>
+<translation id="9219103736887031265">ምስሎች</translation>
 <translation id="9219572436491982747">የChrome ሰው ሠራሽ አስተውሎት ቴክኖሎጂን ለማሻሻል ወደ Google የተላከ ውሂብ በሰው ገምጋሚዎች ሊታይ ይችላል</translation>
 <translation id="9219741625496141320">የአሰሳ ውሂብ በራስ-ሰር ተሰርዟል</translation>
 <translation id="9220525904950070496">መለያ ያስወግዱ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 873e27c..a97d2d0 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1907,6 +1907,7 @@
 <translation id="2287617382468007324">‏عنوان بروتوكول الطباعة على الإنترنت (IPP)</translation>
 <translation id="2287704681286152065">{NUM_SITES,plural, =1{لحماية بياناتك، تمّت إزالة الأذونات من موقع إلكتروني لم تزُره مؤخرًا.}zero{لحماية بياناتك، تمّت إزالة الأذونات من مواقع إلكترونية لم تزُرها مؤخرًا.}two{لحماية بياناتك، تمّت إزالة الأذونات من موقعَين إلكترونيَّين لم تزُرهما مؤخرًا.}few{لحماية بياناتك، تمّت إزالة الأذونات من مواقع إلكترونية لم تزُرها مؤخرًا.}many{لحماية بياناتك، تمّت إزالة الأذونات من مواقع إلكترونية لم تزُرها مؤخرًا.}other{لحماية بياناتك، تمّت إزالة الأذونات من مواقع إلكترونية لم تزُرها مؤخرًا.}}</translation>
 <translation id="2287944065963043964">شاشة تسجيل الدخول</translation>
+<translation id="2289567621059034186">علامة تبويب جديدة أدناه</translation>
 <translation id="2290615375132886363">أزرار التنقُّل في وضع الجهاز اللوحي</translation>
 <translation id="2290703778620332549">استبدال المجموعة أو إنشاء مجموعة جديدة؟</translation>
 <translation id="2291452790265535215">جرِّب استخدام اللوحة الجانبية للاطّلاع على الإشارات المرجعية ورحلات البحث وغير ذلك.</translation>
@@ -3271,6 +3272,7 @@
 <translation id="322708765617468434">يمكنك في أي وقت إضافة مستخدم آخر إلى الجهاز بعد إعداده. ويمكن لكل مستخدم تخصيص تجربته والحفاظ على خصوصية بياناته.</translation>
 <translation id="3227137524299004712">الميكروفون</translation>
 <translation id="3227701057281907159">جارٍ التصحيح</translation>
+<translation id="3228962656492373217">إغلاق علامات التبويب أدناه</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{‏يمكنك إزالتها أو استبدالها بإضافات مشابهة من <ph name="BEGIN_LINK" />سوق Chrome الإلكتروني<ph name="END_LINK" />.}zero{‏يمكنك إزالتها أو استبدالها بإضافات مشابهة من <ph name="BEGIN_LINK" />سوق Chrome الإلكتروني<ph name="END_LINK" />}two{‏يمكنك إزالتهما أو استبدالهما بإضافات مشابهة من <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>
@@ -5005,6 +5007,7 @@
 <translation id="4404843640767531781">حظَر أحد الوالدَين تطبيق <ph name="APP_NAME" />. يُرجى طلب الإذن لتتمكّن من استخدام هذا التطبيق مرة أخرى.</translation>
 <translation id="4405117686468554883">‏jpeg.* وjpg.* وpng.*</translation>
 <translation id="4405224443901389797">نقل إلى...</translation>
+<translation id="4405580203042711503">علامة تبويب جديدة أدناه</translation>
 <translation id="4405781821077215583">تكبير أو تصغير العناصر على الشاشة، بما في ذلك النصوص</translation>
 <translation id="4406308048672435032">يمكنك جعل علامة التبويب هذه غير نشطة أو إعادة تحميلها للاطّلاع على القائمة الكاملة مرة أخرى</translation>
 <translation id="4406881185911439342">التركيز على المجموعة</translation>
@@ -6722,6 +6725,7 @@
 <translation id="5609231933459083978">يبدو أن التطبيق غير صالح.</translation>
 <translation id="5610867721023328944">بإمكانك إعادة المحاولة أو اختيار أحد المظاهر المتوفّرة أدناه.</translation>
 <translation id="5611398002774823980">الحفظ في الحساب</translation>
+<translation id="5611474372949142946">إغلاق علامات التبويب أدناه</translation>
 <translation id="561236229031062396">"<ph name="SHORTCUT_NAME" />" و"<ph name="APP_FULL_NAME" />"</translation>
 <translation id="5614190747811328134">إشعار المستخدم</translation>
 <translation id="5614553682702429503">هل تريد حفظ كلمة المرور؟</translation>
@@ -11989,6 +11993,7 @@
 <translation id="9215742531438648683">‏إلغاء تثبيت "متجر Google Play"</translation>
 <translation id="9218430445555521422">الضبط كخيار تلقائي</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (التطبيق غير متوافق)</translation>
+<translation id="9219103736887031265">الصور</translation>
 <translation id="9219572436491982747">‏قد يراجع فريق من المراجعين البيانات المُرسَلة إلى Google لتحسين تكنولوجيا الذكاء الاصطناعي في Chrome</translation>
 <translation id="9219741625496141320">تم حذف بيانات التصفُّح تلقائيًا</translation>
 <translation id="9220525904950070496">إزالة الحساب</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index 077ff80..8eb16983 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -11984,6 +11984,7 @@
 <translation id="9215742531438648683">Google Play Store আনইনষ্টল কৰক</translation>
 <translation id="9218430445555521422">ডিফ'ল্ট হিচাপে ছেট কৰক</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (অসমৰ্থিত এপ্‌)</translation>
+<translation id="9219103736887031265">Images</translation>
 <translation id="9219572436491982747">Chromeৰ AI সম্পৰ্কীয় প্ৰযুক্তি উন্নত কৰিবলৈ মানৱ পর্যালোচকে ডেটা Googleলৈ পঠিয়াব পাৰে</translation>
 <translation id="9219741625496141320">ব্ৰাউজিঙৰ ডেটা স্বয়ংক্ৰিয়ভাৱে মচা হৈছে</translation>
 <translation id="9220525904950070496">একাউণ্ট আঁতৰাওক</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index d7ad8c44..777933a3 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -11968,6 +11968,7 @@
 <translation id="9215742531438648683">Google Play Market tətbiqini silin</translation>
 <translation id="9218430445555521422">Defolt olaraq ayarlansın</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (dəstəklənməyən tətbiq)</translation>
+<translation id="9219103736887031265">Şəkillər</translation>
 <translation id="9219572436491982747">Chrome Sİ texnologiyasını təkmilləşdirmək üçün insan redaktorlar Google-a göndərilən datanı görə bilər</translation>
 <translation id="9219741625496141320">Baxış datası avtomatik silindi</translation>
 <translation id="9220525904950070496">Hesabı silin</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index 4328119..d25e71d 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -11975,6 +11975,7 @@
 <translation id="9215742531438648683">Выдаліць Краму Google Play</translation>
 <translation id="9218430445555521422">Выкарыстоўваць стандартна</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (праграма не падтрымліваецца)</translation>
+<translation id="9219103736887031265">Відарысы</translation>
 <translation id="9219572436491982747">Для паляпшэння функцыі штучнага інтэлекту ў Chrome даныя, якія перадаюцца ў Google, могуць разглядацца спецыялістамі</translation>
 <translation id="9219741625496141320">Даныя пра работу ў браўзеры аўтаматычна выдалены</translation>
 <translation id="9220525904950070496">Выдаліць уліковы запіс</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index fef17bf2..4b20670 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -11988,6 +11988,7 @@
 <translation id="9215742531438648683">Деинсталиране на Google Play Магазин</translation>
 <translation id="9218430445555521422">Задаване като основен избор</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (неподдържано приложение)</translation>
+<translation id="9219103736887031265">Изображения</translation>
 <translation id="9219572436491982747">Данните, изпратени до Google, може да бъдат видени от проверяващи лица с цел подобряване на технологията на AI на Chrome</translation>
 <translation id="9219741625496141320">Данните за сърфирането бяха изтрити автоматично</translation>
 <translation id="9220525904950070496">Премахване на профила</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index a8f1e45..f752b79 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -11991,6 +11991,7 @@
 <translation id="9215742531438648683">Google Play Store আনইনস্টল করুন</translation>
 <translation id="9218430445555521422">ডিফল্ট হিসেবে সেট করুন</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (অ্যাপটি কাজ করবে না)</translation>
+<translation id="9219103736887031265">Images</translation>
 <translation id="9219572436491982747">Google-কে পাঠানো ডেটা Chrome AI প্রযুক্তির উন্নতির জন্য হিউম্যান রিভিউয়াররা দেখতে পারেন</translation>
 <translation id="9219741625496141320">ব্রাউজ করা ডেটা অটোমেটিক মুছে ফেলা হয়েছে</translation>
 <translation id="9220525904950070496">অ্যাকাউন্ট সরান</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index fb99a355..3c8b8be 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -11991,6 +11991,7 @@
 <translation id="9215742531438648683">Deinstalirajte Google Play trgovinu</translation>
 <translation id="9218430445555521422">Postavi kao zadano</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (nepodržana aplikacija)</translation>
+<translation id="9219103736887031265">Slike</translation>
 <translation id="9219572436491982747">Podatke poslane Googleu mogu pregledati osobe koje vrše pregled radi poboljšanja tehnologije Chrome AI-ja</translation>
 <translation id="9219741625496141320">Podaci o pregledanju su automatski izbrisani</translation>
 <translation id="9220525904950070496">Ukloni račun</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index fe1738cd..96b6500 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -11967,6 +11967,7 @@
 <translation id="9215742531438648683">Desinstal·la Google Play Store</translation>
 <translation id="9218430445555521422">Defineix com a predeterminat</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (l’aplicació no és compatible)</translation>
+<translation id="9219103736887031265">Imatges</translation>
 <translation id="9219572436491982747">És possible que revisors humans vegin les dades enviades a Google per millorar la tecnologia de la IA de Chrome</translation>
 <translation id="9219741625496141320">Les dades de navegació s'han suprimit automàticament</translation>
 <translation id="9220525904950070496">Suprimir el compte</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index c879b917..d5903a2 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -11971,6 +11971,7 @@
 <translation id="9215742531438648683">Odinstalovat obchod Google Play</translation>
 <translation id="9218430445555521422">Nastavit jako výchozí</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (nepodporovaná aplikace)</translation>
+<translation id="9219103736887031265">Obrázky</translation>
 <translation id="9219572436491982747">Data odeslaná do Googlu mohou vidět kontroloři, kteří pomáhají zlepšovat AI technologie v Chromu</translation>
 <translation id="9219741625496141320">Údaje o prohlížení byly automaticky smazány</translation>
 <translation id="9220525904950070496">Odstranit účet</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb
index 399071c..6f9804ce 100644
--- a/chrome/app/resources/generated_resources_cy.xtb
+++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -11999,6 +11999,7 @@
 <translation id="9215742531438648683">Dadosod Google Play Store</translation>
 <translation id="9218430445555521422">Gosod fel diofyn</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (ap heb ei gefnogi)</translation>
+<translation id="9219103736887031265">Lluniau</translation>
 <translation id="9219572436491982747">Mae'n bosib y bydd adolygwyr dynol yn gweld data a anfonir at Google i wella technoleg Chrome AI</translation>
 <translation id="9219741625496141320">Cafodd data pori eu dileu yn awtomatig</translation>
 <translation id="9220525904950070496">Tynnu cyfrif</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index ea259fb..cd3c333 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -11996,6 +11996,7 @@
 <translation id="9215742531438648683">Afinstaller Google Play Butik</translation>
 <translation id="9218430445555521422">Angiv som standard</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (ikke-understøttet app)</translation>
+<translation id="9219103736887031265">Billeder</translation>
 <translation id="9219572436491982747">Data, der sendes til Google, kan blive gennemgået af menneskelige kontrollanter med henblik på at forbedre Chromes AI-teknologi</translation>
 <translation id="9219741625496141320">Browserdataene blev automatisk slettet</translation>
 <translation id="9220525904950070496">Fjern konto</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index b9c5b1a..29b73d5 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -11963,6 +11963,7 @@
 <translation id="9215742531438648683">Google Play Store deinstallieren</translation>
 <translation id="9218430445555521422">Als Standard festlegen</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (nicht unterstützte App)</translation>
+<translation id="9219103736887031265">Bilder</translation>
 <translation id="9219572436491982747">An Google gesendete Daten können von Prüfern eingesehen werden, um die Technologie der Chrome-KI zu verbessern</translation>
 <translation id="9219741625496141320">Browserdaten wurden automatisch gelöscht</translation>
 <translation id="9220525904950070496">Konto entfernen</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index e4bac67..79cfce5d 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -11985,6 +11985,7 @@
 <translation id="9215742531438648683">Απεγκατάσταση Google Play Store</translation>
 <translation id="9218430445555521422">Ορισμός ως προεπιλογή</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (μη υποστηριζόμενη εφαρμογή)</translation>
+<translation id="9219103736887031265">Εικόνες</translation>
 <translation id="9219572436491982747">Τα δεδομένα που αποστέλλονται στην Google ενδέχεται να τα δουν αναθεωρητές για τη βελτίωση της τεχνολογίας του Chrome AI</translation>
 <translation id="9219741625496141320">Τα δεδομένα περιήγησης διαγράφηκαν αυτόματα</translation>
 <translation id="9220525904950070496">Κατάργηση λογαριασμού</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 4dfcec6..22d0224 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -11986,6 +11986,7 @@
 <translation id="9215742531438648683">Uninstall Google Play Store</translation>
 <translation id="9218430445555521422">Set as default</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (unsupported app)</translation>
+<translation id="9219103736887031265">Images</translation>
 <translation id="9219572436491982747">Data sent to Google may be seen by human reviewers to improve Chrome AI's technology</translation>
 <translation id="9219741625496141320">Browsing data was automatically deleted</translation>
 <translation id="9220525904950070496">Remove account</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index c69fc49..b70d15c0 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -11970,6 +11970,7 @@
 <translation id="9215742531438648683">Desinstalar Google Play Store</translation>
 <translation id="9218430445555521422">Establecer como predeterminado</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (app no compatible)</translation>
+<translation id="9219103736887031265">Imágenes</translation>
 <translation id="9219572436491982747">Es posible que los revisores humanos vean los datos enviados a Google para mejorar la tecnología de la IA de Chrome.</translation>
 <translation id="9219741625496141320">Se borraron automáticamente los datos de navegación</translation>
 <translation id="9220525904950070496">Eliminar cuenta</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 2ba41d3..d779cb8 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -11971,6 +11971,7 @@
 <translation id="9215742531438648683">Desinstalar Google Play Store</translation>
 <translation id="9218430445555521422">Establecer como predeterminado</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (aplicación no compatible)</translation>
+<translation id="9219103736887031265">Imágenes</translation>
 <translation id="9219572436491982747">Puede que los datos enviados a Google los vean revisores humanos para mejorar la tecnología de IA de Chrome</translation>
 <translation id="9219741625496141320">Los datos de navegación se han eliminado automáticamente</translation>
 <translation id="9220525904950070496">Quitar cuenta</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 72a7699c..65b42fc 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -11977,6 +11977,7 @@
 <translation id="9215742531438648683">Google Play poe desinstallimine</translation>
 <translation id="9218430445555521422">Määra vaikeseadeks</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (rakendust ei toetata)</translation>
+<translation id="9219103736887031265">Pildid</translation>
 <translation id="9219572436491982747">Chrome'i AI-tehnoloogia täiustamiseks võivad ülevaatajad näha Google'ile saadetavaid andmeid</translation>
 <translation id="9219741625496141320">Sirvimisandmed kustutati automaatselt</translation>
 <translation id="9220525904950070496">Konto eemaldamine</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index f59d208c..0a052a94 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -11963,6 +11963,7 @@
 <translation id="9215742531438648683">Desinstalatu Google Play Store</translation>
 <translation id="9218430445555521422">Ezarri lehenetsi gisa</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (aplikazio bateraezina)</translation>
+<translation id="9219103736887031265">Irudiak</translation>
 <translation id="9219572436491982747">Baliteke Google-ri bidalitako datuak gizakiak diren berrikusleek ikustea, Chrome-ren AAren teknologia hobetzeko.</translation>
 <translation id="9219741625496141320">Arakatze-datuak automatikoki ezabatu dira</translation>
 <translation id="9220525904950070496">Kendu kontua</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 1abc8eb1..6651c11c 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -11986,6 +11986,7 @@
 <translation id="9215742531438648683">‏حذف نصب «فروشگاه Google Play»</translation>
 <translation id="9218430445555521422">تنظیم به‌عنوان پیش‌فرض</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (برنامه پشتیبانی‌نشده)</translation>
+<translation id="9219103736887031265">تصاویر</translation>
 <translation id="9219572436491982747">‏افراد بازبین ممکن است داده‌های ارسال‌شده به Google را برای بهبود فناوری هوش مصنوعی Chrome ببینند</translation>
 <translation id="9219741625496141320">داده‌های مرور به‌طور خودکار حذف شد</translation>
 <translation id="9220525904950070496">برداشتن حساب</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 4e358f25..e41ee8dc 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -11986,6 +11986,7 @@
 <translation id="9215742531438648683">Poista Google Play Kauppa</translation>
 <translation id="9218430445555521422">Aseta oletukseksi</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (ei-tuettu sovellus)</translation>
+<translation id="9219103736887031265">Kuvat</translation>
 <translation id="9219572436491982747">Tarkastajat voivat nähdä Googlelle lähetettyä dataa Chromen tekoälyteknologian parantamiseksi</translation>
 <translation id="9219741625496141320">Selausdata on poistettu automaattisesti</translation>
 <translation id="9220525904950070496">Poista tili</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 021fbb5..a301c9e 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -11996,6 +11996,7 @@
 <translation id="9215742531438648683">I-uninstall ang Google Play Store</translation>
 <translation id="9218430445555521422">Itakda bilang default</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (hindi suportadong app)</translation>
+<translation id="9219103736887031265">Mga Larawan</translation>
 <translation id="9219572436491982747">Puwedeng makita ng mga taong tagasuri ang ipinadalang data sa Google para mapahusay ang teknolohiya ng Chrome AI</translation>
 <translation id="9219741625496141320">Awtomatikong na-delete ang data mula sa pag-browse</translation>
 <translation id="9220525904950070496">Alisin ang account</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 00fb1566..50b5f73b 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -11974,6 +11974,7 @@
 <translation id="9215742531438648683">Désinstaller Google Play Store</translation>
 <translation id="9218430445555521422">Définir par défaut</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (application non prise en charge)</translation>
+<translation id="9219103736887031265">Images</translation>
 <translation id="9219572436491982747">Les données envoyées à Google peuvent être consultées par des réviseurs humains afin d'améliorer la technologie d'IA de Chrome.</translation>
 <translation id="9219741625496141320">Les données de navigation ont été automatiquement supprimées.</translation>
 <translation id="9220525904950070496">Supprimer le compte</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 231b8b1..424c8b0 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -11974,6 +11974,7 @@
 <translation id="9215742531438648683">Désinstaller Google Play Store</translation>
 <translation id="9218430445555521422">Définir par défaut</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (appli non compatible)</translation>
+<translation id="9219103736887031265">Images</translation>
 <translation id="9219572436491982747">Les données envoyées à Google peuvent être consultées par des réviseurs humains afin d'améliorer la technologie d'IA de Chrome</translation>
 <translation id="9219741625496141320">Les données de navigation ont été supprimées automatiquement</translation>
 <translation id="9220525904950070496">Supprimer le compte</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb
index 539bc3b..e3ce9b7be 100644
--- a/chrome/app/resources/generated_resources_gl.xtb
+++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -11970,6 +11970,7 @@
 <translation id="9215742531438648683">Desinstalar Google Play Store</translation>
 <translation id="9218430445555521422">Establecer como predeterminado</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (aplicación non compatible)</translation>
+<translation id="9219103736887031265">Imaxes</translation>
 <translation id="9219572436491982747">Co fin de mellorar a tecnoloxía de IA de Chrome, os datos que se envíen a Google poden someterse a un proceso de revisión por parte do noso equipo</translation>
 <translation id="9219741625496141320">Os datos de navegación elimináronse automaticamente</translation>
 <translation id="9220525904950070496">Quitar conta</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index a90b4d2..ab034c6 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -12002,6 +12002,7 @@
 <translation id="9215742531438648683">Google Play Store અનઇન્સ્ટૉલ કરો</translation>
 <translation id="9218430445555521422">ડિફોલ્ટ તરીકે સેટ કરો</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (સપોર્ટ ન કરવામાં આવતી ઍપ)</translation>
+<translation id="9219103736887031265">છબીઓ</translation>
 <translation id="9219572436491982747">Chrome AIની ટેક્નોલોજીને બહેતર બનાવવા માટે Googleનો મોકલવામાં આવતો ડેટા કદાચ માનવ રિવ્યૂઅર દ્વારા જોવામાં આવી શકે છે</translation>
 <translation id="9219741625496141320">બ્રાઉઝિંગ ડેટા ઑટોમેટિક રીતે ડિલીટ કરી નાખવામાં આવ્યો હતો</translation>
 <translation id="9220525904950070496">એકાઉન્ટ દૂર કરો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index fb25eef0..70d07cc 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -11990,6 +11990,7 @@
 <translation id="9215742531438648683">'Google Play Store' अनइंस्टॉल करें</translation>
 <translation id="9218430445555521422">डिफ़ॉल्ट के तौर पर सेट करें</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (ऐप्लिकेशन काम नहीं करता)</translation>
+<translation id="9219103736887031265">इमेज</translation>
 <translation id="9219572436491982747">Google को भेजा गया डेटा, समीक्षा करने वाले लोगों को दिख सकता है. इसका मकसद, Chrome की एआई टेक्नोलॉजी को बेहतर बनाना है</translation>
 <translation id="9219741625496141320">ब्राउज़िंग डेटा अपने-आप मिट गया</translation>
 <translation id="9220525904950070496">खाता हटाएं</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index cd76297e..df6db81a 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -11976,6 +11976,7 @@
 <translation id="9215742531438648683">Deinstaliranje Trgovine Google Play</translation>
 <translation id="9218430445555521422">Postavi kao zadano</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (aplikacija nije podržana)</translation>
+<translation id="9219103736887031265">Slike</translation>
 <translation id="9219572436491982747">Podatke poslane Googleu mogu vidjeti pregledavatelji radi poboljšanja tehnologije Chromeovog AI-ja</translation>
 <translation id="9219741625496141320">Podaci o pregledavanju automatski su izbrisani</translation>
 <translation id="9220525904950070496">Uklanjanje računa</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 0d1cb00..6c839d43 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -11984,6 +11984,7 @@
 <translation id="9215742531438648683">A Google Play Áruház eltávolítása</translation>
 <translation id="9218430445555521422">Alapbeállítás</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (nem támogatott alkalmazás)</translation>
+<translation id="9219103736887031265">Képek</translation>
 <translation id="9219572436491982747">A Google-nak elküldött adatokat felülvizsgálatot végző emberek is megtekinthetik a Chrome AI technológiájának továbbfejlesztése érdekében</translation>
 <translation id="9219741625496141320">A böngészési adatok automatikusan törlésre kerültek</translation>
 <translation id="9220525904950070496">Fiók eltávolítása</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb
index 881a2a3..cf131d0 100644
--- a/chrome/app/resources/generated_resources_hy.xtb
+++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -11968,6 +11968,7 @@
 <translation id="9215742531438648683">Ապատեղադրել Google Play Խանութը</translation>
 <translation id="9218430445555521422">Սահմանել որպես կանխադրված</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (չաջակցվող հավելված)</translation>
+<translation id="9219103736887031265">Պատկերներ</translation>
 <translation id="9219572436491982747">Google-ին ուղարկված տվյալները կարող են դիտվել մասնագետների կողմից՝ Chrome AI-ի տեխնոլոգիան բարելավելու նպատակով</translation>
 <translation id="9219741625496141320">Այցելությունների պատմությունն ավտոմատ ջնջվել է</translation>
 <translation id="9220525904950070496">Հեռացնել հաշիվը</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index b068d17..0faca6a3 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1915,6 +1915,7 @@
 <translation id="2287617382468007324">Mencetak Alamat IPP</translation>
 <translation id="2287704681286152065">{NUM_SITES,plural, =1{Untuk melindungi data Anda, izin telah dihapus dari situs yang tidak Anda buka baru-baru ini}other{Untuk melindungi data Anda, izin telah dihapus dari situs yang tidak Anda buka baru-baru ini}}</translation>
 <translation id="2287944065963043964">Layar login</translation>
+<translation id="2289567621059034186">Tab baru di bawah</translation>
 <translation id="2290615375132886363">Tombol navigasi tablet</translation>
 <translation id="2290703778620332549">Ganti atau Buat Grup Baru?</translation>
 <translation id="2291452790265535215">Coba gunakan panel samping untuk bookmark, perjalanan, dan lainnya</translation>
@@ -3279,6 +3280,7 @@
 <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">Sedang memberikan patch</translation>
+<translation id="3228962656492373217">Tutup tab di bawah</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>
@@ -5015,6 +5017,7 @@
 <translation id="4404843640767531781"><ph name="APP_NAME" /> diblokir oleh orang tuamu. Minta izin orang tuamu untuk menggunakan aplikasi ini.</translation>
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="4405224443901389797">Pindahkan ke…</translation>
+<translation id="4405580203042711503">Tab Baru di Bawah</translation>
 <translation id="4405781821077215583">Membuat item di layar Anda, termasuk teks, menjadi lebih kecil atau lebih besar</translation>
 <translation id="4406308048672435032">Anda dapat menonaktifkan tab ini atau memuat ulang untuk melihat kembali daftar lengkapnya</translation>
 <translation id="4406881185911439342">Fokuskan grup</translation>
@@ -6732,6 +6735,7 @@
 <translation id="5609231933459083978">Tampaknya aplikasi ini tidak valid.</translation>
 <translation id="5610867721023328944">Coba lagi atau pilih salah satu tema yang tersedia di bawah.</translation>
 <translation id="5611398002774823980">Simpan di akun</translation>
+<translation id="5611474372949142946">Tutup Tab di Bawah</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
 <translation id="5614190747811328134">Notifikasi Pengguna</translation>
 <translation id="5614553682702429503">Simpan sandi?</translation>
@@ -11985,6 +11989,7 @@
 <translation id="9215742531438648683">Uninstal Google Play Store</translation>
 <translation id="9218430445555521422">Jadikan default</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (aplikasi tidak didukung)</translation>
+<translation id="9219103736887031265">Gambar</translation>
 <translation id="9219572436491982747">Data yang dikirim ke Google mungkin dilihat oleh petugas peninjau untuk meningkatkan kualitas teknologi AI Chrome</translation>
 <translation id="9219741625496141320">Data penjelajahan otomatis dihapus</translation>
 <translation id="9220525904950070496">Hapus akun</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index 3290d3f..675d7b53 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -11988,6 +11988,7 @@
 <translation id="9215742531438648683">Fjarlægja Google Play Store</translation>
 <translation id="9218430445555521422">Velja sem sjálfgefið</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (óstutt forrit)</translation>
+<translation id="9219103736887031265">Myndir</translation>
 <translation id="9219572436491982747">Mannlegir yfirlesarar geta séð gögn sem send eru til Google til að bæta tækni gervigreindar Chrome</translation>
 <translation id="9219741625496141320">Vefskoðunargögnum var eytt sjálfkrafa</translation>
 <translation id="9220525904950070496">Fjarlægja reikning</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 0f8fac1..3bc49d3 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -11973,6 +11973,7 @@
 <translation id="9215742531438648683">Disinstallare il Google Play Store</translation>
 <translation id="9218430445555521422">Imposta come predefinito</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (app non supportata)</translation>
+<translation id="9219103736887031265">Immagini</translation>
 <translation id="9219572436491982747">I dati inviati a Google potrebbero essere esaminati da revisori per migliorare la tecnologia AI di Chrome</translation>
 <translation id="9219741625496141320">I dati di navigazione sono stati eliminati automaticamente</translation>
 <translation id="9220525904950070496">Rimuovi account</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 228649c..e4c200d 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -403,6 +403,7 @@
 <translation id="1252987234827889034">אירעה שגיאה בפרופיל</translation>
 <translation id="1254034280040157728">גרנד קניון</translation>
 <translation id="1254593899333212300">חיבור אינטרנט ישיר</translation>
+<translation id="1255095393630332248">‏בשיתוף כרטיסיות, התוכן של הדפים, המדיה וכתובות ה-URL שלהם נשלחים אל Google.</translation>
 <translation id="1256588359404100567">ההגדרה סונכרנה מהמכשיר הקודם שלך.</translation>
 <translation id="1257336506558170607">ייצוא האישור שנבחר</translation>
 <translation id="1258491128795710625">מה חדש</translation>
@@ -527,6 +528,7 @@
 <translation id="1342886103232377846">‏כדי לבדוק אם יש סיסמאות שנחשפו, צריך לעבור למנהל הסיסמאות של Google</translation>
 <translation id="1343920184519992513">להמשיך מהמקום שבו הפסקת ולפתוח קבוצת דפים מסוימת</translation>
 <translation id="1344141078024003905">‏Cast של המסך מופעל. אפשר להשהות או להפסיק את הפעלת ה-Cast של המסך בכל שלב.</translation>
+<translation id="13449088910457661">‏‫Gemini יפעל בכרטיסיות שלך כדי לעבוד על משימות שיינתנו לו. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
 <translation id="1346403631707626730">‏שליחת מידע לגבי אופן השימוש בנתונים וניתוח הביצועים. כדי לתרום לשיפור חוויית המשתמש של הילד או הילדה ב-Android, אפשר לשלוח אל Google נתוני אבחון, נתוני מכשיר ונתוני שימוש באפליקציות באופן אוטומטי. הנתונים האלה לא ישמשו כדי לזהות את הילד או הילדה שלך, והם יעזרו לנו לשמור על היציבות של המערכת ושל האפליקציות ולבצע שיפורים אחרים. חלק מהנתונים הנצברים יעזרו גם לשפר את האפליקציות של Google ויעזרו לשותפים של Google, כמו מפתחים של Android. אם ההגדרה 'פעילות באפליקציות ובאתרי אינטרנט נוספים' הופעלה לילד או לילדה שלך, יכול להיות שהנתונים האלה יישמרו בחשבון שלהם ב-Google. <ph name="BEGIN_LINK1" />מידע נוסף על מדדים<ph name="BEGIN_LINK1_END" />מידע נוסף<ph name="END_LINK1" /></translation>
 <translation id="1346630054604077329">אישור והפעלה מחדש</translation>
 <translation id="1346748346194534595">ימינה</translation>
@@ -589,6 +591,7 @@
 <translation id="1390907927270446471">ל<ph name="PROFILE_USERNAME" /> אין הרשאה להדפיס ב-<ph name="PRINTER_NAME" />. צריך לפנות למנהל המערכת.</translation>
 <translation id="1392047138650695757">המילונים של המשתמש</translation>
 <translation id="139300021892314943">הגבלת המשתמשים שיכולים להיכנס</translation>
+<translation id="1393235015225624732">{NUM_TABS,plural, =1{‏הפסקת שיתוף הכרטיסייה עם Gemini}one{‏הפסקת השיתוף של # כרטיסיות עם Gemini}two{‏הפסקת השיתוף של # כרטיסיות עם Gemini}other{‏הפסקת השיתוף של # כרטיסיות עם Gemini}}</translation>
 <translation id="1393283411312835250">שמש ועננים</translation>
 <translation id="1395832189806039783">הדגשה של פריט באמצעות מיקוד המקלדת</translation>
 <translation id="1396120028054416908">חזרה אל <ph name="FOLDER_TITLE" /></translation>
@@ -732,6 +735,7 @@
 <translation id="1486616492435615702">אפשר ליצור טיוטה או לשפר טקסט קיים.</translation>
 <translation id="1487335504823219454">מופעל - הגדרות מותאמות אישית</translation>
 <translation id="1489101155914355052">המערכת יוצרת הצעות לגבי המסמך הזה…</translation>
+<translation id="1493152297698462486">‏יצירת תמונה באמצעות Gemini</translation>
 <translation id="1493892686965953381">בהמתנה ל-<ph name="LOAD_STATE_PARAMETER" />...</translation>
 <translation id="1494349716233667318">אתרים יכולים לבקש הרשאה להשתמש בגופנים שמותקנים במכשיר</translation>
 <translation id="1494429729245089920">המכונה הווירטואלית '<ph name="VM_NAME" />' קיימת, אבל נראה שהיא לא מכונה וירטואלית תקינה מסוג <ph name="APP_NAME" />. צריך לפנות לאדמין.</translation>
@@ -828,6 +832,7 @@
 <translation id="1561331397460162942">הפעולה הזו מאפשרת גישה למיקום לאפליקציות, ולאתרים עם הרשאת גישה למיקום ולשירותי המערכת</translation>
 <translation id="1562119309884184621">לאחר שאיש הקשר הזה יתווסף, המערכת תזכור אותו לפעם הבאה שיתבצע שיתוף</translation>
 <translation id="1562585387501039294">לפי דרישת הארגון שלך, <ph name="ACCOUNT_MANAGER" />, צריך פרופיל מנוהל. הארגון יוכל לראות חלק מהמידע, כולל</translation>
+<translation id="156345786953026804">‏תוכן הדף וכתובות ה-URL ש-Gemini משתמש בהם במהלך המשימה ישותפו עם Google.</translation>
 <translation id="1566049601598938765">אתר</translation>
 <translation id="15662109988763471">המדפסת שנבחרה אינה זמינה או שאינה מותקנת כראוי. יש לבדוק את המדפסת או לנסות לבחור מדפסת אחרת.</translation>
 <translation id="1566329594234563241">בזמן שהמכשיר מחובר לחשמל ולא פעיל</translation>
@@ -1133,6 +1138,7 @@
 <translation id="1753557900380512635">עיצוב פנים</translation>
 <translation id="1753905327828125965">עם המבקרים הרבים ביותר</translation>
 <translation id="1755601632425835748">גודל טקסט</translation>
+<translation id="1756963401828337401">בחירת מסך לצילום</translation>
 <translation id="1757132445735080748">‏כדי לסיים את ההגדרה של Linux, צריך לעדכן את ChromeOS Flex ולנסות שוב.</translation>
 <translation id="1757301747492736405">הסרת ההתקנה נמצאת במצב המתנה</translation>
 <translation id="175772926354468439">הפעלת עיצוב</translation>
@@ -2138,6 +2144,7 @@
 <translation id="2435248616906486374">הרשת מנותקת</translation>
 <translation id="2435457462613246316">הצגת סיסמה</translation>
 <translation id="2436385001956947090">העתקת &amp;הקישור</translation>
+<translation id="2437105255211187922">{NUM_TABS,plural, =1{שיתוף הכרטיסייה שנבחרה יגרום לחריגה ממגבלת השיתוף}one{שיתוף של # כרטיסיות יגרום לחריגה ממגבלת השיתוף}two{שיתוף של # כרטיסיות יגרום לחריגה ממגבלת השיתוף}other{שיתוף של # כרטיסיות יגרום לחריגה ממגבלת השיתוף}}</translation>
 <translation id="2437561292559037753">שיתוף נתונים</translation>
 <translation id="2438853563451647815">אין מדפסת מחוברת</translation>
 <translation id="2439152382014731627">איפוס הסיסמה ל-<ph name="DEVICE_TYPE" /></translation>
@@ -2351,6 +2358,7 @@
 <translation id="2573276323521243649">חזרה מדף בחירת הדמות</translation>
 <translation id="2573417407488272418">לפני השדרוג כדאי לגבות קבצים ואפליקציות ב'קבצים' &gt; 'הקבצים שלי'.</translation>
 <translation id="2573831315551295105">הקצאת מתג לפעולה “<ph name="ACTION" />”</translation>
+<translation id="2574037773163798130">{NUM_TABS,plural, =1{‏שיתוף הכרטיסייה עם Gemini}one{‏שיתוף של # כרטיסיות עם Gemini}two{‏שיתוף של # כרטיסיות עם Gemini}other{‏שיתוף של # כרטיסיות עם Gemini}}</translation>
 <translation id="2575247648642144396">סמל זה יוצג כאשר התוסף יכול לפעול בדף הנוכחי. יש להשתמש בתוסף זה על ידי לחיצה על הסמל או על ידי הקשה על <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2575407791320728464">‏כתובת ה-URL לא תקינה. יש לוודא שהפורמט שלה תקין.</translation>
 <translation id="2575441894380764255">לא מורשים להציג מודעות מפריעות או מטעות</translation>
@@ -2809,6 +2817,7 @@
 <translation id="2886119409731773154">התהליך עשוי להימשך עד 30 דקות</translation>
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="288734198558082692"><ph name="DEVICE" /> ו-<ph name="NUMBER_OF_DEVICES" /> נוספים</translation>
+<translation id="2887344147309501015">‏אפשר לשוחח עם Gemini ב-Chrome כדי לקבל תשובות, מסקנות עיקריות ועוד בזמן הגלישה</translation>
 <translation id="2889043468805635730">לא נמצאו בעיות</translation>
 <translation id="2889064240420137087">פתיחת קישור באמצעות...</translation>
 <translation id="2891464434568738544">אין אתרים זמינים כרגע. צריך לבקר באתר כדי שהוא יתווסף לרשימה הזו.</translation>
@@ -4624,6 +4633,7 @@
 <translation id="4116480382905329353">התנועה זוהתה פעם אחת</translation>
 <translation id="4116704186509653070">פתיחה מחדש</translation>
 <translation id="4117714603282104018">משוב פיזי בלוח המגע</translation>
+<translation id="4117854923024277067">אפשר להשתמש בצילום המסך בהנחיה או למחוק אותו</translation>
 <translation id="4118579674665737931">אפשר להפעיל מחדש את המכשיר ולנסות שוב.</translation>
 <translation id="4120388883569225797">לא ניתן לאפס את מפתח האבטחה הזה</translation>
 <translation id="4120817667028078560">הנתיב ארוך מדי</translation>
@@ -4676,6 +4686,7 @@
 <translation id="4158315983204257156">הגודל והגופן של הטקסט באתר</translation>
 <translation id="4158364720893025815">הצלחה</translation>
 <translation id="4159784952369912983">סגול</translation>
+<translation id="4162545316103024845">{NUM_TABS,plural, =1{שיתוף הכרטיסייה שנבחרה יגרום לחריגה ממגבלת השיתוף}one{שיתוף של # כרטיסיות יגרום לחריגה ממגבלת השיתוף}two{שיתוף של # כרטיסיות יגרום לחריגה ממגבלת השיתוף}other{שיתוף של # כרטיסיות יגרום לחריגה ממגבלת השיתוף}}</translation>
 <translation id="4163560723127662357">מקלדת לא ידועה</translation>
 <translation id="4165942112764990069">‏החשבון <ph name="USER_EMAIL" /> לא שייך לארגון תקין. יש לפנות אל מנהל המערכת. מנהלי מערכת יכולים להגדיר את הארגון שלהם בכתובת: g.co/ChromeEnterpriseAccount</translation>
 <translation id="4165986682804962316">הגדרות לאתרים</translation>
@@ -4686,6 +4697,8 @@
 <translation id="4168651806173792090"><ph name="NETWORK_NAME" /> המסתיים בספרות <ph name="LAST_FOUR_DIGITS" /></translation>
 <translation id="4169535189173047238">לא לאפשר</translation>
 <translation id="4170314459383239649">מחיקה ביציאה</translation>
+<translation id="417112242673828206">{NUM_TABS,plural, =1{‏שיתוף הכרטיסייה עם Gemini}one{‏שיתוף של # כרטיסיות עם Gemini}two{‏שיתוף של # כרטיסיות עם Gemini}other{‏שיתוף של # כרטיסיות עם Gemini}}</translation>
+<translation id="4173129130568053653">‏‫Gemini יכול לעזור לקבוע פגישות, ליצור עגלות קניות או לעבוד על משימות אחרות שיינתנו לו.</translation>
 <translation id="4175137578744761569">סגול בהיר ולבן</translation>
 <translation id="4176463684765177261">מושבת</translation>
 <translation id="4176864026061939326">המכשיר הזה מנוהל. האדמין של המכשיר דורש יצירת פרופיל חדש לחשבון <ph name="USER_EMAIL_ADDRESS" />.</translation>
@@ -4719,6 +4732,7 @@
 <translation id="4200689466366162458">מילים מותאמות אישית</translation>
 <translation id="4200983522494130825">כרטיסייה חדשה</translation>
 <translation id="4201546031411513170">אפשר לבחור מה לסנכרן בכל שלב דרך ההגדרות.</translation>
+<translation id="4202536110335087135">אני רוצה לנסות</translation>
 <translation id="4203065553461038553">שם הקובץ או הנתיב שלו ארוכים מדי</translation>
 <translation id="4203769790323223880">אין הרשאת גישה למצלמה</translation>
 <translation id="4204415812590935863">אי אפשר ליצור עיצוב כרגע.</translation>
@@ -6161,6 +6175,7 @@
 <translation id="5204967432542742771">הזנת סיסמה</translation>
 <translation id="5205484256512407285">אף פעם אין להשתמש בנתונים סלולריים להעברה</translation>
 <translation id="520568280985468584">הרשת נוספה בהצלחה. ייתכן שיחלפו מספר דקות עד שהרשת הסלולרית תהיה פעילה.</translation>
+<translation id="520576054436518354">‏רוצה ש-Gemini יחפש בשבילך?</translation>
 <translation id="5207949376430453814">הדגשה של סמן הטקסט</translation>
 <translation id="520840839826327499">‏<ph name="SERVICE_NAME" /> רוצה לוודא שמכשיר ה-ChromeOS שלך כשיר.</translation>
 <translation id="5208722776934437424">איך משנים את ההרשאות</translation>
@@ -6176,6 +6191,7 @@
 <translation id="5215450412607891876">הפעלה של עדכוני האבטחה המורחבים</translation>
 <translation id="5215502535566372932">יש לבחור מדינה</translation>
 <translation id="5216674789212441076">‏התכונה מתרגמת באופן אוטומטי כתוביות מיידיות. הכתוביות נשלחות אל Google לתרגום.</translation>
+<translation id="5216951551945455224">{NUM_TABS,plural, =1{‏הפסקת שיתוף הכרטיסייה עם Gemini}one{‏הפסקת השיתוף של # כרטיסיות עם Gemini}two{‏הפסקת השיתוף של # כרטיסיות עם Gemini}other{‏הפסקת השיתוף של # כרטיסיות עם Gemini}}</translation>
 <translation id="5220011581825921581">חיפוש + חץ למעלה</translation>
 <translation id="5221516927483787768">‏אי אפשר להפעיל Cast של <ph name="HOST_NAME" /></translation>
 <translation id="5221834113325601057">הכרטיסייה הוחרגה מהרשימה</translation>
@@ -6249,6 +6265,7 @@
 <translation id="5267572070504076962">כדאי להפעיל את הגלישה הבטוחה ולקבל הגנה מפני אתרים מסוכנים</translation>
 <translation id="5269659747698455324">פתיחת הנעילה של מפתחות הגישה</translation>
 <translation id="5269977353971873915">ההדפסה נכשלה</translation>
+<translation id="5271124474068841290">‏שיתוף הכרטיסייה הנוכחית עם Gemini, גם במעבר בין כרטיסיות. הנתונים שלך לא ישמשו לשיפור מודלים של AI גנרטיבי.</translation>
 <translation id="5271578170655641944">‏להסיר את הגישה ל-Google Drive?</translation>
 <translation id="5272198173084686007">אין כרטיסיות ממכשירים אחרים</translation>
 <translation id="527335345740023523">כרגע יש לך <ph name="NUMBERED_ITEM_1" />, ‏<ph name="NUMBERED_ITEM_2" />, ‏<ph name="NUMBERED_ITEM_3" /> ועוד. האדמין בארגון שלך, <ph name="ACCOUNT_MANAGER" />, יוכל לראות את הנתונים האלה ולנהל אותם.</translation>
@@ -6338,6 +6355,7 @@
 <translation id="5333896723098573627">‏כדי להסיר אפליקציות, צריך לעבור אל 'הגדרות' &gt; 'חנות Google Play' &gt; 'ניהול העדפות Android' &gt;'אפליקציות' או 'מנהל האפליקציות'. לאחר מכן לוחצים על האפליקציה שרוצים להסיר את ההתקנה שלה (יכול להיות שצריך יהיה להחליק ימינה או שמאלה כדי למצוא את האפליקציה). לבסוף, לוחצים על 'הסרת התקנה' או 'השבתה'.</translation>
 <translation id="5334113802138581043">גישה למיקרופון</translation>
 <translation id="5334142896108694079">מטמון של סקריפט</translation>
+<translation id="5335370353987155592">‏חשוב להשתמש ב-Gemini בזהירות וב<ph name="BEGIN_LINK1" />אופן בטוח<ph name="LINK_END1" />. הפעולות ש-Gemini מבצע במהלך המשימה הן באחריותך, כולל טעויות ו<ph name="BEGIN_LINK2" />תוצאות לא צפויות<ph name="LINK_END2" /> כמו רכישות.</translation>
 <translation id="5336688142483283574">הדף הזה יוסר גם מההיסטוריה שלך ומהפעילות של <ph name="SEARCH_ENGINE" />.</translation>
 <translation id="5336689872433667741">סמן ולוח מגע</translation>
 <translation id="5337207153202941678">השבתת ההדגשה</translation>
@@ -6808,6 +6826,7 @@
 <translation id="5655296450510165335">שיוך מכשיר לארגון</translation>
 <translation id="5655823808357523308">שינוי של תצוגת הצבעים במסך</translation>
 <translation id="5656845498778518563">‏שליחת משוב ל-Google</translation>
+<translation id="5656944594833183876">קבלת עזרה במשימות</translation>
 <translation id="5657667036353380798">‏על מנת להתקין את התוסף החיצוני, על Chrome להיות מגרסה <ph name="MINIMUM_CHROME_VERSION" /> ומעלה.</translation>
 <translation id="565899488479822148">מתבצעת התקנה של העדכון האחרון</translation>
 <translation id="5659593005791499971">אימייל</translation>
@@ -7600,6 +7619,7 @@
 <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> לא מחובר לרשת. צריך להתחבר לאינטרנט ולנסות שוב.</translation>
 <translation id="6220413761270491930">אירעה שגיאה בטעינת תוסף</translation>
 <translation id="622125358038862905">{NUM_OF_FILES,plural, =1{לא ניתן להעתיק את הקובץ אל <ph name="CLOUD_PROVIDER" />}one{לא ניתן להעתיק את הקבצים אל <ph name="CLOUD_PROVIDER" />}two{לא ניתן להעתיק את הקבצים אל <ph name="CLOUD_PROVIDER" />}other{לא ניתן להעתיק את הקבצים אל <ph name="CLOUD_PROVIDER" />}}</translation>
+<translation id="62229737360959019">‏גם כרטיסיות שנפתחו משיחה או כרטיסייה משותפת משותפות עם Gemini. במצב Live, רק הכרטיסייה הנוכחית משותפת כברירת מחדל.</translation>
 <translation id="6224481128663248237">הפרמוט הסתיים בהצלחה!</translation>
 <translation id="622474711739321877">הקונטיינר הזה כבר קיים.</translation>
 <translation id="622484624075952240">למטה</translation>
@@ -7811,6 +7831,7 @@
 <translation id="6367097275976877956">‏רוצה להפעיל את ChromeVox, קורא המסך המובנה של ChromeOS? אם כן, יש להקיש על מקש הרווח.</translation>
 <translation id="6367196786591004737">מחיקת הרשומה</translation>
 <translation id="6367396429435748845">כדי להשהות את השליטה בעכבר מהמקלדת או להמשיך אותה, לוחצים על <ph name="ALT" /> + <ph name="LAUNCHER" /> + <ph name="NUM_4" /></translation>
+<translation id="6367853307713830174">‏‫Gemini מציג את השלבים שהוא עובר ומנסה לקבל אישור לפני שהוא עושה פעולות רגישות. תמיד אפשר להפסיק את הפעולה או להמשיך אותה באופן עצמאי.</translation>
 <translation id="6367985768157257101">האם לקבל באמצעות 'שיתוף בקרבת מקום'?</translation>
 <translation id="6368157733310917710">כתובות ועוד</translation>
 <translation id="6368276408895187373">מופעלת – <ph name="VARIATION_NAME" /></translation>
@@ -7860,6 +7881,7 @@
 <translation id="640457954117263537">‏שימוש בנתוני המיקום באפליקציות ובשירותים של ChromeOS ו-Android.</translation>
 <translation id="6406303162637086258">ביצוע הדמיה של הפעלת דפדפן מחדש</translation>
 <translation id="6406506848690869874">סנכרון</translation>
+<translation id="6406571339342621375">‏לא להציג את Gemini בסרגל התפריטים</translation>
 <translation id="6406708970972405507">הגדרות - <ph name="SECTION_TITLE" /></translation>
 <translation id="6407398811519202484">יש לאתרים האלה הרשאה לשמור נתונים במכשיר שלך</translation>
 <translation id="6408118934673775994">לקרוא ולשנות את הנתונים שלך ב-<ph name="WEBSITE_1" />‏, <ph name="WEBSITE_2" /> וב-<ph name="WEBSITE_3" /></translation>
@@ -8336,6 +8358,7 @@
 <translation id="6737663862851963468">‏הסרה של כרטיס Kerberos</translation>
 <translation id="6738180164164974883">‏אישור להגדיר קובצי cookie של צד שלישי</translation>
 <translation id="6738430949033571771">החשבון בתהליך אימות…</translation>
+<translation id="6739153164244375709">Gemini Host Renderer</translation>
 <translation id="6739266861259291931">איפוס לשפת המכשיר</translation>
 <translation id="6739923123728562974">הצגת קיצור דרך בשולחן העבודה</translation>
 <translation id="6739943577740687354">‏זאת תכונה שמבוססת על AI ויכול להיות שהתוצאה לא תתאים לך</translation>
@@ -8581,6 +8604,7 @@
 <translation id="6899427698619335650">‏הפעלת ההקצאה הגמישה של סימנים דיאקריטיים. לדוגמה, אפשר להקליד anh1 או a1nh כדי לקבל ánh.</translation>
 <translation id="6900284862687837908">יישום רקע: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">הגנה משופרת</translation>
+<translation id="6900632443249221072">‏יצירת תמונה באמצעות Gemini</translation>
 <translation id="6900651018461749106">יש להיכנס שוב כדי לעדכן את <ph name="USER_EMAIL" /></translation>
 <translation id="6900654715912436255">בחרת למחוק את מנוע החיפוש הזה. להמשיך?</translation>
 <translation id="6901024547292737736"><ph name="MAX_CHAR_COUNT" />/<ph name="ACTUAL_CHAR_COUNT" /></translation>
@@ -9094,6 +9118,7 @@
 <translation id="7268412955622368206">‏הצגת התראה קופצת להתקני USB חדשים.</translation>
 <translation id="7269229526547981029">הפרופיל הזה מנוהל על ידי <ph name="PROFILE_MANAGER" />. יצירת פרופיל חדש לחשבון <ph name="USER_EMAIL_ADDRESS" /> נדרשת על ידי <ph name="ACCOUNT_MANAGER" />.</translation>
 <translation id="7269736181983384521">שימוש בחבילת הגלישה לשיתוף בקרבת מקום</translation>
+<translation id="7270447384127135313">‏במהלך הגלישה, אפשר בקלות לשאול את Gemini שאלות על הכרטיסיות שמשתפים.</translation>
 <translation id="7271278495464744706">הפעלת תיאורים מפורטים</translation>
 <translation id="7272674038937250585">לא סופק תיאור</translation>
 <translation id="7273110280511444812">בוצע חיבור לאחרונה ב-<ph name="DATE" /></translation>
@@ -9592,6 +9617,7 @@
 <translation id="7617263010641145920">‏הפעלה של חנות Play</translation>
 <translation id="7617648809369507487">שימוש בהצגת התראות שקטה יותר</translation>
 <translation id="7619937211696316184">פעולות התחזוקה הסתיימו</translation>
+<translation id="7620049858153799769">‏יכול להיות שבודקים אנושיים יראו שיחות על כרטיסיות משותפות כדי לשפר את Gemini.</translation>
 <translation id="7620083113061729689">סנכרון ההיסטוריה</translation>
 <translation id="7620616707541471029">בחירת חשבון להמשך</translation>
 <translation id="7621382409404463535">המערכת לא הצליחה לשמור את תצורת המכשיר.</translation>
@@ -11998,6 +12024,7 @@
 <translation id="9215742531438648683">‏הסרה של 'חנות Google Play'</translation>
 <translation id="9218430445555521422">הגדרה כברירת מחדל</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (האפליקציה לא נתמכת)</translation>
+<translation id="9219103736887031265">תמונות</translation>
 <translation id="9219572436491982747">‏יכול להיות שבודקים אנושיים יראו את הנתונים שנשלחים אל Google כדי לשפר את טכנולוגיית ה-AI של Chrome</translation>
 <translation id="9219741625496141320">נתוני הגלישה נמחקו באופן אוטומטי</translation>
 <translation id="9220525904950070496">הסרת חשבון</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index db1b519..df05d135 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -11959,6 +11959,7 @@
 <translation id="9215742531438648683">Google Play ストアのアンインストール</translation>
 <translation id="9218430445555521422">デフォルトに設定</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" />(サポートされていないアプリ)</translation>
+<translation id="9219103736887031265">画像</translation>
 <translation id="9219572436491982747">Google に送信されたデータは、Chrome の AI 技術の改善のために人間のレビュアーによって確認される場合があります</translation>
 <translation id="9219741625496141320">閲覧データが自動的に削除されました</translation>
 <translation id="9220525904950070496">アカウントを削除</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index f25cdd7..01e68c9e 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -11974,6 +11974,7 @@
 <translation id="9215742531438648683">Google Play Store-ის დეინსტალაცია</translation>
 <translation id="9218430445555521422">ნაგულისხმევის დაყენება</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (მხარდაუჭერელი აპი)</translation>
+<translation id="9219103736887031265">გამოსახულებები</translation>
 <translation id="9219572436491982747">Google-თან გაგზავნილი მონაცემები შეიძლება ნახონ ადამიანმა მიმომხილველებმა, Chrome-ის ხელოვნური ინტელექტის ტექნოლოგიის გაუმჯობესების მიზნით</translation>
 <translation id="9219741625496141320">დათვალიერების მონაცემები ავტომატურად წაიშალა</translation>
 <translation id="9220525904950070496">ანგარიშის წაშლა</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index 8e32f71..f888521 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -11960,6 +11960,7 @@
 <translation id="9215742531438648683">Google Play Store қолданбасын жою</translation>
 <translation id="9218430445555521422">Әдепкі ретінде орнату</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (қолдау көрсетілмейтін қолданба)</translation>
+<translation id="9219103736887031265">Кескіндер</translation>
 <translation id="9219572436491982747">Chrome-ның жасанды интеллект технологиясын жақсарту үшін Google-ға жіберілетін ақпаратты тексерушілер қарауы мүмкін.</translation>
 <translation id="9219741625496141320">Браузерді пайдалану деректері автоматты түрде жойылады</translation>
 <translation id="9220525904950070496">Аккаунтты жою</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb
index 649fd3d3..f0f1702 100644
--- a/chrome/app/resources/generated_resources_km.xtb
+++ b/chrome/app/resources/generated_resources_km.xtb
@@ -12012,6 +12012,7 @@
 <translation id="9215742531438648683">លុប Google Play Store</translation>
 <translation id="9218430445555521422">កំណត់ជាលំនាំដើម</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (កម្មវិធី​ដែលមិនស្គាល់)</translation>
+<translation id="9219103736887031265">រូបភាព</translation>
 <translation id="9219572436491982747">ទិន្នន័យដែលបានបញ្ជូនឱ្យ Google ប្រហែល​ត្រូវអ្នកត្រួតពិនិត្យជាមនុស្សមើលឃើញ​ក្នុងការកែលម្អ​បច្ចេកវិទ្យារបស់ Chrome AI</translation>
 <translation id="9219741625496141320">ទិន្នន័យរុករក​ត្រូវបានលុប​ដោយស្វ័យប្រវត្តិ</translation>
 <translation id="9220525904950070496">ដកគណនីចេញ</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 2f50972d..6dde4c9 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -12009,6 +12009,7 @@
 <translation id="9215742531438648683">Google Play Store ‌‌ ಅನ್ನು ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ</translation>
 <translation id="9218430445555521422">ಡೀಫಾಲ್ಟ್ ಆಗಿ ಸೆಟ್ ಮಾಡಿ</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (ಬೆಂಬಲಿಸದ ಆ್ಯಪ್)</translation>
+<translation id="9219103736887031265">Images</translation>
 <translation id="9219572436491982747">Chrome AI ತಂತ್ರಜ್ಞಾನವನ್ನು ಸುಧಾರಿಸಲು Google ಗೆ ಕಳುಹಿಸಲಾದ ಡೇಟಾವನ್ನು ಮಾನವ ರಿವ್ಯೂವರ್‌ಗಳು ನೋಡಬಹುದು</translation>
 <translation id="9219741625496141320">ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಅಳಿಸಲಾಗಿದೆ</translation>
 <translation id="9220525904950070496">ಖಾತೆಯನ್ನು ತೆಗೆದುಹಾಕಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index d4022f9..8917d58 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1916,6 +1916,7 @@
 <translation id="2287617382468007324">인쇄 IPP 주소</translation>
 <translation id="2287704681286152065">{NUM_SITES,plural, =1{데이터 보호를 위해 최근에 방문하지 않은 사이트에서 권한이 삭제됨}other{데이터 보호를 위해 최근에 방문하지 않은 사이트에서 권한이 삭제됨}}</translation>
 <translation id="2287944065963043964">로그인 화면</translation>
+<translation id="2289567621059034186">아래에 새 탭</translation>
 <translation id="2290615375132886363">태블릿 탐색 버튼</translation>
 <translation id="2290703778620332549">그룹을 바꾸거나 새로 만드시겠어요?</translation>
 <translation id="2291452790265535215">북마크, 탐색 여정 등에 측면 패널을 사용해 보세요.</translation>
@@ -3281,6 +3282,7 @@
 <translation id="322708765617468434">설정 후 언제든지 다른 사용자를 기기에 추가할 수 있습니다. 모든 사용자는 자신의 환경을 맞춤설정하고 데이터를 비공개로 유지할 수 있습니다.</translation>
 <translation id="3227137524299004712">마이크</translation>
 <translation id="3227701057281907159">패치</translation>
+<translation id="3228962656492373217">아래 탭 닫기</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>
@@ -5015,6 +5017,7 @@
 <translation id="4404843640767531781">부모님이 <ph name="APP_NAME" /> 앱을 차단했습니다. 이 앱을 사용하려면 부모님에게 권한을 요청하세요.</translation>
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="4405224443901389797">다음 폴더로 이동…</translation>
+<translation id="4405580203042711503">아래에 새 탭</translation>
 <translation id="4405781821077215583">텍스트를 포함하여 화면에 표시된 항목을 작게 또는 크게 표시합니다.</translation>
 <translation id="4406308048672435032">이 탭을 비활성화하거나 새로고침하여 전체 목록을 다시 볼 수 있습니다.</translation>
 <translation id="4406881185911439342">그룹 포커스</translation>
@@ -6733,6 +6736,7 @@
 <translation id="5609231933459083978">애플리케이션이 잘못된 것 같습니다.</translation>
 <translation id="5610867721023328944">다시 시도하거나 아래에서 사용 가능한 테마 중 하나를 선택하세요.</translation>
 <translation id="5611398002774823980">계정에 저장</translation>
+<translation id="5611474372949142946">아래 탭 닫기</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
 <translation id="5614190747811328134">사용자 알림</translation>
 <translation id="5614553682702429503">비밀번호를 저장하시겠습니까?</translation>
@@ -11987,6 +11991,7 @@
 <translation id="9215742531438648683">Google Play 스토어 제거</translation>
 <translation id="9218430445555521422">기본값으로 설정</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" />(지원되지 않는 앱)</translation>
+<translation id="9219103736887031265">이미지</translation>
 <translation id="9219572436491982747">Chrome AI 기술을 개선하기 위해 Google로 전송된 데이터를 인적 검토자가 확인할 수 있습니다.</translation>
 <translation id="9219741625496141320">인터넷 사용 기록이 자동으로 삭제되었습니다</translation>
 <translation id="9220525904950070496">계정 삭제</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index f616c2b..732fbbe2 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -11984,6 +11984,7 @@
 <translation id="9215742531438648683">Google Play Store'ду чыгарып салуу</translation>
 <translation id="9218430445555521422">Демейки катары коюу</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (колдоого алынбаган колдонмо)</translation>
+<translation id="9219103736887031265">Сүрөттөр</translation>
 <translation id="9219572436491982747">Google'га жөнөтүлгөн маалыматты адистерибиз Chrome'дун ЖИ технологиясын жакшыртуу үчүн карап көрүшү мүмкүн</translation>
 <translation id="9219741625496141320">Серептөө дайындары автоматтык түрдө өчүрүлдү</translation>
 <translation id="9220525904950070496">Аккаунтту өчүрүү</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb
index 4113a04..7a19ce3 100644
--- a/chrome/app/resources/generated_resources_lo.xtb
+++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -12007,6 +12007,7 @@
 <translation id="9215742531438648683">ຖອນການຕິດຕັ້ງ Google Play Store</translation>
 <translation id="9218430445555521422">ຕັ້ງເປັນຄ່າເລີ່ມຕົ້ນ</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (ແອັບທີ່ບໍ່ຮອງຮັບ)</translation>
+<translation id="9219103736887031265">ຮູບ</translation>
 <translation id="9219572436491982747">ທີມງານກວດສອບອາດເຫັນຂໍ້ມູນທີ່ສົ່ງໄປຫາ Google ເພື່ອນຳໄປໃຊ້ປັບປຸງເທັກໂນໂລຢີຂອງ Chrome AI</translation>
 <translation id="9219741625496141320">ຂໍ້ມູນການທ່ອງເວັບຖືກລຶບອອກໂດຍອັດຕະໂນມັດ</translation>
 <translation id="9220525904950070496">ລົບບັນ​ຊີອອກ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index c22f34f..06d9f28 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -404,6 +404,7 @@
 <translation id="1252987234827889034">Įvyko profilio klaida</translation>
 <translation id="1254034280040157728">Didysis kanjonas</translation>
 <translation id="1254593899333212300">Tiesioginis interneto ryšys</translation>
+<translation id="1255095393630332248">Kai skirtukai bendrinami, jų puslapių turinys, medija ir URL siunčiami „Google“.</translation>
 <translation id="1256588359404100567">Nustatymas sinchronizuotas iš ankstesnio įrenginio.</translation>
 <translation id="1257336506558170607">Eksportuoti pasirinktą sertifikatą</translation>
 <translation id="1258491128795710625">Kas naujo</translation>
@@ -528,6 +529,7 @@
 <translation id="1342886103232377846">Jei norite patikrinti, ar nėra pažeistų slaptažodžių, eikite į „Google“ slaptažodžių tvarkyklę</translation>
 <translation id="1343920184519992513">Tęskite ten, kur baigėte, ir atidarykite konkrečius puslapius</translation>
 <translation id="1344141078024003905">Perduodate ekrano vaizdą. Galite bet kada pristabdyti ar sustabdyti ekrano vaizdo perdavimą.</translation>
+<translation id="13449088910457661">„Gemini“ veikia jūsų skirtukuose, kad atliktų jūsų pateiktas užduotis. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation>
 <translation id="1346403631707626730">Siųskite naudojimo ir diagnostikos duomenis. Padėkite tobulinti vaiko „Android“ funkcijas automatiškai siųsdami „Google“ diagnostikos, įrenginio ir programų naudojimo duomenis. Tai nebus naudojama siekiant nustatyti jūsų vaiko tapatybę ir padės pagerinti sistemos bei programos stabilumą ir teikti kitus patobulinimus. Kai kurie suminiai duomenys taip pat bus naudingi „Google“ programoms ir partneriams, pvz., „Android“ kūrėjams. Jei papildomos žiniatinklio ir programų veiklos nustatymas įjungtas vaiko įrenginyje, šie duomenys gali būti išsaugoti vaiko „Google“ paskyroje. <ph name="BEGIN_LINK1" />Sužinokite daugiau apie metriką<ph name="BEGIN_LINK1_END" />Sužinokite daugiau<ph name="END_LINK1" /></translation>
 <translation id="1346630054604077329">Patvirtinti ir paleisti iš naujo</translation>
 <translation id="1346748346194534595">Dešinė</translation>
@@ -590,6 +592,7 @@
 <translation id="1390907927270446471"><ph name="PROFILE_USERNAME" /> neturi teisės spausdinti „<ph name="PRINTER_NAME" />“. Susisiekite su administratoriumi.</translation>
 <translation id="1392047138650695757">Naudotojo žodynai</translation>
 <translation id="139300021892314943">Apribojimas, kas gali prisijungti</translation>
+<translation id="1393235015225624732">{NUM_TABS,plural, =1{Nebebendrinti skirtuko su „Gemini“}one{Nebebendrinti # skirtuko su „Gemini“}few{Nebebendrinti # skirtukų su „Gemini“}many{Nebebendrinti # skirtuko su „Gemini“}other{Nebebendrinti # skirtukų su „Gemini“}}</translation>
 <translation id="1393283411312835250">Saulė ir debesys</translation>
 <translation id="1395832189806039783">Elemento paryškinimas suaktyvinus klaviatūra</translation>
 <translation id="1396120028054416908">Atgal į aplanką „<ph name="FOLDER_TITLE" />“</translation>
@@ -733,6 +736,7 @@
 <translation id="1486616492435615702">Sukurti juodraštį arba patikslinti esamą darbą.</translation>
 <translation id="1487335504823219454">Įjungta – tinkinti nustatymai</translation>
 <translation id="1489101155914355052">Generuojami šio dokumento pasiūlymai…</translation>
+<translation id="1493152297698462486">Sukurkite vaizdą naudodami „Gemini“</translation>
 <translation id="1493892686965953381">Laukiama <ph name="LOAD_STATE_PARAMETER" />...</translation>
 <translation id="1494349716233667318">Svetainės gali prašyti leidimo naudoti šriftus, įdiegtus jūsų įrenginyje</translation>
 <translation id="1494429729245089920">Virtualusis įrenginys „<ph name="VM_NAME" />“ yra, bet panašu, kad jis nėra tinkamas „<ph name="APP_NAME" />“ virtualusis įrenginys. Susisiekite su administratoriumi.</translation>
@@ -832,6 +836,7 @@
 <translation id="1561331397460162942">Tai leidžia naudoti prieigą prie vietovės programoms, svetainėms, turinčioms leidimą pasiekti vietovės duomenis, ir sistemos paslaugoms</translation>
 <translation id="1562119309884184621">Įtrauktas kontaktas bus prisimenamas, kai bendrins kitą kartą</translation>
 <translation id="1562585387501039294">Jūsų organizacija <ph name="ACCOUNT_MANAGER" /> reikalauja valdomo profilio ir galės peržiūrėti tam tikrą informaciją, įskaitant nurodytą toliau.</translation>
+<translation id="156345786953026804">Puslapio turinys ir URL, kuriuos „Gemini“ naudoja užduočiai atlikti, bus bendrinami su „Google“.</translation>
 <translation id="1566049601598938765">Svetainė</translation>
 <translation id="15662109988763471">Pasirinktas spausdintuvas nepasiekiamas arba netinkamai įdiegtas. Patikrinkite spausdintuvą arba pabandykite pasirinkti kitą spausdintuvą.</translation>
 <translation id="1566329594234563241">Kai neaktyvus ir įjungtas į lizdą</translation>
@@ -1137,6 +1142,7 @@
 <translation id="1753557900380512635">Interjerai</translation>
 <translation id="1753905327828125965">Dažniausiai lankomi</translation>
 <translation id="1755601632425835748">Teksto dydis</translation>
+<translation id="1756963401828337401">Pasirinkite norimą užfiksuoti ekraną</translation>
 <translation id="1757132445735080748">Jei norite baigti „Linux“ nustatymą, atnaujinkite „ChromeOS Flex“ ir bandykite dar kartą.</translation>
 <translation id="1757301747492736405">Laukiama, kol bus pašalinta</translation>
 <translation id="175772926354468439">Įgalinti temą</translation>
@@ -2142,6 +2148,7 @@
 <translation id="2435248616906486374">Tinklas atjungtas</translation>
 <translation id="2435457462613246316">Rodyti slaptažodį</translation>
 <translation id="2436385001956947090">Kopijuoti nuorodą</translation>
+<translation id="2437105255211187922">{NUM_TABS,plural, =1{Bendrinant pasirinktą skirtuką būtų viršytas bendrinimo apribojimas}one{Bendrinant # skirtuką būtų viršytas bendrinimo apribojimas}few{Bendrinant # skirtukus būtų viršytas bendrinimo apribojimas}many{Bendrinant # skirtuko būtų viršytas bendrinimo apribojimas}other{Bendrinant # skirtukų būtų viršytas bendrinimo apribojimas}}</translation>
 <translation id="2437561292559037753">Duomenų bendrinimas</translation>
 <translation id="2438853563451647815">Neprijungta prie spausdintuvo</translation>
 <translation id="2439152382014731627">Iš naujo nustatyti „<ph name="DEVICE_TYPE" />“ slaptažodį</translation>
@@ -2355,6 +2362,7 @@
 <translation id="2573276323521243649">Grįžti iš pseudoportreto pasirinkimo puslapio</translation>
 <translation id="2573417407488272418">Prieš naujovindami sukurkite atsargines programų ir failų kopijas skiltyje „Failai“ &gt; „Mano failai“.</translation>
 <translation id="2573831315551295105">Veiksmo „<ph name="ACTION" />“ jungiklio priskyrimas</translation>
+<translation id="2574037773163798130">{NUM_TABS,plural, =1{Bendrinti skirtuką su „Gemini“}one{Bendrinti # skirtuką su „Gemini“}few{Bendrinti # skirtukus su „Gemini“}many{Bendrinti # skirtuko su „Gemini“}other{Bendrinti # skirtukų su „Gemini“}}</translation>
 <translation id="2575247648642144396">Ši piktograma bus matoma, kai plėtinys galės veikti dabartiniame puslapyje. Naudokite šį plėtinį spustelėję piktogramą arba paspaudę <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2575407791320728464">Netinkamas URL. Įsitikinkite, kad jis tinkamai suformatuotas.</translation>
 <translation id="2575441894380764255">Neleidžiama rodyti nepageidaujamų ar klaidinančių skelbimų</translation>
@@ -2813,6 +2821,7 @@
 <translation id="2886119409731773154">Tai gali užtrukti iki trisdešimt minučių</translation>
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="288734198558082692"><ph name="DEVICE" /> ir dar <ph name="NUMBER_OF_DEVICES" /></translation>
+<translation id="2887344147309501015">Naršydami kalbėkite su „Gemini“ naršyklėje „Chrome“, kad gautumėte atsakymus, pagrindines išvadas ir kt.</translation>
 <translation id="2889043468805635730">Nerasta jokių problemų</translation>
 <translation id="2889064240420137087">Atidaryti nuorodą naudojant...</translation>
 <translation id="2891464434568738544">Šiuo metu nėra pasiekiamų svetainių. Apsilankykite svetainėje, kad pridėtumėte ją prie šio sąrašo.</translation>
@@ -4628,6 +4637,7 @@
 <translation id="4116480382905329353">Aptikta 1 k.</translation>
 <translation id="4116704186509653070">Atidaryti dar kartą</translation>
 <translation id="4117714603282104018">Jutiklinės dalies juntamas grįžtamasis ryšys</translation>
+<translation id="4117854923024277067">Ekrano kopiją galima naudoti su užklausa arba ištrinti</translation>
 <translation id="4118579674665737931">Paleiskite įrenginį iš naujo ir bandykite dar kartą.</translation>
 <translation id="4120388883569225797">Šio saugos rakto nustatyti iš naujo nepavyko</translation>
 <translation id="4120817667028078560">Kelias per ilgas</translation>
@@ -4680,6 +4690,7 @@
 <translation id="4158315983204257156">Svetainės teksto dydis ir šriftas</translation>
 <translation id="4158364720893025815">Pavyko</translation>
 <translation id="4159784952369912983">Violetinė</translation>
+<translation id="4162545316103024845">{NUM_TABS,plural, =1{Bendrinant pasirinktą skirtuką būtų viršytas bendrinimo apribojimas}one{Bendrinant # skirtuką būtų viršytas bendrinimo apribojimas}few{Bendrinant # skirtukus būtų viršytas bendrinimo apribojimas}many{Bendrinant # skirtuko būtų viršytas bendrinimo apribojimas}other{Bendrinant # skirtukų būtų viršytas bendrinimo apribojimas}}</translation>
 <translation id="4163560723127662357">Nežinoma klaviatūra</translation>
 <translation id="4165942112764990069"><ph name="USER_EMAIL" /> nepriklauso tinkamai organizacijai. Susisiekite su administratoriumi. Jei esate administratorius, galite nustatyti savo organizaciją apsilankę adresu šiuo adresu: g.co/ChromeEnterpriseAccount</translation>
 <translation id="4165986682804962316">Svetainės nustatymai</translation>
@@ -4690,6 +4701,8 @@
 <translation id="4168651806173792090">„<ph name="NETWORK_NAME" />“, kurios numeris baigiasi <ph name="LAST_FOUR_DIGITS" /></translation>
 <translation id="4169535189173047238">Neleisti</translation>
 <translation id="4170314459383239649">Išvalyti išeinant</translation>
+<translation id="417112242673828206">{NUM_TABS,plural, =1{Bendrinti skirtuką su „Gemini“}one{Bendrinti # skirtuką su „Gemini“}few{Bendrinti # skirtukus su „Gemini“}many{Bendrinti # skirtuko su „Gemini“}other{Bendrinti # skirtukų su „Gemini“}}</translation>
+<translation id="4173129130568053653">„Gemini“ gali padėti rezervuoti susitikimus, kurti pirkinių krepšelius ar atlikti kitas jūsų pateiktas užduotis.</translation>
 <translation id="4175137578744761569">Šviesiai violetinė ir balta</translation>
 <translation id="4176463684765177261">Išjungta</translation>
 <translation id="4176864026061939326">Šis įrenginys tvarkomas. Įrenginio administratorius turi sukurti naują paskyros <ph name="USER_EMAIL_ADDRESS" /> profilį</translation>
@@ -4723,6 +4736,7 @@
 <translation id="4200689466366162458">Tinkinti žodžiai</translation>
 <translation id="4200983522494130825">Naujas &amp;skirtukas</translation>
 <translation id="4201546031411513170">Bet kada galite pasirinkti, ką norite sinchronizuoti, skiltyje „Nustatymai“.</translation>
+<translation id="4202536110335087135">Išbandyti dabar</translation>
 <translation id="4203065553461038553">Per ilgas failo pavadinimas ar vieta</translation>
 <translation id="4203769790323223880">Fotoaparatas neleidžiamas</translation>
 <translation id="4204415812590935863">Šiuo metu negalima sukurti temos.</translation>
@@ -6164,6 +6178,7 @@
 <translation id="5204967432542742771">Įveskite slaptažodį</translation>
 <translation id="5205484256512407285">Niekada nenaudoti mobiliojo ryšio duomenų perkeliant</translation>
 <translation id="520568280985468584">Tinklas pridėtas sėkmingai. Gali užtrukti kelias minutes, kol mobiliojo ryšio tinklas taps aktyvus.</translation>
+<translation id="520576054436518354">Leiskite „Gemini“ naršyti už jus</translation>
 <translation id="5207949376430453814">Paryškinti teksto žymeklį</translation>
 <translation id="520840839826327499">„<ph name="SERVICE_NAME" />“ nori patikrinti, ar naudojate tinkamą „Chrome“ OS įrenginį.</translation>
 <translation id="5208722776934437424">Keisti leidimus</translation>
@@ -6179,6 +6194,7 @@
 <translation id="5215450412607891876">Išplėstinių saugos naujinių įjungimas</translation>
 <translation id="5215502535566372932">Pasirinkite šalį</translation>
 <translation id="5216674789212441076">Automatiškai verčiami subtitrai realiuoju laiku. Subtitrai siunčiami į sistemą „Google“ išversti.</translation>
+<translation id="5216951551945455224">{NUM_TABS,plural, =1{Nebebendrinti skirtuko su „Gemini“}one{Nebebendrinti # skirtuko su „Gemini“}few{Nebebendrinti # skirtukų su „Gemini“}many{Nebebendrinti # skirtuko su „Gemini“}other{Nebebendrinti # skirtukų su „Gemini“}}</translation>
 <translation id="5220011581825921581">paieškos klavišas + rodyklė aukštyn</translation>
 <translation id="5221516927483787768">Nepavyksta perduoti <ph name="HOST_NAME" /></translation>
 <translation id="5221834113325601057">Skirtukas išskirtas iš sąrašo</translation>
@@ -6252,6 +6268,7 @@
 <translation id="5267572070504076962">Įjunkite Saugų naršymą, kad būtumėte apsaugoti nuo pavojingų svetainių</translation>
 <translation id="5269659747698455324">Atrakinkite prieigos raktus</translation>
 <translation id="5269977353971873915">Spausdinant įvyko klaida</translation>
+<translation id="5271124474068841290">Bendrinamas dabartinis skirtukas su „Gemini“, net kai perjungiate skirtukus Jūsų duomenys nenaudojami generatyviniams DI modeliams tobulinti.</translation>
 <translation id="5271578170655641944">Pašalinti „Google“ disko prieigą?</translation>
 <translation id="5272198173084686007">Nėra skirtukų iš kitų įrenginių</translation>
 <translation id="527335345740023523">Šiuo metu turite <ph name="NUMBERED_ITEM_1" />, <ph name="NUMBERED_ITEM_2" />, <ph name="NUMBERED_ITEM_3" /> ir kt. Jūsų organizacija <ph name="ACCOUNT_MANAGER" /> galės peržiūrėti ir tvarkyti šiuos duomenis.</translation>
@@ -6341,6 +6358,7 @@
 <translation id="5333896723098573627">Jei norite pašalinti programas, eikite į skiltį „Nustatymai“ &gt; „Programos“ &gt; „Google Play“ parduotuvė“ &gt; „Tvarkyti „Android“ nuostatas“ &gt; „Programos“ arba „Programų tvarkytuvė“. Tada palieskite programą, kurią norite pašalinti (gali reikėti perbraukti į dešinę arba į kairę, kad rastumėte programą). Tada palieskite „Pašalinti“ arba „Išjungti“.</translation>
 <translation id="5334113802138581043">Prieiga prie mikrofono</translation>
 <translation id="5334142896108694079">Scenarijų talpykla</translation>
+<translation id="5335370353987155592">Naudokite „Gemini“ atsargiai ir <ph name="BEGIN_LINK1" />saugiai<ph name="LINK_END1" />. Jūs atsakote už „Gemini“ veiksmus atliekant užduotį, įskaitant klaidas ir <ph name="BEGIN_LINK2" />netikėtus rezultatus<ph name="LINK_END2" />, pvz., pirkinius.</translation>
 <translation id="5336688142483283574">Šis puslapis taip pat bus pašalintas iš jūsų istorijos ir „<ph name="SEARCH_ENGINE" />“ veiklos.</translation>
 <translation id="5336689872433667741">Žymeklis ir jutiklinė dalis</translation>
 <translation id="5337207153202941678">Išjungti paryškinimą</translation>
@@ -6812,6 +6830,7 @@
 <translation id="5655296450510165335">Įrenginio registracija</translation>
 <translation id="5655823808357523308">Koreguokite, kaip ekrane rodomos spalvos</translation>
 <translation id="5656845498778518563">Atsiliepimų siuntimas sistemai „Google“</translation>
+<translation id="5656944594833183876">Pagalba atliekant užduotis</translation>
 <translation id="5657667036353380798">Norint naudoti išorinį plėtinį reikalinga <ph name="MINIMUM_CHROME_VERSION" /> arba naujesnės versijos „Chrome“.</translation>
 <translation id="565899488479822148">Naujausio naujinio diegimas</translation>
 <translation id="5659593005791499971">El. paštas</translation>
@@ -7604,6 +7623,7 @@
 <translation id="6218058416316985984">„<ph name="DEVICE_TYPE" />“ įrenginyje neįjungtas internetas. Prisijunkite prie interneto ir bandykite dar kartą.</translation>
 <translation id="6220413761270491930">Klaida įkeliant plėtinį</translation>
 <translation id="622125358038862905">{NUM_OF_FILES,plural, =1{Nepavyko nukopijuoti failo į „<ph name="CLOUD_PROVIDER" />“}one{Nepavyko nukopijuoti failų į „<ph name="CLOUD_PROVIDER" />“}few{Nepavyko nukopijuoti failų į „<ph name="CLOUD_PROVIDER" />“}many{Nepavyko nukopijuoti failų į „<ph name="CLOUD_PROVIDER" />“}other{Nepavyko nukopijuoti failų į „<ph name="CLOUD_PROVIDER" />“}}</translation>
+<translation id="62229737360959019">Skirtukai, atidaryti iš pokalbio arba bendrinamo skirtuko, taip pat bendrinami su „Gemini“. Tiesioginiu režimu pagal numatytuosius nustatymus bendrinamas tik dabartinis skirtukas.</translation>
 <translation id="6224481128663248237">Formatavimas sėkmingai baigtas!</translation>
 <translation id="622474711739321877">Šis sudėtinis failas jau yra.</translation>
 <translation id="622484624075952240">Žemiau</translation>
@@ -7815,6 +7835,7 @@
 <translation id="6367097275976877956">Ar norite suaktyvinti „ChromeVox“ – integruotą „Chrome“ OS ekrano skaitytuvą? Jei norite, paspauskite tarpo klavišą.</translation>
 <translation id="6367196786591004737">Ištrinti įrašą</translation>
 <translation id="6367396429435748845">Paspauskite <ph name="ALT" /> + <ph name="LAUNCHER" /> + <ph name="NUM_4" />, kad pristabdytumėte ir toliau naudotumėte pelės klavišus</translation>
+<translation id="6367853307713830174">„Gemini“ rodo atliekamus veiksmus ir bando gauti patvirtinimą prieš atlikdama neskelbtinus veiksmus. Galite bet kada sustabdyti arba perimti atliekamus veiksmus.</translation>
 <translation id="6367985768157257101">Gauti naudojant Bendrinimą netoliese?</translation>
 <translation id="6368157733310917710">&amp;Adresai ir kt.</translation>
 <translation id="6368276408895187373">Įgalinta – <ph name="VARIATION_NAME" /></translation>
@@ -7864,6 +7885,7 @@
 <translation id="640457954117263537">Naudoti vietovę „ChromeOS“ ir „Android“ programoms bei paslaugoms.</translation>
 <translation id="6406303162637086258">Imituoti naršyklės paleidimą iš naujo</translation>
 <translation id="6406506848690869874">Sinchronizavimas</translation>
+<translation id="6406571339342621375">Nerodyti „Gemini“ meniu juostoje</translation>
 <translation id="6406708970972405507">Nustatymai – „<ph name="SECTION_TITLE" />“</translation>
 <translation id="6407398811519202484">Leidžiama išsaugoti duomenis įrenginyje</translation>
 <translation id="6408118934673775994">Skaityti ir keisti duomenis <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ir <ph name="WEBSITE_3" /></translation>
@@ -8342,6 +8364,7 @@
 <translation id="6737663862851963468">„Kerberos“ bilieto pašalinimas</translation>
 <translation id="6738180164164974883">Leisti nustatyti trečiųjų šalių slapukus</translation>
 <translation id="6738430949033571771">Tvirtinama paskyra...</translation>
+<translation id="6739153164244375709">„Gemini“ prieglobos pateikėjas</translation>
 <translation id="6739266861259291931">Iš naujo nustatyti įrenginio kalbą</translation>
 <translation id="6739923123728562974">Rodyti spartųjį darbalaukio klavišą</translation>
 <translation id="6739943577740687354">Šiai funkcijai naudojamas DI ir jis ne visada veikia tinkamai</translation>
@@ -8587,6 +8610,7 @@
 <translation id="6899427698619335650">Leidžiama lanksčiai priskirti diakritinius ženklus. Pavyzdžiui, galite įvesti „anh1“ arba „a1nh“, kad gautumėte „ánh“.</translation>
 <translation id="6900284862687837908">Foninė programa: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">Sustiprinta apsauga</translation>
+<translation id="6900632443249221072">Sukurkite vaizdą naudodami „Gemini“</translation>
 <translation id="6900651018461749106">Prisijunkite dar kartą, kad atnaujintumėte <ph name="USER_EMAIL" /></translation>
 <translation id="6900654715912436255">Ar tikrai norite ištrinti šį paieškos variklį?</translation>
 <translation id="6901024547292737736"><ph name="ACTUAL_CHAR_COUNT" /> iš <ph name="MAX_CHAR_COUNT" /></translation>
@@ -9100,6 +9124,7 @@
 <translation id="7268412955622368206">Rodyti naujų USB įrenginių iššokantįjį pranešimų langą</translation>
 <translation id="7269229526547981029">Šį profilį tvarko <ph name="PROFILE_MANAGER" />. <ph name="ACCOUNT_MANAGER" /> turi sukurti naują paskyros <ph name="USER_EMAIL_ADDRESS" /> profilį</translation>
 <translation id="7269736181983384521">Bendrinimo netoliese duomenų naudojimas</translation>
+<translation id="7270447384127135313">Naršant galima lengvai paklausti „Gemini“ apie bendrinamus skirtukus.</translation>
 <translation id="7271278495464744706">Įgalinti daugiakalbius aprašus</translation>
 <translation id="7272674038937250585">Nepateikta jokių aprašų</translation>
 <translation id="7273110280511444812">paskutinį kartą pridėta <ph name="DATE" /></translation>
@@ -9598,6 +9623,7 @@
 <translation id="7617263010641145920">Įjungti „Play“ parduotuvę</translation>
 <translation id="7617648809369507487">Naudoti tylesnio susirašinėjimo funkcijas</translation>
 <translation id="7619937211696316184">Techninė priežiūra atlikta</translation>
+<translation id="7620049858153799769">Pokalbius apie bendrinamus skirtukus gali peržiūrėti tikrinantys žmonės, siekdami patobulinti „Gemini“.</translation>
 <translation id="7620083113061729689">Sinchronizuoti istoriją</translation>
 <translation id="7620616707541471029">Pasirinkite paskyrą, kad galėtumėte tęsti</translation>
 <translation id="7621382409404463535">Sistemai nepavyko išsaugoti įrenginio konfigūracijos.</translation>
@@ -12003,6 +12029,7 @@
 <translation id="9215742531438648683">Pašalinti „Google Play“ parduotuvę</translation>
 <translation id="9218430445555521422">Nustatyti kaip numatytąjį</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (nepalaikoma programa)</translation>
+<translation id="9219103736887031265">Vaizdai</translation>
 <translation id="9219572436491982747">Duomenis, siunčiamus į „Google“, gali peržiūrėti tikrinantys žmonės, siekiant tobulinti „Chrome“ DI technologijas</translation>
 <translation id="9219741625496141320">Naršymo duomenys ištrinti automatiškai</translation>
 <translation id="9220525904950070496">Pašalinti paskyrą</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 188296f..e80296e 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -11975,6 +11975,7 @@
 <translation id="9215742531438648683">Google Play veikala atinstalēšana</translation>
 <translation id="9218430445555521422">Iestatīt kā noklusējumu</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (neatbalstīta lietotne)</translation>
+<translation id="9219103736887031265">Attēli</translation>
 <translation id="9219572436491982747">Google serveriem nosūtītos datus var skatīt pārskatītāji, lai uzlabotu Chrome MI tehnoloģijas.</translation>
 <translation id="9219741625496141320">Pārlūkošanas dati tika automātiski izdzēsti</translation>
 <translation id="9220525904950070496">Konta noņemšana</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb
index a7a9932..044b0e5 100644
--- a/chrome/app/resources/generated_resources_mk.xtb
+++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -11991,6 +11991,7 @@
 <translation id="9215742531438648683">Деинсталирање на Google Play Store</translation>
 <translation id="9218430445555521422">Постави како стандардно</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (неподдржана апликација)</translation>
+<translation id="9219103736887031265">Слики</translation>
 <translation id="9219572436491982747">За да се подобри технологијата на Chrome AI, податоците што се испраќаат до Google може да ги гледаат прегледувачи</translation>
 <translation id="9219741625496141320">Податоците од прелистувањето се избришаа автоматски</translation>
 <translation id="9220525904950070496">Отстрани сметка</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index b05ccab..a661f42c 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -11971,6 +11971,7 @@
 <translation id="9215742531438648683">Google Play Store അൺഇൻസ്റ്റാൾ ചെയ്യുക</translation>
 <translation id="9218430445555521422">ഡിഫോൾട്ടായി സജ്ജീകരിക്കുക</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (പിന്തുണയില്ലാത്ത ആപ്പ്)</translation>
+<translation id="9219103736887031265">Images</translation>
 <translation id="9219572436491982747">Chrome AI-യുടെ സാങ്കേതികവിദ്യ മെച്ചപ്പെടുത്താൻ, Google-ലേക്ക് അയയ്ക്കുന്ന ഡാറ്റ റിവ്യൂവർമാർ കാണുകയും ചെയ്തേക്കാം</translation>
 <translation id="9219741625496141320">ബ്രൗസിംഗ് ഡാറ്റ സ്വയമേവ ഇല്ലാതാക്കി</translation>
 <translation id="9220525904950070496">അക്കൗണ്ട് നീക്കംചെയ്യൽ</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index ebd007e..926202d 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -531,7 +531,7 @@
 <translation id="1347512539447549782">Linux-н хадгалах сан</translation>
 <translation id="1347625331607114917">Кодыг Android утсаараа баталгаажуулна уу</translation>
 <translation id="1347975661240122359">Батерейны түвшин <ph name="BATTERY_LEVEL" />% болох үед шинэчлэлтийг эхлүүлнэ.</translation>
-<translation id="1348966090521113558">Хулганын хандалтын тохиргоо</translation>
+<translation id="1348966090521113558">Хулганын хүртээмжтэй тохиргоо</translation>
 <translation id="1350962700620017446">"<ph name="EXTENSION_NAME" />" баримт бичгийн сканнеруудыг олж, үүнд хандахыг хүсэж байна.</translation>
 <translation id="1352834119074414157">Энэ багц гэмтсэн эсвэл алдагдсан байж магадгүй. Энэ цонхыг хаагаад, үүнийг дахин татна уу</translation>
 <translation id="1353275871123211385">Аппын зөвшөөрөл болон дэлгэцийн цагийн хязгаар зэрэг эцэг эхийн хяналтыг ашиглахын тулд хүүхэд эцэг эхийн удирддаг Google Бүртгэлтэй байх ёстой. Google Анги зэрэг хэрэгсэлд зориулж сургуулийн бүртгэлийг дараа нь нэмэх боломжтой.</translation>
@@ -1084,7 +1084,7 @@
 <translation id="1712143791363119140">Үргэлжилж байна</translation>
 <translation id="1714265454085143857">Бэхэлсэн табууд</translation>
 <translation id="1714326320203665217">Үндсэн зангилааны тэмдэглэгээний файлуудыг татаж авлаа</translation>
-<translation id="1714644264617423774">Таны төхөөрөмжийг ашиглахад илүү хялбар болгохын тулд хандалтын онцлогуудыг идэвхжүүлэх. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation>
+<translation id="1714644264617423774">Таны төхөөрөмжийг ашиглахад илүү хялбар болгохын тулд хүртээмжтэй онцлогуудыг идэвхжүүлэх. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation>
 <translation id="1716034099915639464"><ph name="SITE_NAME" /> болон түүний суулгасан аппын сайтын өгөгдөл, зөвшөөрлийг устгах уу?</translation>
 <translation id="171826447717908393">Тусгаарласан веб аппууд (бета)</translation>
 <translation id="1718835860248848330">Сүүлийн цаг</translation>
@@ -1912,6 +1912,7 @@
 <translation id="2287617382468007324">Хэвлэх IPP хаяг</translation>
 <translation id="2287704681286152065">{NUM_SITES,plural, =1{Таны өгөгдлийг хамгаалахын тулд таны сүүлийн үед зочлоогүй сайтаас зөвшөөрлүүдийг хассан}other{Таны өгөгдлийг хамгаалахын тулд таны сүүлийн үед зочлоогүй сайтуудаас зөвшөөрлүүдийг хассан}}</translation>
 <translation id="2287944065963043964">Нэвтрэх дэлгэц</translation>
+<translation id="2289567621059034186">Доорх шинэ таб</translation>
 <translation id="2290615375132886363">Таблетын навигацын товч</translation>
 <translation id="2290703778620332549">Солих уу эсвэл шинэ бүлэг үүсгэх үү?</translation>
 <translation id="2291452790265535215">Хавчуурга, аялал болон бусад зүйлд хажуугийн самбарыг ашиглаж үзнэ үү</translation>
@@ -2210,7 +2211,7 @@
 <translation id="2477607419416067650">Google-н бусад өгөгдөл</translation>
 <translation id="2478176599153288112">"<ph name="EXTENSION" />"-ийн Медиа-Файл зөвшөөрөл</translation>
 <translation id="24786041351753425">Өгөгдөл сэргээх үйлчилгээг идэвхжүүлнэ үү.</translation>
-<translation id="2479541499757560845">Хандалтын гарын тохиргоо</translation>
+<translation id="2479541499757560845">Хүртээмжтэй гарын тохиргоо</translation>
 <translation id="2480868415629598489">Хуулж, буулгах өгөгдлөө өөрчлөх</translation>
 <translation id="2480881140544300950">Одоогийн хайлтын систем таны шинэ таб хуудсыг удирдаж байна</translation>
 <translation id="2482878487686419369">Мэдэгдэл</translation>
@@ -2456,7 +2457,7 @@
 <translation id="265390580714150011">Талбарын утга</translation>
 <translation id="2654553774144920065">Хэвлэх хүсэлт</translation>
 <translation id="265748523151262387">Утастайгаа холбогдсон хэвээр байгаарай</translation>
-<translation id="2657612187216250073">Заагчийн хандалтын тохиргоо</translation>
+<translation id="2657612187216250073">Заагчийн хүртээмжтэй тохиргоо</translation>
 <translation id="2658510146844889864">Нэвтрэх түлхүүр, аюулгүй байдлын түлхүүрүүд</translation>
 <translation id="2658941648214598230">Эх контентыг харуулах уу?</translation>
 <translation id="2659694935349347275">Цонхыг баруун доош зөөсөн</translation>
@@ -3276,6 +3277,7 @@
 <translation id="322708765617468434">Та тохируулгын дараа төхөөрөмжид хүссэн үедээ өөр хүн нэмэх боломжтой. Хүн бүр хэрэглээгээ хувийн болгох ба өгөгдлийг хувийн байлгах боломжтой.</translation>
 <translation id="3227137524299004712">Микрофон</translation>
 <translation id="3227701057281907159">Нөхөж байна</translation>
+<translation id="3228962656492373217">Доорх табуудыг хаах</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>
@@ -5011,6 +5013,7 @@
 <translation id="4404843640767531781">Таны эцэг эх <ph name="APP_NAME" />-г блоклосон байна. Энэ аппыг ашиглах зөвшөөрлийг эцэг эхээсээ хүснэ үү.</translation>
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="4405224443901389797">руу зөөх…</translation>
+<translation id="4405580203042711503">Доорх шинэ таб</translation>
 <translation id="4405781821077215583">Текстийг оруулаад дэлгэцийнхээ зүйлсийг жижгэрүүлэх эсвэл томруулаарай</translation>
 <translation id="4406308048672435032">Та энэ табыг идэвхгүй болгож эсвэл бүрэн жагсаалтыг дахин үзэхийн тулд сэргээж болно</translation>
 <translation id="4406881185911439342">Бүлэг сонгох</translation>
@@ -6527,7 +6530,7 @@
 <translation id="5470741195701938302">Тоо</translation>
 <translation id="5471768120198416576">Сайн байна уу! Би таны бичвэрийг ярианд хувиргагч дуу хоолой байна.</translation>
 <translation id="5472627187093107397">Энэ сайтын хувьд нууц үгсийг хадгалах</translation>
-<translation id="5473062644742711742">Chrome Веб Дэлгүүр-с илүү олон хандалтын хэрэгслүүдийг олоорой</translation>
+<translation id="5473062644742711742">Chrome Веб Дэлгүүр-с илүү олон хүртээмжтэй хэрэгслүүдийг олоорой</translation>
 <translation id="5473075389972733037">IBM</translation>
 <translation id="5473099001878321374">Үргэлжлүүлснээр та энэ төхөөрөмж нь мөн хөдөлгөөнт төхөөрөмжийн дата ашиглан Google, таны хүүхдийн оператор компани, уг төхөөрөмжийн үйлдвэрлэгчээс шинэчлэлт болон аппыг автоматаар татаж суулгаж болохыг зөвшөөрч байна. Эдгээр аппын зарим нь аппын худалдан авалтыг санал болгож магадгүй.</translation>
 <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{ПИН хамгийн багадаа 1 тэмдэгттэй байх ёстой}other{ПИН хамгийн багадаа # тэмдэгттэй байх ёстой}}</translation>
@@ -6728,6 +6731,7 @@
 <translation id="5609231933459083978">Энэхүү апп нь хүчин төгөлдөр бус апп байж болзошгүй байна.</translation>
 <translation id="5610867721023328944">Дахин оролдох эсвэл доорх боломжтой загваруудын аль нэгийг сонгоно уу.</translation>
 <translation id="5611398002774823980">Бүртгэлд хадгалах</translation>
+<translation id="5611474372949142946">Доорх табуудыг хаах</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
 <translation id="5614190747811328134">Хэрэглэгчийн сануулга</translation>
 <translation id="5614553682702429503">Нууц үгийг хадгалах уу?</translation>
@@ -6862,7 +6866,7 @@
 <translation id="5702749864074810610">Зөвлөмжийг үл хэрэгссэн</translation>
 <translation id="5703716265115423771">дууны түвшинг хасах</translation>
 <translation id="5704875434923668958">Дараахад синк хийж байна</translation>
-<translation id="5705005699929844214">Хандалтын сонголтыг байнга харуулах</translation>
+<translation id="5705005699929844214">Хүртээмжийн сонголтыг байнга харуулах</translation>
 <translation id="5705882733397021510">Буцах</translation>
 <translation id="5707185214361380026">:-ээс өргөтгөлийг ачаалах ажиллагаа амжилтгүй боллоо.</translation>
 <translation id="5707674184620508665">Танай байгууллага <ph name="ACCOUNT_MANAGER" /> таны одоо байгаа өгөгдлийг харах, удирдах боломжгүй болно. Энэ нь одоо байгаа профайлд үлдэнэ.</translation>
@@ -9665,7 +9669,7 @@
 <translation id="7668002322287525834">{NUM_WEEKS,plural, =1{<ph name="DEVICE_TYPE" />-г {NUM_WEEKS} долоо хоногийн дотор буцаах}other{<ph name="DEVICE_TYPE" />-г {NUM_WEEKS} долоо хоногийн дотор буцаах}}</translation>
 <translation id="7668205084604701639">Office файлын тохиргоо</translation>
 <translation id="7668423670802040666"><ph name="ACCOUNT" />-н Google-н Нууц үгний менежерт байна</translation>
-<translation id="7668648754769651616">Хандалтын онцлогууд таны төхөөрөмжийг ашиглахад илүү хялбар болгодог. Шуурхай тохиргоонд хандахын тулд дэлгэцийнхээ доор байх цагийг сонгоно уу.</translation>
+<translation id="7668648754769651616">Хүртээмжтэй онцлогууд таны төхөөрөмжийг ашиглахад илүү хялбар болгодог. Шуурхай тохиргоонд хандахын тулд дэлгэцийнхээ доор байх цагийг сонгоно уу.</translation>
 <translation id="7669620291129890197">Таны төхөөрөмжүүдэд харагдана</translation>
 <translation id="7669825497510425694">{NUM_ATTEMPTS,plural, =1{ПИН буруу байна. Танд нэг оролдлого үлдлээ.}other{ПИН буруу байна. Танд # оролдлого үлдлээ.}}</translation>
 <translation id="7670434942695515800">Шилдэг гүйцэтгэл авах бол хамгийн сүүлийн үеийн хувилбар луу сайжруулна уу. Сайжруулалтыг дуусгах боломжгүй тохиолдолд файлуудаа хуулбарлахыг санал болгож байна. Сайжруулалт эхэлсний дараа Linux-г унтраана. Үргэлжлүүлэхээсээ өмнө нээлттэй файлуудыг хадгална уу. <ph name="LINK_START" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation>
@@ -11221,7 +11225,7 @@
 <translation id="8711402221661888347">Pickles</translation>
 <translation id="8711538096655725662">Таны зочилсон бүх сайтад автоматаар ажиллана</translation>
 <translation id="8712637175834984815">Ойлголоо</translation>
-<translation id="8713110120305151436">Шуурхай тохиргоонд хандалтын сонголтыг харуулах</translation>
+<translation id="8713110120305151436">Шуурхай тохиргоонд хүртээмжийн сонголтыг харуулах</translation>
 <translation id="8713570323158206935"><ph name="BEGIN_LINK1" />системийн мэдээллийг<ph name="END_LINK1" /> илгээх</translation>
 <translation id="8713761545374852805">Та шүүмж, имэйл, сошиал медиагийн нийтлэл, эсээ болон бусад зүйлтэй холбоотой тусламж авах боломжтой</translation>
 <translation id="871445143952086903">Таныг бүтээгдэхүүнүүд харьцуулахад табын нэр, бүтээгдэхүүнүүдийн URL-г Google-д илгээдэг</translation>
@@ -11977,6 +11981,7 @@
 <translation id="9215742531438648683">Google Play Дэлгүүрийг устгах</translation>
 <translation id="9218430445555521422">Өгөгдмөлөөр тохируулах</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (дэмждэггүй апп)</translation>
+<translation id="9219103736887031265">Зураг</translation>
 <translation id="9219572436491982747">Google-д илгээсэн өгөгдлийг Chrome-н ХОУ-ы технологийг сайжруулахын тулд хянагч хүмүүс харж магадгүй</translation>
 <translation id="9219741625496141320">Интернэтээр үзсэн өгөгдлийг автоматаар устгасан</translation>
 <translation id="9220525904950070496">Бүртгэлийг хасах</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 1b2fc58..ecf59df 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -11988,6 +11988,7 @@
 <translation id="9215742531438648683">Google Play स्टोअर अनइंस्टॉल करा</translation>
 <translation id="9218430445555521422">डीफॉल्ट म्हणून सेट करा</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (सपोर्ट नसलेले अ‍ॅप)</translation>
+<translation id="9219103736887031265">इमेज</translation>
 <translation id="9219572436491982747">Chrome AI च्या तंत्रज्ञानामध्ये सुधारणा करण्यासाठी Google ला पाठवलेला डेटा मानवी परीक्षणकर्त्यांद्वारे पाहिला जाऊ शकतो</translation>
 <translation id="9219741625496141320">ब्राउझिंग डेटा आपोआप हटवला गेला</translation>
 <translation id="9220525904950070496">खाते काढून टाका</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 2848fb37..49f995a 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -401,6 +401,7 @@
 <translation id="1252987234827889034">Ralat profil berlaku</translation>
 <translation id="1254034280040157728">Grand Canyon</translation>
 <translation id="1254593899333212300">Sambungan Internet Langsung</translation>
+<translation id="1255095393630332248">Apabila tab dikongsi, kandungan halaman, media dan URL tab tersebut akan dihantar kepada Google.</translation>
 <translation id="1256588359404100567">Tetapan disegerakkan daripada peranti terdahulu anda.</translation>
 <translation id="1257336506558170607">Eksport sijil terpilih</translation>
 <translation id="1258491128795710625">Perkara Baharu</translation>
@@ -525,6 +526,7 @@
 <translation id="1342886103232377846">Untuk menyemak kata laluan yang terjejas, akses Google Password Manager</translation>
 <translation id="1343920184519992513">Teruskan dari tempat anda berhenti dan buka set halaman tertentu</translation>
 <translation id="1344141078024003905">Anda menghantar skrin. Anda boleh menjeda atau menghentikan penghantaran skrin anda pada bila-bila masa.</translation>
+<translation id="13449088910457661">Gemini berfungsi dalam tab anda untuk melengkapkan tugasan yang anda berikan kepada Gemini. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation>
 <translation id="1346403631707626730">Hantar data penggunaan dan diagnostik. Bantu kami meningkatkan pengalaman Android anak anda dengan menghantar data diagnostik dan penggunaan peranti serta apl kepada Google secara automatik. Data ini tidak akan digunakan untuk mengenal pasti anak anda dan akan membantu peningkatan kestabilan sistem dan apl serta pelbagai lagi. Sesetengah data agregat juga akan membantu apl dan rakan kongsi Google, seperti pembangun Android. Jika Aktiviti Web &amp; Apl tambahan dihidupkan untuk anak anda, data ini mungkin disimpan pada Google Account miliknya. <ph name="BEGIN_LINK1" />Ketahui lebih lanjut tentang metrik<ph name="BEGIN_LINK1_END" />Ketahui Lebih Lanjut<ph name="END_LINK1" /></translation>
 <translation id="1346630054604077329">Sahkan dan mulakan semula</translation>
 <translation id="1346748346194534595">Kanan</translation>
@@ -587,6 +589,7 @@
 <translation id="1390907927270446471"><ph name="PROFILE_USERNAME" /> tidak diizinkan untuk mencetak ke <ph name="PRINTER_NAME" />. Sila hubungi pentadbir anda.</translation>
 <translation id="1392047138650695757">Kamus pengguna</translation>
 <translation id="139300021892314943">Had individu yang boleh log masuk</translation>
+<translation id="1393235015225624732">{NUM_TABS,plural, =1{Hentikan perkongsian tab dengan Gemini}other{Hentikan perkongsian # tab dengan Gemini}}</translation>
 <translation id="1393283411312835250">Matahari dan awan</translation>
 <translation id="1395832189806039783">Serlahkan item dengan fokus papan kekunci</translation>
 <translation id="1396120028054416908">Kembali kepada <ph name="FOLDER_TITLE" /></translation>
@@ -730,6 +733,7 @@
 <translation id="1486616492435615702">Buat draf atau perhalus kerja sedia ada.</translation>
 <translation id="1487335504823219454">Hidup - tetapan tersuai</translation>
 <translation id="1489101155914355052">Menjana cadangan untuk dokumen ini…</translation>
+<translation id="1493152297698462486">Buat Imej dengan Gemini</translation>
 <translation id="1493892686965953381">Menunggu untuk <ph name="LOAD_STATE_PARAMETER" />...</translation>
 <translation id="1494349716233667318">Laman boleh meminta untuk menggunakan fon yang dipasang pada peranti anda</translation>
 <translation id="1494429729245089920">Mesin maya "<ph name="VM_NAME" />" wujud tetapi tidak kelihatan seperti mesin maya <ph name="APP_NAME" /> yang sah. Sila hubungi pentadbir anda.</translation>
@@ -829,6 +833,7 @@
 <translation id="1561331397460162942">Tindakan ini membenarkan akses lokasi untuk apl, laman web dengan kebenaran lokasi dan perkhidmatan sistem</translation>
 <translation id="1562119309884184621">Tindakan menambah kenalan ini akan membuatkan peranti mengingat kali seterusnya mereka membuat perkongsian</translation>
 <translation id="1562585387501039294">Organisasi anda, <ph name="ACCOUNT_MANAGER" />, memerlukan profil terurus dan akan dapat melihat beberapa maklumat, termasuk</translation>
+<translation id="156345786953026804">Kandungan halaman dan URL yang digunakan oleh Gemini semasa melaksanakan tugas akan dikongsi dengan Google.</translation>
 <translation id="1566049601598938765">Tapak web</translation>
 <translation id="15662109988763471">Pencetak yang dipilih tidak tersedia atau tidak dipasang dengan betul. Periksa pencetak anda atau cuba pilih pencetak lain.</translation>
 <translation id="1566329594234563241">Ketika tidak aktif dan dipalamkan</translation>
@@ -1134,6 +1139,7 @@
 <translation id="1753557900380512635">Bahagian dalaman</translation>
 <translation id="1753905327828125965">Paling Kerap Dilawati</translation>
 <translation id="1755601632425835748">Saiz teks</translation>
+<translation id="1756963401828337401">Pilih skrin untuk menangkap imej</translation>
 <translation id="1757132445735080748">Untuk menyelesaikan persediaan Linux, kemas kini Chrome OS Flex dan cuba lagi.</translation>
 <translation id="1757301747492736405">Penyahpasangan belum selesai</translation>
 <translation id="175772926354468439">Dayakan tema</translation>
@@ -2139,6 +2145,7 @@
 <translation id="2435248616906486374">Rangkaian diputuskan</translation>
 <translation id="2435457462613246316">Paparkan kata laluan</translation>
 <translation id="2436385001956947090">Salin &amp;pautan</translation>
+<translation id="2437105255211187922">{NUM_TABS,plural, =1{Perkongsian Tab yang Dipilih Akan Melebihi Had Perkongsian}other{Perkongsian # Tab Akan Melebihi Had Perkongsian}}</translation>
 <translation id="2437561292559037753">Perkongsian Data</translation>
 <translation id="2438853563451647815">Tidak disambungkan kepada pencetak</translation>
 <translation id="2439152382014731627">Tetapkan semula kata laluan <ph name="DEVICE_TYPE" /></translation>
@@ -2352,6 +2359,7 @@
 <translation id="2573276323521243649">Kembali daripada halaman pemilihan avatar</translation>
 <translation id="2573417407488272418">Sandarkan apl dan fail ke Fail &gt; Fail saya sebelum peningkatan.</translation>
 <translation id="2573831315551295105">Tetapkan suis untuk “<ph name="ACTION" />”</translation>
+<translation id="2574037773163798130">{NUM_TABS,plural, =1{Kongsi Tab dengan Gemini}other{Kongsi # Tab dengan Gemini}}</translation>
 <translation id="2575247648642144396">Ikon ini akan dapat dilihat apabila perlanjutan boleh bertindak ke atas halaman semasa. Gunakan sambungan ini dengan mengklik pada ikon atau dengan menekan <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="2575407791320728464">URL tidak sah. Pastikan URL itu diformatkan dengan betul.</translation>
 <translation id="2575441894380764255">Tidak dibenarkan untuk memaparkan iklan yang mengganggu atau mengelirukan</translation>
@@ -2810,6 +2818,7 @@
 <translation id="2886119409731773154">Proses ini mungkin mengambil masa sehingga 30 minit</translation>
 <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation>
 <translation id="288734198558082692"><ph name="DEVICE" /> dan <ph name="NUMBER_OF_DEVICES" /> yang lain</translation>
+<translation id="2887344147309501015">Bersembang dengan Gemini dalam Chrome untuk mendapatkan jawapan, kesimpulan utama dan pelbagai lagi semasa anda menyemak imbas</translation>
 <translation id="2889043468805635730">Tiada masalah ditemukan</translation>
 <translation id="2889064240420137087">Buka pautan dengan...</translation>
 <translation id="2891464434568738544">Tiada laman tersedia pada masa ini. Lawati laman untuk menambahkan laman tersebut pada senarai ini.</translation>
@@ -4625,6 +4634,7 @@
 <translation id="4116480382905329353">Dikesan 1 kali</translation>
 <translation id="4116704186509653070">Buka sekali lagi</translation>
 <translation id="4117714603282104018">Maklum balas haptik pad sentuh</translation>
+<translation id="4117854923024277067">Tangkapan skrin anda boleh digunakan dengan gesaan anda atau dipadamkan</translation>
 <translation id="4118579674665737931">Sila but semula peranti dan cuba lagi.</translation>
 <translation id="4120388883569225797">Tidak dapat menetapkan semula kunci keselamatan ini</translation>
 <translation id="4120817667028078560">Laluan terlalu panjang</translation>
@@ -4677,6 +4687,7 @@
 <translation id="4158315983204257156">Saiz dan fon teks laman web</translation>
 <translation id="4158364720893025815">Pas</translation>
 <translation id="4159784952369912983">Ungu</translation>
+<translation id="4162545316103024845">{NUM_TABS,plural, =1{Perkongsian tab yang dipilih akan melebihi had perkongsian}other{Perkongsian # tab akan melebihi had perkongsian}}</translation>
 <translation id="4163560723127662357">Papan kekunci yang tidak diketahui.</translation>
 <translation id="4165942112764990069"><ph name="USER_EMAIL" /> bukan milik organisasi yang sah. Hubungi pentadbir anda. Jika anda seorang pentadbir, anda boleh menyediakan organisasi anda dengan melawati: g.co/ChromeEnterpriseAccount</translation>
 <translation id="4165986682804962316">Tetapan tapak</translation>
@@ -4687,6 +4698,8 @@
 <translation id="4168651806173792090"><ph name="NETWORK_NAME" /> berakhir dengan <ph name="LAST_FOUR_DIGITS" /></translation>
 <translation id="4169535189173047238">Jangan benarkan</translation>
 <translation id="4170314459383239649">Kosongkan Apabila Keluar</translation>
+<translation id="417112242673828206">{NUM_TABS,plural, =1{Kongsi tab dengan Gemini}other{Kongsi # tab dengan Gemini}}</translation>
+<translation id="4173129130568053653">Gemini boleh membantu anda menempah janji temu, membuat troli beli-belah atau melakukan tugasan lain yang anda berikan kepada Gemini.</translation>
 <translation id="4175137578744761569">Ungu cerah dan putih</translation>
 <translation id="4176463684765177261">Dilumpuhkan</translation>
 <translation id="4176864026061939326">Peranti ini terurus. Profil baharu diperlukan untuk akaun <ph name="USER_EMAIL_ADDRESS" /> oleh pentadbir peranti anda</translation>
@@ -4720,6 +4733,7 @@
 <translation id="4200689466366162458">Perkataan tersuai</translation>
 <translation id="4200983522494130825">Tab &amp;baharu</translation>
 <translation id="4201546031411513170">Anda boleh memilih item yang hendak disegerakkan dalam tetapan pada bila-bila masa.</translation>
+<translation id="4202536110335087135">Cuba Sekarang</translation>
 <translation id="4203065553461038553">Nama fail atau lokasi terlalu panjang</translation>
 <translation id="4203769790323223880">Kamera tidak dibenarkan</translation>
 <translation id="4204415812590935863">Tidak dapat membuat tema sekarang.</translation>
@@ -6161,6 +6175,7 @@
 <translation id="5204967432542742771">Masukkan kata laluan</translation>
 <translation id="5205484256512407285">Jangan sekali-kali menggunakan data mudah alih untuk memindahkan fail</translation>
 <translation id="520568280985468584">Rangkaian telah berjaya ditambah. Rangkaian selular anda mungkin mengambil masa beberapa minit untuk menjadi aktif.</translation>
+<translation id="520576054436518354">Benarkan Gemini menyemak imbas untuk anda</translation>
 <translation id="5207949376430453814">Serlahkan karet teks</translation>
 <translation id="520840839826327499"><ph name="SERVICE_NAME" /> mahu menyemak sama ada anda menggunakan peranti Chrome OS yang layak.</translation>
 <translation id="5208722776934437424">Tukar kebenaran</translation>
@@ -6176,6 +6191,7 @@
 <translation id="5215450412607891876">Hidupkan kemaskinian keselamatan lanjutan</translation>
 <translation id="5215502535566372932">Pilih negara</translation>
 <translation id="5216674789212441076">Menterjemahkan sari kata langsung secara automatik. Sari kata akan dihantar kepada Google untuk diterjemahkan.</translation>
+<translation id="5216951551945455224">{NUM_TABS,plural, =1{Hentikan Perkongsian Tab dengan Gemini}other{Hentikan Perkongsian # Tab dengan Gemini}}</translation>
 <translation id="5220011581825921581">Search + anak panah ke atas</translation>
 <translation id="5221516927483787768">Tidak dapat menghantar <ph name="HOST_NAME" /></translation>
 <translation id="5221834113325601057">Tab dikecualikan daripada senarai</translation>
@@ -6249,6 +6265,7 @@
 <translation id="5267572070504076962">Hidupkan Penyemakan Imbas Selamat untuk mendapatkan perlindungan terhadap laman berbahaya</translation>
 <translation id="5269659747698455324">Buka kunci kunci laluan anda</translation>
 <translation id="5269977353971873915">Cetakan Gagal</translation>
+<translation id="5271124474068841290">Berkongsi tab semasa dengan Gemini, walaupun semasa anda bertukar tab. Data anda tidak digunakan untuk meningkatkan model AI generatif.</translation>
 <translation id="5271578170655641944">Alih keluar akses Google Drive?</translation>
 <translation id="5272198173084686007">Tiada Tab daripada Peranti Lain</translation>
 <translation id="527335345740023523">Kini anda mempunyai <ph name="NUMBERED_ITEM_1" />, <ph name="NUMBERED_ITEM_2" />, <ph name="NUMBERED_ITEM_3" /> dan pelbagai lagi. Organisasi anda, <ph name="ACCOUNT_MANAGER" />, akan dapat melihat dan mengurus data ini.</translation>
@@ -6338,6 +6355,7 @@
 <translation id="5333896723098573627">Untuk mengalih keluar apl, pergi ke Tetapan &gt; Google Play Store &gt; Urus pilihan Android &gt; Apl atau Pengurus aplikasi. Kemudian, ketik apl yang ingin dinyahpasang (anda mungkin perlu meleret ke kanan atau ke kiri untuk mencari apl). Kemudian, ketik Nyahpasang atau Lumpuhkan.</translation>
 <translation id="5334113802138581043">Akses mikrofon</translation>
 <translation id="5334142896108694079">Cache Skrip</translation>
+<translation id="5335370353987155592">Gunakan Gemini dengan berhati-hati dan <ph name="BEGIN_LINK1" />selamat<ph name="LINK_END1" />. Anda bertanggungjawab terhadap tindakan Gemini semasa melaksanakan tugas, termasuk kesilapan dan <ph name="BEGIN_LINK2" />keputusan yang tidak dijangka<ph name="LINK_END2" /> seperti pembelian.</translation>
 <translation id="5336688142483283574">Halaman ini juga akan dialih keluar daripada sejarah dan aktiviti<ph name="SEARCH_ENGINE" /> anda.</translation>
 <translation id="5336689872433667741">Kursor dan pad sentuh</translation>
 <translation id="5337207153202941678">Matikan serlahan</translation>
@@ -6808,6 +6826,7 @@
 <translation id="5655296450510165335">Pendaftaran peranti</translation>
 <translation id="5655823808357523308">Laraskan cara warna dipaparkan pada skrin anda</translation>
 <translation id="5656845498778518563">Hantar Maklum Balas kepada Google</translation>
+<translation id="5656944594833183876">Dapatkan bantuan dengan tugasan anda</translation>
 <translation id="5657667036353380798">Sambungan luaran memerlukan chrome versi <ph name="MINIMUM_CHROME_VERSION" /> atau lebih baharu untuk dipasang.</translation>
 <translation id="565899488479822148">Memasang kemaskinian terkini</translation>
 <translation id="5659593005791499971">E-mel</translation>
@@ -7600,6 +7619,7 @@
 <translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> di luar talian. Sambung ke Internet dan cuba lagi.</translation>
 <translation id="6220413761270491930">Ralat Memuatkan Sambungan</translation>
 <translation id="622125358038862905">{NUM_OF_FILES,plural, =1{Tidak dapat menyalin fail kepada <ph name="CLOUD_PROVIDER" />}other{Tidak dapat menyalin fail kepada <ph name="CLOUD_PROVIDER" />}}</translation>
+<translation id="62229737360959019">Tab yang dibuka daripada sembang atau tab perkongsian turut dikongsi dengan Gemini. Dalam mod Langsung, hanya tab semasa dikongsi secara lalai.</translation>
 <translation id="6224481128663248237">Pemformatan berjaya diselesaikan!</translation>
 <translation id="622474711739321877">Bekas ini sudah wujud.</translation>
 <translation id="622484624075952240">Bawah</translation>
@@ -7811,6 +7831,7 @@
 <translation id="6367097275976877956">Adakah anda mahu mengaktifkan ChromeVox, pembaca skrin terbina dalam untuk Chrome OS? Jika ya, tekan bar ruang.</translation>
 <translation id="6367196786591004737">Padam entri</translation>
 <translation id="6367396429435748845">Tekan <ph name="ALT" /> + <ph name="LAUNCHER" /> + <ph name="NUM_4" /> untuk menjeda dan menyambung semula kekunci tetikus</translation>
+<translation id="6367853307713830174">Gemini menunjukkan langkah yang diambil dan cuba meminta pengesahan sebelum mengambil langkah yang sensitif. Anda boleh menghentikan atau mengambil alih proses pada bila-bila masa.</translation>
 <translation id="6367985768157257101">Terima dengan Kongsi Berdekatan?</translation>
 <translation id="6368157733310917710">&amp;Alamat dan pelbagai lagi</translation>
 <translation id="6368276408895187373">Didayakan – <ph name="VARIATION_NAME" /></translation>
@@ -7860,6 +7881,7 @@
 <translation id="640457954117263537">Gunakan lokasi untuk apl dan perkhidmatan ChromeOS serta Android.</translation>
 <translation id="6406303162637086258">Rangsang mula semula penyemak imbas</translation>
 <translation id="6406506848690869874">Segerak</translation>
+<translation id="6406571339342621375">Jangan tunjukkan Gemini dalam bar menu</translation>
 <translation id="6406708970972405507">Tetapan - <ph name="SECTION_TITLE" /></translation>
 <translation id="6407398811519202484">Dibenarkan menyimpan data pada peranti anda</translation>
 <translation id="6408118934673775994">Baca dan tukar data anda di <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> dan <ph name="WEBSITE_3" /></translation>
@@ -8332,6 +8354,7 @@
 <translation id="6737663862851963468">Alih keluar tiket Kerberos</translation>
 <translation id="6738180164164974883">Benarkan penetapkan kuki pihak ketiga</translation>
 <translation id="6738430949033571771">Mengesahkan akaun...</translation>
+<translation id="6739153164244375709">Pemapar Hos Gemini</translation>
 <translation id="6739266861259291931">Tetapkan semula kepada bahasa peranti</translation>
 <translation id="6739923123728562974">Tunjukkan pintasan desktop</translation>
 <translation id="6739943577740687354">Ciri ini menggunakan AI dan tidak sentiasa betul</translation>
@@ -8577,6 +8600,7 @@
 <translation id="6899427698619335650">Benarkan tugasan diakritik fleksibel. Contohnya, anda boleh menaip “anh1” atau “a1nh” untuk mendapatkan “ánh”.</translation>
 <translation id="6900284862687837908">Apl Latar Belakang: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">Perlindungan dipertingkat</translation>
+<translation id="6900632443249221072">Buat imej dengan Gemini</translation>
 <translation id="6900651018461749106">Log masuk sekali lagi untuk mengemas kini <ph name="USER_EMAIL" /></translation>
 <translation id="6900654715912436255">Adakah anda pasti mahu memadamkan enjin carian ini?</translation>
 <translation id="6901024547292737736"><ph name="ACTUAL_CHAR_COUNT" />/<ph name="MAX_CHAR_COUNT" /></translation>
@@ -9090,6 +9114,7 @@
 <translation id="7268412955622368206">Tunjukkan pemberitahuan tetingkap timbul untuk peranti USB baharu.</translation>
 <translation id="7269229526547981029">Profil ini diurus oleh <ph name="PROFILE_MANAGER" />. Profil baharu diperlukan untuk akaun <ph name="USER_EMAIL_ADDRESS" /> oleh <ph name="ACCOUNT_MANAGER" /></translation>
 <translation id="7269736181983384521">Penggunaan data Kongsi Berdekatan</translation>
+<translation id="7270447384127135313">Anda boleh bertanya soalan kepada Gemini tentang tab yang anda kongsi dengan mudah semasa anda menyemak imbas.</translation>
 <translation id="7271278495464744706">Dayakan perihalan yang berjela-jela</translation>
 <translation id="7272674038937250585">Tiada perihalan disediakan</translation>
 <translation id="7273110280511444812">kali terakhir dilampirkan pada <ph name="DATE" /></translation>
@@ -9588,6 +9613,7 @@
 <translation id="7617263010641145920">Hidupkan Gedung Play</translation>
 <translation id="7617648809369507487">Gunakan pemesejan yang lebih senyap</translation>
 <translation id="7619937211696316184">Penyenggaraan selesai</translation>
+<translation id="7620049858153799769">Perbualan tentang tab dikongsi boleh dilihat oleh jurusemak untuk meningkatkan Gemini.</translation>
 <translation id="7620083113061729689">Sejarah penyegerakan</translation>
 <translation id="7620616707541471029">Pilih akaun untuk meneruskan proses</translation>
 <translation id="7621382409404463535">Sistem gagal menyimpan konfigurasi peranti.</translation>
@@ -11991,6 +12017,7 @@
 <translation id="9215742531438648683">Nyahpasang Gedung Google Play</translation>
 <translation id="9218430445555521422">Tetapkan sebagai lalai</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (apl tidak disokong)</translation>
+<translation id="9219103736887031265">Imej</translation>
 <translation id="9219572436491982747">Data yang dihantar kepada Google mungkin akan dilihat oleh jurusemak untuk meningkatkan Teknologi AI Chrome</translation>
 <translation id="9219741625496141320">Data semakan imbas telah dipadamkan secara automatik</translation>
 <translation id="9220525904950070496">Alih keluar akaun</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb
index a1274a4..79b2596 100644
--- a/chrome/app/resources/generated_resources_my.xtb
+++ b/chrome/app/resources/generated_resources_my.xtb
@@ -11980,6 +11980,7 @@
 <translation id="9215742531438648683">Google Play စတိုး ဖယ်ရှားရန်</translation>
 <translation id="9218430445555521422">မူရင်းအဖြစ် သတ်မှတ်ရန်</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (ပံ့ပိုးမထားသော အက်ပ်)</translation>
+<translation id="9219103736887031265">ပုံများ</translation>
 <translation id="9219572436491982747">Chrome AI ၏ နည်းပညာ ပိုကောင်းစေရန်အတွက် Google သို့ ပို့ထားသောဒေတာကို ပြန်စစ်သည့် ပုဂ္ဂိုလ်များက မြင်နိုင်သည်</translation>
 <translation id="9219741625496141320">ဖွင့်ကြည့်ထားသည့်မှတ်တမ်းဒေတာကို အလိုအလျောက် ဖျက်လိုက်သည်</translation>
 <translation id="9220525904950070496">အကောင့်ကို ဖယ်ရှားရန်</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb
index 0389816..96b30b31 100644
--- a/chrome/app/resources/generated_resources_ne.xtb
+++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -11969,6 +11969,7 @@
 <translation id="9215742531438648683">Google Play Store अनइन्स्टल गर्नुहोस्</translation>
 <translation id="9218430445555521422">डिफल्टका रूपमा सेट गर्नुहोस्</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (चलाउन नमिल्ने एप)</translation>
+<translation id="9219103736887031265">फोटो</translation>
 <translation id="9219572436491982747">समीक्षकहरू Chrome AI को प्रविधिको गुणस्तर सुधार गर्ने प्रयोजनका लागि Google मा पठाइने जानकारी हेर्न सक्छन्</translation>
 <translation id="9219741625496141320">ब्राउजिङ डेटा स्वतः मेटाइयो</translation>
 <translation id="9220525904950070496">खाता हटाउनुहोस्</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index dd22a71..79f5d7c 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -11969,6 +11969,7 @@
 <translation id="9215742531438648683">Google Play Store verwijderen</translation>
 <translation id="9218430445555521422">Instellen als standaard</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (niet-ondersteunde app)</translation>
+<translation id="9219103736887031265">Afbeeldingen</translation>
 <translation id="9219572436491982747">Gegevens die naar Google worden gestuurd, kunnen door menselijke reviewers worden bekeken om de AI-technologie van Chrome te verbeteren</translation>
 <translation id="9219741625496141320">Browsergegevens zijn automatisch verwijderd</translation>
 <translation id="9220525904950070496">Account verwijderen</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index cc2f3e7..0d3e320f 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -11979,6 +11979,7 @@
 <translation id="9215742531438648683">Avinstaller Google Play-butikken</translation>
 <translation id="9218430445555521422">Angi som standard</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (appen støttes ikke)</translation>
+<translation id="9219103736887031265">Bilder</translation>
 <translation id="9219572436491982747">Data som sendes til Google, kan bli sett av menneskelige evaluerere som jobber med å gjøre AI-teknologien i Chrome bedre</translation>
 <translation id="9219741625496141320">Nettleserdataene ble slettet automatisk</translation>
 <translation id="9220525904950070496">Fjern konto</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb
index b5282589..dac9f01 100644
--- a/chrome/app/resources/generated_resources_or.xtb
+++ b/chrome/app/resources/generated_resources_or.xtb
@@ -11965,6 +11965,7 @@
 <translation id="9215742531438648683">Google Play Store ଅନଇନଷ୍ଟଲ୍ କରନ୍ତୁ</translation>
 <translation id="9218430445555521422">ଡିଫଲ୍ଟ ଭାବେ ସେଟ କରନ୍ତୁ</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (ଅସମର୍ଥିତ ଆପ୍)</translation>
+<translation id="9219103736887031265">Images</translation>
 <translation id="9219572436491982747">Chrome AIର ଟେକ୍ନୋଲୋଜିରେ ଉନ୍ନତି ଆଣିବା ପାଇଁ Googleକୁ ପଠାଯାଇଥିବା ଡାଟା ମାନବ ସମୀକ୍ଷକମାନେ ଦେଖିପାରନ୍ତି</translation>
 <translation id="9219741625496141320">ବ୍ରାଉଜିଂ ଡାଟା ସ୍ୱତଃ ଡିଲିଟ ହୋଇଯାଇଛି</translation>
 <translation id="9220525904950070496">ଆକାଉଣ୍ଟ କାଢ଼ିଦିଅନ୍ତୁ</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb
index 88ed5fed..f8dc8d8 100644
--- a/chrome/app/resources/generated_resources_pa.xtb
+++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -11988,6 +11988,7 @@
 <translation id="9215742531438648683">Google Play Store ਨੂੰ ਅਣਸਥਾਪਤ ਕਰੋ</translation>
 <translation id="9218430445555521422">ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਵਜੋਂ ਸੈੱਟ ਕਰੋ</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (ਅਸਮਰਥਿਤ ਐਪ)</translation>
+<translation id="9219103736887031265">ਚਿੱਤਰ</translation>
 <translation id="9219572436491982747">Chrome AI ਦੀ ਤਕਨਾਲੋਜੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, Google ਨੂੰ ਭੇਜਿਆ ਗਿਆ ਡਾਟਾ ਮਨੁੱਖੀ ਸਮੀਖਿਅਕਾਂ ਵੱਲੋਂ ਦੇਖਿਆ ਜਾ ਸਕਦਾ ਹੈ</translation>
 <translation id="9219741625496141320">ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟਾ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਸੀ</translation>
 <translation id="9220525904950070496">ਖਾਤਾ ਹਟਾਓ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 184b14a..b007583 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -11946,6 +11946,7 @@
 <translation id="9215742531438648683">Odinstaluj Sklep Google Play</translation>
 <translation id="9218430445555521422">Ustaw jako opcję domyślną</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (nieobsługiwana aplikacja)</translation>
+<translation id="9219103736887031265">Grafika</translation>
 <translation id="9219572436491982747">Dane przesłane do Google mogą być widoczne dla weryfikatorów, którzy pracują nad ulepszaniem technologii AI w Chrome</translation>
 <translation id="9219741625496141320">Dane przeglądania zostały automatycznie usunięte</translation>
 <translation id="9220525904950070496">Usuń konto</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index e13b43c..081e5827 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -11991,6 +11991,7 @@
 <translation id="9215742531438648683">Desinstalar a Google Play Store</translation>
 <translation id="9218430445555521422">Definir como padrão</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (app sem suporte)</translation>
+<translation id="9219103736887031265">Imagens</translation>
 <translation id="9219572436491982747">Os dados enviados ao Google podem ser conferidos por revisores humanos para melhorar a tecnologia de IA do Chrome</translation>
 <translation id="9219741625496141320">Os dados de navegação foram excluídos automaticamente</translation>
 <translation id="9220525904950070496">Remover conta</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index eb38361..2473e683 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -11979,6 +11979,7 @@
 <translation id="9215742531438648683">Desinstalar Google Play Store</translation>
 <translation id="9218430445555521422">Predefinir</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (app não suportada)</translation>
+<translation id="9219103736887031265">Imagens</translation>
 <translation id="9219572436491982747">Os dados enviados para a Google podem ser vistos por revisores humanos para melhorar a tecnologia de IA do Chrome</translation>
 <translation id="9219741625496141320">Os dados de navegação foram eliminados automaticamente</translation>
 <translation id="9220525904950070496">Remover conta</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 760432c..b57a158 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -11974,6 +11974,7 @@
 <translation id="9215742531438648683">Dezinstalează Magazinul Google Play</translation>
 <translation id="9218430445555521422">Setează ca prestabilit</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (aplicație neacceptată)</translation>
+<translation id="9219103736887031265">Imagini</translation>
 <translation id="9219572436491982747">Datele trimise la Google pot fi examinate de evaluatori umani pentru a îmbunătăți tehnologia AI Chrome</translation>
 <translation id="9219741625496141320">Datele de navigare au fost șterse automat</translation>
 <translation id="9220525904950070496">Eliminați contul</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 764c7093..42b3bc0 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -12012,6 +12012,7 @@
 <translation id="9215742531438648683">Удалить Google Play Маркет</translation>
 <translation id="9218430445555521422">Использовать по умолчанию</translation>
 <translation id="9218842937876577955">"<ph name="APP_NAME" />" (не поддерживается)</translation>
+<translation id="9219103736887031265">Картинки</translation>
 <translation id="9219572436491982747">Наши специалисты могут просматривать такие данные, чтобы улучшать технологии искусственного интеллекта в Chrome.</translation>
 <translation id="9219741625496141320">Данные о работе в браузере были удалены автоматически</translation>
 <translation id="9220525904950070496">Удалить аккаунт</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb
index f3e82de..c494a10 100644
--- a/chrome/app/resources/generated_resources_si.xtb
+++ b/chrome/app/resources/generated_resources_si.xtb
@@ -11973,6 +11973,7 @@
 <translation id="9215742531438648683">Google Play Store අස්ථාපන කරන්න</translation>
 <translation id="9218430445555521422">පෙරනිමි ලෙස සකසන්න</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (සහාය නොදක්වන යෙදුම)</translation>
+<translation id="9219103736887031265">රූප</translation>
 <translation id="9219572436491982747">Chrome AI හි තාක්ෂණය වැඩි දියුණු කිරීම සඳහා Google වෙත යවන ලද දත්ත මානව සමාලෝචකයින් විසින් දැකිය හැක</translation>
 <translation id="9219741625496141320">බ්‍රවුස් කිරීමේ දත්ත ස්වයංක්‍රීයව මකා දමන ලදි</translation>
 <translation id="9220525904950070496">ගිනුම ඉවත් කරන්න</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 1ad5026c..c833f2b 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -11978,6 +11978,7 @@
 <translation id="9215742531438648683">Odinštalovať Obchod Google Play</translation>
 <translation id="9218430445555521422">Nastaviť ako predvolený</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (nepodporovaná aplikácia)</translation>
+<translation id="9219103736887031265">Obrázky</translation>
 <translation id="9219572436491982747">Údaje odoslané Googlu môžu prezerať kontrolóri s cieľom zlepšiť technológiu umelej inteligencie v Chrome</translation>
 <translation id="9219741625496141320">Dáta prehliadania boli automaticky odstránené</translation>
 <translation id="9220525904950070496">Odstrániť účet</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index db56e02..2be13c64 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1918,6 +1918,7 @@
 <translation id="2287617382468007324">Naslov za tiskanje IPP</translation>
 <translation id="2287704681286152065">{NUM_SITES,plural, =1{Zaradi zaščite podatkov so bila odstranjena dovoljenja za spletno mesto, ki ga nedavno niste obiskali}one{Zaradi zaščite podatkov so bila odstranjena dovoljenja za spletna mesta, ki jih nedavno niste obiskali}two{Zaradi zaščite podatkov so bila odstranjena dovoljenja za spletna mesta, ki jih nedavno niste obiskali}few{Zaradi zaščite podatkov so bila odstranjena dovoljenja za spletna mesta, ki jih nedavno niste obiskali}other{Zaradi zaščite podatkov so bila odstranjena dovoljenja za spletna mesta, ki jih nedavno niste obiskali}}</translation>
 <translation id="2287944065963043964">Zaslon za prijavo</translation>
+<translation id="2289567621059034186">Nov zavihek spodaj</translation>
 <translation id="2290615375132886363">Gumbi za krmarjenje v načinu tabličnega računalnika</translation>
 <translation id="2290703778620332549">Želite zamenjati ali ustvariti novo skupino?</translation>
 <translation id="2291452790265535215">Stransko podokno poskusite uporabiti za zaznamke, poti in drugo.</translation>
@@ -3282,6 +3283,7 @@
 <translation id="322708765617468434">Po nastavitvi lahko v napravo kadar koli dodate drugo osebo. Vsak si lahko individualno prilagodi izkušnjo in poskrbi za zasebnost podatkov.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3227701057281907159">Popravljanje</translation>
+<translation id="3228962656492373217">Zapri spodnje zavihke</translation>
 <translation id="3228985231489269630">{NUM_EXTENSIONS,plural, =1{Odstranite ali zamenjajte s podobnimi razširitvami iz <ph name="BEGIN_LINK" />Spletne trgovine Chrome<ph name="END_LINK" />.}one{Odstranite ali zamenjajte jih s podobnimi razširitvami iz <ph name="BEGIN_LINK" />Spletne trgovine Chrome<ph name="END_LINK" />.}two{Odstranite ali zamenjajte jih s podobnimi razširitvami iz <ph name="BEGIN_LINK" />Spletne trgovine Chrome<ph name="END_LINK" />.}few{Odstranite ali zamenjajte jih s podobnimi razširitvami iz <ph name="BEGIN_LINK" />Spletne trgovine Chrome<ph name="END_LINK" />.}other{Odstranite ali zamenjajte jih s podobnimi razširitvami iz <ph name="BEGIN_LINK" />Spletne trgovine Chrome<ph name="END_LINK" />.}}</translation>
 <translation id="3229254977651514276">Preverite datum</translation>
 <translation id="3230539834943294477">Ogled člankov s pomočjo ali iskanje podpore za napravo</translation>
@@ -5018,6 +5020,7 @@
 <translation id="4404843640767531781">Aplikacijo <ph name="APP_NAME" /> je blokiral starš. Če želiš uporabljati to aplikacijo, prosi starša za dovoljenje.</translation>
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="4405224443901389797">Premakni v …</translation>
+<translation id="4405580203042711503">Nov zavihek spodaj</translation>
 <translation id="4405781821077215583">Povečajte ali pomanjšajte elemente na zaslonu, vključno z besedilom</translation>
 <translation id="4406308048672435032">Če si želite znova ogledati celoten seznam, ta zavihek lahko spremenite v neaktivnega ali ga osvežite</translation>
 <translation id="4406881185911439342">Premakni skupino v fokus</translation>
@@ -6736,6 +6739,7 @@
 <translation id="5609231933459083978">Videti je, da je aplikacija neveljavna.</translation>
 <translation id="5610867721023328944">Poskusite znova ali izberite eno od spodnjih tem.</translation>
 <translation id="5611398002774823980">Shrani v račun</translation>
+<translation id="5611474372949142946">Zapri spodnje zavihke</translation>
 <translation id="561236229031062396"><ph name="SHORTCUT_NAME" />, <ph name="APP_FULL_NAME" /></translation>
 <translation id="5614190747811328134">Uporabniško obvestilo</translation>
 <translation id="5614553682702429503">Želite shraniti geslo?</translation>
@@ -12000,6 +12004,7 @@
 <translation id="9215742531438648683">Odstranjevanje Trgovine Google Play</translation>
 <translation id="9218430445555521422">Nastavi kot privzeto</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (aplikacija ni podprta)</translation>
+<translation id="9219103736887031265">Slike</translation>
 <translation id="9219572436491982747">Podatke, poslane Googlu, bodo morda videli pregledovalci zaradi izboljšanja tehnologije umetne inteligence v Chromu</translation>
 <translation id="9219741625496141320">Podatki brskanja so bili samodejno izbrisani</translation>
 <translation id="9220525904950070496">Odstranitev računa</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb
index 741b9c7a..b8d9b2f 100644
--- a/chrome/app/resources/generated_resources_sq.xtb
+++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -11967,6 +11967,7 @@
 <translation id="9215742531438648683">Çinstalo "Dyqanin e Google Play"</translation>
 <translation id="9218430445555521422">Cakto si parazgjedhje</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (aplikacion i pambështetur)</translation>
+<translation id="9219103736887031265">Imazhet</translation>
 <translation id="9219572436491982747">Të dhënat e dërguara te Google mund të shikohen nga shqyrtues njerëzorë për të përmirësuar teknologjinë e IA-së së Google</translation>
 <translation id="9219741625496141320">Të dhënat e shfletimit janë fshirë automaitkisht</translation>
 <translation id="9220525904950070496">Hiq llogarinë</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb
index 30d90731..7e0f8a3e 100644
--- a/chrome/app/resources/generated_resources_sr-Latn.xtb
+++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -12006,6 +12006,7 @@
 <translation id="9215742531438648683">Deinstalirajte Google Play prodavnicu</translation>
 <translation id="9218430445555521422">Podesi kao podrazumevano</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (aplikacija nije podržana)</translation>
+<translation id="9219103736887031265">Slike</translation>
 <translation id="9219572436491982747">Osobe koje pregledaju mogu da vide podatke poslate Google-u radi poboljšanja tehnologije Chrome veštačke inteligencije</translation>
 <translation id="9219741625496141320">Podaci pregledanja su automatski izbrisani</translation>
 <translation id="9220525904950070496">Uklanjanje naloga</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index cfe2fe92..2ce2051e 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -12006,6 +12006,7 @@
 <translation id="9215742531438648683">Деинсталирајте Google Play продавницу</translation>
 <translation id="9218430445555521422">Подеси као подразумевано</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (апликација није подржана)</translation>
+<translation id="9219103736887031265">Слике</translation>
 <translation id="9219572436491982747">Особе које прегледају могу да виде податке послате Google-у ради побољшања технологије Chrome вештачке интелигенције</translation>
 <translation id="9219741625496141320">Подаци прегледања су аутоматски избрисани</translation>
 <translation id="9220525904950070496">Уклањање налога</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 7174733c..e9d2c667 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -11986,6 +11986,7 @@
 <translation id="9215742531438648683">Avinstallera Google Play Butik</translation>
 <translation id="9218430445555521422">Ange som standard</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (appen stöds inte)</translation>
+<translation id="9219103736887031265">Bilder</translation>
 <translation id="9219572436491982747">Data som skickas till Google kan ses av mänskliga granskare för att förbättra Chromes AI-teknik</translation>
 <translation id="9219741625496141320">Webbinformation har raderats automatiskt</translation>
 <translation id="9220525904950070496">Ta bort konto</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index a39dc10..e414246 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -11985,6 +11985,7 @@
 <translation id="9215742531438648683">Ondoa programu ya Duka la Google Play</translation>
 <translation id="9218430445555521422">Weka iwe chaguomsingi</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (programu hii haiwezi kutumika)</translation>
+<translation id="9219103736887031265">Picha</translation>
 <translation id="9219572436491982747">Huenda wahakiki wanadamu wakaona data iliyotumwa kwa Google ili kuboresha teknolojia ya Chrome AI</translation>
 <translation id="9219741625496141320">Data ya kuvinjari ilifutwa kiotomatiki</translation>
 <translation id="9220525904950070496">Ondoa akaunti</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index dfb128f..dffa0b3 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -11987,6 +11987,7 @@
 <translation id="9215742531438648683">Google Play Storeரை நிறுவல் நீக்கு</translation>
 <translation id="9218430445555521422">இயல்பானதாக அமை</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (ஆதரிக்கப்படாத ஆப்ஸ்)</translation>
+<translation id="9219103736887031265">Images</translation>
 <translation id="9219572436491982747">Chrome AI தொழில்நுட்பத்தை மேம்படுத்துவதற்காக Googleளுக்கு அனுப்பப்படும் தரவு மதிப்பாய்வாளர்களுக்குக் காட்டப்படலாம்</translation>
 <translation id="9219741625496141320">உலாவிய தரவு தானாக நீக்கப்பட்டது</translation>
 <translation id="9220525904950070496">கணக்கை அகற்றுக</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 31b85e59..238dba4 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -12006,6 +12006,7 @@
 <translation id="9215742531438648683">Google Play Storeను అన్ఇన్‌స్టాల్ చేయండి</translation>
 <translation id="9218430445555521422">ఆటోమేటిక్ ఆప్షన్‌గా సెట్ చేయండి</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (సపోర్ట్ లేని యాప్)</translation>
+<translation id="9219103736887031265">ఇమేజ్‌లు</translation>
 <translation id="9219572436491982747">Chromeకు సంబంధించిన AI టెక్నాలజీని మెరుగుపరచడానికి Googleకు పంపిన డేటాను రివ్యూవర్‌లు రివ్యూ చేయవచ్చు</translation>
 <translation id="9219741625496141320">బ్రౌజింగ్ డేటా ఆటోమేటిక్‌గా తీసివేయబడింది</translation>
 <translation id="9220525904950070496">ఖాతాను తీసివేయండి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index bc801ef..a1a4cab 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -11965,6 +11965,7 @@
 <translation id="9215742531438648683">ถอนการติดตั้ง Google Play Store</translation>
 <translation id="9218430445555521422">ตั้งเป็นค่าเริ่มต้น</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (แอปที่ไม่รองรับ)</translation>
+<translation id="9219103736887031265">ภาพ</translation>
 <translation id="9219572436491982747">เจ้าหน้าที่ตรวจสอบอาจเห็นข้อมูลที่ส่งไปยัง Google เพื่อนำไปใช้ปรับปรุงเทคโนโลยี AI ของ Chrome</translation>
 <translation id="9219741625496141320">มีการลบข้อมูลการท่องเว็บโดยอัตโนมัติ</translation>
 <translation id="9220525904950070496">ลบบัญชี</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index f59bd47..4d42366 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -11968,6 +11968,7 @@
 <translation id="9215742531438648683">Google Play Store'u kaldır</translation>
 <translation id="9218430445555521422">Varsayılan olarak ayarla</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (desteklenmeyen uygulama)</translation>
+<translation id="9219103736887031265">Resimler</translation>
 <translation id="9219572436491982747">Google'a gönderilen veriler, Chrome yapay zeka teknolojisinin geliştirilmesi için inceleme uzmanları tarafından görüntülenebilir.</translation>
 <translation id="9219741625496141320">Tarama verileri otomatik olarak silindi</translation>
 <translation id="9220525904950070496">Hesabı kaldır</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 73f12e7..5b4c59ed 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -11992,6 +11992,7 @@
 <translation id="9215742531438648683">Видалити Play Маркет</translation>
 <translation id="9218430445555521422">Використовувати за умовчанням</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (додаток не підтримується)</translation>
+<translation id="9219103736887031265">Зображення</translation>
 <translation id="9219572436491982747">Наші спеціалісти можуть переглядати дані, що надсилаються в Google, щоб покращувати технології ШІ в Chrome</translation>
 <translation id="9219741625496141320">Дані веб-перегляду видалено автоматично</translation>
 <translation id="9220525904950070496">Видалення облікового запису</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb
index da0a4db..1cabb1e 100644
--- a/chrome/app/resources/generated_resources_ur.xtb
+++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -11994,6 +11994,7 @@
 <translation id="9215742531438648683">‏Google Play اسٹور اَن انسٹال کریں</translation>
 <translation id="9218430445555521422">بطور ڈیفالٹ سیٹ کریں</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (غیر تعاون یافتہ ایپ)</translation>
+<translation id="9219103736887031265">تصاویر</translation>
 <translation id="9219572436491982747">‏‫Chrome AI کی ٹیکنالوجی کو بہتر بنانے کے لیے Google کو بھیجا گیا ڈیٹا انسانی جائزہ کاران دیکھ سکتے ہیں۔</translation>
 <translation id="9219741625496141320">براؤزنگ ڈیٹا خودکار طور پر حذف ہو گیا</translation>
 <translation id="9220525904950070496">اکاؤنٹ ہٹائیں</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb
index 87ea93b..82beb7e 100644
--- a/chrome/app/resources/generated_resources_uz.xtb
+++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -11970,6 +11970,7 @@
 <translation id="9215742531438648683">Google Play Marketni oʻchirib tashlash</translation>
 <translation id="9218430445555521422">Birlamchi qilish</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (qoʻllab-quvvatlanmaydigan ilova)</translation>
+<translation id="9219103736887031265">Rasmlar</translation>
 <translation id="9219572436491982747">Googlega yuborilgan maʼlumotlarni xodimlarimiz Chrome AI texnologiyasini yaxshilash maqsadida koʻrishi mumkin</translation>
 <translation id="9219741625496141320">Brauzer maʼlumotlari avtomatik oʻchirib tashlandi</translation>
 <translation id="9220525904950070496">Hisobni olib tashlash</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index ea77d7d..51a32561 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -12018,6 +12018,7 @@
 <translation id="9215742531438648683">Gỡ cài đặt Cửa hàng Google Play</translation>
 <translation id="9218430445555521422">Đặt làm mặc định</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (ứng dụng không được hỗ trợ)</translation>
+<translation id="9219103736887031265">Hình ảnh</translation>
 <translation id="9219572436491982747">Nhân viên đánh giá có thể xem xét dữ liệu được gửi đến Google để cải thiện công nghệ AI của Chrome</translation>
 <translation id="9219741625496141320">Dữ liệu duyệt web đã tự động bị xoá</translation>
 <translation id="9220525904950070496">Xóa tài khoản</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 2a445fe..baaf3cc9 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -11957,6 +11957,7 @@
 <translation id="9215742531438648683">卸载 Google Play 商店</translation>
 <translation id="9218430445555521422">设为默认</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" />(不支持此应用)</translation>
+<translation id="9219103736887031265">图片</translation>
 <translation id="9219572436491982747">人工审核员可能会查看系统发送给 Google 的数据,以改进 Chrome AI 的技术</translation>
 <translation id="9219741625496141320">浏览数据已自动删除</translation>
 <translation id="9220525904950070496">移除账号</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb
index 86bbcd67..4b12bb9d 100644
--- a/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -11968,6 +11968,7 @@
 <translation id="9215742531438648683">解除安裝「Google Play 商店」</translation>
 <translation id="9218430445555521422">設定為預設</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (不支援的應用程式)</translation>
+<translation id="9219103736887031265">圖片</translation>
 <translation id="9219572436491982747">傳送至 Google 的資料可能會送交人手審查以改善 Chrome AI 技術</translation>
 <translation id="9219741625496141320">瀏覽資料已自動刪除</translation>
 <translation id="9220525904950070496">移除帳戶</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index efbc319b..de1f9b40 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -11959,6 +11959,7 @@
 <translation id="9215742531438648683">解除安裝 Google Play 商店</translation>
 <translation id="9218430445555521422">設為預設</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (不支援的應用程式)</translation>
+<translation id="9219103736887031265">圖片</translation>
 <translation id="9219572436491982747">傳送給 Google 的資料可能會由人工審查員查看,以提升 Chrome AI 技術</translation>
 <translation id="9219741625496141320">瀏覽資料已自動刪除</translation>
 <translation id="9220525904950070496">移除帳戶</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index 69fb2cc1..5c37b1ac 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -11988,6 +11988,7 @@
 <translation id="9215742531438648683">Khipha i-Google Play Isitolo</translation>
 <translation id="9218430445555521422">Setha njengokuzenzakalelayo</translation>
 <translation id="9218842937876577955"><ph name="APP_NAME" /> (i-app engasekelwa)</translation>
+<translation id="9219103736887031265">Izithombe</translation>
 <translation id="9219572436491982747">Idatha ethunyelwa kuGoogle ingase ibonwe ababuyekezi abangabantu ukuze kuthuthukiswe ubuchwepheshe be-AI yeChrome</translation>
 <translation id="9219741625496141320">Idatha yokubhrawuza isulwe ngokuzenzekelayo</translation>
 <translation id="9220525904950070496">Susa i-akhawunti</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb
index f5463cff..bd95c4e 100644
--- a/chrome/app/resources/google_chrome_strings_ar.xtb
+++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -33,6 +33,7 @@
 <translation id="1330562121671411446">رصد اللغة</translation>
 <translation id="1335640173511558774">‏يطلب <ph name="MANAGER" /> منك قراءة بنود الخدمة التالية وقبولها قبل استخدام هذا الجهاز، مع العلم بأنّ هذه البنود لا توسِّع نطاق بنود نظام التشغيل ChromeOS Flex من Google ولا تعدلِّها ولا تفرض قيودًا عليها.</translation>
 <translation id="1341711321000856656">‏يمكنك التبديل للاطّلاع على كلمات المرور من ملف شخصي آخر في Chrome.</translation>
+<translation id="1343830902827845050">‏سجِّل الدخول إلى Chrome</translation>
 <translation id="1356661055722410047">ميزة جديدة: يمكنك ترجمة كل من النص والصور على شاشتك</translation>
 <translation id="1363996462118479832">‏تعذّر على نظام التشغيل Chrome مزامنة البيانات بسبب حدوث خطأ في تسجيل الدخول.</translation>
 <translation id="137466361146087520">‏الإصدار التجريبي من Google Chrome</translation>
@@ -560,6 +561,7 @@
 <translation id="7098166902387133879">‏يستخدم Google Chrome الميكروفون.</translation>
 <translation id="7099479769133613710">‏إعادة التشغيل لتحديث نظام التشغيل Chrome</translation>
 <translation id="7106741999175697885">‏مدير المهام - Google Chrome</translation>
+<translation id="7121179479711575744">‏تسجيل الدخول إلى Chrome</translation>
 <translation id="7140653346177713799">{COUNT,plural, =0{‏يتوفر تحديث جديد لبرنامج Chrome وسيتم تطبيقه عند إعادة التشغيل.}=1{‏يتوفر تحديث جديد لبرنامج Chrome وسيتم تطبيقه عند إعادة التشغيل. لن تتم إعادة فتح نافذة التصفح المتخفي.}two{‏يتوفر تحديث جديد لبرنامج Chrome وسيتم تطبيقه عند إعادة التشغيل. لن تتم إعادة فتح نافذتَي التصفح المتخفي.}few{‏يتوفر تحديث جديد لبرنامج Chrome وسيتم تطبيقه عند إعادة التشغيل. لن تتم إعادة فتح نوافذ التصفّح المتخفي البالغ عددها #.}many{‏يتوفر تحديث جديد لبرنامج Chrome وسيتم تطبيقه عند إعادة التشغيل. لن تتم إعادة فتح نوافذ التصفّح المتخفي البالغ عددها #.}other{‏يتوفر تحديث جديد لبرنامج Chrome وسيتم تطبيقه عند إعادة التشغيل. لن تتم إعادة فتح نوافذ التصفّح المتخفي البالغ عددها #.}}</translation>
 <translation id="7155997830309522122">‏في هذه الحالة، يُرجى تعديل كلمة المرور المحفوظة في Chrome لتتطابق مع كلمة المرور الجديدة.</translation>
 <translation id="7161904924553537242">‏مرحبًا بك في Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb
index 9710b75..24a0904 100644
--- a/chrome/app/resources/google_chrome_strings_id.xtb
+++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -33,6 +33,7 @@
 <translation id="1330562121671411446">Deteksi bahasa</translation>
 <translation id="1335640173511558774"><ph name="MANAGER" /> mewajibkan Anda membaca dan menyetujui Persyaratan Layanan berikut sebelum menggunakan perangkat ini. Persyaratan ini tidak memperluas, mengubah, atau membatasi Persyaratan Google ChromeOS Flex.</translation>
 <translation id="1341711321000856656">Anda dapat beralih untuk melihat sandi dari profil Chrome lainnya</translation>
+<translation id="1343830902827845050">Login ke Chrome</translation>
 <translation id="1356661055722410047">Baru! Anda dapat menerjemahkan teks dan gambar di layar</translation>
 <translation id="1363996462118479832">ChromeOS tidak dapat menyinkronkan data Anda karena terjadi error saat login.</translation>
 <translation id="137466361146087520">Google Chrome Beta</translation>
@@ -556,6 +557,7 @@
 <translation id="7098166902387133879">Google Chrome menggunakan mikrofon Anda.</translation>
 <translation id="7099479769133613710">Luncurkan kembali untuk mengupdate &amp;ChromeOS</translation>
 <translation id="7106741999175697885">Pengelola Tugas - Google Chrome</translation>
+<translation id="7121179479711575744">Login ke Chrome</translation>
 <translation id="7140653346177713799">{COUNT,plural, =0{Update baru untuk Chrome telah tersedia dan akan diterapkan segera setelah diluncurkan kembali.}=1{Update baru untuk Chrome telah tersedia dan akan diterapkan segera setelah diluncurkan kembali. Jendela Samaran Anda tidak akan dibuka kembali.}other{Update baru untuk Chrome telah tersedia dan akan diterapkan segera setelah diluncurkan kembali. # jendela Samaran Anda tidak akan dibuka kembali.}}</translation>
 <translation id="7155997830309522122">Jika ya, edit sandi Anda yang tersimpan di Chrome agar cocok dengan sandi baru Anda.</translation>
 <translation id="7161904924553537242">Selamat Datang di Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb
index bcd6b12..de5bc2a 100644
--- a/chrome/app/resources/google_chrome_strings_iw.xtb
+++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -80,6 +80,7 @@
 <translation id="1843347690926158494">‏חיפוש הכרטיסייה הזו באמצעות Google Lens</translation>
 <translation id="1849248141818021764">‏רק מי שיודע את ביטוי הסיסמה יכול לקרוא את הנתונים המוצפנים. ביטוי הסיסמה לא נשלח אל Google ולא מאוחסן אצלה. אם שכחת את ביטוי הסיסמה או שברצונך לשנות את ההגדרה הזו, עליך <ph name="BEGIN_LINK" />למחוק את נתוני Chrome בחשבון<ph name="END_LINK" />.</translation>
 <translation id="1860536484129686729">‏Chrome זקוק להרשאת גישה למצלמה בשביל האתר הזה</translation>
+<translation id="1867503717113754604">‏כדי להשתמש ב-<ph name="START_GLIC_STYLING" />Gemini<ph name="END_GLIC_STYLING" />, צריך להיכנס ל-Chrome באמצעות חשבון Google</translation>
 <translation id="1873233029667955273">‏Google Chrome‏ אינו דפדפן ברירת המחדל שלך</translation>
 <translation id="1874309113135274312">‏גרסת הביטא של Google Chrome‏ (mDNS-In)</translation>
 <translation id="1877026089748256423">‏Chrome אינו מעודכן</translation>
@@ -170,6 +171,7 @@
 <translation id="286025080868315611">‏למה הורדות מסוימות נחסמות ב-Chrome</translation>
 <translation id="2861074815332034794">‏מתבצע עדכון של Chrome (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="2871893339301912279">‏נכנסת ל-Chrome!</translation>
+<translation id="2875053229394024379">‏כשנכנסים ל-Chrome באמצעות חשבון Google, אפשר להשתמש בפרופיל Chrome עם Gemini. <ph name="BEGIN_LINK" />איך להיכנס לחשבון ב-Chrome<ph name="END_LINK" /></translation>
 <translation id="2876628302275096482">‏<ph name="BEGIN_LINK" />מידע נוסף לגבי השמירה על פרטיות הנתונים ב-Chrome<ph name="END_LINK" /></translation>
 <translation id="2885378588091291677">מנהל המשימות</translation>
 <translation id="2888126860611144412">‏מידע כללי על Chrome</translation>
@@ -219,6 +221,7 @@
 <translation id="3352986031709923790">‏הפינה הימנית העליונה של אזור החיפוש: ‎<ph name="RIGHT" />%‎ מימין, ‎<ph name="TOP" />%‎ מלמעלה</translation>
 <translation id="3360895254066713204">Chrome Helper</translation>
 <translation id="3379938682270551431">{0,plural, =0{‏Chrome יופעל מחדש עכשיו}=1{‏Chrome יופעל מחדש בעוד שנייה}one{‏Chrome יופעל מחדש בעוד # שניות}two{‏Chrome יופעל מחדש בעוד # שניות}other{‏Chrome יופעל מחדש בעוד # שניות}}</translation>
+<translation id="3380249972812870825">‏כדי לפתוח את Gemini ב-Chrome, צריך ללחוץ על <ph name="GLOBAL_HOTKEY" /></translation>
 <translation id="3396977131400919238">‏במהלך ההתקנה אירעה שגיאה של מערכת ההפעלה. יש להוריד שוב את Google Chrome.</translation>
 <translation id="3428747202529429621">‏מגן עליך ב-Chrome וייתכן שייעשה בו שימוש לשיפור האבטחה באפליקציות אחרות של Google שבהן נכנסת לחשבון</translation>
 <translation id="3434246496373299699">‏Chrome יכול לבדוק את הסיסמאות כשנכנסים באמצעות חשבון Google</translation>
@@ -347,6 +350,7 @@
 <translation id="4891791193823137474">‏לאפשר ל-Google Chrome לפעול ברקע</translation>
 <translation id="4895437082222824641">‏פתיחת הקישור ב&amp;כרטיסיית Chrome חדשה</translation>
 <translation id="4918844574251943176">התמונה הועתקה</translation>
+<translation id="4926882258455737990">‏כדי להשתמש בחשבון Google אחר עם Gemini ב-Chrome, צריך <ph name="BEGIN_LINK" />ליצור פרופיל חדש<ph name="END_LINK" /> ולהיכנס באמצעות החשבון הרצוי</translation>
 <translation id="492720062778050435">‏לפי המלצת Chrome, כדאי לבדוק את התוסף הזה</translation>
 <translation id="4946912144186040233">‏‫Chrome מבין את הטפסים טוב יותר ויכול למלא אותם אוטומטית מהר יותר. ההגדרה הזו מושבתת.</translation>
 <translation id="4953650215774548573">‏הגדרת Google Chrome כדפדפן ברירת המחדל</translation>
@@ -370,6 +374,7 @@
 <translation id="5170938038195470297">‏לא ניתן להשתמש בפרופיל שלך משום שהוא מגרסה חדשה יותר של Google Chrome. ייתכן שחלק מהתכונות לא יהיו זמינות. ציין ספריית פרופיל אחרת או השתמש בגרסה חדשה יותר של Chrome.</translation>
 <translation id="5174969993834422967">הבחירה שלך היא בדרך כלל לחסום התראות. כדי לאפשר לאתר הזה להציג התראות, יש ללחוץ על סמל ההתראה בפינה השמאלית של סרגל המיקום.</translation>
 <translation id="5174983315706567306">אין מספיק מקום בכונן.</translation>
+<translation id="5179933070463113976">‏כדי להשתמש ב-Gemini ב-Chrome, צריך להיכנס ל-Chrome באמצעות חשבון Google</translation>
 <translation id="5190467473654176081">‏אפשר לשנות את המראה של Chrome</translation>
 <translation id="5201744974236816379">‏עדכון ל-Chrome</translation>
 <translation id="521447420733633466">‏כשמשתפים מכשיר, חברים ובני משפחה יכולים לגלוש בנפרד ולהגדיר את Chrome בדיוק כפי שהם רוצים</translation>
@@ -388,6 +393,7 @@
 <translation id="5394833366792865639">‏שיתוף כרטיסיית Chrome</translation>
 <translation id="5402307365844630024">‏הפעלה או השבתה של Gemini ב-Chrome בטא</translation>
 <translation id="5430073640787465221">‏קובץ ההעדפות שלך פגום או לא חוקי. Google Chrome לא יכול לשחזר את ההגדרות שלך.</translation>
+<translation id="5465210843490471889">‏בחירת פרופיל ב-Chrome לשימוש עם <ph name="START_GLIC_STYLING" />Gemini<ph name="END_GLIC_STYLING" /></translation>
 <translation id="5468572406162360320">‏כדי לשפר את התכונות האלו, Chrome שולח את האינטראקציות שלך איתן ל-Google. בודקים אנושיים יכולים לקרוא את הנתונים האלה, לעבד אותם ולהוסיף להם הערות.</translation>
 <translation id="5510398294750420479">‏רוצה עוד שכבת הגנה בכל מקום? כדאי להוריד את Chrome לטלפון</translation>
 <translation id="5524890928877629608">‏הפינה השמאלית העליונה של אזור החיפוש: ‎<ph name="LEFT" />%‎ משמאל, ‎<ph name="TOP" />%‎ מלמעלה</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb
index 3a21aeb..742fdc3 100644
--- a/chrome/app/resources/google_chrome_strings_ko.xtb
+++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -35,6 +35,7 @@
 <translation id="1330562121671411446">언어 감지</translation>
 <translation id="1335640173511558774"><ph name="MANAGER" />에서는 기기를 사용하기 전에 다음 서비스 약관을 읽고 이에 동의하도록 하고 있습니다. 이 약관은 Google ChromeOS Flex 약관을 확대하거나 수정 또는 제한하지 않습니다.</translation>
 <translation id="1341711321000856656">다른 Chrome 프로필의 비밀번호를 보도록 전환할 수 있습니다.</translation>
+<translation id="1343830902827845050">Chrome에 로그인하세요</translation>
 <translation id="1356661055722410047">New! 화면의 텍스트와 이미지를 모두 번역할 수 있습니다.</translation>
 <translation id="1363996462118479832">로그인 중 오류가 발생하여 ChromeOS에서 데이터를 동기화할 수 없습니다.</translation>
 <translation id="137466361146087520">Chrome 베타</translation>
@@ -563,6 +564,7 @@
 <translation id="7098166902387133879">Chrome에서 마이크를 사용 중입니다.</translation>
 <translation id="7099479769133613710">다시 실행하여 ChromeOS 업데이트</translation>
 <translation id="7106741999175697885">작업 관리자 - Chrome</translation>
+<translation id="7121179479711575744">Chrome에 로그인</translation>
 <translation id="7140653346177713799">{COUNT,plural, =0{새 Chrome 업데이트가 있습니다. Chrome을 다시 실행하면 업데이트가 바로 적용됩니다.}=1{새 Chrome 업데이트가 있습니다. Chrome을 다시 실행하면 업데이트가 바로 적용됩니다. 시크릿 창이 다시 열리지 않습니다.}other{새 Chrome 업데이트가 있습니다. Chrome을 다시 실행하면 업데이트가 바로 적용됩니다. 시크릿 창 #개가 다시 열리지 않습니다.}}</translation>
 <translation id="7155997830309522122">그렇다면 Chrome에 저장된 비밀번호가 새로운 비밀번호와 일치하도록 수정해 주세요.</translation>
 <translation id="7161904924553537242">신개념 브라우저 - Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb
index a18d1e6..740c66a 100644
--- a/chrome/app/resources/google_chrome_strings_lt.xtb
+++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -84,6 +84,7 @@
 <translation id="1843347690926158494">Ieškoti šiame skirtuke naudojant „Google Lens“</translation>
 <translation id="1849248141818021764">Tik jūsų slaptafrazę turintis asmuo galės perskaityti šifruotus duomenis. Slaptafrazė nesiunčiama ir nesaugoma „Google“. Jei pamiršite slaptafrazę ar norėsite pakeisti šį nustatymą, turėsite <ph name="BEGIN_LINK" />ištrinti „Chrome“ duomenis paskyroje<ph name="END_LINK" />.</translation>
 <translation id="1860536484129686729">„Chrome“ reikia leidimo, kad galėtų naudoti fotoaparatą šioje svetainėje</translation>
+<translation id="1867503717113754604">Prisijunkite prie „Chrome“ naudodami „Google“ paskyrą, kad galėtumėte naudoti <ph name="START_GLIC_STYLING" />„Gemini“<ph name="END_GLIC_STYLING" /></translation>
 <translation id="1873233029667955273">„Google Chrome“ nėra numatytoji naršyklė</translation>
 <translation id="1874309113135274312">„Google Chrome“ beta („mDNS-In“)</translation>
 <translation id="1877026089748256423">„Chrome“ versija yra pasenusi</translation>
@@ -174,6 +175,7 @@
 <translation id="286025080868315611">Sužinokite, kodėl „Chrome“ blokuoja kai kuriuos atsisiuntimus</translation>
 <translation id="2861074815332034794">Atnaujinama „Chrome“ (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="2871893339301912279">Esate prisijungę prie „Chrome“.</translation>
+<translation id="2875053229394024379">Kai prisijungiate prie „Chrome“ naudodami „Google“ paskyrą, galite naudoti „Chrome“ profilį su „Gemini“. <ph name="BEGIN_LINK" />Sužinokite, kaip prisijungti prie „Chrome“<ph name="END_LINK" />.</translation>
 <translation id="2876628302275096482">Sužinokite daugiau, <ph name="BEGIN_LINK" />kaip „Chrome“ užtikrina jūsų duomenų privatumą<ph name="END_LINK" /></translation>
 <translation id="2885378588091291677">Užduočių tvarkytuvė</translation>
 <translation id="2888126860611144412">Apie „Chrome“</translation>
@@ -223,6 +225,7 @@
 <translation id="3352986031709923790">viršutinis dešinysis paieškos srities kampas: dešinė – <ph name="RIGHT" /> %, viršus – <ph name="TOP" /> %</translation>
 <translation id="3360895254066713204">„Chrome“ pagalbos priemonė</translation>
 <translation id="3379938682270551431">{0,plural, =0{„Chrome“ bus paleista iš naujo dabar}=1{„Chrome“ bus paleista iš naujo po 1 sekundės}one{„Chrome“ bus paleista iš naujo po # sekundės}few{„Chrome“ bus paleista iš naujo po # sekundžių}many{„Chrome“ bus paleista iš naujo po # sekundės}other{„Chrome“ bus paleista iš naujo po # sekundžių}}</translation>
+<translation id="3380249972812870825">Jei norite atidaryti „Gemini“ naršyklėje „Chrome“, paspauskite <ph name="GLOBAL_HOTKEY" /></translation>
 <translation id="3396977131400919238">Diegimo metu įvyko operacinės sistemos klaida. Atsisiųskite „Google Chrome“ dar kartą.</translation>
 <translation id="3428747202529429621">Apsaugo jus naršyklėje „Chrome“ ir gali būti naudojama apsaugai kitose „Google“ programose pagerinti, kai esate prisijungę</translation>
 <translation id="3434246496373299699">„Chrome“ gali tikrinti jūsų slaptažodžius, kai prisijungiate naudodami „Google“ paskyrą</translation>
@@ -351,6 +354,7 @@
 <translation id="4891791193823137474">Paleisti „Google Chrome“ fone</translation>
 <translation id="4895437082222824641">Atidaryti nuorodą naujame „Chrome“ &amp;skirtuke</translation>
 <translation id="4918844574251943176">Vaizdas nukopijuotas</translation>
+<translation id="4926882258455737990">Jei norite naudoti kitą „Google“ paskyrą su „Gemini“ naršyklėje „Chrome“, <ph name="BEGIN_LINK" />sukurkite naują profilį<ph name="END_LINK" /> ir prisijunkite naudodami norimą paskyrą</translation>
 <translation id="492720062778050435">„Chrome“ rekomenduoja peržiūrėti šį plėtinį</translation>
 <translation id="4946912144186040233">„Chrome“ geriau supranta formas ir gali greičiau jas automatiškai užpildyti. Šis nustatymas išjungtas.</translation>
 <translation id="4953650215774548573">Nustatyti „Google Chrome“ kaip numatytąją naršyklę</translation>
@@ -376,6 +380,7 @@
 Kai kurios funkcijos gali būti nepasiekiamos. Nurodykite kitą profilio katalogą arba naudokite naujesnės versijos „Chrome“.</translation>
 <translation id="5174969993834422967">Įprastai blokuojate pranešimus. Jei norite leisti šiai svetainei siųsti pranešimus, spustelėkite pranešimo piktogramą vietos juostos dešiniajame kampe.</translation>
 <translation id="5174983315706567306">Nepakanka vietos diske.</translation>
+<translation id="5179933070463113976">Jei norite naudoti „Gemini“ naršyklėje „Chrome“, reikia prisijungti prie „Chrome“ naudojant „Google“ paskyrą</translation>
 <translation id="5190467473654176081">Tinkinkite „Chrome“ ir suteikite jai naują išvaizdą</translation>
 <translation id="5201744974236816379">„Chrome“ naujinys</translation>
 <translation id="521447420733633466">Jei bendrinate įrenginį, šeimos nariai ir draugai gali naršyti atskirai ir nustatyti „Chrome“ pagal savo poreikius</translation>
@@ -396,6 +401,7 @@
 <translation id="5430073640787465221">Nuostatų failas sugadintas ar netinkamas.
 
 „Google Chrome“ negali atkurti nustatymų.</translation>
+<translation id="5465210843490471889">Pasirinkite „Chrome“ profilį, kurį norite naudoti su <ph name="START_GLIC_STYLING" />„Gemini“<ph name="END_GLIC_STYLING" /></translation>
 <translation id="5468572406162360320">Kad padėtų tobulinti šias funkcijas, „Chrome“ siunčia jūsų sąveikas su jomis sistemai „Google“. Šiuos duomenis gali skaityti, apdoroti ir komentuoti tikrinantys žmonės.</translation>
 <translation id="5510398294750420479">Atsisiųskite „Chrome“ į telefoną, kad keliaudami būtumėte papildomai apsaugoti</translation>
 <translation id="5524890928877629608">viršutinis kairysis paieškos srities kampas: kairė – <ph name="LEFT" /> %, viršus – <ph name="TOP" /> %</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mn.xtb b/chrome/app/resources/google_chrome_strings_mn.xtb
index 22bb17d..f83fdd8 100644
--- a/chrome/app/resources/google_chrome_strings_mn.xtb
+++ b/chrome/app/resources/google_chrome_strings_mn.xtb
@@ -35,6 +35,7 @@
 <translation id="1330562121671411446">Хэл илрүүлэх</translation>
 <translation id="1335640173511558774"><ph name="MANAGER" /> танаас энэ төхөөрөмжийг ашиглахаасаа өмнө дараах үйлчилгээний нөхцөлийг уншиж, зөвшөөрөхийг шаардаж байна. Эдгээр нөхцөл нь Google ChromeOS Flex-н нөхцөлийг өргөтгөх, өөрчлөх эсвэл хязгаарлахгүй.</translation>
 <translation id="1341711321000856656">Та өөр Chrome профайлаас нууц үгнүүдийг харахын тулд сэлгэх боломжтой</translation>
+<translation id="1343830902827845050">Chrome-д нэвтрэх</translation>
 <translation id="1356661055722410047">Шинэ! Та дэлгэц дээрх текст, зургийн аль алиныг орчуулах боломжтой</translation>
 <translation id="1363996462118479832">Нэвтрэх алдааны улмаас ChromeOS таны өгөгдлийг синк хийж чадсангүй.</translation>
 <translation id="137466361146087520">Google Chrome Бета</translation>
@@ -563,6 +564,7 @@
 <translation id="7098166902387133879">Google Chrome таны микрофоныг ашиглаж байна.</translation>
 <translation id="7099479769133613710">&amp;ChromeOS-г шинэчлэхийн тулд дахин ачаалах</translation>
 <translation id="7106741999175697885">Асуудлын менежер - Google Chrome</translation>
+<translation id="7121179479711575744">Chrome-д нэвтрэх</translation>
 <translation id="7140653346177713799">{COUNT,plural, =0{Chrome-н шинэ шинэчлэлт боломжтой байгаа бөгөөд таныг дахин ачаалах үед түүнийг хэрэгжүүлэх болно.}=1{Chrome-н шинэ шинэчлэлт боломжтой байгаа бөгөөд таныг дахин ачаалах үед түүнийг хэрэгжүүлэх болно. Таны нууцлалтай цонхыг дахин нээхгүй.}other{Chrome-н шинэ шинэчлэлт боломжтой байгаа бөгөөд таныг дахин ачаалах үед түүнийг хэрэгжүүлэх болно. Таны # нууцлалтай цонхыг дахин нээхгүй.}}</translation>
 <translation id="7155997830309522122">Хэрэв тийм бол Chrome-д хадгалсан нууц үгээ засаж, шинэ нууц үгтэйгээ тааруулна уу.</translation>
 <translation id="7161904924553537242">Google Chrome-д тавтай морил</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb
index f7cf145..d8dd711b 100644
--- a/chrome/app/resources/google_chrome_strings_ms.xtb
+++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -80,6 +80,7 @@
 <translation id="1843347690926158494">Cari tab ini dengan Google Lens</translation>
 <translation id="1849248141818021764">Pengguna yang mengetahui ungkapan laluan anda sahaja yang dapat membaca data anda yang disulitkan. Ungkapan laluan tidak dihantar kepada atau disimpan oleh Google. Jika anda terlupa ungkapan laluan anda atau mahu menukar tetapan ini, anda perlu <ph name="BEGIN_LINK" />memadamkan data Chrome dalam akaun anda<ph name="END_LINK" />.</translation>
 <translation id="1860536484129686729">Chrome memerlukan kebenaran untuk mengakses kamera anda bagi tapak ini</translation>
+<translation id="1867503717113754604">Log masuk ke Chrome dengan Google Account anda untuk menggunakan <ph name="START_GLIC_STYLING" />Gemini<ph name="END_GLIC_STYLING" /></translation>
 <translation id="1873233029667955273">Google Chrome bukan penyemak imbas lalai anda</translation>
 <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome sudah usang</translation>
@@ -170,6 +171,7 @@
 <translation id="286025080868315611">Ketahui sebab Chrome menghalang sesetengah muat turun</translation>
 <translation id="2861074815332034794">Mengemas kini Chrome (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="2871893339301912279">Anda kini telah log masuk ke Chrome!</translation>
+<translation id="2875053229394024379">Apabila anda log masuk ke Chrome dengan Google Account anda, anda boleh menggunakan profil Chrome anda dengan Gemini. <ph name="BEGIN_LINK" />Ketahui cara log masuk ke Chrome<ph name="END_LINK" /></translation>
 <translation id="2876628302275096482">Ketahui lebih lanjut tentang <ph name="BEGIN_LINK" />cara Chrome mengekalkan data anda peribadi<ph name="END_LINK" /></translation>
 <translation id="2885378588091291677">Pengurus Tugas</translation>
 <translation id="2888126860611144412">Perihal Chrome</translation>
@@ -219,6 +221,7 @@
 <translation id="3352986031709923790">penjuru atas sebelah kanan kawasan carian: kanan <ph name="RIGHT" />%, atas <ph name="TOP" />%</translation>
 <translation id="3360895254066713204">Chrome Helper</translation>
 <translation id="3379938682270551431">{0,plural, =0{Chrome akan dilancarkan semula sekarang}=1{Chrome akan dilancarkan semula dalam masa sesaat}other{Chrome akan dilancarkan semula dalam masa # saat}}</translation>
+<translation id="3380249972812870825">Untuk membuka Gemini dalam Chrome, tekan <ph name="GLOBAL_HOTKEY" /></translation>
 <translation id="3396977131400919238">Ralat sistem pengendalian berlaku semasa pemasangan. Sila muat turun Google Chrome semula.</translation>
 <translation id="3428747202529429621">Memastikan anda selamat pada Chrome dan mungkin digunakan untuk meningkatkan keselamatan anda dalam apl Google yang lain apabila anda log masuk</translation>
 <translation id="3434246496373299699">Chrome boleh menyemak kata laluan anda apabila anda log masuk menggunakan Google Account anda</translation>
@@ -347,6 +350,7 @@
 <translation id="4891791193823137474">Biarkan Google Chrome dijalankan di latar belakang</translation>
 <translation id="4895437082222824641">Buka pautan dalam &amp;tab Chrome baharu</translation>
 <translation id="4918844574251943176">Imej disalin</translation>
+<translation id="4926882258455737990">Untuk menggunakan Google Account yang berbeza dengan Gemini dalam Chrome, <ph name="BEGIN_LINK" />buat profil baharu<ph name="END_LINK" /> dan log masuk dengan akaun yang anda mahukan</translation>
 <translation id="492720062778050435">Chrome mengesyorkan agar anda menyemak sambungan ini</translation>
 <translation id="4946912144186040233">Chrome memahami borang dengan lebih baik dan dapat membuat autolengkap borang dengan lebih pantas untuk anda. Tetapan ini dimatikan.</translation>
 <translation id="4953650215774548573">Tetapkan Google Chrome sebagai penyemak imbas lalai anda</translation>
@@ -370,6 +374,7 @@
 <translation id="5170938038195470297">Profil anda tidak boleh digunakan kerana ia adalah dari versi Google Chrome yang lebih baharu. Beberapa ciri mungkin tidak tersedia. Sila tetapkan direktori profil lain atau gunakan versi Chrome yang lebih baharu.</translation>
 <translation id="5174969993834422967">Anda biasanya menyekat pemberitahuan. Untuk membenarkan laman ini memaklumi anda, klik ikon pemberitahuan pada penjuru kanan bar lokasi anda.</translation>
 <translation id="5174983315706567306">Ruang cakera tidak mencukupi.</translation>
+<translation id="5179933070463113976">Untuk menggunakan Gemini dalam Chrome, anda perlu log masuk ke Chrome dengan Google Account anda</translation>
 <translation id="5190467473654176081">Sesuaikan Chrome untuk memberikan rupa baharu</translation>
 <translation id="5201744974236816379">Kemaskinian Chrome</translation>
 <translation id="521447420733633466">Jika anda berkongsi peranti, rakan dan keluarga boleh menyemak imbas secara terpisah dan menyediakan Chrome sebagaimana yang mereka ingini</translation>
@@ -388,6 +393,7 @@
 <translation id="5394833366792865639">Kongsi tab Chrome</translation>
 <translation id="5402307365844630024">Togol Gemini dalam Chrome Beta</translation>
 <translation id="5430073640787465221">Fail pilihan anda rosak atau tidak sah. Google Chrome tidak dapat mengembalikan tetapan anda.</translation>
+<translation id="5465210843490471889">Pilih profil Chrome untuk digunakan dengan <ph name="START_GLIC_STYLING" />Gemini<ph name="END_GLIC_STYLING" /></translation>
 <translation id="5468572406162360320">Untuk membantu meningkatkan ciri ini, Chrome menghantar interaksi anda dengan ciri tersebut kepada Google. Data ini boleh dibaca, diproses dan dianotasikan oleh jurusemak.</translation>
 <translation id="5510398294750420479">Muat turun Chrome pada telefon anda untuk menambahkan lapisan perlindungan tambahan semasa dalam perjalanan</translation>
 <translation id="5524890928877629608">penjuru atas sebelah kiri kawasan carian: kiri <ph name="LEFT" />%, atas <ph name="TOP" />%</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb
index e8072cd..0512c9b 100644
--- a/chrome/app/resources/google_chrome_strings_sl.xtb
+++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -35,6 +35,7 @@
 <translation id="1330562121671411446">Zaznaj jezik</translation>
 <translation id="1335640173511558774"><ph name="MANAGER" /> zahteva, da preberete in sprejmete pogoje storitve, preden začnete uporabljati napravo. Ti pogoji ne dopolnjujejo, spreminjajo ali omejujejo pogojev za Google ChromeOS Flex.</translation>
 <translation id="1341711321000856656">Če si želite ogledati gesla v drugem profilu za Chromium, lahko preklopite</translation>
+<translation id="1343830902827845050">Prijava v Chrome</translation>
 <translation id="1356661055722410047">Novo! Prevedete lahko besedilo in slike na zaslonu.</translation>
 <translation id="1363996462118479832">Chrome OS ni mogel sinhronizirati podatkov zaradi napake pri prijavi.</translation>
 <translation id="137466361146087520">Google Chrome Beta</translation>
@@ -564,6 +565,7 @@
 <translation id="7098166902387133879">Google Chrome uporablja vaš mikrofon.</translation>
 <translation id="7099479769133613710">Znova zaženite, če želite posodobiti &amp;Chrome OS</translation>
 <translation id="7106741999175697885">Upravitelj opravil – Google Chrome</translation>
+<translation id="7121179479711575744">Prijava v Chrome</translation>
 <translation id="7140653346177713799">{COUNT,plural, =0{Na voljo je nova posodobitev za Chrome, ki bo nameščena, takoj ko ga znova zaženete.}=1{Na voljo je nova posodobitev za Chrome, ki bo nameščena, takoj ko ga znova zaženete. Anonimno okno se ne bo znova odprlo.}one{Na voljo je nova posodobitev za Chrome, ki bo nameščena, takoj ko ga znova zaženete. # anonimno okno se ne bo znova odprlo.}two{Na voljo je nova posodobitev za Chrome, ki bo nameščena, takoj ko ga znova zaženete. # anonimni okni se ne bosta znova odprli.}few{Na voljo je nova posodobitev za Chrome, ki bo nameščena, takoj ko ga znova zaženete. # anonimna okna se ne bodo znova odprla.}other{Na voljo je nova posodobitev za Chrome, ki bo nameščena, takoj ko ga znova zaženete. # anonimnih oken se ne bo znova odprlo.}}</translation>
 <translation id="7155997830309522122">Če ste ga, uredite shranjeno geslo v Chromu, da se bo ujemalo z novim geslom.</translation>
 <translation id="7161904924553537242">Dobrodošli v brskalniku Google Chrome</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index bd624e2..c36350c 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -2068,6 +2068,26 @@
     Doesn’t warn you for private sites, such as your company’s intranet
   </message>
 
+  <!-- Secure Connections (in bundled version of security settings page) -->
+  <message name="IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_TOGGLE_LABEL" desc="Label for the HTTPS-First Mode toggle in the Security settings page">
+    Secure connections
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_TOGGLE_SUBLABEL" desc="Sublabel explaining HTTPS-First Mode in the Security settings page">
+    Upgrades connections to HTTPS when possible and warns you before making insecure connections
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_BALANCED_LABEL" desc="Label for radio button to enable the less-strict form of HTTPS-First Mode">
+    On open internet connections
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_BALANCED_SUBLABEL" desc="Sublabel explaining the less-strict form of HTTPS-First Mode">
+    Warns you about insecure connections on the open internet
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_STRICT_LABEL" desc="Label for radio button to enable the stricter form of HTTPS-First Mode">
+    On all connections
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_STRICT_SUBLABEL" desc="Sublabel explaining the stricter form of HTTPS-First Mode">
+    Warns you about all insecure connections, including private intranets
+  </message>
+
   <message name="IDS_SETTINGS_MANAGE_CERTIFICATES" desc="Text for manage certificates button in Privacy options">
     Manage certificates
   </message>
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_BALANCED_LABEL.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_BALANCED_LABEL.png.sha1
new file mode 100644
index 0000000..02d5789d
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_BALANCED_LABEL.png.sha1
@@ -0,0 +1 @@
+2f7ad7f0d0254faa98d622c43a86601df3aca4ca
\ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_BALANCED_SUBLABEL.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_BALANCED_SUBLABEL.png.sha1
new file mode 100644
index 0000000..02d5789d
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_BALANCED_SUBLABEL.png.sha1
@@ -0,0 +1 @@
+2f7ad7f0d0254faa98d622c43a86601df3aca4ca
\ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_STRICT_LABEL.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_STRICT_LABEL.png.sha1
new file mode 100644
index 0000000..02d5789d
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_STRICT_LABEL.png.sha1
@@ -0,0 +1 @@
+2f7ad7f0d0254faa98d622c43a86601df3aca4ca
\ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_STRICT_SUBLABEL.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_STRICT_SUBLABEL.png.sha1
new file mode 100644
index 0000000..02d5789d
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_STRICT_SUBLABEL.png.sha1
@@ -0,0 +1 @@
+2f7ad7f0d0254faa98d622c43a86601df3aca4ca
\ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_TOGGLE_LABEL.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_TOGGLE_LABEL.png.sha1
new file mode 100644
index 0000000..02d5789d
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_TOGGLE_LABEL.png.sha1
@@ -0,0 +1 @@
+2f7ad7f0d0254faa98d622c43a86601df3aca4ca
\ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_TOGGLE_SUBLABEL.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_TOGGLE_SUBLABEL.png.sha1
new file mode 100644
index 0000000..02d5789d
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_TOGGLE_SUBLABEL.png.sha1
@@ -0,0 +1 @@
+2f7ad7f0d0254faa98d622c43a86601df3aca4ca
\ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 76651ae..699b4d1 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -2174,7 +2174,7 @@
     "//components/enterprise",
     "//components/enterprise/browser/data_region",
     "//components/enterprise/browser/identifiers",
-    "//components/enterprise/browser/promotion:prefs",
+    "//components/enterprise/browser/promotion",
     "//components/enterprise/common/proto:connectors_proto",
     "//components/enterprise/common/proto:extensions_workflow_events_proto",
     "//components/enterprise/content",
diff --git a/chrome/browser/actor/actor_keyed_service.cc b/chrome/browser/actor/actor_keyed_service.cc
index 14604d18..2e58e1f 100644
--- a/chrome/browser/actor/actor_keyed_service.cc
+++ b/chrome/browser/actor/actor_keyed_service.cc
@@ -15,6 +15,7 @@
 #include "base/types/pass_key.h"
 #include "chrome/browser/actor/actor_features.h"
 #include "chrome/browser/actor/actor_keyed_service_factory.h"
+#include "chrome/browser/actor/actor_metrics.h"
 #include "chrome/browser/actor/actor_policy_checker.h"
 #include "chrome/browser/actor/actor_tab_data.h"
 #include "chrome/browser/actor/actor_task.h"
@@ -276,14 +277,14 @@
     base::WeakPtr<ActorTaskDelegate> delegate) {
   TRACE_EVENT0("actor", "ActorKeyedService::CreateTask");
   if (!policy_checker_->can_act_on_web()) {
-    base::UmaHistogramBoolean("Actor.Task.Created", false);
+    RecordActorTaskCreated(false);
     GetJournal().Log(GURL(), TaskId(), "ActorKeyedService::CreateTask",
                      JournalDetailsBuilder()
                          .AddError("Actuation capability disabled")
                          .Build());
     return TaskId();
   }
-  base::UmaHistogramBoolean("Actor.Task.Created", true);
+  RecordActorTaskCreated(true);
   auto execution_engine = std::make_unique<ExecutionEngine>(profile_.get());
   auto actor_task = std::make_unique<ActorTask>(
       profile_.get(), std::move(execution_engine),
@@ -534,7 +535,7 @@
   if (content::WebContents* web_contents =
           content::DownloadItemUtils::GetWebContents(item)) {
     if (GetActingActorTaskForWebContents(web_contents)) {
-      base::UmaHistogramBoolean("Actor.Download.DirectDownloadTriggered", true);
+      RecordDirectDownloadTriggered(true);
     }
   }
 }
diff --git a/chrome/browser/actor/actor_metrics.cc b/chrome/browser/actor/actor_metrics.cc
index f1da833..baa20a6 100644
--- a/chrome/browser/actor/actor_metrics.cc
+++ b/chrome/browser/actor/actor_metrics.cc
@@ -96,4 +96,50 @@
   base::UmaHistogramEnumeration("Actor.Task.StoppedReason", stopped_reason);
 }
 
+void RecordActorTaskCreated(bool success) {
+  base::UmaHistogramBoolean("Actor.Task.Created", success);
+}
+
+void RecordActionResultCode(actor::mojom::ActionResultCode action_result_code) {
+  // Note: Uses a sparse histogram instead of a linear (i.e. enumeration)
+  // histogram here because, the linear histograms are limited to 1000 values in
+  // base/metrics/histogram.cc.
+  base::UmaHistogramSparse("Actor.ExecutionEngine.Action.ResultCode",
+                           base::to_underlying(action_result_code));
+}
+
+void RecordPageContextApcDuration(base::TimeDelta duration) {
+  base::UmaHistogramMediumTimes("Actor.PageContext.APC.Duration", duration);
+}
+
+void RecordPageContextScreenshotDuration(base::TimeDelta duration) {
+  base::UmaHistogramMediumTimes("Actor.PageContext.Screenshot.Duration",
+                                duration);
+}
+
+void RecordPageContextTabCount(size_t tab_count) {
+  base::UmaHistogramCounts1000("Actor.PageContext.TabCount", tab_count);
+}
+
+void RecordDirectDownloadTriggered(bool success) {
+  base::UmaHistogramBoolean("Actor.Download.DirectDownloadTriggered", success);
+}
+
+void RecordDownloadSaveAsDialogTriggered(bool success) {
+  base::UmaHistogramBoolean("Actor.Download.SaveAsDialogTriggered", success);
+}
+
+void RecordActorNavigationGatingListSize(size_t allow_list_size,
+                                         size_t confirmed_list_size) {
+  base::UmaHistogramCounts1000("Actor.NavigationGating.AllowListSize",
+                               allow_list_size);
+  base::UmaHistogramCounts1000("Actor.NavigationGating.ConfirmedListSize",
+                               confirmed_list_size);
+}
+
+void RecordNavigationGatingDecision(ExecutionEngine::GatingDecision decision) {
+  base::UmaHistogramEnumeration("Actor.NavigationGating.GatingDecision",
+                                decision);
+}
+
 }  // namespace actor
diff --git a/chrome/browser/actor/actor_metrics.h b/chrome/browser/actor/actor_metrics.h
index e942c13..4fcb448 100644
--- a/chrome/browser/actor/actor_metrics.h
+++ b/chrome/browser/actor/actor_metrics.h
@@ -8,6 +8,8 @@
 #include <cstddef>
 
 #include "chrome/browser/actor/actor_task.h"
+#include "chrome/browser/actor/execution_engine.h"
+#include "chrome/common/actor.mojom.h"
 
 namespace actor {
 
@@ -47,5 +49,34 @@
                                size_t interruptions_count,
                                size_t actions_count);
 
+// Recorded when a ActorTask is successfully created for the first time or not.
+void RecordActorTaskCreated(bool success);
+
+// Records the result codes of completed actions.
+void RecordActionResultCode(actor::mojom::ActionResultCode action_result_code);
+
+// Records the time spent fetching the APC for a PerformActions response.
+void RecordPageContextApcDuration(base::TimeDelta duration);
+
+// Records the time spent fetching a screenshot for a PerformActions response.
+void RecordPageContextScreenshotDuration(base::TimeDelta duration);
+
+// Records the number of tabs that were observed for a PerformActions response.
+void RecordPageContextTabCount(size_t tab_count);
+
+// Recorded when a direct download is triggered by an ActorTask.
+void RecordDirectDownloadTriggered(bool success);
+
+// Recorded when a 'save as' download dialog is triggered by an ActorTask.
+void RecordDownloadSaveAsDialogTriggered(bool success);
+
+// Records the the size of the allow list and confirmed list (blocklist) of
+// origins for navigation gating.
+void RecordActorNavigationGatingListSize(size_t allow_list_size,
+                                         size_t confirmed_list_size);
+
+// Records the outcome of navigation gating decisions.
+void RecordNavigationGatingDecision(ExecutionEngine::GatingDecision decision);
+
 }  // namespace actor
 #endif  // CHROME_BROWSER_ACTOR_ACTOR_METRICS_H_
diff --git a/chrome/browser/actor/actor_policy_checker.cc b/chrome/browser/actor/actor_policy_checker.cc
index b5cd29ac..ca8ad76 100644
--- a/chrome/browser/actor/actor_policy_checker.cc
+++ b/chrome/browser/actor/actor_policy_checker.cc
@@ -142,17 +142,27 @@
           account_info.account_id);
   auto is_managed = extended_account_info.IsManaged();
 
-  journal.Log(GURL(), TaskId(), "IsAccountEligibleForActuation",
-              JournalDetailsBuilder()
-                  .Add("is_enterprise_account_data_protected",
-                       base::ToString(is_enterprise_account_data_protected))
-                  .Add("is_managed", signin::TriboolToString(is_managed))
-                  .Build());
+  // If the main Glic check has been split to no longer use the
+  // can_use_model_execution_features capability (see
+  // kGlicEligibilitySeparateAccountCapability), then that capability must be
+  // checked here. This is because actuation currently implements stricter
+  // account checks.
+  auto can_use_model_execution_features =
+      extended_account_info.capabilities.can_use_model_execution_features();
 
-  if (is_enterprise_account_data_protected) {
-    return false;
-  }
-  return is_managed == signin::Tribool::kFalse;
+  journal.Log(
+      GURL(), TaskId(), "IsAccountEligibleForActuation",
+      JournalDetailsBuilder()
+          .Add("is_enterprise_account_data_protected",
+               base::ToString(is_enterprise_account_data_protected))
+          .Add("is_managed", signin::TriboolToString(is_managed))
+          .Add("can_use_model_execution_features",
+               signin::TriboolToString(can_use_model_execution_features))
+          .Build());
+
+  return !is_enterprise_account_data_protected &&
+         (is_managed == signin::Tribool::kFalse) &&
+         (can_use_model_execution_features == signin::Tribool::kTrue);
 }
 
 #endif  // BUILDFLAG(ENABLE_GLIC)
@@ -280,7 +290,7 @@
   bool is_likely_dogfood_client = IsLikelyDogfoodClient();
   auto* profile = service_->GetProfile();
   CHECK(profile);
-  bool is_browser_managed = IsBrowserManaged(*service_->GetProfile());
+  bool is_browser_managed = IsBrowserManaged(*profile);
   bool actuation_enabled_for_managed_user = false;
   if (is_browser_managed) {
     actuation_enabled_for_managed_user =
diff --git a/chrome/browser/actor/actor_policy_checker_browsertest.cc b/chrome/browser/actor/actor_policy_checker_browsertest.cc
index 17074bb..e8abdf1 100644
--- a/chrome/browser/actor/actor_policy_checker_browsertest.cc
+++ b/chrome/browser/actor/actor_policy_checker_browsertest.cc
@@ -156,10 +156,11 @@
  protected:
   bool ShouldForceActOnWeb() override { return false; }
 
- private:
-  std::unique_ptr<IdentityTestEnvironmentProfileAdaptor> adaptor_;
   raw_ptr<signin::IdentityManager> identity_manager_;
   raw_ptr<signin::IdentityTestEnvironment> identity_test_env_;
+
+ private:
+  std::unique_ptr<IdentityTestEnvironmentProfileAdaptor> adaptor_;
   network::TestURLLoaderFactory test_url_loader_factory_;
   base::ScopedClosureRunner disclaimer_service_resetter_;
   base::test::ScopedFeatureList scoped_feature_list_;
@@ -493,6 +494,42 @@
                    .can_act_on_web());
 }
 
+IN_PROC_BROWSER_TEST_F(ActorPolicyCheckerBrowserTestWithManagedAccount,
+                       CanUseModelExecutionFeaturesCapabilityFalse) {
+  SimulatePrimaryAccountChangedSignIn(&kNonEnterpriseAccount);
+
+  CoreAccountInfo core_account_info =
+      identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
+  AccountInfo account_info =
+      identity_manager_->FindExtendedAccountInfoByAccountId(
+          core_account_info.account_id);
+
+  AccountCapabilitiesTestMutator mutator(&account_info.capabilities);
+  mutator.set_can_use_model_execution_features(false);
+  identity_test_env_->UpdateAccountInfoForAccount(account_info);
+  EXPECT_FALSE(ActorKeyedService::Get(browser()->profile())
+                   ->GetPolicyChecker()
+                   .can_act_on_web());
+}
+
+IN_PROC_BROWSER_TEST_F(ActorPolicyCheckerBrowserTestWithManagedAccount,
+                       CanUseModelExecutionFeaturesCapabilityTrue) {
+  SimulatePrimaryAccountChangedSignIn(&kNonEnterpriseAccount);
+
+  CoreAccountInfo core_account_info =
+      identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
+  AccountInfo account_info =
+      identity_manager_->FindExtendedAccountInfoByAccountId(
+          core_account_info.account_id);
+
+  AccountCapabilitiesTestMutator mutator(&account_info.capabilities);
+  mutator.set_can_use_model_execution_features(true);
+  identity_test_env_->UpdateAccountInfoForAccount(account_info);
+  EXPECT_TRUE(ActorKeyedService::Get(browser()->profile())
+                  ->GetPolicyChecker()
+                  .can_act_on_web());
+}
+
 // Exercise the policy checker for managed accounts (AccountInfo::IsManaged())
 // on policymanaged browsers (browser_management_service->IsManaged()).
 using ActorPolicyCheckerBrowserTestWithManagedAccountWithPolicy =
diff --git a/chrome/browser/actor/browser_action_util.cc b/chrome/browser/actor/browser_action_util.cc
index 87d5779..850a9df0 100644
--- a/chrome/browser/actor/browser_action_util.cc
+++ b/chrome/browser/actor/browser_action_util.cc
@@ -18,6 +18,7 @@
 #include "base/trace_event/trace_event.h"
 #include "base/types/expected.h"
 #include "chrome/browser/actor/actor_keyed_service.h"
+#include "chrome/browser/actor/actor_metrics.h"
 #include "chrome/browser/actor/actor_task.h"
 #include "chrome/browser/actor/aggregated_journal.h"
 #include "chrome/browser/actor/shared_types.h"
@@ -858,10 +859,9 @@
         (fetch_result.annotated_page_content_result.value().end_time -
          start_time)
             .InMilliseconds());
-    base::UmaHistogramMediumTimes(
-        "Actor.PageContext.APC.Duration",
+    RecordPageContextApcDuration(
         fetch_result.annotated_page_content_result.value().end_time -
-            fetch_context_time);
+        fetch_context_time);
   }
 
   {
@@ -873,8 +873,7 @@
     latency_step->set_latency_stop_ms(
         (fetch_result.screenshot_result.value().end_time - start_time)
             .InMilliseconds());
-    base::UmaHistogramMediumTimes(
-        "Actor.PageContext.Screenshot.Duration",
+    RecordPageContextScreenshotDuration(
         fetch_result.screenshot_result.value().end_time - fetch_context_time);
   }
 
@@ -1028,8 +1027,7 @@
           .Add("tabs_to_fetch", tabs_to_fetch.size())
           .Build());
 
-  base::UmaHistogramCounts1000("Actor.PageContext.TabCount",
-                               tabs_to_fetch.size());
+  RecordPageContextTabCount(tabs_to_fetch.size());
 
   if (skip_async_observation_information) {
     std::move(callback).Run(std::move(response), std::move(journal_entry));
diff --git a/chrome/browser/actor/execution_engine.cc b/chrome/browser/actor/execution_engine.cc
index 81d44a4..b817514 100644
--- a/chrome/browser/actor/execution_engine.cc
+++ b/chrome/browser/actor/execution_engine.cc
@@ -87,11 +87,7 @@
     mojom::ActionResultPtr result,
     std::optional<size_t> index_of_failed_action,
     std::vector<ActionResultWithLatencyInfo> action_results) {
-  // Using a sparse histogram instead of a linear (i.e. enumeration) histogram
-  // here because, the linear histograms are limited to 1000 values in
-  // base/metrics/histogram.cc.
-  base::UmaHistogramSparse("Actor.ExecutionEngine.Action.ResultCode",
-                           base::to_underlying(result->code));
+  RecordActionResultCode(result->code);
   base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
       FROM_HERE,
       base::BindOnce(std::move(callback), std::move(result),
@@ -159,10 +155,9 @@
 
 ExecutionEngine::~ExecutionEngine() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  base::UmaHistogramCounts1000("Actor.NavigationGating.AllowListSize",
-                               allowed_navigation_origins_.size());
-  base::UmaHistogramCounts1000("Actor.NavigationGating.ConfirmedListSize",
-                               user_confirmed_blocklisted_origins_.size());
+  RecordActorNavigationGatingListSize(
+      allowed_navigation_origins_.size(),
+      user_confirmed_blocklisted_origins_.size());
 
   RunUserTakeoverCallbackIfExists(/*should_cancel=*/true);
 }
@@ -260,8 +255,7 @@
   const GURL& destination_url = navigation_handle.GetURL();
   const GatingDecision decision =
       DetermineGatingDecision(source_url, destination_url);
-  base::UmaHistogramEnumeration("Actor.NavigationGating.GatingDecision",
-                                decision);
+  RecordNavigationGatingDecision(decision);
   if (decision == GatingDecision::kBlockByStaticList) {
     base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
         FROM_HERE, base::BindOnce(std::move(callback), /*may_continue=*/false));
@@ -517,7 +511,7 @@
     mojom::ActionResultCode takeover_response_code,
     base::OnceCallback<void(bool)> callback) {
   if (takeover_response_code == mojom::ActionResultCode::kFilePickerTriggered) {
-    base::UmaHistogramBoolean("Actor.Download.SaveAsDialogTriggered", true);
+    RecordDownloadSaveAsDialogTriggered(true);
   }
 
   CancelOngoingActions(takeover_response_code);
diff --git a/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc b/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc
index 84761eb7..86ca10a 100644
--- a/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc
+++ b/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc
@@ -58,11 +58,11 @@
 #include "chrome/browser/ui/ash/device_scheduled_reboot/reboot_notification_controller.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
-#include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_tabstrip.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
 #include "chrome/browser/ui/browser_window/public/browser_window_interface_iterator.h"
+#include "chrome/browser/ui/browser_window/public/global_browser_collection.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
@@ -415,7 +415,7 @@
 
 IN_PROC_BROWSER_TEST_F(FullRestoreAppLaunchHandlerBrowserTest,
                        NoBrowserOnLaunch) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 }
 
 IN_PROC_BROWSER_TEST_F(FullRestoreAppLaunchHandlerBrowserTest,
diff --git a/chrome/browser/ash/app_restore/informed_restore_browsertest.cc b/chrome/browser/ash/app_restore/informed_restore_browsertest.cc
index 513d325..ccbfc59 100644
--- a/chrome/browser/ash/app_restore/informed_restore_browsertest.cc
+++ b/chrome/browser/ash/app_restore/informed_restore_browsertest.cc
@@ -28,11 +28,11 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.h"
 #include "chrome/browser/ui/browser_finder.h"
-#include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_tabstrip.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
 #include "chrome/browser/ui/browser_window/public/browser_window_interface_iterator.h"
+#include "chrome/browser/ui/browser_window/public/global_browser_collection.h"
 #include "chrome/browser/ui/webui/ash/settings/pref_names.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/test/base/ash/util/ash_test_util.h"
@@ -129,7 +129,7 @@
 #define MAYBE_PRE_LaunchBrowsers PRE_LaunchBrowsers
 #endif
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, MAYBE_PRE_LaunchBrowsers) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   Profile* profile = ProfileManager::GetActiveUserProfile();
   CreateBrowser(profile);
@@ -157,7 +157,7 @@
 #define MAYBE_LaunchBrowsers LaunchBrowsers
 #endif
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, MAYBE_LaunchBrowsers) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   // Verify we have entered overview. The restore button will be null if we
   // failed to enter overview.
@@ -178,7 +178,7 @@
 
 // Creates SWAs that will be restored in the main test.
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, PRE_LaunchSWA) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   // Create two SWAs, files and settings.
   Profile* profile = ProfileManager::GetActiveUserProfile();
@@ -194,7 +194,7 @@
 // Verify that with two elements in the full restore file, we enter overview on
 // login. Then when we click the restore button, we restore SWAs.
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, LaunchSWA) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   test::InstallSystemAppsForTesting(ProfileManager::GetActiveUserProfile());
 
@@ -230,7 +230,7 @@
 // Creates 3 browser windows on 3 different desks that will be restored in the
 // main test.
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, PRE_LaunchBrowsersToDesks) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   Profile* profile = ProfileManager::GetActiveUserProfile();
   Browser* browser1 = CreateBrowser(profile);
@@ -272,7 +272,7 @@
 
 // Tests that the three browser windows are restored to their old desks.
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, DISABLED_LaunchBrowsersToDesks) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   // Verify we have entered overview. The restore button will be null if we
   // failed to enter overview.
@@ -299,7 +299,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, PRE_DISABLED_WindowStates) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   Profile* profile = ProfileManager::GetActiveUserProfile();
   Browser* browser_maximized = CreateBrowser(profile);
@@ -336,7 +336,7 @@
 
 // Tests that the browser windows are restored to their old window states.
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, DISABLED_WindowStates) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   // Verify we have entered overview. The restore button will be null if we
   // failed to enter overview.
@@ -392,7 +392,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, PRE_ClickCancelButton) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   Profile* profile = ProfileManager::GetActiveUserProfile();
   CreateBrowser(profile);
@@ -406,7 +406,7 @@
 // Verify that with two elements in the full restore file, if we click cancel no
 // browsers are launched.
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, ClickCancelButton) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   // Verify we have entered overview. The cancel button will be null if we
   // failed to enter overview.
@@ -418,11 +418,11 @@
   // async. Verify that no browsers are launched.
   test::Click(cancel_button, /*flag=*/0);
   base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 }
 
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, PRE_TabInfoWithinLimit) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   Browser* browser = CreateBrowser(ProfileManager::GetActiveUserProfile());
   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
@@ -450,7 +450,7 @@
 // Verify that the tab info that is sent to ash shell is as expected, when the
 // most recent active tab is one of the first five tabs.
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, TabInfoWithinLimit) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   // The informed restore dialog is built based on the values in this data
   // structure.
@@ -473,7 +473,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, PRE_TabInfoOutsideLimit) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   Browser* browser = CreateBrowser(ProfileManager::GetActiveUserProfile());
   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
@@ -502,7 +502,7 @@
 // Verify that the tab info that is sent to ash shell is as expected, when the
 // most recent active tab is outside of the first five tabs.
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, TabInfoOutsideLimit) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   // The informed restore dialog is built based on the values in this data
   // structure.
@@ -527,7 +527,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, PRE_AppInfo) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   // Create multiple SWAs that will be added to the restore data. Each SWA is
   // activated when it is created, so the Print Management app should be the
@@ -558,7 +558,7 @@
 // Verify that the app info that is sent to ash shell is as expected, with the
 // apps appearing in order from most recently used to least recently used.
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, AppInfo) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   // The informed restore dialog is built based on the values in this data
   // structure.
@@ -600,7 +600,7 @@
 
 // Verify that the app info that is sent to ash shell is dialog type update.
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, Update) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   const InformedRestoreContentsData* contents_data =
       Shell::Get()->informed_restore_controller()->contents_data();
@@ -610,7 +610,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, PRE_ReenterInformedRestoreSession) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
   CreateBrowser(ProfileManager::GetActiveUserProfile());
   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
 
@@ -621,7 +621,7 @@
 // Test that if we exit overview and reenter without opening a new window, we
 // see the informed restore dialog again.
 IN_PROC_BROWSER_TEST_F(InformedRestoreTest, ReenterInformedRestoreSession) {
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   // Verify we have entered overview with the informed restore dialog.
   WaitForOverviewEnterAnimation();
diff --git a/chrome/browser/ash/browser_delegate/browser_controller_impl.cc b/chrome/browser/ash/browser_delegate/browser_controller_impl.cc
index 74b51be..77e9946fc 100644
--- a/chrome/browser/ash/browser_delegate/browser_controller_impl.cc
+++ b/chrome/browser/ash/browser_delegate/browser_controller_impl.cc
@@ -291,7 +291,7 @@
   for (auto& observer : observers_) {
     observer.OnBrowserClosed(browser_delegate);
 
-    if (BrowserList::GetInstance()->empty()) {
+    if (GlobalBrowserCollection::GetInstance()->IsEmpty()) {
       observer.OnLastBrowserClosed();
     }
   }
diff --git a/chrome/browser/ash/login/demo_mode/DEPS b/chrome/browser/ash/login/demo_mode/DEPS
index 016de35..f94e152 100644
--- a/chrome/browser/ash/login/demo_mode/DEPS
+++ b/chrome/browser/ash/login/demo_mode/DEPS
@@ -51,6 +51,7 @@
     "+chrome/browser/ui/browser.h",
     "+chrome/browser/ui/browser_list.h",
     "+chrome/browser/ui/browser_list_observer.h",
+    "+chrome/browser/ui/browser_window/public/global_browser_collection.h",
     "+chrome/test/base",
   ]
 }
diff --git a/chrome/browser/ash/login/demo_mode/demo_mode_idle_handler_unittest.cc b/chrome/browser/ash/login/demo_mode/demo_mode_idle_handler_unittest.cc
index 6c2ad411..0e70e7b9 100644
--- a/chrome/browser/ash/login/demo_mode/demo_mode_idle_handler_unittest.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_mode_idle_handler_unittest.cc
@@ -27,7 +27,7 @@
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
-#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/browser_window/public/global_browser_collection.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/test/base/chrome_ash_test_base.h"
 #include "chrome/test/base/test_browser_window.h"
@@ -190,7 +190,7 @@
   browser_2.reset();
 
   EXPECT_EQ(get_launch_demo_app_count(), 1);
-  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 }
 
 TEST_F(DemoModeIdleHandlerTest, ClearAndCloseClipboard) {
diff --git a/chrome/browser/ash/printing/print_management/DEPS b/chrome/browser/ash/printing/print_management/DEPS
index 940a75a..cbc534be 100644
--- a/chrome/browser/ash/printing/print_management/DEPS
+++ b/chrome/browser/ash/printing/print_management/DEPS
@@ -23,7 +23,6 @@
   "+chrome/browser/ui/ash/system_web_apps",
   "+chrome/browser/ui/browser_commands.h",
   "+chrome/browser/ui/browser.h",
-  "+chrome/browser/ui/browser_list.h",
   "+chrome/browser/ui/browser_window/public",
   "+chrome/browser/ui/chrome_pages.h",
   "+chrome/browser/ui/settings_window_manager_chromeos.h",
diff --git a/chrome/browser/ash/printing/print_management/print_management_printer_settings_interactive_uitest.cc b/chrome/browser/ash/printing/print_management/print_management_printer_settings_interactive_uitest.cc
index 700f529..9359d85f 100644
--- a/chrome/browser/ash/printing/print_management/print_management_printer_settings_interactive_uitest.cc
+++ b/chrome/browser/ash/printing/print_management/print_management_printer_settings_interactive_uitest.cc
@@ -15,9 +15,9 @@
 #include "chrome/browser/ash/printing/history/print_job_info.pb.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
 #include "chrome/browser/ui/browser_window/public/browser_window_interface_iterator.h"
+#include "chrome/browser/ui/browser_window/public/global_browser_collection.h"
 #include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/browser/ui/settings_window_manager_chromeos.h"
 #include "chrome/test/base/ash/interactive/interactive_ash_test.h"
@@ -106,7 +106,7 @@
   auto ClosePrinterSettings() {
     return Do([]() {
       // Printer settings is opened last so it'll be the last active browser.
-      ASSERT_FALSE(BrowserList::GetInstance()->empty());
+      ASSERT_FALSE(GlobalBrowserCollection::GetInstance()->IsEmpty());
       chrome::CloseWindow(GetLastActiveBrowserWindowInterfaceWithAnyProfile());
     });
   }
@@ -115,7 +115,7 @@
     return Do([]() {
       // The test always starts from an empty state so the Print Management app
       // will always be the first browser.
-      ASSERT_FALSE(BrowserList::GetInstance()->empty());
+      ASSERT_FALSE(GlobalBrowserCollection::GetInstance()->IsEmpty());
       chrome::Reload(GetLastActiveBrowserWindowInterfaceWithAnyProfile()
                          ->GetBrowserForMigrationOnly(),
                      WindowOpenDisposition::CURRENT_TAB);
diff --git a/chrome/browser/autofill/otp_manager_browsertest.cc b/chrome/browser/autofill/otp_manager_browsertest.cc
index 72b22e2d8..b9e11ee 100644
--- a/chrome/browser/autofill/otp_manager_browsertest.cc
+++ b/chrome/browser/autofill/otp_manager_browsertest.cc
@@ -20,6 +20,7 @@
 #include "components/autofill/core/browser/ui/test_autofill_external_delegate.h"
 #include "components/autofill/core/common/signatures.h"
 #include "components/one_time_tokens/core/browser/one_time_token.h"
+#include "components/one_time_tokens/core/browser/one_time_token_retrieval_error.h"
 #include "components/one_time_tokens/core/browser/one_time_token_service_impl.h"
 #include "components/one_time_tokens/core/browser/sms_otp_backend.h"
 #include "content/public/test/browser_test.h"
@@ -34,8 +35,9 @@
 // the moment an SMS is received for one-time passwords (OTP).
 class FakeSmsOtpBackend : public one_time_tokens::SmsOtpBackend {
  public:
-  using CallbackType =
-      base::OnceCallback<void(const one_time_tokens::OtpFetchReply&)>;
+  using CallbackType = base::OnceCallback<void(
+      base::expected<one_time_tokens::OneTimeToken,
+                     one_time_tokens::OneTimeTokenRetrievalError>)>;
 
   FakeSmsOtpBackend() = default;
   ~FakeSmsOtpBackend() override = default;
@@ -44,7 +46,9 @@
   void RetrieveSmsOtp(CallbackType callback) override;
 
   // Simulates the reception of an SMS.
-  void NotifyCallbacks(const one_time_tokens::OtpFetchReply& reply);
+  void NotifyCallbacks(
+      base::expected<one_time_tokens::OneTimeToken,
+                     one_time_tokens::OneTimeTokenRetrievalError> reply);
 
   size_t num_callbacks() const { return callbacks_.size(); }
 
@@ -58,7 +62,8 @@
 }
 
 void FakeSmsOtpBackend::NotifyCallbacks(
-    const one_time_tokens::OtpFetchReply& reply) {
+    base::expected<one_time_tokens::OneTimeToken,
+                   one_time_tokens::OneTimeTokenRetrievalError> reply) {
   for (auto& callback : callbacks_) {
     std::move(callback).Run(reply);
   }
@@ -255,11 +260,8 @@
 
   // Simulate an OTP arriving.
   autofill_client().sms_otp_backend().NotifyCallbacks(
-      one_time_tokens::OtpFetchReply(
-          one_time_tokens::OneTimeToken(
-              one_time_tokens::OneTimeTokenType::kSmsOtp, "123456",
-              base::Time::Now()),
-          /*request_complete=*/true));
+      one_time_tokens::OneTimeToken(one_time_tokens::OneTimeTokenType::kSmsOtp,
+                                    "123456", base::Time::Now()));
 
   // Simulate click on field.
   const std::map<FormGlobalId, std::unique_ptr<FormStructure>>& forms =
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/DEPS b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/DEPS
index eb30e877..6ebd161f 100644
--- a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/DEPS
+++ b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/DEPS
@@ -40,6 +40,7 @@
   "+chrome/browser/ui/browser_list.h",
   "+chrome/browser/ui/browser_list_observer.h",
   "+chrome/browser/ui/browser_window/public/browser_window_interface_iterator.h",
+  "+chrome/browser/ui/browser_window/public/global_browser_collection.h",
   "+chrome/browser/ui/web_applications",
   "+chrome/browser/web_applications",
   "+chrome/common",
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/browser_cleanup_handler_browsertest.cc b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/browser_cleanup_handler_browsertest.cc
index 3909e54..628ab3c 100644
--- a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/browser_cleanup_handler_browsertest.cc
+++ b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/browser_cleanup_handler_browsertest.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/browser_window/public/global_browser_collection.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "content/public/test/browser_test.h"
@@ -120,7 +121,7 @@
 
   RunBrowserCleanupHandler();
 
-  ASSERT_TRUE(BrowserList::GetInstance()->empty());
+  ASSERT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
   ASSERT_EQ(0, GetHistorySize());
 }
 
@@ -137,11 +138,11 @@
       /*skip_beforeunload=*/true);
   ui_test_utils::WaitForBrowserToClose();
 
-  ASSERT_TRUE(BrowserList::GetInstance()->empty());
+  ASSERT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
   ASSERT_EQ(1, GetHistorySize());
 
   RunBrowserCleanupHandler();
 
-  ASSERT_TRUE(BrowserList::GetInstance()->empty());
+  ASSERT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
   ASSERT_EQ(0, GetHistorySize());
 }
diff --git a/chrome/browser/contextual_cueing/contextual_cueing_features.cc b/chrome/browser/contextual_cueing/contextual_cueing_features.cc
index 324f8de..c5d0c9d 100644
--- a/chrome/browser/contextual_cueing/contextual_cueing_features.cc
+++ b/chrome/browser/contextual_cueing/contextual_cueing_features.cc
@@ -20,6 +20,8 @@
 
 BASE_FEATURE(kGlicZeroStateSuggestions, base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kZeroStateSuggestionsUseLegion, base::FEATURE_DISABLED_BY_DEFAULT);
+
 bool IsContextualCueingEnabled() {
 #if BUILDFLAG(ENABLE_GLIC)
   // If the feature is overridden (e.g. via server-side config or command-line),
diff --git a/chrome/browser/contextual_cueing/contextual_cueing_features.h b/chrome/browser/contextual_cueing/contextual_cueing_features.h
index 43f05afd..d0a2676e2 100644
--- a/chrome/browser/contextual_cueing/contextual_cueing_features.h
+++ b/chrome/browser/contextual_cueing/contextual_cueing_features.h
@@ -12,6 +12,7 @@
 
 BASE_DECLARE_FEATURE(kContextualCueing);
 BASE_DECLARE_FEATURE(kGlicZeroStateSuggestions);
+BASE_DECLARE_FEATURE(kZeroStateSuggestionsUseLegion);
 
 // Whether contextual cueing is enabled.
 //
diff --git a/chrome/browser/contextual_cueing/zero_state_suggestions_request.cc b/chrome/browser/contextual_cueing/zero_state_suggestions_request.cc
index 99122009..87351c5 100644
--- a/chrome/browser/contextual_cueing/zero_state_suggestions_request.cc
+++ b/chrome/browser/contextual_cueing/zero_state_suggestions_request.cc
@@ -8,11 +8,14 @@
 #include <vector>
 
 #include "base/barrier_callback.h"
+#include "base/feature_list.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/single_thread_task_runner.h"
+#include "chrome/browser/contextual_cueing/contextual_cueing_features.h"
 #include "chrome/browser/contextual_cueing/zero_state_suggestions_page_data.h"
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
+#include "components/optimization_guide/core/model_execution/remote_model_executor.h"
 #include "components/optimization_guide/core/optimization_guide_logger.h"
 #include "content/public/browser/web_contents.h"
 
@@ -156,10 +159,14 @@
       "ZeroStateSuggestionsRequest: Starting fetch for "
       "suggestions. Is-mulitab request: %s",
       pending_base_request_.has_page_context_list() ? "true" : "false"));
+  optimization_guide::ModelExecutionServiceType service_type =
+      base::FeatureList::IsEnabled(kZeroStateSuggestionsUseLegion)
+          ? optimization_guide::ModelExecutionServiceType::kLegion
+          : optimization_guide::ModelExecutionServiceType::kDefault;
+
   optimization_guide_keyed_service_->ExecuteModel(
       optimization_guide::ModelBasedCapabilityKey::kZeroStateSuggestions,
-      pending_base_request_,
-      /*options=*/{},
+      pending_base_request_, {.service_type = service_type},
       base::BindOnce(&ZeroStateSuggestionsRequest::OnModelExecutionResponse,
                      weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now()));
 }
diff --git a/chrome/browser/contextual_tasks/contextual_tasks_ui.cc b/chrome/browser/contextual_tasks/contextual_tasks_ui.cc
index c8e4d97..0388189 100644
--- a/chrome/browser/contextual_tasks/contextual_tasks_ui.cc
+++ b/chrome/browser/contextual_tasks/contextual_tasks_ui.cc
@@ -132,6 +132,7 @@
       {"myActivity", IDS_CONTEXTUAL_TASKS_MENU_MY_ACTIVITY},
       {"help", IDS_CONTEXTUAL_TASKS_MENU_HELP},
       {"sourcesMenuTabsHeader", IDS_CONTEXTUAL_TASKS_SOURCES_MENU_TABS_HEADER},
+      {"title", IDS_CONTEXTUAL_TASKS_AI_MODE_TITLE},
   };
   source->AddLocalizedStrings(kLocalizedStrings);
   source->AddLocalizedString(
diff --git a/chrome/browser/enterprise/connectors/analysis/files_request_handler.cc b/chrome/browser/enterprise/connectors/analysis/files_request_handler.cc
index e0913db..abaa02f 100644
--- a/chrome/browser/enterprise/connectors/analysis/files_request_handler.cc
+++ b/chrome/browser/enterprise/connectors/analysis/files_request_handler.cc
@@ -308,7 +308,7 @@
 
 void FilesRequestHandler::FileRequestStartCallback(
     size_t index,
-    const safe_browsing::BinaryUploadService::Request& request) {
+    const BinaryUploadRequest& request) {
   start_times_[index] = base::TimeTicks::Now();
 }
 
diff --git a/chrome/browser/enterprise/connectors/analysis/files_request_handler.h b/chrome/browser/enterprise/connectors/analysis/files_request_handler.h
index fd3c1de..cf69cae 100644
--- a/chrome/browser/enterprise/connectors/analysis/files_request_handler.h
+++ b/chrome/browser/enterprise/connectors/analysis/files_request_handler.h
@@ -147,9 +147,8 @@
       ScanRequestUploadResult result,
       enterprise_connectors::ContentAnalysisResponse response);
 
-  void FileRequestStartCallback(
-      size_t index,
-      const safe_browsing::BinaryUploadService::Request& request);
+  void FileRequestStartCallback(size_t index,
+                                const BinaryUploadRequest& request);
 
   void MaybeCompleteScanRequest();
 
diff --git a/chrome/browser/enterprise/connectors/common.cc b/chrome/browser/enterprise/connectors/common.cc
index 9881739..3439564 100644
--- a/chrome/browser/enterprise/connectors/common.cc
+++ b/chrome/browser/enterprise/connectors/common.cc
@@ -6,6 +6,7 @@
 
 #include "base/metrics/histogram_functions.h"
 #include "build/build_config.h"
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/enterprise/connectors/analysis/content_analysis_downloads_delegate.h"
 #include "chrome/browser/enterprise/connectors/connectors_service.h"
 #include "chrome/browser/enterprise/util/affiliation.h"
@@ -207,6 +208,11 @@
 
 }  // namespace
 
+policy::BrowserPolicyConnector* GetBrowserPolicyConnector() {
+  return g_browser_process ? g_browser_process->browser_policy_connector()
+                           : nullptr;
+}
+
 #if BUILDFLAG(ENTERPRISE_CONTENT_ANALYSIS)
 RequestHandlerResult CalculateRequestHandlerResult(
     const AnalysisSettings& settings,
diff --git a/chrome/browser/enterprise/connectors/common.h b/chrome/browser/enterprise/connectors/common.h
index df197060..4b22efacc 100644
--- a/chrome/browser/enterprise/connectors/common.h
+++ b/chrome/browser/enterprise/connectors/common.h
@@ -9,6 +9,7 @@
 
 #include "base/functional/callback_forward.h"
 #include "base/supports_user_data.h"
+#include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "components/enterprise/buildflags/buildflags.h"
 #include "components/enterprise/connectors/core/analysis_settings.h"
 #include "components/enterprise/connectors/core/common.h"
@@ -50,6 +51,8 @@
   content::SavePackageAllowedCallback callback;
 };
 
+policy::BrowserPolicyConnector* GetBrowserPolicyConnector();
+
 // Checks `item` for a SavePackageScanningData, and run it's callback with
 // `allowed` if there is one.
 void RunSavePackageScanningCallback(download::DownloadItem* item, bool allowed);
diff --git a/chrome/browser/feedback/system_logs/log_sources/related_website_sets_source_unittest.cc b/chrome/browser/feedback/system_logs/log_sources/related_website_sets_source_unittest.cc
index 6fff22f0..ac440b5 100644
--- a/chrome/browser/feedback/system_logs/log_sources/related_website_sets_source_unittest.cc
+++ b/chrome/browser/feedback/system_logs/log_sources/related_website_sets_source_unittest.cc
@@ -49,6 +49,9 @@
     service_->WaitForFirstInitCompleteForTesting(run_loop.QuitClosure());
     run_loop.Run();
     service_->ResetForTesting();
+
+    // Explicitly enable Related Website Sets.
+    SetRwsEnabledViaPref(true);
   }
 
   void TearDown() override {
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_browsertest.cc b/chrome/browser/first_party_sets/first_party_sets_policy_browsertest.cc
index 9c3089fd..cf26bb5 100644
--- a/chrome/browser/first_party_sets/first_party_sets_policy_browsertest.cc
+++ b/chrome/browser/first_party_sets/first_party_sets_policy_browsertest.cc
@@ -58,14 +58,6 @@
         {}, {content_settings::features::kTrackingProtection3pcd});
   }
 
-  void SetBlockThirdPartyCookies(bool value) {
-    browser()->profile()->GetPrefs()->SetInteger(
-        prefs::kCookieControlsMode,
-        static_cast<int>(
-            value ? content_settings::CookieControlsMode::kBlockThirdParty
-                  : content_settings::CookieControlsMode::kOff));
-  }
-
   void SetUpOnMainThread() override {
     PolicyTest::SetUpOnMainThread();
     // Add content/test/data for cross_site_iframe_factory.html
@@ -82,7 +74,14 @@
     prompt_factory_->set_response_type(
         permissions::PermissionRequestManager::DISMISS);
 
-    SetBlockThirdPartyCookies(true);
+    // Block third-party cookies.
+    browser()->profile()->GetPrefs()->SetInteger(
+        prefs::kCookieControlsMode,
+        static_cast<int>(
+            content_settings::CookieControlsMode::kBlockThirdParty));
+    // Explicitly enable Related Website Sets (formerly First Party Sets).
+    browser()->profile()->GetPrefs()->SetBoolean(
+        prefs::kPrivacySandboxRelatedWebsiteSetsEnabled, true);
   }
 
   void TearDownOnMainThread() override { prompt_factory_.reset(); }
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_service_factory_unittest.cc b/chrome/browser/first_party_sets/first_party_sets_policy_service_factory_unittest.cc
index 9e5b60d2..4b89a92a 100644
--- a/chrome/browser/first_party_sets/first_party_sets_policy_service_factory_unittest.cc
+++ b/chrome/browser/first_party_sets/first_party_sets_policy_service_factory_unittest.cc
@@ -69,6 +69,8 @@
        OffTheRecordProfile_DistinctAndDisabled) {
   TestingProfile* profile =
       profile_manager().CreateTestingProfile("TestProfile");
+  profile->GetPrefs()->SetBoolean(
+      prefs::kPrivacySandboxRelatedWebsiteSetsEnabled, true);
 
   FirstPartySetsPolicyService* service =
       FirstPartySetsPolicyServiceFactory::GetForBrowserContext(
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc b/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc
index f67683a..eb51cc5 100644
--- a/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc
+++ b/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc
@@ -171,6 +171,9 @@
         FirstPartySetsPolicyServiceFactory::GetForBrowserContext(profile_);
     ASSERT_NE(service_, nullptr);
 
+    profile_->GetPrefs()->SetBoolean(
+        prefs::kPrivacySandboxRelatedWebsiteSetsEnabled, true);
+
     // We can't avoid eagerly initializing the service, due to
     // indirection/caching in the factory infrastructure. So we wait for the
     // initialization to complete, and then reset the instance so that we can
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 26cad25..107d07d0 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -6173,7 +6173,7 @@
   {
     "name": "intents-on-measurements",
     "owners": [ "erahmaoui@google.com", "bling-flags@google.com" ],
-    "expiry_milestone": 132
+    "expiry_milestone": 150
   },
   {
     "name": "invalidate-search-engine-choice-on-device-restore-detection",
@@ -9020,7 +9020,7 @@
       "friedrichh@chromium.org",
       "anki-team@google.com"
     ],
-    "expiry_milestone": 145
+    "expiry_milestone": 150
   },
   {
     "name": "related-searches-all-language",
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index 2cafc35..4b21624 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -1686,6 +1686,9 @@
                             "activity_creation_timestamp_diff_threshold_ms",
                             1000);
 
+    public static final IntCachedFeatureParam sTopControlsRefactorNarrowWidthTransitionThreshold =
+            newIntCachedFeatureParam(TOP_CONTROLS_REFACTOR, "min_width_transition_threshold", 0);
+
     /** Always register to push notification service. */
     public static final BooleanCachedFeatureParam sUseChimeAndroidSdkAlwaysRegister =
             newBooleanCachedFeatureParam(USE_CHIME_ANDROID_SDK, "always_register", false);
@@ -1781,6 +1784,7 @@
                     sTabGroupListContainment,
                     sTabStorageSqlitePrototypeAuthoritativeReadSource,
                     sTabWindowManagerReportIndicesMismatchTimeDiffThresholdMs,
+                    sTopControlsRefactorNarrowWidthTransitionThreshold,
                     sTouchToSearchCalloutIph,
                     sTouchToSearchCalloutSnippetAsSubtitle,
                     sUseChimeAndroidSdkAlwaysRegister,
diff --git a/chrome/browser/media/webrtc/desktop_capture_access_handler.cc b/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
index 088b364..da90d66 100644
--- a/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
+++ b/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
@@ -247,13 +247,22 @@
       pending_request->is_allowlisted_extension ||
       IsBuiltInFeedbackUI(pending_request->request.security_origin);
 
+  if (!screen_capture_enabled) {
+    std::move(pending_request->callback)
+        .Run(blink::mojom::StreamDevicesSet(),
+             MediaStreamRequestResult::CAPTURE_NOT_ENABLED, /*ui=*/nullptr);
+    return;
+  }
+
   const bool origin_is_secure =
       network::IsUrlPotentiallyTrustworthy(
           pending_request->request.security_origin) ||
       base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kAllowHttpScreenCapture);
 
-  if (!screen_capture_enabled || !origin_is_secure) {
+  if (!origin_is_secure) {
+    // TODO(crbug.com/453600255): Use result INVALID_SECURITY_ORIGIN instead of
+    // INVALID_STATE once all new enum values are added.
     std::move(pending_request->callback)
         .Run(blink::mojom::StreamDevicesSet(),
              MediaStreamRequestResult::INVALID_STATE,
diff --git a/chrome/browser/media/webrtc/display_media_access_handler.cc b/chrome/browser/media/webrtc/display_media_access_handler.cc
index 4adc0ed..70af5b9 100644
--- a/chrome/browser/media/webrtc/display_media_access_handler.cc
+++ b/chrome/browser/media/webrtc/display_media_access_handler.cc
@@ -221,7 +221,7 @@
           web_contents);
   if (observer) {
     std::move(callback).Run(blink::mojom::StreamDevicesSet(),
-                            MediaStreamRequestResult::PERMISSION_DENIED,
+                            MediaStreamRequestResult::SAFE_BROWSING_OBSERVER,
                             /*ui=*/nullptr);
     observer->OnDesktopCaptureRequest();
     return;
@@ -243,9 +243,10 @@
       !web_contents->HasPictureInPictureDocument() &&
       request.request_type != blink::MEDIA_DEVICE_UPDATE) {
     LOG(ERROR) << "Do not allow getDisplayMedia() on a backgrounded page.";
-    std::move(callback).Run(blink::mojom::StreamDevicesSet(),
-                            MediaStreamRequestResult::INVALID_STATE,
-                            /*ui=*/nullptr);
+    std::move(callback).Run(
+        blink::mojom::StreamDevicesSet(),
+        MediaStreamRequestResult::CAPTURE_FROM_BACKGROUND_PAGE_ON_MAC,
+        /*ui=*/nullptr);
     return;
   }
 #endif  // BUILDFLAG(IS_MAC)
@@ -500,7 +501,9 @@
   // it is unlikely that valid domains are excluded by this check.
   if (base::FeatureList::IsEnabled(kDisplayMediaRejectLongDomains) &&
       GetApplicationTitle(web_contents).size() > 255u) {
-    RejectRequest(web_contents, MediaStreamRequestResult::INVALID_STATE);
+    RejectRequest(
+        web_contents,
+        MediaStreamRequestResult::CAPTURE_NOT_ALLOWED_FOR_LONG_DOMAINS);
     return;
   }
 
diff --git a/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc b/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc
index 65c5e144..f1f5828 100644
--- a/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc
+++ b/chrome/browser/media/webrtc/display_media_access_handler_unittest.cc
@@ -378,7 +378,9 @@
   ProcessRequest(content::DesktopMediaID(content::DesktopMediaID::TYPE_WINDOW,
                                          content::DesktopMediaID::kFakeId),
                  &result, devices, false /* request_audio */);
-  EXPECT_EQ(blink::mojom::MediaStreamRequestResult::INVALID_STATE, result);
+  EXPECT_EQ(blink::mojom::MediaStreamRequestResult::
+                CAPTURE_NOT_ALLOWED_FOR_LONG_DOMAINS,
+            result);
 }
 
 class DisplayMediaAccessHandlerActiveRfhTest
diff --git a/chrome/browser/optimization_guide/BUILD.gn b/chrome/browser/optimization_guide/BUILD.gn
index 479cfdc..fd9b33a 100644
--- a/chrome/browser/optimization_guide/BUILD.gn
+++ b/chrome/browser/optimization_guide/BUILD.gn
@@ -88,6 +88,7 @@
     deps += [
       "//chrome/browser/ui/tabs:tab_strip",
       "//components/legion",
+      "//components/legion:proto",
     ]
   }
 }
@@ -193,8 +194,11 @@
   ]
   if (!is_android) {
     sources += [
+      "legion_model_execution_fetcher_unittest.cc",
+
       # Android uses a different way of showing browser windows.
       "optimization_guide_tab_url_provider_unittest.cc",
     ]
+    deps += [ "//components/legion" ]
   }
 }
diff --git a/chrome/browser/optimization_guide/legion_model_execution_fetcher.cc b/chrome/browser/optimization_guide/legion_model_execution_fetcher.cc
index a67c3e7..01bf95cd 100644
--- a/chrome/browser/optimization_guide/legion_model_execution_fetcher.cc
+++ b/chrome/browser/optimization_guide/legion_model_execution_fetcher.cc
@@ -6,11 +6,81 @@
 
 #include <utility>
 
+#include "base/strings/string_split.h"
 #include "components/legion/client.h"
+#include "components/legion/error_code.h"
+#include "components/legion/proto/legion.pb.h"
+#include "components/optimization_guide/core/model_execution/feature_keys.h"
 #include "components/optimization_guide/core/model_execution/model_execution_fetcher.h"
+#include "components/optimization_guide/core/model_execution/optimization_guide_model_execution_error.h"
+#include "components/optimization_guide/core/optimization_guide_proto_util.h"
+#include "components/optimization_guide/proto/common_types.pb.h"
+#include "components/optimization_guide/proto/features/zero_state_suggestions.pb.h"
 #include "components/optimization_guide/proto/model_execution.pb.h"
 
 namespace optimization_guide {
+namespace {
+legion::proto::FeatureName ToLegionFeatureName(
+    ModelBasedCapabilityKey feature) {
+  switch (feature) {
+    case ModelBasedCapabilityKey::kZeroStateSuggestions:
+      return legion::proto::FeatureName::
+          FEATURE_NAME_CHROME_ZERO_STATE_SUGGESTION;
+    default:
+      NOTREACHED() << feature;
+  }
+}
+
+OptimizationGuideModelExecutionError ToModelExecutionError(
+    legion::ErrorCode error) {
+  // TODO(crbug.com/460052805): Figure out how to store legion errors.
+  return OptimizationGuideModelExecutionError::FromModelExecutionError(
+      OptimizationGuideModelExecutionError::ModelExecutionError::kUnknown);
+}
+
+constexpr char prompt[] =
+    "Please provide 3 short suggestions for what you could ask Gemini\n"
+    "about the content of the following list of websites.\n"
+    "Please provide each suggestion on a separate line and no other\n"
+    "content in your response. No more than 30 characters per\n"
+    "suggestion.\n"
+    "Websites:\n";
+
+std::string ToLegionRequest(
+    ModelBasedCapabilityKey feature,
+    const google::protobuf::MessageLite& request_metadata) {
+  CHECK_EQ(feature, ModelBasedCapabilityKey::kZeroStateSuggestions);
+  // TODO(crbug.com/460052805): Send proto directly.
+  std::stringstream request;
+  request << prompt;
+  auto* zss_request = static_cast<
+      const optimization_guide::proto::ZeroStateSuggestionsRequest*>(
+      &request_metadata);
+  if (zss_request->has_page_context()) {
+    request << zss_request->page_context().url() << " - "
+            << zss_request->page_context().title() << '\n';
+  }
+  if (zss_request->has_page_context_list()) {
+    auto& contexts = zss_request->page_context_list().page_contexts();
+    for (auto& context : contexts) {
+      request << context.page_context().url() << " - "
+              << context.page_context().title() << '\n';
+    }
+  }
+  return request.str();
+}
+
+proto::ZeroStateSuggestionsResponse ToZSSResponse(const std::string& result) {
+  proto::ZeroStateSuggestionsResponse zss;
+  for (auto line : base::SplitStringPiece(
+           result, "\n", base::WhitespaceHandling::TRIM_WHITESPACE,
+           base::SplitResult::SPLIT_WANT_NONEMPTY)) {
+    zss.add_suggestions()->set_label(line);
+  }
+  return zss;
+}
+
+}  // namespace
 
 LegionModelExecutionFetcher::LegionModelExecutionFetcher(
     legion::Client* legion_client)
@@ -26,8 +96,33 @@
     const google::protobuf::MessageLite& request_metadata,
     std::optional<base::TimeDelta> timeout,
     ModelExecuteResponseCallback callback) {
-  // TODO(crbug.com/460052805): Actually use legion client.
-  std::move(callback).Run(base::ok(proto::ExecuteResponse{}));
+  auto legion_feature_name = ToLegionFeatureName(feature);
+  auto request = ToLegionRequest(feature, request_metadata);
+
+  legion_client_->SendTextRequest(
+      legion_feature_name, request,
+      base::BindOnce(
+          [](ModelBasedCapabilityKey feature,
+             ModelExecuteResponseCallback callback,
+             base::expected<std::string, legion::ErrorCode> result) {
+            if (!result.has_value()) {
+              std::move(callback).Run(
+                  base::unexpected(ToModelExecutionError(result.error())));
+              return;
+            }
+            proto::ExecuteResponse response;
+            auto* metadata = response.mutable_response_metadata();
+            switch (feature) {
+              case ModelBasedCapabilityKey::kZeroStateSuggestions: {
+                *metadata = AnyWrapProto(ToZSSResponse(result.value()));
+                break;
+              }
+              default:
+                NOTREACHED() << feature;
+            }
+            std::move(callback).Run(base::ok(response));
+          },
+          feature, std::move(callback)));
 }
 
 }  // namespace optimization_guide
diff --git a/chrome/browser/optimization_guide/legion_model_execution_fetcher_unittest.cc b/chrome/browser/optimization_guide/legion_model_execution_fetcher_unittest.cc
new file mode 100644
index 0000000..046de5c7
--- /dev/null
+++ b/chrome/browser/optimization_guide/legion_model_execution_fetcher_unittest.cc
@@ -0,0 +1,159 @@
+// 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 "chrome/browser/optimization_guide/legion_model_execution_fetcher.h"
+
+#include "base/test/task_environment.h"
+#include "base/test/test_future.h"
+#include "components/legion/client.h"
+#include "components/optimization_guide/core/model_execution/optimization_guide_model_execution_error.h"
+#include "components/optimization_guide/core/optimization_guide_proto_util.h"
+#include "components/optimization_guide/core/optimization_guide_util.h"
+#include "components/optimization_guide/proto/features/zero_state_suggestions.pb.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace optimization_guide {
+
+class MockLegionClient : public legion::Client {
+ public:
+  MOCK_METHOD(void,
+              EstablishSession,
+              (legion::Client::OnEstablishSessionCompletedCallback),
+              (override));
+  MOCK_METHOD(void,
+              SendTextRequest,
+              (legion::proto::FeatureName,
+               const std::string&,
+               legion::Client::OnTextRequestCompletedCallback),
+              (override));
+  MOCK_METHOD(void,
+              SendTextRequest,
+              (legion::proto::FeatureName,
+               const std::string&,
+               legion::Client::OnTextRequestCompletedCallback,
+               base::TimeDelta),
+              (override));
+  MOCK_METHOD(void,
+              SendGenerateContentRequest,
+              (legion::proto::FeatureName,
+               const legion::proto::GenerateContentRequest&,
+               legion::Client::OnGenerateContentRequestCompletedCallback),
+              (override));
+  MOCK_METHOD(void,
+              SendGenerateContentRequest,
+              (legion::proto::FeatureName,
+               const legion::proto::GenerateContentRequest&,
+               legion::Client::OnGenerateContentRequestCompletedCallback,
+               base::TimeDelta),
+              (override));
+};
+
+class LegionModelExecutionFetcherTest : public testing::Test {
+ public:
+  void SetUp() override {
+    fetcher_ =
+        std::make_unique<LegionModelExecutionFetcher>(&mock_legion_client_);
+  }
+
+ protected:
+  base::test::TaskEnvironment task_environment_;
+  MockLegionClient mock_legion_client_;
+  std::unique_ptr<LegionModelExecutionFetcher> fetcher_;
+};
+
+TEST_F(LegionModelExecutionFetcherTest, ConvertsZeroStateSuggestionsRequest) {
+  proto::ZeroStateSuggestionsRequest request;
+  request.mutable_page_context()->set_url("url");
+  request.mutable_page_context()->set_title("Hello");
+
+  const std::string expected_prompt =
+      "Please provide 3 short suggestions for what you could ask Gemini\n"
+      "about the content of the following list of websites.\n"
+      "Please provide each suggestion on a separate line and no other\n"
+      "content in your response. No more than 30 characters per\n"
+      "suggestion.\n"
+      "Websites:\n"
+      "url - Hello\n";
+
+  EXPECT_CALL(
+      mock_legion_client_,
+      SendTextRequest(
+          testing::Eq(legion::proto::FEATURE_NAME_CHROME_ZERO_STATE_SUGGESTION),
+          testing::Eq(expected_prompt), testing::_))
+      .WillOnce([](legion::proto::FeatureName feature_name,
+                   const std::string& request,
+                   legion::Client::OnTextRequestCompletedCallback callback) {});
+
+  fetcher_->ExecuteModel(ModelBasedCapabilityKey::kZeroStateSuggestions,
+                         /*identity_manager=*/nullptr, request,
+                         /*timeout=*/std::nullopt, base::DoNothing());
+}
+TEST_F(LegionModelExecutionFetcherTest,
+       ConvertsZeroStateSuggestionsRequestWithLists) {
+  proto::ZeroStateSuggestionsRequest request;
+  auto* list = request.mutable_page_context_list();
+  auto* context1 = list->add_page_contexts()->mutable_page_context();
+  context1->set_url("url1");
+  context1->set_title("Привіт");
+  auto* context2 = list->add_page_contexts()->mutable_page_context();
+  context2->set_url("url2");
+  context2->set_title("你好");
+
+  const std::string expected_prompt =
+      "Please provide 3 short suggestions for what you could ask Gemini\n"
+      "about the content of the following list of websites.\n"
+      "Please provide each suggestion on a separate line and no other\n"
+      "content in your response. No more than 30 characters per\n"
+      "suggestion.\n"
+      "Websites:\n"
+      "url1 - Привіт\n"
+      "url2 - 你好\n";
+
+  EXPECT_CALL(
+      mock_legion_client_,
+      SendTextRequest(
+          testing::Eq(legion::proto::FEATURE_NAME_CHROME_ZERO_STATE_SUGGESTION),
+          testing::Eq(expected_prompt), testing::_))
+      .WillOnce([](legion::proto::FeatureName feature_name,
+                   const std::string& request,
+                   legion::Client::OnTextRequestCompletedCallback callback) {});
+
+  fetcher_->ExecuteModel(ModelBasedCapabilityKey::kZeroStateSuggestions,
+                         /*identity_manager=*/nullptr, request,
+                         /*timeout=*/std::nullopt, base::DoNothing());
+}
+
+TEST_F(LegionModelExecutionFetcherTest, ConvertsZeroStateSuggestionsResponse) {
+  const std::string legion_response = "Hello\nПривіт\n你好";
+
+  EXPECT_CALL(
+      mock_legion_client_,
+      SendTextRequest(
+          testing::Eq(legion::proto::FEATURE_NAME_CHROME_ZERO_STATE_SUGGESTION),
+          testing::_, testing::_))
+      .WillOnce([&](legion::proto::FeatureName feature_name,
+                    const std::string& request,
+                    legion::Client::OnTextRequestCompletedCallback callback) {
+        std::move(callback).Run(base::ok(legion_response));
+      });
+
+  base::test::TestFuture<base::expected<const proto::ExecuteResponse,
+                                        OptimizationGuideModelExecutionError>>
+      future;
+  fetcher_->ExecuteModel(ModelBasedCapabilityKey::kZeroStateSuggestions,
+                         /*identity_manager=*/nullptr,
+                         proto::ZeroStateSuggestionsRequest(),
+                         /*timeout=*/std::nullopt, future.GetCallback());
+
+  auto result = future.Get();
+  EXPECT_TRUE(result.has_value());
+  auto zss_response = optimization_guide::ParsedAnyMetadata<
+      proto::ZeroStateSuggestionsResponse>(result.value().response_metadata());
+  EXPECT_EQ(zss_response->suggestions(0).label(), "Hello");
+  EXPECT_EQ(zss_response->suggestions(1).label(), "Привіт");
+  EXPECT_EQ(zss_response->suggestions(2).label(), "你好");
+}
+
+}  // namespace optimization_guide
diff --git a/chrome/browser/page_load_metrics/observers/ash_session_restore_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/ash_session_restore_page_load_metrics_observer_browsertest.cc
index d1f9312..f1f91b56 100644
--- a/chrome/browser/page_load_metrics/observers/ash_session_restore_page_load_metrics_observer_browsertest.cc
+++ b/chrome/browser/page_load_metrics/observers/ash_session_restore_page_load_metrics_observer_browsertest.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/ui/browser_list_observer.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/browser_window/public/browser_window_interface_iterator.h"
+#include "chrome/browser/ui/browser_window/public/global_browser_collection.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
 #include "chrome/test/base/in_process_browser_test.h"
@@ -161,7 +162,7 @@
   // input delay is not recorded since the browser window is not from a session
   // restore.
   void RunFirstInputDelaySetupTest() {
-    ASSERT_TRUE(BrowserList::GetInstance()->empty());
+    ASSERT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
     CreateBrowser(ProfileManager::GetActiveUserProfile());
 
diff --git a/chrome/browser/regional_capabilities/regional_capabilities_service_client_chromeos.cc b/chrome/browser/regional_capabilities/regional_capabilities_service_client_chromeos.cc
index f188b14..c640238 100644
--- a/chrome/browser/regional_capabilities/regional_capabilities_service_client_chromeos.cc
+++ b/chrome/browser/regional_capabilities/regional_capabilities_service_client_chromeos.cc
@@ -49,7 +49,6 @@
   }
   if (vpd_region == "GCC" || vpd_region == "LATAM-ES-419" ||
       vpd_region == "NORDIC") {
-    // TODO: crbug.com/377475851 - Implement a lookup for the groupings.
     base::UmaHistogramEnumeration(kCrOSMissingVariationData, kGroupedRegion);
     return {};
   }
diff --git a/chrome/browser/resources/contextual_tasks/app.ts b/chrome/browser/resources/contextual_tasks/app.ts
index 1c82a4ff..5664a72 100644
--- a/chrome/browser/resources/contextual_tasks/app.ts
+++ b/chrome/browser/resources/contextual_tasks/app.ts
@@ -93,6 +93,7 @@
         this.browserProxy_.callbackRouter.setThreadTitle.addListener(
             (title: string) => {
               this.threadTitle_ = title;
+              document.title = title || loadTimeData.getString('title');
             }),
         this.browserProxy_.callbackRouter.postMessageToWebview.addListener(
             this.postMessageToWebview.bind(this)),
diff --git a/chrome/browser/resources/contextual_tasks/contextual_tasks.html b/chrome/browser/resources/contextual_tasks/contextual_tasks.html
index 7bd430c3..1d82056 100644
--- a/chrome/browser/resources/contextual_tasks/contextual_tasks.html
+++ b/chrome/browser/resources/contextual_tasks/contextual_tasks.html
@@ -2,7 +2,7 @@
 <html>
   <head>
     <meta charset="utf-8">
-    <title>Contextual Tasks</title>
+    <title>$i18n{title}</title>
     <link rel="stylesheet" href="//resources/css/text_defaults_md.css">
     <link rel="stylesheet" href="//theme/colors.css?sets=chrome">
     <style>
diff --git a/chrome/browser/resources/settings/privacy_page/security/security_page_feature_row.html b/chrome/browser/resources/settings/privacy_page/security/security_page_feature_row.html
index 02d3493..ded7230 100644
--- a/chrome/browser/resources/settings/privacy_page/security/security_page_feature_row.html
+++ b/chrome/browser/resources/settings/privacy_page/security/security_page_feature_row.html
@@ -27,7 +27,8 @@
     </template>
     <template is="dom-if" if="[[expanded]]">
       <settings-toggle-button id="toggleButton" pref="{{pref}}"
-          numeric-unchecked-values="[[numericUncheckedValues]]">
+          numeric-unchecked-values="[[numericUncheckedValues]]"
+          numeric-checked-value="[[numericCheckedValue]]">
       </settings-toggle-button>
     </template>
   </div>
diff --git a/chrome/browser/resources/settings/privacy_page/security/security_page_feature_row.ts b/chrome/browser/resources/settings/privacy_page/security/security_page_feature_row.ts
index c93c0bed..b811406f 100644
--- a/chrome/browser/resources/settings/privacy_page/security/security_page_feature_row.ts
+++ b/chrome/browser/resources/settings/privacy_page/security/security_page_feature_row.ts
@@ -50,6 +50,8 @@
 
       numericUncheckedValues: Array,
 
+      numericCheckedValue: Number,
+
       stateTextMap: Object,
 
       /* The computed string label for the current pref state. */
@@ -65,6 +67,7 @@
   declare pref: chrome.settingsPrivate.PrefObject;
   declare subLabel: string;
   declare numericUncheckedValues: number[];
+  declare numericCheckedValue: number;
   declare stateTextMap: Record<string, string>;
   declare private currentStateLabel_: string;
 
diff --git a/chrome/browser/resources/settings/privacy_page/security/security_page_v2.html b/chrome/browser/resources/settings/privacy_page/security/security_page_v2.html
index 6144cd9..1deb33d 100644
--- a/chrome/browser/resources/settings/privacy_page/security/security_page_v2.html
+++ b/chrome/browser/resources/settings/privacy_page/security/security_page_v2.html
@@ -193,6 +193,38 @@
   </security-page-feature-row>
   </settings-section>
   <settings-section page-title="$i18n{securityAccountAndNetworkSectionTitle}">
+    <div id="httpsFirstModeSection">
+      <settings-toggle-button id="httpsFirstModeToggle" class="cr-row first"
+          pref="{{prefs.generated.https_first_mode_enabled}}"
+          label="$i18n{securityHttpsFirstModeToggleLabel}"
+          sub-label="$i18n{securityHttpsFirstModeToggleSublabel}"
+          numeric-unchecked-values="[[httpsFirstModeUncheckedValues_]]"
+          numeric-checked-value=
+              "[[httpsFirstModeSettingEnum_.ENABLED_BALANCED]]">
+      </settings-toggle-button>
+      <settings-radio-group id="httpsFirstModeRadioGroup"
+          pref="{{prefs.generated.https_first_mode_enabled}}"
+          selectable-elements="controlled-radio-button">
+        <controlled-radio-button id="httpsFirstModeEnabledBalanced"
+            name="[[httpsFirstModeSettingEnum_.ENABLED_BALANCED]]"
+            pref="[[prefs.generated.https_first_mode_enabled]]"
+            label="$i18n{securityHttpsFirstModeBalancedLabel}"
+            disabled="[[!isHttpsFirstModeEnabled_]]">
+          <div class="cr-secondary-text">
+            $i18n{securityHttpsFirstModeBalancedSublabel}
+          </div>
+        </controlled-radio-button>
+        <controlled-radio-button id="httpsFirstModeEnabledStrict"
+            name="[[httpsFirstModeSettingEnum_.ENABLED_FULL]]"
+            pref="[[prefs.generated.https_first_mode_enabled]]"
+            label="$i18n{securityHttpsFirstModeStrictLabel}"
+            disabled="[[!isHttpsFirstModeEnabled_]]">
+          <div class="cr-secondary-text">
+            $i18n{securityHttpsFirstModeStrictSublabel}
+          </div>
+        </controlled-radio-button>
+      </settings-radio-group>
+    </div>
     <settings-toggle-button id="passwordsLeakToggle"
         pref="{{prefs.generated.password_leak_detection}}"
         label="$i18n{securityPasswordsLeakDetectionTitle}"
diff --git a/chrome/browser/resources/settings/privacy_page/security/security_page_v2.ts b/chrome/browser/resources/settings/privacy_page/security/security_page_v2.ts
index 8bcd63d..32827505 100644
--- a/chrome/browser/resources/settings/privacy_page/security/security_page_v2.ts
+++ b/chrome/browser/resources/settings/privacy_page/security/security_page_v2.ts
@@ -5,6 +5,7 @@
 import 'chrome://resources/cr_elements/cr_icon/cr_icon.js';
 import 'chrome://resources/cr_elements/cr_link_row/cr_link_row.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
+import 'chrome://resources/cr_elements/cr_collapse/cr_collapse.js';
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 import '/shared/settings/prefs/prefs.js';
 import '../../controls/controlled_radio_button.js';
@@ -48,9 +49,23 @@
 }
 // LINT.ThenChange(/components/safe_browsing/core/common/safe_browsing_prefs.h:SecuritySettingsBundleSetting)
 
+/** Enumeration of all HTTPS-First Mode setting states.*/
+// LINT.IfChange(HttpsFirstModeSetting)
+export enum HttpsFirstModeSetting {
+  DISABLED = 0,
+  // DEPRECATED: A separate Incognito setting never shipped.
+  // ENABLED_INCOGNITO = 1,
+  ENABLED_FULL = 2,
+  ENABLED_BALANCED = 3,
+}
+// LINT.ThenChange(/chrome/browser/ssl/https_first_mode_settings_tracker.h)
+
 export interface SettingsSecurityPageV2Element {
   $: {
     bundlesRadioGroup: SettingsRadioGroupElement,
+    httpsFirstModeEnabledBalanced: ControlledRadioButtonElement,
+    httpsFirstModeEnabledStrict: ControlledRadioButtonElement,
+    httpsFirstModeToggle: SettingsToggleButtonElement,
     passwordsLeakToggle: SettingsToggleButtonElement,
     resetEnhancedBundleToDefaultsButton: CrButtonElement,
     resetStandardBundleToDefaultsButton: CrButtonElement,
@@ -86,6 +101,11 @@
         value: SafeBrowsingSetting,
       },
 
+      httpsFirstModeSettingEnum_: {
+        type: Object,
+        value: HttpsFirstModeSetting,
+      },
+
       isResetStandardBundleToDefaultsButtonVisible_: {
         type: Boolean,
         value: false,
@@ -102,11 +122,21 @@
         value: false,
       },
 
+      isHttpsFirstModeEnabled_: {
+        type: Boolean,
+        value: true,
+      },
+
       safeBrowsingOff_: {
         type: Array,
         value: () => [SafeBrowsingSetting.DISABLED],
       },
 
+      httpsFirstModeUncheckedValues_: {
+        type: Array,
+        value: () => [HttpsFirstModeSetting.DISABLED],
+      },
+
       safeBrowsingStateTextMap_: {
         type: Object,
         value: () => ({
@@ -135,13 +165,17 @@
           'isResettingToDefaults_,' +
           'prefs.generated.security_settings_bundle.value,' +
           'prefs.generated.safe_browsing.*),',
+      'updateHttpsFirstModeState_(' +
+          'prefs.generated.https_first_mode_enabled.value),',
     ];
   }
 
   declare private isResettingToDefaults_: boolean;
   declare private isResetStandardBundleToDefaultsButtonVisible_: boolean;
   declare private isResetEnhancedBundleToDefaultsButtonVisible_: boolean;
+  declare private isHttpsFirstModeEnabled_: boolean;
   declare private safeBrowsingOff_: SafeBrowsingSetting[];
+  declare private httpsFirstModeUncheckedValues_: HttpsFirstModeSetting[];
   declare private safeBrowsingStateTextMap_: Object;
   declare private enableSecurityKeysSubpage_: boolean;
 
@@ -354,6 +388,12 @@
   private onSecurityKeysClick_() {
     Router.getInstance().navigateTo(routes.SECURITY_KEYS);
   }
+
+  private updateHttpsFirstModeState_() {
+    this.isHttpsFirstModeEnabled_ =
+        this.getPref('generated.https_first_mode_enabled').value !==
+        HttpsFirstModeSetting.DISABLED;
+  }
 }
 
 declare global {
diff --git a/chrome/browser/resources/updater/BUILD.gn b/chrome/browser/resources/updater/BUILD.gn
index b92ca2c..1ef08fb 100644
--- a/chrome/browser/resources/updater/BUILD.gn
+++ b/chrome/browser/resources/updater/BUILD.gn
@@ -15,14 +15,20 @@
     "app.html.ts",
     "app.ts",
     "event_history.ts",
+    "event_list/raw_event_details.html.ts",
+    "event_list/raw_event_details.ts",
   ]
-  css_files = [ "app.css" ]
+  css_files = [
+    "app.css",
+    "event_list/raw_event_details.css",
+  ]
 
   webui_context_type = "trusted"
 
   ts_deps = [
     "//third_party/lit/v3_0:build_ts",
     "//ui/webui/resources/cr_elements:build_ts",
+    "//ui/webui/resources/js:build_ts",
   ]
   ts_composite = true
 }
diff --git a/chrome/browser/resources/updater/event_list/raw_event_details.css b/chrome/browser/resources/updater/event_list/raw_event_details.css
new file mode 100644
index 0000000..d931045
--- /dev/null
+++ b/chrome/browser/resources/updater/event_list/raw_event_details.css
@@ -0,0 +1,24 @@
+/* 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. */
+
+/* #css_wrapper_metadata_start
+ * #type=style-lit
+ * #scheme=relative
+ * #import=chrome://resources/cr_elements/cr_shared_vars.css.js
+ * #css_wrapper_metadata_end */
+
+cr-expand-button {
+  min-width: 100px;
+  padding: 0 12px;
+  width: 45%;
+}
+
+pre {
+  white-space: pre-wrap;
+  overflow-wrap: break-word;
+  background-color: var(--google-grey-100);
+  padding: 4px;
+  margin-top: 4px;
+  border-radius: 5px;
+}
\ No newline at end of file
diff --git a/chrome/browser/resources/updater/event_list/raw_event_details.html.ts b/chrome/browser/resources/updater/event_list/raw_event_details.html.ts
new file mode 100644
index 0000000..e6d4540
--- /dev/null
+++ b/chrome/browser/resources/updater/event_list/raw_event_details.html.ts
@@ -0,0 +1,28 @@
+// 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 '/strings.m.js';
+
+import {html, nothing} from '//resources/lit/v3_0/lit.rollup.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
+
+import type {RawEventDetailsElement} from './raw_event_details.js';
+
+export function getHtml(this: RawEventDetailsElement) {
+  if (this.events.length === 0) {
+    return nothing;
+  }
+  const renderedEvents = this.events.map(
+      (event) => html`<pre>${JSON.stringify(event, null, 2)}</pre>`);
+  return html`
+    <cr-expand-button
+        ?expanded="${this.expanded}"
+        @expanded-changed="${this.onExpandedChanged}"
+        expand-title="${loadTimeData.getString('viewRawDetails')}">
+      ${loadTimeData.getString('viewRawDetails')}
+    </cr-expand-button>
+    <cr-collapse ?opened="${this.expanded}">
+      ${renderedEvents}
+    </cr-collapse>`;
+}
diff --git a/chrome/browser/resources/updater/event_list/raw_event_details.ts b/chrome/browser/resources/updater/event_list/raw_event_details.ts
new file mode 100644
index 0000000..e3ccf21
--- /dev/null
+++ b/chrome/browser/resources/updater/event_list/raw_event_details.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 '//resources/cr_elements/cr_collapse/cr_collapse.js';
+import '//resources/cr_elements/cr_expand_button/cr_expand_button.js';
+
+import {CrLitElement} from '//resources/lit/v3_0/lit.rollup.js';
+
+import {getCss} from './raw_event_details.css.js';
+import {getHtml} from './raw_event_details.html.js';
+
+export class RawEventDetailsElement extends CrLitElement {
+  static get is() {
+    return 'raw-event-details';
+  }
+
+  static override get styles() {
+    return getCss();
+  }
+
+  override render() {
+    return getHtml.bind(this)();
+  }
+
+  static override get properties() {
+    return {
+      events: {type: Array},
+      expanded: {type: Boolean},
+    };
+  }
+
+  accessor events: Array<Record<string, unknown>> = [];
+  protected accessor expanded: boolean = false;
+
+  protected onExpandedChanged(e: CustomEvent<{value: boolean}>) {
+    this.expanded = e.detail.value;
+  }
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'raw-event-details': RawEventDetailsElement;
+  }
+}
+
+customElements.define(RawEventDetailsElement.is, RawEventDetailsElement);
diff --git a/chrome/browser/resources/webui_browser/app.css b/chrome/browser/resources/webui_browser/app.css
index d4914994..371229b 100644
--- a/chrome/browser/resources/webui_browser/app.css
+++ b/chrome/browser/resources/webui_browser/app.css
@@ -19,6 +19,7 @@
   color: var(--color-toolbar-text);
   position: relative; /* Needed for absolute positioning of controls */
   overflow: hidden;
+  user-select: none;
 }
 
 /* Hide browser frame in tab fullscreen mode */
@@ -45,7 +46,7 @@
   --iron-icon-stroke-color: var(--color-tab-foreground-active-frame-active);
   --iron-icon-fill-color: transparent;
   stroke-width: 3px;
-  height: 43px;
+  height: 41px;
   min-width: 30px;
   padding: 0;
   shape-rendering: crispEdges;
@@ -70,7 +71,8 @@
 }
 
 cr-searchbox {
-  --cr-searchbox-height: 35px;
+  --cr-searchbox-font-size: 14px;
+  --cr-searchbox-height: 32px;
   --cr-searchbox-shadow: 0 0 0px 1px #20212451;
   --cr-searchbox-icon-left-position: 12px;
   --cr-searchbox-icon-size-in-searchbox: 20px;
@@ -78,6 +80,7 @@
   --cr-searchbox-match-padding: 4px 0;
 
   margin: 0 10px;
+  flex: 1;
 }
 
 cr-searchbox[dropdown-is-visible] {
@@ -119,6 +122,8 @@
 #addressBox {
   position: relative;
   flex: 1;
+  display: flex;
+  align-items: center;
 }
 
 #locationIconButton {
diff --git a/chrome/browser/resources/webui_browser/tab_element.css b/chrome/browser/resources/webui_browser/tab_element.css
index 6cc5e0f..c5945d5 100644
--- a/chrome/browser/resources/webui_browser/tab_element.css
+++ b/chrome/browser/resources/webui_browser/tab_element.css
@@ -20,7 +20,7 @@
     color: var(--color-tab-foreground-inactive-frame-active);
     background-color: var(--color-tab-background-inactive-frame-active);
     border-radius: 12px 12px 0 0;
-    height: 36px;
+    height: 34px;
     padding: 0 10px;
     display: flex;
     align-items: center;
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc
index 17cc9d7a..c2f734c 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc
@@ -5,443 +5,46 @@
 #include "chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h"
 
 #include <algorithm>
-#include <variant>
 
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/rand_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "chrome/browser/browser_process.h"
+#include "base/functional/bind.h"
+#include "chrome/browser/enterprise/connectors/common.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service_factory.h"
 #include "components/enterprise/buildflags/buildflags.h"
-#include "components/enterprise/common/strings.h"
 #include "components/enterprise/connectors/core/analysis_settings.h"
-#include "components/safe_browsing/core/common/safebrowsing_switches.h"
-#include "net/base/url_util.h"
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 #include "chrome/browser/enterprise/connectors/analysis/local_binary_upload_service_factory.h"
 #endif
 
 namespace safe_browsing {
+
 namespace {
 
-std::optional<GURL> GetUrlOverride() {
-  // Ignore this flag on Stable and Beta to avoid abuse.
-  if (!g_browser_process || !g_browser_process->browser_policy_connector()
-                                 ->IsCommandLineSwitchSupported()) {
-    return std::nullopt;
-  }
-
-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  if (command_line->HasSwitch(switches::kCloudBinaryUploadServiceUrlFlag)) {
-    GURL url = GURL(command_line->GetSwitchValueASCII(
-        switches::kCloudBinaryUploadServiceUrlFlag));
-    if (url.is_valid()) {
-      return url;
-    } else {
-      LOG(ERROR) << "--binary-upload-service-url is set to an invalid URL";
-    }
-  }
-
-  return std::nullopt;
-}
+using ::enterprise_connectors::BinaryUploadRequest;
+using ::enterprise_connectors::GetBrowserPolicyConnector;
 
 }  // namespace
 
-BinaryUploadService::Request::Data::Data() = default;
-
-BinaryUploadService::Request::Data::Data(const Data& other) {
-  operator=(other);
-}
-
-BinaryUploadService::Request::Data::Data(Data&&) = default;
-
-BinaryUploadService::Request::Data&
-BinaryUploadService::Request::Data::operator=(
-    const BinaryUploadService::Request::Data& other) {
-  contents = other.contents;
-  path = other.path;
-  hash = other.hash;
-  size = other.size;
-  mime_type = other.mime_type;
-  page = other.page.Duplicate();
-  is_obfuscated = other.is_obfuscated;
-  return *this;
-}
-
-BinaryUploadService::Request::Data&
-BinaryUploadService::Request::Data::operator=(
-    BinaryUploadService::Request::Data&& other) = default;
-BinaryUploadService::Request::Data::~Data() = default;
-
 BinaryUploadService::Request::Request(
     ContentAnalysisCallback callback,
     enterprise_connectors::CloudOrLocalAnalysisSettings settings)
-    : content_analysis_callback_(std::move(callback)),
-      cloud_or_local_settings_(std::move(settings)) {}
+    : BinaryUploadRequest(std::move(callback),
+                          std::move(settings),
+                          base::BindRepeating(&GetBrowserPolicyConnector)) {}
 
 BinaryUploadService::Request::Request(
     ContentAnalysisCallback content_analysis_callback,
     enterprise_connectors::CloudOrLocalAnalysisSettings settings,
     Request::RequestStartCallback start_callback)
-    : content_analysis_callback_(std::move(content_analysis_callback)),
-      request_start_callback_(std::move(start_callback)),
-      cloud_or_local_settings_(std::move(settings)) {}
+    : BinaryUploadRequest(std::move(content_analysis_callback),
+                          std::move(settings),
+                          std::move(start_callback),
+                          base::BindRepeating(&GetBrowserPolicyConnector)) {}
 
 BinaryUploadService::Request::~Request() = default;
 
-void BinaryUploadService::Request::set_id(Id id) {
-  id_ = id;
-}
-
-BinaryUploadService::Request::Id BinaryUploadService::Request::id() const {
-  return id_;
-}
-
-void BinaryUploadService::Request::set_per_profile_request(
-    bool per_profile_request) {
-  per_profile_request_ = per_profile_request;
-}
-
-bool BinaryUploadService::Request::per_profile_request() const {
-  return per_profile_request_;
-}
-
-void BinaryUploadService::Request::set_device_token(const std::string& token) {
-  content_analysis_request_.set_device_token(token);
-}
-
-void BinaryUploadService::Request::set_filename(const std::string& filename) {
-  content_analysis_request_.mutable_request_data()->set_filename(filename);
-}
-
-void BinaryUploadService::Request::set_digest(const std::string& digest) {
-  content_analysis_request_.mutable_request_data()->set_digest(digest);
-}
-
-void BinaryUploadService::Request::clear_dlp_scan_request() {
-  auto* tags = content_analysis_request_.mutable_tags();
-  auto it = std::ranges::find(*tags, "dlp");
-  if (it != tags->end()) {
-    tags->erase(it);
-  }
-}
-
-void BinaryUploadService::Request::set_analysis_connector(
-    enterprise_connectors::AnalysisConnector connector) {
-  content_analysis_request_.set_analysis_connector(connector);
-}
-
-void BinaryUploadService::Request::set_url(const GURL& url) {
-  content_analysis_request_.mutable_request_data()->set_url(url.spec());
-}
-
-void BinaryUploadService::Request::set_source(const std::string& source) {
-  content_analysis_request_.mutable_request_data()->set_source(source);
-}
-
-void BinaryUploadService::Request::set_destination(
-    const std::string& destination) {
-  content_analysis_request_.mutable_request_data()->set_destination(
-      destination);
-}
-
-void BinaryUploadService::Request::set_csd(ClientDownloadRequest csd) {
-  *content_analysis_request_.mutable_request_data()->mutable_csd() =
-      std::move(csd);
-}
-
-void BinaryUploadService::Request::add_tag(const std::string& tag) {
-  content_analysis_request_.add_tags(tag);
-}
-
-void BinaryUploadService::Request::set_email(const std::string& email) {
-  content_analysis_request_.mutable_request_data()->set_email(email);
-}
-
-void BinaryUploadService::Request::set_client_metadata(
-    enterprise_connectors::ClientMetadata metadata) {
-  *content_analysis_request_.mutable_client_metadata() = std::move(metadata);
-}
-
-void BinaryUploadService::Request::set_content_type(const std::string& type) {
-  content_analysis_request_.mutable_request_data()->set_content_type(type);
-}
-
-void BinaryUploadService::Request::set_tab_title(const std::string& tab_title) {
-  content_analysis_request_.mutable_request_data()->set_tab_title(tab_title);
-}
-
-void BinaryUploadService::Request::set_user_action_id(
-    const std::string& user_action_id) {
-  content_analysis_request_.set_user_action_id(user_action_id);
-}
-
-void BinaryUploadService::Request::set_user_action_requests_count(
-    uint64_t user_action_requests_count) {
-  content_analysis_request_.set_user_action_requests_count(
-      user_action_requests_count);
-}
-
-void BinaryUploadService::Request::set_tab_url(const GURL& tab_url) {
-  content_analysis_request_.mutable_request_data()->set_tab_url(tab_url.spec());
-}
-
-void BinaryUploadService::Request::set_printer_name(
-    const std::string& printer_name) {
-  content_analysis_request_.mutable_request_data()
-      ->mutable_print_metadata()
-      ->set_printer_name(printer_name);
-}
-
-void BinaryUploadService::Request::set_printer_type(
-    enterprise_connectors::ContentMetaData::PrintMetadata::PrinterType
-        printer_type) {
-  content_analysis_request_.mutable_request_data()
-      ->mutable_print_metadata()
-      ->set_printer_type(printer_type);
-}
-
-void BinaryUploadService::Request::set_clipboard_source_type(
-    enterprise_connectors::ContentMetaData::CopiedTextSource::
-        CopiedTextSourceType source_type) {
-  content_analysis_request_.mutable_request_data()
-      ->mutable_copied_text_source()
-      ->set_context(source_type);
-}
-
-void BinaryUploadService::Request::set_clipboard_source_url(
-    const std::string& url) {
-  content_analysis_request_.mutable_request_data()
-      ->mutable_copied_text_source()
-      ->set_url(url);
-}
-
-void BinaryUploadService::Request::set_password(const std::string& password) {
-  content_analysis_request_.mutable_request_data()->set_decryption_key(
-      password);
-}
-
-void BinaryUploadService::Request::set_reason(
-    enterprise_connectors::ContentAnalysisRequest::Reason reason) {
-  content_analysis_request_.set_reason(reason);
-}
-
-void BinaryUploadService::Request::set_require_metadata_verdict(
-    bool require_metadata_verdict) {
-  content_analysis_request_.set_require_metadata_verdict(
-      require_metadata_verdict);
-}
-
-void BinaryUploadService::Request::set_is_content_encrypted(
-    bool is_content_encrypted) {
-  content_analysis_request_.set_is_content_encrypted(is_content_encrypted);
-}
-
-void BinaryUploadService::Request::set_is_content_too_large(
-    bool is_content_too_large) {
-  is_content_too_large_ = is_content_too_large;
-}
-
-void BinaryUploadService::Request::set_blocking(bool blocking) {
-  content_analysis_request_.set_blocking(blocking);
-}
-
-void BinaryUploadService::Request::add_local_ips(
-    const std::string& ip_address) {
-  content_analysis_request_.add_local_ips(ip_address);
-}
-
-void BinaryUploadService::Request::set_referrer_chain(
-    const google::protobuf::RepeatedPtrField<safe_browsing::ReferrerChainEntry>
-        referrer_chain) {
-  *content_analysis_request_.mutable_request_data()->mutable_referrer_chain() =
-      std::move(referrer_chain);
-}
-
-void BinaryUploadService::Request::set_content_area_account_email(
-    const std::string& email) {
-  content_analysis_request_.mutable_request_data()
-      ->set_content_area_account_email(email);
-}
-
-void BinaryUploadService::Request::set_source_content_area_account_email(
-    const std::string& email) {
-  content_analysis_request_.mutable_request_data()
-      ->set_source_content_area_account_email(email);
-}
-
-void BinaryUploadService::Request::set_frame_url_chain(
-    const google::protobuf::RepeatedPtrField<std::string> frame_url_chain) {
-  *content_analysis_request_.mutable_request_data()->mutable_frame_url_chain() =
-      std::move(frame_url_chain);
-}
-
-std::string BinaryUploadService::Request::SetRandomRequestToken() {
-  DCHECK(request_token().empty());
-  content_analysis_request_.set_request_token(
-      base::HexEncode(base::RandBytesAsVector(128)));
-  return content_analysis_request_.request_token();
-}
-
-enterprise_connectors::AnalysisConnector
-BinaryUploadService::Request::analysis_connector() {
-  return content_analysis_request_.analysis_connector();
-}
-
-const std::string& BinaryUploadService::Request::device_token() const {
-  return content_analysis_request_.device_token();
-}
-
-const std::string& BinaryUploadService::Request::request_token() const {
-  return content_analysis_request_.request_token();
-}
-
-const std::string& BinaryUploadService::Request::filename() const {
-  return content_analysis_request_.request_data().filename();
-}
-
-const std::string& BinaryUploadService::Request::digest() const {
-  return content_analysis_request_.request_data().digest();
-}
-
-const std::string& BinaryUploadService::Request::content_type() const {
-  return content_analysis_request_.request_data().content_type();
-}
-
-const std::string& BinaryUploadService::Request::user_action_id() const {
-  return content_analysis_request_.user_action_id();
-}
-
-const std::string& BinaryUploadService::Request::tab_title() const {
-  return content_analysis_request_.request_data().tab_title();
-}
-
-const std::string& BinaryUploadService::Request::printer_name() const {
-  return content_analysis_request_.request_data()
-      .print_metadata()
-      .printer_name();
-}
-
-uint64_t BinaryUploadService::Request::user_action_requests_count() const {
-  return content_analysis_request_.user_action_requests_count();
-}
-
-GURL BinaryUploadService::Request::tab_url() const {
-  if (!content_analysis_request_.has_request_data()) {
-    return GURL();
-  }
-  return GURL(content_analysis_request_.request_data().tab_url());
-}
-
-base::optional_ref<const std::string> BinaryUploadService::Request::password()
-    const {
-  return content_analysis_request_.request_data().has_decryption_key()
-             ? base::optional_ref(
-                   content_analysis_request_.request_data().decryption_key())
-             : std::nullopt;
-}
-
-enterprise_connectors::ContentAnalysisRequest::Reason
-BinaryUploadService::Request::reason() const {
-  return content_analysis_request_.reason();
-}
-
-bool BinaryUploadService::Request::blocking() const {
-  return content_analysis_request_.blocking();
-}
-
-bool BinaryUploadService::Request::image_paste() const {
-  return image_paste_;
-}
-
-void BinaryUploadService::Request::set_image_paste(bool image_paste) {
-  image_paste_ = image_paste;
-}
-
-bool BinaryUploadService::Request::is_content_too_large() const {
-  return is_content_too_large_;
-}
-
-bool BinaryUploadService::Request::is_content_encrypted() const {
-  return content_analysis_request_.is_content_encrypted();
-}
-
-void BinaryUploadService::Request::StartRequest() {
-  if (!request_start_callback_.is_null()) {
-    std::move(request_start_callback_).Run(*this);
-  }
-}
-
-void BinaryUploadService::Request::FinishRequest(
-    enterprise_connectors::ScanRequestUploadResult result,
-    enterprise_connectors::ContentAnalysisResponse response) {
-  if (content_analysis_callback_) {
-    std::move(content_analysis_callback_).Run(result, response);
-  }
-}
-
-void BinaryUploadService::Request::SerializeToString(
-    std::string* destination) const {
-  content_analysis_request_.SerializeToString(destination);
-}
-
-GURL BinaryUploadService::Request::GetUrlWithParams() const {
-  DCHECK(std::holds_alternative<enterprise_connectors::CloudAnalysisSettings>(
-      cloud_or_local_settings_));
-
-  GURL url = GetUrlOverride().value_or(cloud_or_local_settings_.analysis_url());
-  url = net::AppendQueryParameter(url, enterprise::kUrlParamDeviceToken,
-                                  device_token());
-
-  std::string connector;
-  switch (content_analysis_request_.analysis_connector()) {
-    case enterprise_connectors::FILE_ATTACHED:
-      connector = "OnFileAttached";
-      break;
-    case enterprise_connectors::FILE_DOWNLOADED:
-      connector = "OnFileDownloaded";
-      break;
-    case enterprise_connectors::BULK_DATA_ENTRY:
-      connector = "OnBulkDataEntry";
-      break;
-    case enterprise_connectors::PRINT:
-      connector = "OnPrint";
-      break;
-    case enterprise_connectors::FILE_TRANSFER:
-      connector = "OnFileTransfer";
-      break;
-    case enterprise_connectors::ANALYSIS_CONNECTOR_UNSPECIFIED:
-      break;
-  }
-  if (!connector.empty()) {
-    url = net::AppendQueryParameter(url, enterprise::kUrlParamConnector,
-                                    connector);
-  }
-
-  for (const std::string& tag : content_analysis_request_.tags()) {
-    url = net::AppendQueryParameter(url, enterprise::kUrlParamTag, tag);
-  }
-
-  return url;
-}
-
-bool BinaryUploadService::Request::IsAuthRequest() const {
-  return false;
-}
-
-const std::string& BinaryUploadService::Request::access_token() const {
-  return access_token_;
-}
-
-void BinaryUploadService::Request::set_access_token(
-    const std::string& access_token) {
-  access_token_ = access_token;
-}
-
 BinaryUploadService::Ack::Ack(
     enterprise_connectors::CloudOrLocalAnalysisSettings settings)
     : cloud_or_local_settings_(std::move(settings)) {}
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h
index 1394ecd..a85ff81 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h
@@ -5,17 +5,12 @@
 #ifndef CHROME_BROWSER_SAFE_BROWSING_CLOUD_CONTENT_SCANNING_BINARY_UPLOAD_SERVICE_H_
 #define CHROME_BROWSER_SAFE_BROWSING_CLOUD_CONTENT_SCANNING_BINARY_UPLOAD_SERVICE_H_
 
-#include "base/functional/bind.h"
 #include "base/functional/callback.h"
-#include "base/memory/read_only_shared_memory_region.h"
-#include "base/memory/weak_ptr.h"
-#include "base/types/id_type.h"
-#include "base/types/optional_ref.h"
 #include "components/enterprise/common/proto/connectors.pb.h"
 #include "components/enterprise/connectors/core/analysis_settings.h"
+#include "components/enterprise/connectors/core/cloud_content_scanning/binary_upload_request.h"
 #include "components/enterprise/connectors/core/cloud_content_scanning/common.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "url/gurl.h"
 
 class Profile;
 
@@ -38,15 +33,12 @@
   // all the functionality needed to generate a ContentAnalysisRequest, and
   // subclasses will provide different sources of data to upload (e.g. file,
   // page or string).
-  class Request {
+  class Request : public enterprise_connectors::BinaryUploadRequest {
    public:
-    // RequestStartCallback: Optional callback, called on the UI thread before
-    // authentication attempts or upload. Useful for tracking individual
-    // uploads.
-    using RequestStartCallback = base::OnceCallback<void(const Request&)>;
-
-    // Type alias for safe IDs
-    using Id = base::IdTypeU32<class RequestClass>;
+    using enterprise_connectors::BinaryUploadRequest::Data;
+    using enterprise_connectors::BinaryUploadRequest::DataCallback;
+    using enterprise_connectors::BinaryUploadRequest::Id;
+    using enterprise_connectors::BinaryUploadRequest::RequestStartCallback;
 
     Request(ContentAnalysisCallback,
             enterprise_connectors::CloudOrLocalAnalysisSettings settings);
@@ -55,175 +47,11 @@
     Request(ContentAnalysisCallback,
             enterprise_connectors::CloudOrLocalAnalysisSettings settings,
             RequestStartCallback);
-    virtual ~Request();
+    ~Request() override;
     Request(const Request&) = delete;
     Request& operator=(const Request&) = delete;
     Request(Request&&) = delete;
     Request& operator=(Request&&) = delete;
-
-    // Structure of data returned in the callback to GetRequestData().
-    struct Data {
-      Data();
-      Data(const Data&);
-      Data(Data&&);
-      Data& operator=(const Data&);
-      Data& operator=(Data&&);
-      ~Data();
-
-      // The data content. Only populated for string requests.
-      std::string contents;
-
-      // The path to the file to be scanned. Only populated for file requests.
-      base::FilePath path;
-
-      // The SHA256 of the data.
-      std::string hash;
-
-      // The size of the data. This can differ from `contents.size()` when the
-      // file is too large for deep scanning. This field will contain the true
-      // size.
-      uint64_t size = 0;
-
-      // The mime type of the data. Only populated for file requests.
-      std::string mime_type;
-
-      // The page's content. Only populated for page requests.
-      base::ReadOnlySharedMemoryRegion page;
-
-      // Whether the file has been obfuscated. Only populated for file requests.
-      bool is_obfuscated = false;
-    };
-
-    // Aynchronously returns the data required to make a MultipartUploadRequest.
-    // `result` is set to SUCCESS if getting the request data succeeded or
-    // some value describing the error.
-    using DataCallback =
-        base::OnceCallback<void(enterprise_connectors::ScanRequestUploadResult,
-                                Data)>;
-    virtual void GetRequestData(DataCallback callback) = 0;
-
-    // Returns the URL to send the request to.
-    GURL GetUrlWithParams() const;
-
-    // Returns the metadata to upload, as a ContentAnalysisRequest.
-    const enterprise_connectors::ContentAnalysisRequest&
-    content_analysis_request() const {
-      return content_analysis_request_;
-    }
-
-    const enterprise_connectors::CloudOrLocalAnalysisSettings&
-    cloud_or_local_settings() const {
-      return cloud_or_local_settings_;
-    }
-
-    void set_id(Id id);
-    Id id() const;
-
-    void set_per_profile_request(bool per_profile_request);
-    bool per_profile_request() const;
-
-    // Methods for modifying the ContentAnalysisRequest.
-    void set_analysis_connector(
-        enterprise_connectors::AnalysisConnector connector);
-    void set_url(const GURL& url);
-    void set_source(const std::string& source);
-    void set_destination(const std::string& destination);
-    void set_csd(ClientDownloadRequest csd);
-    void add_tag(const std::string& tag);
-    void set_email(const std::string& email);
-    void set_device_token(const std::string& token);
-    void set_filename(const std::string& filename);
-    void set_digest(const std::string& digest);
-    void clear_dlp_scan_request();
-    void set_client_metadata(enterprise_connectors::ClientMetadata metadata);
-    void set_content_type(const std::string& type);
-    void set_tab_title(const std::string& tab_title);
-    void set_user_action_id(const std::string& user_action_id);
-    void set_user_action_requests_count(uint64_t user_action_requests_count);
-    void set_tab_url(const GURL& tab_url);
-    void set_printer_name(const std::string& printer_name);
-    void set_printer_type(
-        enterprise_connectors::ContentMetaData::PrintMetadata::PrinterType
-            printer_type);
-    void set_clipboard_source_type(
-        enterprise_connectors::ContentMetaData::CopiedTextSource::
-            CopiedTextSourceType source_type);
-    void set_clipboard_source_url(const std::string& url);
-    void set_password(const std::string& password);
-    void set_reason(
-        enterprise_connectors::ContentAnalysisRequest::Reason reason);
-    void set_require_metadata_verdict(bool require_metadata_verdict);
-    void set_is_content_encrypted(bool is_content_encrypted);
-    void set_is_content_too_large(bool is_content_too_large);
-    void set_blocking(bool blocking);
-    void add_local_ips(const std::string& ip_address);
-    void set_referrer_chain(const google::protobuf::RepeatedPtrField<
-                            safe_browsing::ReferrerChainEntry> referrer_chain);
-    void set_content_area_account_email(const std::string& email);
-    void set_source_content_area_account_email(const std::string& email);
-    void set_frame_url_chain(
-        const google::protobuf::RepeatedPtrField<std::string> frame_url_chain);
-
-    std::string SetRandomRequestToken();
-
-    // Methods for accessing the ContentAnalysisRequest.
-    enterprise_connectors::AnalysisConnector analysis_connector();
-    const std::string& device_token() const;
-    const std::string& request_token() const;
-    const std::string& filename() const;
-    const std::string& digest() const;
-    const std::string& content_type() const;
-    const std::string& user_action_id() const;
-    const std::string& tab_title() const;
-    const std::string& printer_name() const;
-    uint64_t user_action_requests_count() const;
-    GURL tab_url() const;
-    base::optional_ref<const std::string> password() const;
-    enterprise_connectors::ContentAnalysisRequest::Reason reason() const;
-    bool blocking() const;
-    bool is_content_encrypted() const;
-    bool is_content_too_large() const;
-
-    // Called when beginning to try upload.
-    void StartRequest();
-
-    // Finish the request, with the given `result` and `response` from the
-    // server.
-    void FinishRequest(enterprise_connectors::ScanRequestUploadResult result,
-                       enterprise_connectors::ContentAnalysisResponse response);
-
-    // Calls SerializeToString on the appropriate proto request.
-    void SerializeToString(std::string* destination) const;
-
-    // Method used to identify authentication requests.
-    virtual bool IsAuthRequest() const;
-
-    const std::string& access_token() const;
-    void set_access_token(const std::string& access_token);
-
-    void set_image_paste(bool image_paste);
-    bool image_paste() const;
-
-   private:
-    Id id_;
-    enterprise_connectors::ContentAnalysisRequest content_analysis_request_;
-    ContentAnalysisCallback content_analysis_callback_;
-    RequestStartCallback request_start_callback_;
-
-    // Settings used to determine how the request is used in the cloud or
-    // locally.
-    enterprise_connectors::CloudOrLocalAnalysisSettings
-        cloud_or_local_settings_;
-
-    // Indicates if the request was triggered by a profile-level policy or not.
-    bool per_profile_request_ = false;
-
-    // Access token to be attached in the request headers.
-    std::string access_token_;
-
-    bool image_paste_ = false;
-
-    bool is_content_too_large_ = false;
   };
 
   // A class to encapsulate the a request acknowledgement. This class will
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service_unittest.cc b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service_unittest.cc
index 502ee7e..912786f 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service_unittest.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service_unittest.cc
@@ -1307,8 +1307,8 @@
           enterprise_connectors::AnalysisSettings(), file_path,
           file_path.BaseName(), "fake/mimetype", false, base::DoNothing(),
           base::BindLambdaForTesting(
-              [&run_loop,
-               &was_started](const BinaryUploadService::Request& request) {
+              [&run_loop, &was_started](
+                  const enterprise_connectors::BinaryUploadRequest& request) {
                 was_started = true;
                 run_loop.Quit();
               }));
diff --git a/chrome/browser/signin/android/signin_bridge.cc b/chrome/browser/signin/android/signin_bridge.cc
index 004f7a653..efe2e0d 100644
--- a/chrome/browser/signin/android/signin_bridge.cc
+++ b/chrome/browser/signin/android/signin_bridge.cc
@@ -17,12 +17,14 @@
 
 using base::android::JavaRef;
 
-void SigninBridge::StartAddAccountFlow(ui::WindowAndroid* window,
+void SigninBridge::StartAddAccountFlow(TabAndroid* tab,
                                        const std::string& prefilled_email,
                                        const GURL& continue_url) {
-  DCHECK(window);
+  if (!tab) {
+    return;
+  }
   JNIEnv* env = base::android::AttachCurrentThread();
-  Java_SigninBridge_startAddAccountFlow(env, window->GetJavaObject(),
+  Java_SigninBridge_startAddAccountFlow(env, tab->GetJavaObject(),
                                         prefilled_email, continue_url);
 }
 
diff --git a/chrome/browser/signin/android/signin_bridge.h b/chrome/browser/signin/android/signin_bridge.h
index 4b1acb31..f6acad9 100644
--- a/chrome/browser/signin/android/signin_bridge.h
+++ b/chrome/browser/signin/android/signin_bridge.h
@@ -7,6 +7,7 @@
 
 #include <string>
 
+#include "chrome/browser/android/tab_android.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/signin/core/browser/signin_header_helper.h"
 #include "components/signin/public/base/signin_metrics.h"
@@ -27,7 +28,7 @@
 
   // Opens a add account flow pre-filled with |prefilled_email| that opens
   // the specified |continue_url| upon completion.
-  virtual void StartAddAccountFlow(ui::WindowAndroid* window,
+  virtual void StartAddAccountFlow(TabAndroid* tab,
                                    const std::string& prefilled_email,
                                    const GURL& continue_url);
 
diff --git a/chrome/browser/signin/android/web_signin_bridge.cc b/chrome/browser/signin/android/web_signin_bridge.cc
index befd683..5c624405a 100644
--- a/chrome/browser/signin/android/web_signin_bridge.cc
+++ b/chrome/browser/signin/android/web_signin_bridge.cc
@@ -5,12 +5,14 @@
 #include "chrome/browser/signin/android//web_signin_bridge.h"
 
 #include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
 #include "base/android/scoped_java_ref.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/account_reconcilor_factory.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h"
+#include "google_apis/gaia/core_account_id.h"
 
 // Must come after all headers that specialize FromJniType() / ToJniType().
 #include "chrome/browser/signin/services/android/jni_headers/WebSigninBridge_jni.h"
@@ -29,7 +31,7 @@
 WebSigninBridge::WebSigninBridge(
     signin::IdentityManager* identity_manager,
     AccountReconcilor* account_reconcilor,
-    CoreAccountId signin_account,
+    std::variant<CoreAccountId, std::string> signin_account,
     base::OnceCallback<void(signin::WebSigninTracker::Result)> callback)
     : tracker_(identity_manager,
                account_reconcilor,
@@ -38,12 +40,12 @@
 
 WebSigninBridge::~WebSigninBridge() = default;
 
-static jlong JNI_WebSigninBridge_Create(
+static jlong JNI_WebSigninBridge_CreateWithCoreAccountId(
     JNIEnv* env,
     Profile* profile,
-    CoreAccountInfo& account,
+    CoreAccountId& account_id,
     const JavaRef<jobject>& j_listener) {
-  DCHECK(j_listener) << "Listener should be non-null";
+  CHECK(j_listener) << "Listener should be non-null";
 
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(profile);
@@ -54,8 +56,28 @@
           &ForwardOnSigninCompletedToJava,
           base::android::ScopedJavaGlobalRef<jobject>(j_listener));
   return reinterpret_cast<intptr_t>(
-      new WebSigninBridge(identity_manager, account_reconcilor,
-                          account.account_id, std::move(on_signin_completed)));
+      new WebSigninBridge(identity_manager, account_reconcilor, account_id,
+                          std::move(on_signin_completed)));
+}
+
+static jlong JNI_WebSigninBridge_CreateWithEmail(
+    JNIEnv* env,
+    Profile* profile,
+    std::string& account_email,
+    const JavaRef<jobject>& j_listener) {
+  CHECK(j_listener) << "Listener should be non-null";
+
+  signin::IdentityManager* identity_manager =
+      IdentityManagerFactory::GetForProfile(profile);
+  AccountReconcilor* account_reconcilor =
+      AccountReconcilorFactory::GetForProfile(profile);
+  base::OnceCallback<void(signin::WebSigninTracker::Result)>
+      on_signin_completed = base::BindOnce(
+          &ForwardOnSigninCompletedToJava,
+          base::android::ScopedJavaGlobalRef<jobject>(j_listener));
+  return reinterpret_cast<intptr_t>(
+      new WebSigninBridge(identity_manager, account_reconcilor, account_email,
+                          std::move(on_signin_completed)));
 }
 
 static void JNI_WebSigninBridge_Destroy(JNIEnv* env, jlong web_signin_bridge) {
diff --git a/chrome/browser/signin/android/web_signin_bridge.h b/chrome/browser/signin/android/web_signin_bridge.h
index 9e57e2ba..1785a1f 100644
--- a/chrome/browser/signin/android/web_signin_bridge.h
+++ b/chrome/browser/signin/android/web_signin_bridge.h
@@ -15,7 +15,7 @@
   explicit WebSigninBridge(
       signin::IdentityManager* identity_manager,
       AccountReconcilor* account_reconcilor,
-      CoreAccountId signin_account,
+      std::variant<CoreAccountId, std::string> signin_account,
       base::OnceCallback<void(signin::WebSigninTracker::Result)>
           on_signin_completed);
 
diff --git a/chrome/browser/signin/chrome_signin_helper.cc b/chrome/browser/signin/chrome_signin_helper.cc
index 16396a7..6eb55ae 100644
--- a/chrome/browser/signin/chrome_signin_helper.cc
+++ b/chrome/browser/signin/chrome_signin_helper.cc
@@ -30,6 +30,7 @@
 #include "components/signin/public/base/consent_level.h"
 #include "components/signin/public/base/signin_buildflags.h"
 #include "components/signin/public/base/signin_switches.h"
+#include "components/signin/public/identity_manager/account_info.h"
 #include "components/signin/public/identity_manager/accounts_cookie_mutator.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -359,8 +360,20 @@
 
   if (service_type == signin::GAIA_SERVICE_TYPE_ADDSESSION &&
       base::FeatureList::IsEnabled(switches::kSupportWebSigninAddSession)) {
+    signin::IdentityManager* const identity_manager =
+        IdentityManagerFactory::GetForProfile(profile);
+    for (CoreAccountInfo account :
+         identity_manager->GetAccountsWithRefreshTokens()) {
+      if (gaia::AreEmailsSame(account.email, manage_accounts_params.email)) {
+        // If account is already on device don't start the add account flow.
+        // TODO(crbug.com/456445865): Consider adding a reauth flow or a wait
+        // for cookies in this scenario.
+        return;
+      }
+    }
     SigninBridgeFactory::GetForProfile(profile)->StartAddAccountFlow(
-        window, manage_accounts_params.email, continue_url);
+        TabAndroid::FromWebContents(web_contents), manage_accounts_params.email,
+        continue_url);
     return;
   }
 
diff --git a/chrome/browser/signin/chrome_signin_helper_unittest.cc b/chrome/browser/signin/chrome_signin_helper_unittest.cc
index c47ce32..58dad5a 100644
--- a/chrome/browser/signin/chrome_signin_helper_unittest.cc
+++ b/chrome/browser/signin/chrome_signin_helper_unittest.cc
@@ -16,7 +16,6 @@
 #include "base/test/bind.h"
 #include "build/buildflag.h"
 #include "chrome/browser/content_settings/cookie_settings_factory.h"
-#include "chrome/browser/signin/android/signin_bridge.h"
 #include "chrome/browser/signin/android/signin_bridge_factory.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "components/content_settings/core/browser/cookie_settings.h"
@@ -47,6 +46,8 @@
 #include "url/gurl.h"
 
 #if BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/android/tab_android.h"
+#include "chrome/browser/signin/android/signin_bridge.h"
 #include "chrome/browser/ui/android/tab_model/tab_model_list.h"
 #include "chrome/browser/ui/android/tab_model/tab_model_test_helper.h"
 #include "ui/android/window_android.h"
@@ -200,7 +201,7 @@
 
   MOCK_METHOD(void,
               StartAddAccountFlow,
-              (ui::WindowAndroid * window,
+              (TabAndroid * window,
                const std::string& prefilled_email,
                const GURL& continue_url),
               (override));
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/WebSigninBridge.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/WebSigninBridge.java
index 9e128eb..59636f2bd 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/WebSigninBridge.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/WebSigninBridge.java
@@ -14,8 +14,8 @@
 import org.chromium.base.Callback;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.profiles.Profile;
-import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.components.signin.browser.WebSigninTrackerResult;
+import org.chromium.google_apis.gaia.CoreAccountId;
 
 import java.util.Objects;
 
@@ -36,11 +36,23 @@
          * @param account The primary account account used for the sign-in process.
          * @param callback The callback to be notified about sign-in result.
          */
-        public WebSigninBridge create(
+        public WebSigninBridge createWithCoreAccountId(
                 Profile profile,
-                CoreAccountInfo account,
+                CoreAccountId accountId,
                 Callback<@WebSigninTrackerResult Integer> callback) {
-            return new WebSigninBridge(profile, account, callback);
+            return new WebSigninBridge(profile, accountId, callback);
+        }
+
+        /**
+         * Creates a WebSigninBridge object.
+         *
+         * @param profile The profile to use for the sign-in.
+         * @param email The primary account account email used for the sign-in process.
+         * @param callback The callback to be notified about sign-in result.
+         */
+        public WebSigninBridge createWithEmail(
+                Profile profile, String email, Callback<@WebSigninTrackerResult Integer> callback) {
+            return new WebSigninBridge(profile, email, callback);
         }
     }
 
@@ -56,11 +68,30 @@
      */
     private WebSigninBridge(
             Profile profile,
-            CoreAccountInfo account,
+            CoreAccountId accountId,
             Callback<@WebSigninTrackerResult Integer> callback) {
-        Objects.requireNonNull(account);
+        Objects.requireNonNull(accountId);
         Objects.requireNonNull(callback);
-        mNativeWebSigninBridge = WebSigninBridgeJni.get().create(profile, account, callback);
+        mNativeWebSigninBridge =
+                WebSigninBridgeJni.get().createWithCoreAccountId(profile, accountId, callback);
+        assert mNativeWebSigninBridge != 0 : "Couldn't create native WebSigninBridge object!";
+    }
+
+    /**
+     * Notifies the passed {@link Listener} when the sign-in process completes either successfully
+     * or with an error. Successful completion means that the primary account is available in
+     * cookies. Should be explicitly destroyed using {@link #destroy()} to release native resources.
+     *
+     * @param account The primary account account used for the sign-in process.
+     * @param callback The callback to be notified about sign-in result.
+     */
+    private WebSigninBridge(
+            Profile profile, String email, Callback<@WebSigninTrackerResult Integer> callback) {
+        Objects.requireNonNull(email);
+        Objects.requireNonNull(callback);
+        mNativeWebSigninBridge =
+                org.chromium.chrome.browser.signin.services.WebSigninBridgeJni.get()
+                        .createWithEmail(profile, email, callback);
         assert mNativeWebSigninBridge != 0 : "Couldn't create native WebSigninBridge object!";
     }
 
@@ -80,9 +111,14 @@
 
     @NativeMethods
     interface Natives {
-        long create(
+        long createWithCoreAccountId(
                 @JniType("Profile*") Profile profile,
-                @JniType("CoreAccountInfo") CoreAccountInfo account,
+                @JniType("CoreAccountId") CoreAccountId account,
+                Callback<@WebSigninTrackerResult Integer> callback);
+
+        long createWithEmail(
+                @JniType("Profile*") Profile profile,
+                @JniType("std::string") String email,
                 Callback<@WebSigninTrackerResult Integer> callback);
 
         void destroy(long webSigninBridgePtr);
diff --git a/chrome/browser/signin/services/android/junit/src/org/chromium/chrome/browser/signin/services/WebSigninBridgeTest.java b/chrome/browser/signin/services/android/junit/src/org/chromium/chrome/browser/signin/services/WebSigninBridgeTest.java
index 5e9cf50..7eb6688 100644
--- a/chrome/browser/signin/services/android/junit/src/org/chromium/chrome/browser/signin/services/WebSigninBridgeTest.java
+++ b/chrome/browser/signin/services/android/junit/src/org/chromium/chrome/browser/signin/services/WebSigninBridgeTest.java
@@ -43,21 +43,25 @@
     @Before
     public void setUp() {
         WebSigninBridgeJni.setInstanceForTesting(mNativeMock);
-        when(mNativeMock.create(mProfileMock, CORE_ACCOUNT_INFO, mCallbackMock))
+        when(mNativeMock.createWithCoreAccountId(
+                        mProfileMock, CORE_ACCOUNT_INFO.getId(), mCallbackMock))
                 .thenReturn(NATIVE_WEB_SIGNIN_BRIDGE);
     }
 
     @Test
     public void testFactoryCreate() {
         WebSigninBridge webSigninBridge =
-                mFactory.create(mProfileMock, CORE_ACCOUNT_INFO, mCallbackMock);
+                mFactory.createWithCoreAccountId(
+                        mProfileMock, CORE_ACCOUNT_INFO.getId(), mCallbackMock);
         Assert.assertNotNull("Factory#create should not return null!", webSigninBridge);
-        verify(mNativeMock).create(mProfileMock, CORE_ACCOUNT_INFO, mCallbackMock);
+        verify(mNativeMock)
+                .createWithCoreAccountId(mProfileMock, CORE_ACCOUNT_INFO.getId(), mCallbackMock);
     }
 
     @Test
     public void testDestroy() {
-        mFactory.create(mProfileMock, CORE_ACCOUNT_INFO, mCallbackMock).destroy();
+        mFactory.createWithCoreAccountId(mProfileMock, CORE_ACCOUNT_INFO.getId(), mCallbackMock)
+                .destroy();
         verify(mNativeMock).destroy(NATIVE_WEB_SIGNIN_BRIDGE);
     }
 
diff --git a/chrome/browser/ssl/https_first_mode_settings_tracker.h b/chrome/browser/ssl/https_first_mode_settings_tracker.h
index 2b53b6a0..f1754a0 100644
--- a/chrome/browser/ssl/https_first_mode_settings_tracker.h
+++ b/chrome/browser/ssl/https_first_mode_settings_tracker.h
@@ -29,7 +29,9 @@
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused.
 // Must be kept in sync with the HttpsFirstModeSetting enums located in
-// chrome/browser/resources/settings/privacy_page/security_page.ts and enums.xml
+// chrome/browser/resources/settings/privacy_page/security_page.ts,
+// chrome/browser/resources/settings/privacy_page/security/security_page_v2.ts,
+// and enums.xml
 // LINT.IfChange
 // A Java counterpart will be generated for this enum.
 // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.ssl
@@ -41,7 +43,11 @@
   kEnabledBalanced = 3,
   kMaxValue = kEnabledBalanced,
 };
-// LINT.ThenChange(/tools/metrics/histograms/metadata/security/enums.xml)
+// LINT.ThenChange(
+//      /chrome/browser/resources/settings/privacy_page/security/security_page.ts,
+//      /chrome/browser/resources/settings/privacy_page/security/security_page_v2.ts:HttpsFirstModeSetting,
+//      /tools/metrics/histograms/metadata/security/enums.xml
+// )
 
 // A `KeyedService` that tracks changes to the HTTPS-First Mode pref for each
 // profile. This is currently used for:
diff --git a/chrome/browser/storage_access_api/api_browsertest.cc b/chrome/browser/storage_access_api/api_browsertest.cc
index dea2a6b..a2c1b451 100644
--- a/chrome/browser/storage_access_api/api_browsertest.cc
+++ b/chrome/browser/storage_access_api/api_browsertest.cc
@@ -49,6 +49,7 @@
 #include "components/permissions/test/permission_request_observer.h"
 #include "components/policy/policy_constants.h"
 #include "components/prefs/pref_service.h"
+#include "components/privacy_sandbox/privacy_sandbox_prefs.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/storage_partition.h"
@@ -2438,6 +2439,13 @@
 class StorageAccessAPIWithFirstPartySetsBrowserTest
     : public StorageAccessAPIBaseBrowserTest {
  public:
+  void SetUpOnMainThread() override {
+    StorageAccessAPIBaseBrowserTest::SetUpOnMainThread();
+    // Explicitly enable Related Website Sets (formerly First Party Sets).
+    browser()->profile()->GetPrefs()->SetBoolean(
+        prefs::kPrivacySandboxRelatedWebsiteSetsEnabled, true);
+  }
+
   void SetUpCommandLine(base::CommandLine* command_line) override {
     StorageAccessAPIBaseBrowserTest::SetUpCommandLine(command_line);
     command_line->AppendSwitchASCII(
diff --git a/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc b/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc
index fded7e87..41229e90 100644
--- a/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc
+++ b/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc
@@ -39,6 +39,7 @@
 #include "components/permissions/resolvers/content_setting_permission_resolver.h"
 #include "components/permissions/test/mock_permission_prompt_factory.h"
 #include "components/prefs/pref_service.h"
+#include "components/privacy_sandbox/privacy_sandbox_prefs.h"
 #include "content/public/browser/btm_service.h"
 #include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/permission_result.h"
@@ -801,6 +802,9 @@
   void SetUp() override {
     StorageAccessGrantPermissionContextTest::SetUp();
 
+    // Enable Related Website Sets (formerly First Party Sets).
+    profile()->GetPrefs()->SetBoolean(
+        prefs::kPrivacySandboxRelatedWebsiteSetsEnabled, true);
     // Create a FPS with https://requester.example.com as the member and
     // https://embedder.com as the primary.
     first_party_sets_handler_.SetGlobalSets(net::GlobalFirstPartySets(
diff --git a/chrome/browser/top_level_storage_access_api/request_storage_access_for_browsertest.cc b/chrome/browser/top_level_storage_access_api/request_storage_access_for_browsertest.cc
index c128329..409e484 100644
--- a/chrome/browser/top_level_storage_access_api/request_storage_access_for_browsertest.cc
+++ b/chrome/browser/top_level_storage_access_api/request_storage_access_for_browsertest.cc
@@ -27,6 +27,7 @@
 #include "components/metrics/content/subprocess_metrics_provider.h"
 #include "components/permissions/test/mock_permission_prompt_factory.h"
 #include "components/prefs/pref_service.h"
+#include "components/privacy_sandbox/privacy_sandbox_prefs.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/network_service_util.h"
@@ -616,6 +617,13 @@
     content::ForceInProcessNetworkService();
   }
 
+  void SetUpOnMainThread() override {
+    RequestStorageAccessForBaseBrowserTest::SetUpOnMainThread();
+    // Explicitly enable Related Website Sets (formerly First Party Sets).
+    browser()->profile()->GetPrefs()->SetBoolean(
+        prefs::kPrivacySandboxRelatedWebsiteSetsEnabled, true);
+  }
+
   void SetUpCommandLine(base::CommandLine* command_line) override {
     RequestStorageAccessForBaseBrowserTest::SetUpCommandLine(command_line);
     command_line->AppendSwitchASCII(
diff --git a/chrome/browser/top_level_storage_access_api/top_level_storage_access_permission_context_unittest.cc b/chrome/browser/top_level_storage_access_api/top_level_storage_access_permission_context_unittest.cc
index 4347674..fb38d16 100644
--- a/chrome/browser/top_level_storage_access_api/top_level_storage_access_permission_context_unittest.cc
+++ b/chrome/browser/top_level_storage_access_api/top_level_storage_access_permission_context_unittest.cc
@@ -18,6 +18,8 @@
 #include "components/permissions/permission_util.h"
 #include "components/permissions/resolvers/content_setting_permission_resolver.h"
 #include "components/permissions/test/mock_permission_prompt_factory.h"
+#include "components/prefs/pref_service.h"
+#include "components/privacy_sandbox/privacy_sandbox_prefs.h"
 #include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/permission_result.h"
 #include "content/public/browser/web_contents.h"
@@ -224,6 +226,9 @@
              net::FirstPartySetEntry(top_level, net::SiteType::kPrimary)},
         },
         /*aliases=*/{}));
+
+    profile()->GetPrefs()->SetBoolean(
+        prefs::kPrivacySandboxRelatedWebsiteSetsEnabled, true);
   }
 
  private:
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index cbf0fa7..bf9c87e 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -454,6 +454,7 @@
     "//components/encrypted_messages:encrypted_message_proto",
     "//components/enterprise",
     "//components/enterprise/browser/identifiers",
+    "//components/enterprise/browser/promotion",
     "//components/error_page/content/browser",
     "//components/facilitated_payments/core/features",
     "//components/favicon/content",
diff --git a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoCoordinator.java b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoCoordinator.java
index 2218f29..275dca1 100644
--- a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoCoordinator.java
+++ b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoCoordinator.java
@@ -70,10 +70,7 @@
         if (ChromeFeatureList.sAndroidLogoViewRefactor.isEnabled()) {
             defaultGoogleLogoDrawable =
                     ContextCompat.getDrawable(context, R.drawable.ic_google_logo);
-            if (ChromeFeatureList.sNewTabPageCustomizationV2.isEnabled()) {
-                NtpCustomizationUtils.setTintForDefaultGoogleLogo(
-                        context, defaultGoogleLogoDrawable);
-            }
+            NtpCustomizationUtils.setTintForDefaultGoogleLogo(context, defaultGoogleLogoDrawable);
         }
 
         mMediator =
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/account_picker/WebSigninAccountPickerDelegate.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/account_picker/WebSigninAccountPickerDelegate.java
index cbb308b..dc48db4 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/account_picker/WebSigninAccountPickerDelegate.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/account_picker/WebSigninAccountPickerDelegate.java
@@ -78,9 +78,9 @@
             CoreAccountInfo accountInfo, AccountPickerDelegate.SigninStateController controller) {
         // Create WebSigninBridge and wait for redirect to the continue url.
         mWebSigninBridge =
-                mWebSigninBridgeFactory.create(
+                mWebSigninBridgeFactory.createWithCoreAccountId(
                         mProfile,
-                        accountInfo,
+                        accountInfo.getId(),
                         createWebSigninBridgeCallback(mCurrentTab, mContinueUrl, controller));
     }
 
diff --git a/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/account_picker/WebSigninAccountPickerDelegateTest.java b/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/account_picker/WebSigninAccountPickerDelegateTest.java
index 12c6201..3238082 100644
--- a/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/account_picker/WebSigninAccountPickerDelegateTest.java
+++ b/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/account_picker/WebSigninAccountPickerDelegateTest.java
@@ -83,7 +83,7 @@
         mDelegate =
                 new WebSigninAccountPickerDelegate(
                         mTabMock, mWebSigninBridgeFactoryMock, CONTINUE_URL);
-        when(mWebSigninBridgeFactoryMock.create(eq(mProfileMock), any(), any()))
+        when(mWebSigninBridgeFactoryMock.createWithCoreAccountId(eq(mProfileMock), any(), any()))
                 .thenReturn(mWebSigninBridgeMock);
     }
 
@@ -98,9 +98,9 @@
         mDelegate.onSignInComplete(TestAccounts.ACCOUNT1, mSigninStateControllerMock);
 
         verify(mWebSigninBridgeFactoryMock)
-                .create(
+                .createWithCoreAccountId(
                         eq(mProfileMock),
-                        eq(TestAccounts.ACCOUNT1),
+                        eq(TestAccounts.ACCOUNT1.getId()),
                         mWebSigninCallbackCaptor.capture());
 
         mWebSigninCallbackCaptor.getValue().onResult(WebSigninTrackerResult.SUCCESS);
@@ -117,9 +117,9 @@
         mDelegate.onSignInComplete(TestAccounts.ACCOUNT1, mSigninStateControllerMock);
 
         verify(mWebSigninBridgeFactoryMock)
-                .create(
+                .createWithCoreAccountId(
                         eq(mProfileMock),
-                        eq(TestAccounts.ACCOUNT1),
+                        eq(TestAccounts.ACCOUNT1.getId()),
                         mWebSigninCallbackCaptor.capture());
 
         mWebSigninCallbackCaptor.getValue().onResult(WebSigninTrackerResult.OTHER_ERROR);
@@ -139,9 +139,9 @@
         mDelegate.onSignInComplete(TestAccounts.ACCOUNT1, mSigninStateControllerMock);
 
         verify(mWebSigninBridgeFactoryMock)
-                .create(
+                .createWithCoreAccountId(
                         eq(mProfileMock),
-                        eq(TestAccounts.ACCOUNT1),
+                        eq(TestAccounts.ACCOUNT1.getId()),
                         mWebSigninCallbackCaptor.capture());
 
         mWebSigninCallbackCaptor.getValue().onResult(WebSigninTrackerResult.AUTH_ERROR);
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
index 011198c3..9ec6727e 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -563,7 +563,7 @@
 <translation id="3474624961160222204">እንደ <ph name="NAME" /> ይቀጥሉ</translation>
 <translation id="3478363558367712427">የፍለጋ ፕሮግራምዎን መምረጥ ይችላሉ</translation>
 <translation id="3482805106082349287">የቁልፍ ሰሌዳ፣ ድምፅ፣ ማንነት የማያሳውቅ ወይም ካሜራ በመጠቀም ይፈልጉ</translation>
-<translation id="3487903178221457900">ወደ ውጭ የተላከው ፋይል መተግበሪያዎችን ጨምሮ ለሌሎች ተደራሽ ሊሆን ይችላል። አንዴ ወደ ውጭ ከላኩ በኋላ የይለፍ ቃላትዎ ከChrome ይሰረዛሉ።</translation>
+<translation id="3487903178221457900">ወደ ውጭ የተላከው ፋይል መተግበሪያዎችን ጨምሮ ለሌሎች ተደራሽ ሊሆን ይችላል። አንዴ ወደ ውጭ ከላክሽ በኋላ የይለፍ ቃላትሽ ከChrome ይሰረዛሉ።</translation>
 <translation id="3488199663160411179">ስም</translation>
 <translation id="3493531032208478708">ስለሚጠቆም ይዘት <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation>
 <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></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 1ad4858..343b2104 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
@@ -87,6 +87,7 @@
 <translation id="1336996151357442890">تم إلغاء الاشتراك في "<ph name="SITE_NAME" />". سيُطلب منك مجددًا منح الإذن في زيارتك القادمة إلى هذا الموقع الإلكتروني.</translation>
 <translation id="1340839264183302272">مغادرة المجموعة</translation>
 <translation id="1342886103232377846">‏للتحقّق من كلمات المرور المحتمَل تعرّضها للاختراق، يُرجى الانتقال إلى "مدير كلمات المرور في Google".</translation>
+<translation id="1343830902827845050">‏سجِّل الدخول إلى Chrome</translation>
 <translation id="1344653310988386453">تضمين رابط يؤدي إلى النصوص التي تم تمييزها</translation>
 <translation id="1347468774581902829">إدارة النشاط</translation>
 <translation id="1355088659320425659">السجلّ وعلامات التبويب</translation>
@@ -719,6 +720,7 @@
 <translation id="414128724510021958">المواقع الإلكترونية المتوافقة مع أجهزة الكمبيوتر المكتبي يتم طلبها تلقائيًا</translation>
 <translation id="4162867837470729563">قائمة خيارات المشاركة مفتوحة بطول الشاشة.</translation>
 <translation id="4170011742729630528">الخدمة غير متاحة، أعد المحاولة لاحقًا.</translation>
+<translation id="4170577491341606575">‏جارٍ تحميل بياناتك\u2026</translation>
 <translation id="4177222230309051052">سترافقك إشاراتك المرجعية كلها أينما كنت</translation>
 <translation id="4177501066905053472">مواضيع الإعلانات</translation>
 <translation id="417865198503699526">يمكنك البحث عن إعداد</translation>
@@ -1458,6 +1460,7 @@
 <translation id="7115358764509798967">الإعداد التلقائي للنظام</translation>
 <translation id="7117485132243600300">إدارة المحتوى الذي تتم متابعته والمواضيع وعمليات البحث المقترَحة</translation>
 <translation id="7119984597597798764">إغلاق "<ph name="INSTANCE_TITLE" />"</translation>
+<translation id="7121179479711575744">‏تسجيل الدخول إلى Chrome</translation>
 <translation id="7136902389402789299">{NUM_SITES,plural, =1{تمت مراجعة أذونات موقع إلكتروني واحد}zero{تمت مراجعة أذونات # موقع إلكتروني}two{تمت مراجعة أذونات موقعَين إلكترونيَين}few{تمت مراجعة أذونات # مواقع إلكترونية}many{تمت مراجعة أذونات # موقعًا إلكترونيًا}other{تمت مراجعة أذونات # موقع إلكتروني}}</translation>
 <translation id="7138678301420049075">أخرى</translation>
 <translation id="7140829094791862589">ترتيب يدوي</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
index 5e3c142..b1c1d15 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -87,6 +87,7 @@
 <translation id="1336996151357442890">Berhenti berlangganan dari <ph name="SITE_NAME" />. Anda akan ditanyai lagi pada kunjungan berikutnya.</translation>
 <translation id="1340839264183302272">Keluar dari grup</translation>
 <translation id="1342886103232377846">Untuk memeriksa sandi yang telah dibobol, buka Pengelola Sandi Google</translation>
+<translation id="1343830902827845050">Login ke Chrome</translation>
 <translation id="1344653310988386453">Sertakan link ke sorotan</translation>
 <translation id="1347468774581902829">Kelola aktivitas</translation>
 <translation id="1355088659320425659">Histori dan tab</translation>
@@ -718,6 +719,7 @@
 <translation id="414128724510021958">Situs desktop diminta secara default</translation>
 <translation id="4162867837470729563">Daftar opsi berbagi terbuka sepenuhnya.</translation>
 <translation id="4170011742729630528">Layanan tidak tersedia; coba lagi nanti.</translation>
+<translation id="4170577491341606575">Mengambil data Anda\u2026</translation>
 <translation id="4177222230309051052">Dapatkan semua bookmark Anda</translation>
 <translation id="4177501066905053472">Topik iklan</translation>
 <translation id="417865198503699526">Telusuri setelan</translation>
@@ -1457,6 +1459,7 @@
 <translation id="7115358764509798967">Default sistem</translation>
 <translation id="7117485132243600300">Kelola konten yang Anda ikuti serta topik dan penelusuran yang disarankan</translation>
 <translation id="7119984597597798764">Tutup <ph name="INSTANCE_TITLE" /></translation>
+<translation id="7121179479711575744">Login ke Chrome</translation>
 <translation id="7136902389402789299">{NUM_SITES,plural, =1{Izin ditinjau untuk 1 situs}other{Izin ditinjau untuk # situs}}</translation>
 <translation id="7138678301420049075">Lainnya</translation>
 <translation id="7140829094791862589">Urutkan secara manual</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
index 6466476..294acff 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -87,6 +87,7 @@
 <translation id="1336996151357442890"><ph name="SITE_NAME" /> 사이트의 알림 수신을 거부했습니다. 다음에 사이트를 방문할 때 설정을 다시 확인합니다.</translation>
 <translation id="1340839264183302272">그룹 나가기</translation>
 <translation id="1342886103232377846">유출된 비밀번호가 있는지 확인하려면 Google 비밀번호 관리자로 이동하세요</translation>
+<translation id="1343830902827845050">Chrome에 로그인하세요</translation>
 <translation id="1344653310988386453">하이라이트 링크 포함</translation>
 <translation id="1347468774581902829">활동 관리</translation>
 <translation id="1355088659320425659">방문 기록 및 탭</translation>
@@ -718,6 +719,7 @@
 <translation id="414128724510021958">기본적으로 요청되는 데스크톱 사이트</translation>
 <translation id="4162867837470729563">공유 옵션 목록이 전체 높이로 열렸습니다.</translation>
 <translation id="4170011742729630528">서비스를 사용할 수 없습니다. 나중에 다시 시도해 주세요.</translation>
+<translation id="4170577491341606575">데이터를 가져오는 중\u2026</translation>
 <translation id="4177222230309051052">모든 북마크 가져오기</translation>
 <translation id="4177501066905053472">광고 주제</translation>
 <translation id="417865198503699526">설정을 검색합니다.</translation>
@@ -1457,6 +1459,7 @@
 <translation id="7115358764509798967">시스템 기본값</translation>
 <translation id="7117485132243600300">추천 주제, 검색어, 팔로우하는 콘텐츠 관리</translation>
 <translation id="7119984597597798764"><ph name="INSTANCE_TITLE" /> 닫기</translation>
+<translation id="7121179479711575744">Chrome에 로그인</translation>
 <translation id="7136902389402789299">{NUM_SITES,plural, =1{사이트 1개의 권한이 검토됨}other{사이트 #개의 권한이 검토됨}}</translation>
 <translation id="7138678301420049075">기타</translation>
 <translation id="7140829094791862589">직접 정렬</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
index 289e883..e801355 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -87,6 +87,7 @@
 <translation id="1336996151357442890"><ph name="SITE_NAME" />-с захиалгаа цуцаллаа. Танаас дараагийн удаа зочлоход тань дахин асууна.</translation>
 <translation id="1340839264183302272">Бүлгээс гарах</translation>
 <translation id="1342886103232377846">Алдагдсан нууц үгнүүд байгаа эсэхийг шалгахын тулд Google Password Manager лүү очно уу</translation>
+<translation id="1343830902827845050">Chrome-д нэвтрэх</translation>
 <translation id="1344653310988386453">Тодруулсан текстийн холбоосыг багтаах</translation>
 <translation id="1347468774581902829">Үйл ажиллагааг удирдах</translation>
 <translation id="1355088659320425659">Түүх, табууд</translation>
@@ -718,6 +719,7 @@
 <translation id="414128724510021958">Өгөгдмөлөөр хүссэн компьютерын сайтууд</translation>
 <translation id="4162867837470729563">Бүтэн хэмжээтэйгээр хуваалцах сонголтын жагсаалт.</translation>
 <translation id="4170011742729630528">Энэ үйлчилгээг авах боломжгүй байна; Та дараа дахин оролдоно уу.</translation>
+<translation id="4170577491341606575">Таны юмнуудыг авч байна\u2026</translation>
 <translation id="4177222230309051052">Бүх хавчуургаа аваарай</translation>
 <translation id="4177501066905053472">Зарын сэдвүүд</translation>
 <translation id="417865198503699526">Тохиргоо хайх</translation>
@@ -1457,6 +1459,7 @@
 <translation id="7115358764509798967">Системийн өгөгдмөл</translation>
 <translation id="7117485132243600300">Дагадаг контент, санал болгосон сэдэв, хайлтаа удирдана уу</translation>
 <translation id="7119984597597798764"><ph name="INSTANCE_TITLE" />-г хаах</translation>
+<translation id="7121179479711575744">Chrome-д нэвтрэх</translation>
 <translation id="7136902389402789299">{NUM_SITES,plural, =1{1 сайтын зөвшөөрлийг хянасан}other{# сайтын зөвшөөрлийг хянасан}}</translation>
 <translation id="7138678301420049075">Бусад</translation>
 <translation id="7140829094791862589">Гар дарааллаар эрэмбэлэх</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
index c989ba1..7dc3149 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -87,6 +87,7 @@
 <translation id="1336996151357442890">Odjavili ste se s spletnega mesta <ph name="SITE_NAME" />. Ob naslednjem obisku boste znova pozvani.</translation>
 <translation id="1340839264183302272">Zapusti skupino</translation>
 <translation id="1342886103232377846">Če želite preveriti, ali so gesla ogrožena, odprite Googlovega upravitelja gesel</translation>
+<translation id="1343830902827845050">Prijava v Chrome</translation>
 <translation id="1344653310988386453">Vključite povezavo do označitve</translation>
 <translation id="1347468774581902829">Upravljanje dejavnosti</translation>
 <translation id="1355088659320425659">Zgodovina in zavihki</translation>
@@ -718,6 +719,7 @@
 <translation id="414128724510021958">Namizna spletna mesta so privzeto zahtevana</translation>
 <translation id="4162867837470729563">Seznam možnosti deljenja z drugimi je odprt pri polni višini.</translation>
 <translation id="4170011742729630528">Storitev ni na voljo; poskusite znova pozneje.</translation>
+<translation id="4170577491341606575">Pridobivanje vaših stvari \u2026</translation>
 <translation id="4177222230309051052">Zagotovitev vseh zaznamkov</translation>
 <translation id="4177501066905053472">Teme oglasov</translation>
 <translation id="417865198503699526">Poiščite nastavitev</translation>
@@ -1457,6 +1459,7 @@
 <translation id="7115358764509798967">Sistemsko privzeto</translation>
 <translation id="7117485132243600300">Upravljajte vsebino, ki jo spremljate, ter predlagane teme in iskanja</translation>
 <translation id="7119984597597798764">Zapiranje »<ph name="INSTANCE_TITLE" />«</translation>
+<translation id="7121179479711575744">Prijava v Chrome</translation>
 <translation id="7136902389402789299">{NUM_SITES,plural, =1{Dovoljenja so bila pregledana za 1 spletno mesto}one{Dovoljenja so bila pregledana za # spletno mesto}two{Dovoljenja so bila pregledana za # spletni mesti}few{Dovoljenja so bila pregledana za # spletna mesta}other{Dovoljenja so bila pregledana za # spletnih mest}}</translation>
 <translation id="7138678301420049075">Drugo</translation>
 <translation id="7140829094791862589">Razvrsti ročno</translation>
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/HeightTransitionHandler.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/HeightTransitionHandler.java
index a9765a1..d5fc6c7 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/HeightTransitionHandler.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/HeightTransitionHandler.java
@@ -21,6 +21,7 @@
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider.Observer;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsUtils;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsVisibilityManager;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.TabObscuringHandler;
 import org.chromium.chrome.browser.toolbar.ControlContainer;
@@ -505,6 +506,12 @@
             if (threshold > 0) return threshold;
         }
 
+        int minThresholdOverride =
+                ChromeFeatureList.sTopControlsRefactorNarrowWidthTransitionThreshold.getValue();
+        if (minThresholdOverride > 0) {
+            return minThresholdOverride;
+        }
+
         return TRANSITION_THRESHOLD_DP;
     }
 
diff --git a/chrome/browser/ui/ash/test/first_web_contents_profiler_ash_browsertest.cc b/chrome/browser/ui/ash/test/first_web_contents_profiler_ash_browsertest.cc
index 20a5226..1000637 100644
--- a/chrome/browser/ui/ash/test/first_web_contents_profiler_ash_browsertest.cc
+++ b/chrome/browser/ui/ash/test/first_web_contents_profiler_ash_browsertest.cc
@@ -18,12 +18,11 @@
 #include "chrome/browser/ash/app_restore/full_restore_service.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_list.h"
-#include "chrome/browser/ui/browser_list_observer.h"
 #include "chrome/browser/ui/browser_tabstrip.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
 #include "chrome/browser/ui/browser_window/public/browser_window_interface_iterator.h"
+#include "chrome/browser/ui/browser_window/public/global_browser_collection.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/web_contents_observer.h"
@@ -112,7 +111,7 @@
 // Creates browser window that will be restored in the main test.
 IN_PROC_BROWSER_TEST_F(FirstWebContentsProfilerAshTest,
                        PRE_RecordsFirstWebContentsMetricsOnRestore) {
-  ASSERT_TRUE(BrowserList::GetInstance()->empty());
+  ASSERT_TRUE(GlobalBrowserCollection::GetInstance()->IsEmpty());
 
   FirstNonEmptyPaintObserver first_non_empty_paint_observer(
       &histogram_tester_,
diff --git a/chrome/browser/ui/read_anything/read_anything_side_panel_controller_interactive_uitest.cc b/chrome/browser/ui/read_anything/read_anything_side_panel_controller_interactive_uitest.cc
index 3098e19..9be5e61 100644
--- a/chrome/browser/ui/read_anything/read_anything_side_panel_controller_interactive_uitest.cc
+++ b/chrome/browser/ui/read_anything/read_anything_side_panel_controller_interactive_uitest.cc
@@ -30,7 +30,7 @@
 constexpr char kDocumentWithNamedElement[] = "/select.html";
 }  // namespace
 
-class MockReadAnythingSidePanelControllerObserver
+class MockReadAnythingLifecycleObserver
     : public ReadAnythingLifecycleObserver {
  public:
   MOCK_METHOD(void,
@@ -82,7 +82,7 @@
 
  protected:
   bool IsImmersiveEnabled() const { return GetParam(); }
-  MockReadAnythingSidePanelControllerObserver side_panel_controller_observer_;
+  MockReadAnythingLifecycleObserver read_anything_observer_;
 
  private:
   base::test::ScopedFeatureList feature_list_;
@@ -104,7 +104,7 @@
 
 IN_PROC_BROWSER_TEST_P(ReadAnythingSidePanelControllerTest,
                        OnEntryShown_ActivateObservers) {
-  AddObserver(&side_panel_controller_observer_);
+  AddObserver(&read_anything_observer_);
   SidePanelEntry* entry = browser()
                               ->GetActiveTabInterface()
                               ->GetTabFeatures()
@@ -113,7 +113,7 @@
                                   SidePanelEntry::Id::kReadAnything));
   entry->set_last_open_trigger(SidePanelOpenTrigger::kReadAnythingOmniboxChip);
 
-  EXPECT_CALL(side_panel_controller_observer_,
+  EXPECT_CALL(read_anything_observer_,
               Activate(true, std::optional<ReadAnythingOpenTrigger>(
                                  ReadAnythingOpenTrigger::kOmniboxChip)))
       .Times(1);
@@ -122,7 +122,7 @@
 
 IN_PROC_BROWSER_TEST_P(ReadAnythingSidePanelControllerTest,
                        OnEntryHidden_ActivateObservers) {
-  AddObserver(&side_panel_controller_observer_);
+  AddObserver(&read_anything_observer_);
   SidePanelEntry* entry = browser()
                               ->GetActiveTabInterface()
                               ->GetTabFeatures()
@@ -130,16 +130,16 @@
                               ->GetEntryForKey(SidePanelEntry::Key(
                                   SidePanelEntry::Id::kReadAnything));
 
-  EXPECT_CALL(side_panel_controller_observer_, Activate(false, empty_trigger()))
+  EXPECT_CALL(read_anything_observer_, Activate(false, empty_trigger()))
       .Times(1);
   side_panel_controller()->OnEntryHidden(entry);
 }
 
 IN_PROC_BROWSER_TEST_P(ReadAnythingSidePanelControllerTest,
                        TabWillDetach_NotfiyObservers) {
-  AddObserver(&side_panel_controller_observer_);
+  AddObserver(&read_anything_observer_);
 
-  EXPECT_CALL(side_panel_controller_observer_, OnTabWillDetach()).Times(1);
+  EXPECT_CALL(read_anything_observer_, OnTabWillDetach()).Times(1);
   browser()->GetActiveTabInterface()->Close();
 }
 
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
index c389eac..0e48ff2 100644
--- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
+++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
@@ -581,16 +581,18 @@
 
 int OpaqueBrowserFrameView::GetTopAreaHeight() const {
   int top_height = layout_->NonClientTopHeight(false);
-  const gfx::Rect web_app_toolbar_bounds = GetBoundsForWebAppFrameToolbar(
-      GetBrowserView()->GetWebAppFrameToolbarPreferredSize());
-  const bool should_draw_tabstrip = GetBrowserView()->ShouldDrawTabStrip();
-  if (!web_app_toolbar_bounds.IsEmpty()) {
-    top_height = std::max({top_height, web_app_toolbar_bounds.bottom(),
-                           layout_->FrameEdgeInsets(false).top()});
-    if (should_draw_tabstrip) {
+  auto* const browser_view = GetBrowserView();
+  const bool should_draw_tab_strip = browser_view->ShouldDrawTabStrip();
+  const bool is_app = browser_view->browser()->is_type_app() ||
+                      browser_view->browser()->is_type_app_popup();
+  if (is_app) {
+    const gfx::Rect web_app_toolbar_bounds = GetBoundsForWebAppFrameToolbar(
+        GetBrowserView()->GetWebAppFrameToolbarPreferredSize());
+    top_height = std::max(top_height, web_app_toolbar_bounds.bottom());
+    if (should_draw_tab_strip) {
       top_height = std::max(top_height, GetTabstripMinimumSize().height());
     }
-  } else if (should_draw_tabstrip) {
+  } else if (should_draw_tab_strip) {
     top_height =
         std::max(top_height,
                  GetBoundsForTabStripRegion(GetTabstripMinimumSize()).bottom() -
diff --git a/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc b/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc
index e3cfbb8c..b90a0fd9 100644
--- a/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc
+++ b/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc
@@ -60,9 +60,14 @@
 constexpr int kInterceptionChromeSigninBubbleWidth = 320;
 
 AvatarToolbarButton* GetAvatarToolbarButton(const Browser& browser) {
-  return BrowserView::GetBrowserViewForBrowser(&browser)
-      ->toolbar_button_provider()
-      ->GetAvatarToolbarButton();
+  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(&browser);
+  // WebUI Browser does not use BrowserView.
+  // TODO(webium): make a framework-agnostic way to get the avatar button.
+  if (!browser_view) {
+    return nullptr;
+  }
+
+  return browser_view->toolbar_button_provider()->GetAvatarToolbarButton();
 }
 
 std::u16string InterceptionTypeToIdentityPillText(
diff --git a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc
index 218280d..fab55cd 100644
--- a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc
+++ b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.cc
@@ -298,23 +298,17 @@
   return uma_logger_;
 }
 
-void TabSharingUIViews::OnBrowserAdded(Browser* browser) {
+void TabSharingUIViews::OnBrowserCreated(BrowserWindowInterface* browser) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   CHECK(browser);
 
-  if (IsCapturableByCapturer(browser->profile())) {
-    browser->tab_strip_model()->AddObserver(this);
+  if (IsCapturableByCapturer(browser->GetProfile())) {
+    // TODO(crbug.com/452120900): Observer is auto-unregistered by the
+    // TabStripModel destructor.
+    browser->GetTabStripModel()->AddObserver(this);
   }
 }
 
-void TabSharingUIViews::OnBrowserRemoved(Browser* browser) {
-  BrowserList* browser_list = BrowserList::GetInstance();
-  if (browser_list->empty()) {
-    browser_list->RemoveObserver(this);
-  }
-  browser->tab_strip_model()->RemoveObserver(this);
-}
-
 void TabSharingUIViews::OnTabStripModelChanged(
     TabStripModel* tab_strip_model,
     const TabStripModelChange& change,
@@ -414,21 +408,23 @@
 
 void TabSharingUIViews::CreateInfobarsForAllTabs() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  ForEachCurrentBrowserWindowInterfaceOrderedByActivation(
+  GlobalBrowserCollection::GetInstance()->ForEach(
       [this](BrowserWindowInterface* browser) {
         if (!IsCapturableByCapturer(browser->GetProfile())) {
           return true;
         }
 
-        OnBrowserAdded(browser->GetBrowserForMigrationOnly());
+        OnBrowserCreated(browser);
 
         TabStripModel* const tab_strip_model = browser->GetTabStripModel();
         for (int i = 0; i < tab_strip_model->count(); i++) {
           CreateInfobarForWebContents(tab_strip_model->GetWebContentsAt(i));
         }
         return true;
-      });
-  BrowserList::GetInstance()->AddObserver(this);
+      },
+      BrowserCollection::Order::kCreation);
+
+  browser_collection_observer_.Observe(GlobalBrowserCollection::GetInstance());
 #if BUILDFLAG(IS_CHROMEOS)
   // Observe only for managed users.
   if (g_apply_dlp_for_all_users_for_testing_ ||
@@ -529,7 +525,7 @@
 }
 
 void TabSharingUIViews::RemoveInfobarsForAllTabs() {
-  BrowserList::GetInstance()->RemoveObserver(this);
+  browser_collection_observer_.Reset();
   TabStripModelObserver::StopObservingAll(this);
 
   for (const auto& infobars_entry : infobars_) {
diff --git a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.h b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.h
index e345b3a..b3adde5 100644
--- a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.h
+++ b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views.h
@@ -11,9 +11,12 @@
 
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
+#include "base/scoped_observation.h"
 #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
 #include "chrome/browser/media/webrtc/same_origin_observer.h"
-#include "chrome/browser/ui/browser_list_observer.h"
+#include "chrome/browser/ui/browser_window/public/browser_collection_observer.h"
+#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
+#include "chrome/browser/ui/browser_window/public/global_browser_collection.h"
 #include "chrome/browser/ui/tab_sharing/tab_sharing_infobar_delegate.h"
 #include "chrome/browser/ui/tab_sharing/tab_sharing_ui.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
@@ -40,7 +43,7 @@
 class Profile;
 
 class TabSharingUIViews : public TabSharingUI,
-                          public BrowserListObserver,
+                          public BrowserCollectionObserver,
                           public TabStripModelObserver,
                           public infobars::InfoBarManager::Observer,
 #if BUILDFLAG(IS_CHROMEOS)
@@ -81,9 +84,8 @@
   // recording "no-interaction" by the others.
   ScreensharingControlsHistogramLogger& GetUmaLogger() override;
 
-  // BrowserListObserver:
-  void OnBrowserAdded(Browser* browser) override;
-  void OnBrowserRemoved(Browser* browser) override;
+  // BrowserCollectionObserver:
+  void OnBrowserCreated(BrowserWindowInterface* browser) override;
 
   // TabStripModelObserver:
   void OnTabStripModelChanged(
@@ -218,6 +220,9 @@
   bool captured_surface_control_active_ = false;
   std::unique_ptr<CapturedSurfaceControlObserver> csc_observer_;
 
+  base::ScopedObservation<GlobalBrowserCollection, BrowserCollectionObserver>
+      browser_collection_observer_{this};
+
   ScreensharingControlsHistogramLogger uma_logger_;
 };
 
diff --git a/chrome/browser/ui/webui/policy/policy_ui_handler.cc b/chrome/browser/ui/webui/policy/policy_ui_handler.cc
index 540d93a..a3f228a 100644
--- a/chrome/browser/ui/webui/policy/policy_ui_handler.cc
+++ b/chrome/browser/ui/webui/policy/policy_ui_handler.cc
@@ -55,7 +55,6 @@
 #include "components/crx_file/id_util.h"
 #include "components/enterprise/browser/controller/browser_dm_token_storage.h"
 #include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
-#include "components/enterprise/browser/promotion/promotion_eligibility_checker.h"
 #include "components/enterprise/browser/reporting/common_pref_names.h"
 #include "components/policy/core/browser/configuration_policy_handler_list.h"
 #include "components/policy/core/browser/policy_conversions.h"
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index aecfbdda..c535244 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -2384,7 +2384,19 @@
       {"securityPasswordsLeakDetectionTitle",
        IDS_SETTINGS_SECURITY_PASSWORDS_LEAK_DETECTION_TITLE},
       {"securityPasswordsLeakDetectionDesc",
-       IDS_SETTINGS_SECURITY_PASSWORDS_LEAK_DETECTION_DESC}};
+       IDS_SETTINGS_SECURITY_PASSWORDS_LEAK_DETECTION_DESC},
+      {"securityHttpsFirstModeToggleLabel",
+       IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_TOGGLE_LABEL},
+      {"securityHttpsFirstModeToggleSublabel",
+       IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_TOGGLE_SUBLABEL},
+      {"securityHttpsFirstModeBalancedLabel",
+       IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_BALANCED_LABEL},
+      {"securityHttpsFirstModeBalancedSublabel",
+       IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_BALANCED_SUBLABEL},
+      {"securityHttpsFirstModeStrictLabel",
+       IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_STRICT_LABEL},
+      {"securityHttpsFirstModeStrictSublabel",
+       IDS_SETTINGS_SECURITY_HTTPS_FIRST_MODE_STRICT_SUBLABEL}};
   html_source->AddLocalizedStrings(kLocalizedStrings);
 
   html_source->AddString("cookiesSettingsHelpCenterURL",
diff --git a/chrome/browser/ui/webui/updater/updater_ui.cc b/chrome/browser/ui/webui/updater/updater_ui.cc
index f801f26..6f4f8cd9 100644
--- a/chrome/browser/ui/webui/updater/updater_ui.cc
+++ b/chrome/browser/ui/webui/updater/updater_ui.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ui/webui/updater/updater_ui.h"
 
 #include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/generated_resources.h"
 #include "chrome/grit/updater_resources.h"
 #include "chrome/grit/updater_resources_map.h"
 #include "content/public/browser/browser_context.h"
@@ -18,6 +19,7 @@
   content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd(
       web_ui->GetWebContents()->GetBrowserContext(),
       chrome::kChromeUIUpdaterHost);
+  source->AddLocalizedString("viewRawDetails", IDS_UPDATER_VIEW_RAW_DETAILS);
 
   webui::SetupWebUIDataSource(source, kUpdaterResources,
                               IDR_UPDATER_UPDATER_HTML);
diff --git a/chrome/browser/ui/window_sizer/window_sizer_chromeos.cc b/chrome/browser/ui/window_sizer/window_sizer_chromeos.cc
index b0cd7e2..e91ad27b 100644
--- a/chrome/browser/ui/window_sizer/window_sizer_chromeos.cc
+++ b/chrome/browser/ui/window_sizer/window_sizer_chromeos.cc
@@ -9,8 +9,8 @@
 #include "base/command_line.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/browser_window/public/global_browser_collection.h"
 #include "chrome/browser/ui/web_applications/app_browser_controller.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
@@ -162,7 +162,8 @@
   if (browser()->is_session_restore()) {
     // Respect display for saved bounds during session restore.
     display = display::Screen::Get()->GetDisplayMatching(*bounds_in_screen);
-  } else if (BrowserList::GetInstance()->empty() && !is_saved_bounds &&
+  } else if (GlobalBrowserCollection::GetInstance()->IsEmpty() &&
+             !is_saved_bounds &&
              (ShouldForceMaximizeOnFirstRun(browser()->profile()) ||
               (display.work_area().width() <= kForceMaximizeWidthLimit &&
                !command_line->HasSwitch(
diff --git a/chrome/browser/web_applications/os_integration/mac/app_shim_registry.cc b/chrome/browser/web_applications/os_integration/mac/app_shim_registry.cc
index 4564d2f..0a02fad 100644
--- a/chrome/browser/web_applications/os_integration/mac/app_shim_registry.cc
+++ b/chrome/browser/web_applications/os_integration/mac/app_shim_registry.cc
@@ -378,14 +378,8 @@
 void AppShimRegistry::DoSaveCdHashForApp(const std::string& app_id,
                                          std::vector<uint8_t> cd_hash,
                                          os_crypt_async::Encryptor encryptor) {
-  HmacKey hmac_key = GetCdHashHmacKey(encryptor);
-  crypto::HMAC hmac(crypto::HMAC::SHA256);
-  CHECK(hmac.Init(hmac_key));
-
-  std::array<uint8_t, 32> cd_hash_hmac;
-  CHECK(hmac.Sign(cd_hash, cd_hash_hmac));
-
-  std::string cd_hash_hmac_base64 = base::Base64Encode(cd_hash_hmac);
+  std::string cd_hash_hmac_base64 = base::Base64Encode(
+      crypto::hmac::SignSha256(GetCdHashHmacKey(encryptor), cd_hash));
   SetAppInfo(app_id, /*installed_profiles=*/nullptr,
              /*last_active_profiles=*/nullptr, /*handlers=*/nullptr,
              &cd_hash_hmac_base64,
@@ -428,10 +422,15 @@
     return false;
   }
 
-  HmacKey hmac_key = GetCdHashHmacKey(encryptor);
-  crypto::HMAC hmac(crypto::HMAC::SHA256);
-  CHECK(hmac.Init(hmac_key));
-  return hmac.Verify(cd_hash, *cd_hash_hmac);
+  auto cd_hash_hmac_span =
+      base::span(*cd_hash_hmac).to_fixed_extent<crypto::hash::kSha256Size>();
+  if (!cd_hash_hmac_span) {
+    LOG(WARNING) << "App shim's code directory hash is unexpected size";
+    return false;
+  }
+
+  return crypto::hmac::VerifySha256(GetCdHashHmacKey(encryptor), cd_hash,
+                                    *cd_hash_hmac_span);
 }
 
 void AppShimRegistry::SaveNotificationPermissionStatusForApp(
diff --git a/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc b/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc
index 01f674d..9f86d05 100644
--- a/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc
+++ b/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc
@@ -14,6 +14,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/scoped_logging_settings.h"
+#include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/password_manager/profile_password_store_factory.h"
 #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
@@ -283,6 +284,41 @@
             }));
   }
 
+  base::WeakPtr<autofill::AutofillSuggestionController>
+  GetSuggestionsControllerForWebContents(content::WebContents* web_contents) {
+    return autofill::ChromeAutofillClient::FromWebContentsForTesting(
+               web_contents)
+        ->suggestion_controller_for_testing();
+  }
+
+  bool HasWebauthnSuggestionInPopup(content::WebContents* web_contents) {
+    base::WeakPtr<autofill::AutofillSuggestionController>
+        suggestion_controller =
+            GetSuggestionsControllerForWebContents(web_contents);
+    if (!suggestion_controller) {
+      return false;  // No popup is open.
+    }
+    return std::ranges::count(suggestion_controller->GetSuggestions(),
+                              autofill::SuggestionType::kWebauthnCredential,
+                              &autofill::Suggestion::type) != 0;
+  }
+
+  // Interact with the username field until the popup shows up. This has the
+  // effect of waiting for the browser to send the renderer the password
+  // information, and waiting for the UI to render.
+  void TapUsernameFieldUntilPopupWithWebauthnSuggestionAppears(
+      content::WebContents* web_contents) {
+    base::TimeTicks start_time = base::TimeTicks::Now();
+    while (!HasWebauthnSuggestionInPopup(web_contents)) {
+      if (base::TimeTicks::Now() - start_time > base::Seconds(2)) {
+        ASSERT_TRUE(GetSuggestionsControllerForWebContents(web_contents))
+            << "Timed out waiting for suggestion popup.";
+        FAIL() << "Timed out waiting for WebAuthn suggestion in popup.";
+      }
+      content::SimulateMouseClickOrTapElementWithId(web_contents, "username");
+    }
+  }
+
   void RunSelectAccountTest(const char* request) {
     // Make sure input events cannot close the autofill popup.
     content::WebContents* web_contents =
@@ -297,19 +333,14 @@
 
     delegate_observer_->WaitForUI();
 
-    // Interact with the username field until the popup shows up. This has the
-    // effect of waiting for the browser to send the renderer the password
-    // information, and waiting for the UI to render.
-    base::WeakPtr<autofill::AutofillSuggestionController> suggestion_controller;
-    while (!suggestion_controller) {
-      content::SimulateMouseClickOrTapElementWithId(web_contents, "username");
-      suggestion_controller =
-          autofill_client->suggestion_controller_for_testing();
-    }
+    TapUsernameFieldUntilPopupWithWebauthnSuggestionAppears(web_contents);
+    base::WeakPtr<autofill::AutofillSuggestionController>
+        suggestion_controller =
+            autofill_client->suggestion_controller_for_testing();
+    const std::vector<autofill::Suggestion>& suggestions =
+        suggestion_controller->GetSuggestions();
 
     // Find the webauthn credential on the suggestions list.
-    std::vector<autofill::Suggestion> suggestions =
-        suggestion_controller->GetSuggestions();
     auto it = std::ranges::find(suggestions,
                                 autofill::SuggestionType::kWebauthnCredential,
                                 &autofill::Suggestion::type);
@@ -348,18 +379,13 @@
 
     delegate_observer_->WaitForUI();
 
-    // Interact with the username field until the popup shows up. This has the
-    // effect of waiting for the browser to send the renderer the password
-    // information, and waiting for the UI to render.
-    base::WeakPtr<autofill::AutofillSuggestionController> suggestion_controller;
-    while (!suggestion_controller) {
-      content::SimulateMouseClickOrTapElementWithId(web_contents, "username");
-      suggestion_controller =
-          autofill_client->suggestion_controller_for_testing();
-    }
+    TapUsernameFieldUntilPopupWithWebauthnSuggestionAppears(web_contents);
+    base::WeakPtr<autofill::AutofillSuggestionController>
+        suggestion_controller =
+            autofill_client->suggestion_controller_for_testing();
 
     // Find the webauthn credential on the suggestions list.
-    std::vector<autofill::Suggestion> suggestions =
+    const std::vector<autofill::Suggestion>& suggestions =
         suggestion_controller->GetSuggestions();
     auto it = std::ranges::find(suggestions,
                                 autofill::SuggestionType::kWebauthnCredential,
diff --git a/chrome/browser/webauthn/chrome_webauthn_autofill_mac_interactive_uitest.mm b/chrome/browser/webauthn/chrome_webauthn_autofill_mac_interactive_uitest.mm
index e442ebd..471a3bc 100644
--- a/chrome/browser/webauthn/chrome_webauthn_autofill_mac_interactive_uitest.mm
+++ b/chrome/browser/webauthn/chrome_webauthn_autofill_mac_interactive_uitest.mm
@@ -119,7 +119,15 @@
   // effect of waiting for the browser to send the renderer the password
   // information, and waiting for the UI to render.
   base::WeakPtr<autofill::AutofillSuggestionController> controller;
-  while (!controller) {
+  base::TimeTicks start_time = base::TimeTicks::Now();
+  while (!controller ||
+         std::ranges::count(controller->GetSuggestions(),
+                            autofill::SuggestionType::kWebauthnCredential,
+                            &autofill::Suggestion::type) == 0) {
+    if (base::TimeTicks::Now() - start_time > base::Seconds(2)) {
+      ASSERT_TRUE(controller) << "Timed out waiting for suggestion popup.";
+      FAIL() << "Timed out waiting for WebAuthn suggestion in popup.";
+    }
     content::SimulateMouseClickOrTapElementWithId(web_contents, "username");
     controller = autofill_client->suggestion_controller_for_testing();
   }
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 1d98ea3..d4d620dd 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1765195063-f0f6d87e7b28478a29d42365c049b9c02618800b-3457ecae229e55e3260f1b3210acda332e80a8a5.profdata
+chrome-mac-arm-main-1765209580-321d3febb640f6503e4fce42aca049cbeab85063-39eaf5d690fdbcc894aa89cb8cc25dfb01758f1c.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 4543180..b80c3f6 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1765173445-1158ecae655b1a894fcf24a8866bba524ec947e2-89e15c703a7f2034682e32241e39909027a35428.profdata
+chrome-mac-main-1765195063-52d5b28b4bfcbb1cc934ace295c4be21399bab69-3457ecae229e55e3260f1b3210acda332e80a8a5.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 4bd4686..fb18a548a 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1765173445-fd311b18a0cff0a21f3e5c3a6e91d70bf9630bb5-89e15c703a7f2034682e32241e39909027a35428.profdata
+chrome-win32-main-1765184391-6a8f29080c8765abb4128f975d37f23d94c9218d-5e245df55a8b32a6580838a85394195a8ed70d78.profdata
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/CtaPageStation.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/CtaPageStation.java
index d0c781b..ee05b06 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/CtaPageStation.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/CtaPageStation.java
@@ -13,6 +13,7 @@
 import android.view.View;
 import android.widget.ImageButton;
 
+import org.chromium.base.test.transit.OptionalViewElement;
 import org.chromium.base.test.transit.TripBuilder;
 import org.chromium.base.test.transit.ViewElement;
 import org.chromium.base.test.transit.ViewSpec;
@@ -45,9 +46,10 @@
  */
 public class CtaPageStation extends BasePageStation<ChromeTabbedActivity> {
     public static final ViewSpec<UrlBar> URL_BAR = viewSpec(UrlBar.class, withId(R.id.url_bar));
-    public ViewElement<ToolbarControlContainer> toolbarElement;
-    public ViewElement<ToggleTabStackButton> tabSwitcherButtonElement;
-    public ViewElement<ImageButton> menuButtonElement;
+    public final OptionalViewElement<View> homeButtonElement;
+    public final ViewElement<ToolbarControlContainer> toolbarElement;
+    public final ViewElement<ToggleTabStackButton> tabSwitcherButtonElement;
+    public final ViewElement<ImageButton> menuButtonElement;
 
     /** Prefer the CtaPageStation's subclass |newBuilder()|. */
     public static Builder<CtaPageStation> newGenericBuilder() {
@@ -70,8 +72,6 @@
                         ToolbarControlContainer.class,
                         withId(R.id.control_container),
                         ViewElement.unscopedOption());
-        // TODO(crbug.com/416324280): Declare the HomeButton with R.id.home_button as an optional
-        //  ViewElement.
         tabSwitcherButtonElement =
                 declareView(
                         ToggleTabStackButton.class,
@@ -80,6 +80,10 @@
         menuButtonElement =
                 declareView(
                         ImageButton.class, withId(R.id.menu_button), ViewElement.unscopedOption());
+
+        // The home button may not appear in tablets if the available screen size is too small.
+        homeButtonElement =
+                declareOptionalView(withId(R.id.home_button), ViewElement.unscopedOption());
     }
 
     /** Long presses the tab switcher button to open the action menu. */
diff --git a/chrome/test/data/webui/contextual_tasks/contextual_tasks_browsertest.ts b/chrome/test/data/webui/contextual_tasks/contextual_tasks_browsertest.ts
index a09c2fe..3825200a 100644
--- a/chrome/test/data/webui/contextual_tasks/contextual_tasks_browsertest.ts
+++ b/chrome/test/data/webui/contextual_tasks/contextual_tasks_browsertest.ts
@@ -34,7 +34,7 @@
     assertEquals(await proxy.handler.getCallCount('getThreadUrl'), 1);
   });
 
-  test('gets task url when query param set', async () => {
+  test('gets task url when query param set and updates title', async () => {
     // Set a task Uuid as a query parameter.
     const taskId = '123';
     window.history.replaceState({}, '', `?task=${taskId}`);
@@ -52,6 +52,36 @@
     assertDeepEquals(
         await proxy.handler.whenCalled('setTaskId'), {value: taskId});
     assertEquals(await proxy.handler.whenCalled('setThreadTitle'), query);
+
+    proxy.callbackRouterRemote.setThreadTitle(query);
+    await proxy.callbackRouterRemote.$.flushForTesting();
+    await microtasksFinished();
+
+    assertEquals(document.title, query);
+  });
+
+  test('sets title to default string when query param is not set', async () => {
+    // Set a task Uuid as a query parameter.
+    const taskId = '123';
+    window.history.replaceState({}, '', `?task=${taskId}`);
+
+    // Don't set the q query parameter for the AI page.
+    const proxy = new TestContextualTasksBrowserProxy(fixtureUrl);
+    BrowserProxyImpl.setInstance(proxy);
+
+    document.body.appendChild(document.createElement('contextual-tasks-app'));
+
+    assertDeepEquals(
+        await proxy.handler.whenCalled('getUrlForTask'), {value: taskId});
+    assertDeepEquals(
+        await proxy.handler.whenCalled('setTaskId'), {value: taskId});
+    assertEquals(await proxy.handler.whenCalled('setThreadTitle'), '');
+
+    proxy.callbackRouterRemote.setThreadTitle('');
+    await proxy.callbackRouterRemote.$.flushForTesting();
+    await microtasksFinished();
+
+    assertEquals(document.title, 'AI Mode');
   });
 
   test('toolbar visibility changes for tab and side panel', async () => {
diff --git a/chrome/test/data/webui/settings/security_page_v2_test.ts b/chrome/test/data/webui/settings/security_page_v2_test.ts
index 217cf78a..95a2b37 100644
--- a/chrome/test/data/webui/settings/security_page_v2_test.ts
+++ b/chrome/test/data/webui/settings/security_page_v2_test.ts
@@ -5,7 +5,7 @@
 // clang-format off
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import type {CrExpandButtonElement, SettingsSecurityPageV2Element} from 'chrome://settings/lazy_load.js';
-import {SafeBrowsingSetting, SecuritySettingsBundleSetting} from 'chrome://settings/lazy_load.js';
+import {HttpsFirstModeSetting, SafeBrowsingSetting, SecuritySettingsBundleSetting} from 'chrome://settings/lazy_load.js';
 import type {SettingsPrefsElement} from 'chrome://settings/settings.js';
 import type {ControlledRadioButtonElement} from 'chrome://settings/settings.js';
 import {CrSettingsPrefs, HatsBrowserProxyImpl, loadTimeData, MetricsBrowserProxyImpl, OpenWindowProxyImpl, PrivacyElementInteractions, Router, routes, SecurityPageV2Interaction} from 'chrome://settings/settings.js';
@@ -151,6 +151,51 @@
     assertFalse(isVisible(page.$.resetEnhancedBundleToDefaultsButton));
   });
 
+  test('HttpsFirstModeRowRadioButtonsDisabledWhenOff', async function() {
+    page.setPrefValue(
+        'generated.https_first_mode_enabled', HttpsFirstModeSetting.DISABLED);
+    await flushTasks();
+
+    // The toggle is set to OFF because HTTPS First Mode is DISABLED.
+    const toggle = page.$.httpsFirstModeToggle;
+    assertFalse(toggle.checked, 'Toggle should be set to off');
+
+    // The radio buttons are disabled because HTTPS First Mode is DISABLED.
+    const balancedButton = page.$.httpsFirstModeEnabledBalanced;
+    assertTrue(
+        balancedButton.disabled, 'Balanced radio button should be disabled');
+    const strictButton = page.$.httpsFirstModeEnabledStrict;
+    assertTrue(strictButton.disabled, 'Strict radio button should be disabled');
+
+    toggle.click();
+    await flushTasks();
+
+    // The toggle is set to ON, so the radio buttons are now enabled.
+    assertFalse(
+        balancedButton.disabled, 'Balanced radio button should be enabled');
+    assertFalse(strictButton.disabled, 'Strict radio button should be enabled');
+  });
+
+  test('HttpsFirstModeDefaultBalancedWhenToggledOn', async function() {
+    page.setPrefValue(
+        'generated.https_first_mode_enabled', HttpsFirstModeSetting.DISABLED);
+    await flushTasks();
+
+    // The toggle is set to OFF because HTTPS First Mode is DISABLED.
+    const toggle = page.$.httpsFirstModeToggle;
+    assertFalse(toggle.checked, 'Toggle should be OFF');
+
+    toggle.click();
+    await flushTasks();
+    assertTrue(toggle.checked, 'Toggle should be ON');
+
+    // The pref should default to ENABLED_BALANCED.
+    assertEquals(
+        HttpsFirstModeSetting.ENABLED_BALANCED,
+        page.getPref('generated.https_first_mode_enabled').value,
+        'HTTPS First Mode should default to ENABLED_BALANCED when enabled');
+  });
+
   test('PasswordsLeakDetectionClickTogglesSetting', async function() {
     page.setPrefValue('generated.password_leak_detection', true);
 
diff --git a/chrome/test/variations/drivers/chromeos.py b/chrome/test/variations/drivers/chromeos.py
index 47c6606..5436fc3 100644
--- a/chrome/test/variations/drivers/chromeos.py
+++ b/chrome/test/variations/drivers/chromeos.py
@@ -38,6 +38,10 @@
 CACHE_DIR = os.path.join(SRC_DIR, "build", "cros_cache")
 INITIAL_WAIT_TIME_SECONDS = 10
 
+# Wait time after loading a page to allow the scrollbar to disappear before
+# taking a screenshot.
+SCREENSHOT_WAIT_TIME_SECONDS = 5
+
 
 class _PossibleCrOSBrowser(cros_browser_finder.PossibleCrOSBrowser):
   """The CrOS browser wrapper to filter out start-up args."""
@@ -180,6 +184,10 @@
       tunnel.terminate()
 
   #override
+  def wait_for_screenshot(self):
+    time.sleep(SCREENSHOT_WAIT_TIME_SECONDS)
+
+  #override
   @contextmanager
   def create_driver(
     self,
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb
index 85ba378..b66025ca 100644
--- a/chromeos/strings/chromeos_strings_mn.xtb
+++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -188,7 +188,7 @@
 <translation id="1703835215927279855">Захидал</translation>
 <translation id="1706391837335750954">DNS тайлагчийг үзүүлэх</translation>
 <translation id="1708602061922134366">Google-н цэнхэр</translation>
-<translation id="1710499924611012470">Хандалтын навигац</translation>
+<translation id="1710499924611012470">Хүртээмжтэй навигац</translation>
 <translation id="1715359911173058521">Сканнертай холбогдоход асуудал гарлаа. Сүлжээ эсвэл USB холболтыг шалгаад, дахин оролдоно уу.</translation>
 <translation id="1717874160321062422"><ph name="FIRST_MANAGER" /> болон <ph name="SECOND_MANAGER" />-р удирддаг</translation>
 <translation id="1718553040985966377">нуур</translation>
@@ -820,7 +820,7 @@
 <translation id="4562494484721939086">Үйлчилгээ байхгүй</translation>
 <translation id="4570558255126759859">Бичлэгийг хураангуйлахын тулд Gemini-н загварыг татах уу?</translation>
 <translation id="4573777384450697571">Амжилтгүй болсон - Сертификатын хугацаа дууссан</translation>
-<translation id="4575450106703099687">хандалтын сонголтууд</translation>
+<translation id="4575450106703099687">хүртээмжийн сонголтууд</translation>
 <translation id="458794348635939462">Бүх хостыг шийдвэрлэж чадсангүй</translation>
 <translation id="4593212453765072419">Проксиг баталгаажуулах шаардлагатай</translation>
 <translation id="4594021849294327751">Сийрүүлэг үүсгэх</translation>
diff --git a/clank b/clank
index fe18f15..67e6fd8 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit fe18f1532fab7fddfaac4b6fb1b53dd222e0a532
+Subproject commit 67e6fd873fde1ac55a0929ce4c057d52e7405449
diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager.cc b/components/autofill/core/browser/foundations/browser_autofill_manager.cc
index a8fdb99..16e3144 100644
--- a/components/autofill/core/browser/foundations/browser_autofill_manager.cc
+++ b/components/autofill/core/browser/foundations/browser_autofill_manager.cc
@@ -1726,10 +1726,8 @@
          eligible_features) {
       switch (eligible_feature) {
         case AmountExtractionManager::EligibleFeature::kBnpl:
-          if (base::FeatureList::IsEnabled(
+          if (!base::FeatureList::IsEnabled(
                   features::kAutofillEnableAiBasedAmountExtraction)) {
-            GetAmountExtractionManager().FetchAiPageContent();
-          } else {
             GetPaymentsBnplManager()->NotifyOfSuggestionGeneration(
                 trigger_source);
             GetAmountExtractionManager().TriggerCheckoutAmountExtraction();
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 610688d7a..104d0119 100644
--- a/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc
@@ -984,7 +984,6 @@
         .WillByDefault(Return(true));
   }
 
-  MOCK_METHOD(void, FetchAiPageContent, (), (override));
   MOCK_METHOD(DenseSet<EligibleFeature>,
               GetEligibleFeatures,
               (bool is_autofill_payments_enabled,
@@ -3411,117 +3410,6 @@
   EXPECT_FALSE(external_delegate()->on_suggestions_returned_seen());
 }
 
-// Tests that `AmountExtractionManager` should trigger `FetchAiPageContent` if
-// a credit card form is clicked when BNPL is available.
-TEST_F(BrowserAutofillManagerTest, AiAmountExtraction_TriggerPageContentFetch) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitWithFeatures(
-      /*enabled_features=*/{features::kAutofillEnableAmountExtraction,
-                            features::kAutofillEnableBuyNowPayLaterSyncing,
-                            features::kAutofillEnableBuyNowPayLater,
-                            features::kAutofillEnableAiBasedAmountExtraction},
-      /*disabled_features=*/{});
-  personal_data().test_payments_data_manager().AddBnplIssuer(
-      test::GetTestUnlinkedBnplIssuer());
-  // Set up our form data.
-  FormData form =
-      CreateTestCreditCardFormData(/*is_https=*/true, /*use_month_type=*/false);
-  FormsSeen({form});
-
-  // Test case for credit-card-number field.
-  const FormFieldData& card_number_field = form.fields()[1];
-  ASSERT_EQ(card_number_field.name(), u"cardnumber");
-
-  DenseSet<MockAmountExtractionManager::EligibleFeature> features = {
-      MockAmountExtractionManager::EligibleFeature::kBnpl};
-  ON_CALL(amount_extraction_manager(), GetEligibleFeatures)
-      .WillByDefault(Return(features));
-
-  if constexpr (BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
-                BUILDFLAG(IS_CHROMEOS)) {
-    EXPECT_CALL(amount_extraction_manager(), FetchAiPageContent);
-  }
-  EXPECT_CALL(amount_extraction_manager(), TriggerCheckoutAmountExtraction)
-      .Times(0);
-
-  OnAskForValuesToFill(form, card_number_field);
-
-  // Verify that suggestions are returned as normal.
-  EXPECT_TRUE(external_delegate()->on_suggestions_returned_seen());
-}
-
-// Tests that `AmountExtractionManager` should not trigger `FetchAiPageContent`
-// if a credit card form is clicked but the feature flag
-// `kAutofillEnableAiBasedAmountExtraction` is disabled.
-TEST_F(BrowserAutofillManagerTest, AiAmountExtractionFeatureDisabled) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitWithFeatures(
-      /*enabled_features=*/{features::kAutofillEnableAmountExtraction,
-                            features::kAutofillEnableBuyNowPayLaterSyncing,
-                            features::kAutofillEnableBuyNowPayLater},
-      /*disabled_features=*/{features::kAutofillEnableAiBasedAmountExtraction});
-  personal_data().test_payments_data_manager().AddBnplIssuer(
-      test::GetTestUnlinkedBnplIssuer());
-  // Set up our form data.
-  FormData form =
-      CreateTestCreditCardFormData(/*is_https=*/true, /*use_month_type=*/false);
-  FormsSeen({form});
-
-  // Test case for credit-card-number field.
-  const FormFieldData& card_number_field = form.fields()[1];
-  ASSERT_EQ(card_number_field.name(), u"cardnumber");
-
-  DenseSet<MockAmountExtractionManager::EligibleFeature> features = {
-      MockAmountExtractionManager::EligibleFeature::kBnpl};
-  ON_CALL(amount_extraction_manager(), GetEligibleFeatures)
-      .WillByDefault(Return(features));
-
-  EXPECT_CALL(amount_extraction_manager(), FetchAiPageContent).Times(0);
-  EXPECT_CALL(amount_extraction_manager(), TriggerCheckoutAmountExtraction);
-  EXPECT_CALL(*autofill_manager().GetPaymentsBnplManager(),
-              NotifyOfSuggestionGeneration);
-
-  OnAskForValuesToFill(form, card_number_field);
-
-  // Verify that suggestions are returned as normal.
-  EXPECT_TRUE(external_delegate()->on_suggestions_returned_seen());
-}
-
-// Tests that `AmountExtractionManager` should not trigger `FetchAiPageContent`
-// if a credit card form is clicked but there is no BNPL suggestion.
-TEST_F(BrowserAutofillManagerTest,
-       AiAmountExtraction_TriggerPageContentFetch_WithoutBnplSuggestion) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitWithFeatures(
-      /*enabled_features=*/{features::kAutofillEnableAmountExtraction,
-                            features::kAutofillEnableBuyNowPayLaterSyncing,
-                            features::kAutofillEnableBuyNowPayLater,
-                            features::kAutofillEnableAiBasedAmountExtraction},
-      /*disabled_features=*/{});
-  // Set up our form data.
-  FormData form =
-      CreateTestCreditCardFormData(/*is_https=*/true, /*use_month_type=*/false);
-  FormsSeen({form});
-
-  // Test case for credit-card-number field.
-  const FormFieldData& card_number_field = form.fields()[1];
-  ASSERT_EQ(card_number_field.name(), u"cardnumber");
-
-  // Verify that `FetchAiPageContent` won't be triggered as there is no BNPL
-  // suggestion. This test case is set up by do not add any BNPL issuer to the
-  // `PaymentsDataManager`.
-  EXPECT_CALL(amount_extraction_manager(), FetchAiPageContent).Times(0);
-
-  ON_CALL(amount_extraction_manager(), GetEligibleFeatures)
-      .WillByDefault(
-          Return(DenseSet<MockAmountExtractionManager::EligibleFeature>{}));
-
-  OnAskForValuesToFill(form, card_number_field);
-
-  // Verify that suggestions are returned as normal.
-  EXPECT_TRUE(external_delegate()->on_suggestions_returned_seen());
-}
-
 struct LogAblationTestParams {
   const char* description;
   // Whether any autofillable data is stored.
diff --git a/components/autofill/core/browser/integrators/one_time_tokens/metrics/otp_form_event_logger_unittest.cc b/components/autofill/core/browser/integrators/one_time_tokens/metrics/otp_form_event_logger_unittest.cc
index ac0bb11e..c43e0a72 100644
--- a/components/autofill/core/browser/integrators/one_time_tokens/metrics/otp_form_event_logger_unittest.cc
+++ b/components/autofill/core/browser/integrators/one_time_tokens/metrics/otp_form_event_logger_unittest.cc
@@ -12,6 +12,8 @@
 #include "components/autofill/core/browser/metrics/ukm_metrics_test_utils.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
 #include "components/autofill/core/common/signatures.h"
+#include "components/one_time_tokens/core/browser/one_time_token.h"
+#include "components/one_time_tokens/core/browser/one_time_token_retrieval_error.h"
 #include "components/one_time_tokens/core/browser/one_time_token_service_impl.h"
 #include "components/one_time_tokens/core/browser/sms_otp_backend.h"
 #include "components/password_manager/core/browser/features/password_features.h"
@@ -36,10 +38,13 @@
   MockSmsOtpBackend() = default;
   ~MockSmsOtpBackend() override = default;
 
-  MOCK_METHOD(void,
-              RetrieveSmsOtp,
-              (base::OnceCallback<void(const one_time_tokens::OtpFetchReply&)>),
-              (override));
+  MOCK_METHOD(
+      void,
+      RetrieveSmsOtp,
+      (base::OnceCallback<
+          void(base::expected<one_time_tokens::OneTimeToken,
+                              one_time_tokens::OneTimeTokenRetrievalError>)>),
+      (override));
 };
 
 class OtpFormEventLoggerIntegrationTest
@@ -136,25 +141,24 @@
   void SetupMockedOtpResponse(bool returns_otp) {
     MockSmsOtpBackend* backend =
         static_cast<MockSmsOtpBackend*>(autofill_client().GetSmsOtpBackend());
-    one_time_tokens::OtpFetchReply reply = CreateOtpFetchReply(returns_otp);
     EXPECT_CALL(*backend, RetrieveSmsOtp)
-        .WillRepeatedly([this, returns_otp, reply](auto callback) {
+        .WillRepeatedly([this, returns_otp](auto callback) {
           if (returns_otp) {
             autofill_manager().GetOtpFormEventLogger().OnOtpAvailable();
           }
-          std::move(callback).Run(reply);
+          std::move(callback).Run(CreateOtpResult(returns_otp));
         });
   }
 
-  one_time_tokens::OtpFetchReply CreateOtpFetchReply(bool returns_otp) {
-    std::optional<one_time_tokens::OneTimeToken> token;
+  base::expected<one_time_tokens::OneTimeToken,
+                 one_time_tokens::OneTimeTokenRetrievalError>
+  CreateOtpResult(bool returns_otp) {
     if (returns_otp) {
-      token = one_time_tokens::OneTimeToken(
+      return one_time_tokens::OneTimeToken(
           one_time_tokens::OneTimeTokenType::kSmsOtp, "123456",
           base::Time::Now());
     }
-
-    return one_time_tokens::OtpFetchReply(token, /*request_complete=*/true);
+    return base::unexpected(one_time_tokens::OneTimeTokenRetrievalError());
   }
 
   void VerifyInteractedWithFormUkmMetric(
diff --git a/components/autofill/core/browser/integrators/one_time_tokens/otp_manager_impl_unittest.cc b/components/autofill/core/browser/integrators/one_time_tokens/otp_manager_impl_unittest.cc
index 5d9bde9..c062b38 100644
--- a/components/autofill/core/browser/integrators/one_time_tokens/otp_manager_impl_unittest.cc
+++ b/components/autofill/core/browser/integrators/one_time_tokens/otp_manager_impl_unittest.cc
@@ -19,6 +19,7 @@
 #include "components/autofill/core/common/autofill_test_utils.h"
 #include "components/autofill/core/common/form_data.h"
 #include "components/one_time_tokens/core/browser/one_time_token.h"
+#include "components/one_time_tokens/core/browser/one_time_token_retrieval_error.h"
 #include "components/one_time_tokens/core/browser/one_time_token_service_impl.h"
 #include "components/one_time_tokens/core/browser/sms_otp_backend.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -44,10 +45,13 @@
 
 class MockSmsOtpBackend : public one_time_tokens::SmsOtpBackend {
  public:
-  MOCK_METHOD(void,
-              RetrieveSmsOtp,
-              (base::OnceCallback<void(const one_time_tokens::OtpFetchReply&)>),
-              (override));
+  MOCK_METHOD(
+      void,
+      RetrieveSmsOtp,
+      (base::OnceCallback<
+          void(base::expected<one_time_tokens::OneTimeToken,
+                              one_time_tokens::OneTimeTokenRetrievalError>)>),
+      (override));
 };
 
 class MockOtpPhishGuardDelegate : public OtpPhishGuardDelegate {
@@ -93,14 +97,6 @@
             kAutofillAiModel);
   }
 
-  one_time_tokens::OtpFetchReply GetDefaultOtpFetchReply() {
-    return one_time_tokens::OtpFetchReply(
-        one_time_tokens::OneTimeToken(
-            one_time_tokens::OneTimeTokenType::kSmsOtp, kDefaultOtpValue,
-            base::Time::Now()),
-        /*request_complete=*/true);
-  }
-
   void AddFormWithOtpField() {
     FormDescription form_description = {
         .fields = {
@@ -158,9 +154,10 @@
   OtpManagerImpl otp_manager(autofill_manager(), &one_time_token_service_);
 
   // Prepare the handling of SMS requests from the SMS backend.
-  one_time_tokens::OtpFetchReply reply = GetDefaultOtpFetchReply();
+  one_time_tokens::OneTimeToken otp(one_time_tokens::OneTimeTokenType::kSmsOtp,
+                                    kDefaultOtpValue, base::Time::Now());
   EXPECT_CALL(sms_otp_backend_, RetrieveSmsOtp)
-      .WillOnce(RunOnceCallback<0>(reply));
+      .WillOnce(RunOnceCallback<0>(otp));
   EXPECT_CALL(otp_phish_guard_delegate(), StartOtpPhishGuardCheck)
       .WillOnce(RunOnceCallback<1>(false));
 
@@ -171,7 +168,7 @@
   otp_manager.GetOtpSuggestions(future.GetCallback());
 
   ASSERT_EQ(future.Get().size(), 1u);
-  EXPECT_EQ(future.Get()[0], reply.otp_value->value());
+  EXPECT_EQ(future.Get()[0], otp.value());
 }
 
 // Tests that `GetOtpSuggestions` waits with the callback if an SMS OTP
@@ -180,12 +177,17 @@
   OtpManagerImpl otp_manager(autofill_manager(), &one_time_token_service_);
 
   // Prepare the handling of SMS requests from the SMS backend.
-  one_time_tokens::OtpFetchReply reply = GetDefaultOtpFetchReply();
-  base::OnceCallback<void(const one_time_tokens::OtpFetchReply&)>
+  one_time_tokens::OneTimeToken otp(one_time_tokens::OneTimeTokenType::kSmsOtp,
+                                    kDefaultOtpValue, base::Time::Now());
+  base::OnceCallback<void(
+      base::expected<one_time_tokens::OneTimeToken,
+                     one_time_tokens::OneTimeTokenRetrievalError>)>
       sms_backend_callback;
   EXPECT_CALL(sms_otp_backend_, RetrieveSmsOtp)
       .WillOnce(
-          [&](base::OnceCallback<void(const one_time_tokens::OtpFetchReply&)>
+          [&](base::OnceCallback<void(
+                  base::expected<one_time_tokens::OneTimeToken,
+                                 one_time_tokens::OneTimeTokenRetrievalError>)>
                   callback) { sms_backend_callback = std::move(callback); });
   EXPECT_CALL(otp_phish_guard_delegate(), StartOtpPhishGuardCheck)
       .WillOnce(RunOnceCallback<1>(false));
@@ -200,12 +202,12 @@
   EXPECT_FALSE(future.IsReady());
 
   // Now, let the SMS backend respond.
-  std::move(sms_backend_callback).Run(reply);
+  std::move(sms_backend_callback).Run(otp);
 
   // The future should now be ready, and contain the OTP.
   EXPECT_TRUE(future.IsReady());
   ASSERT_EQ(future.Get().size(), 1u);
-  EXPECT_EQ(future.Get()[0], reply.otp_value->value());
+  EXPECT_EQ(future.Get()[0], otp.value());
 }
 
 // Tests that `GetOtpSuggestions` immediately returns any OTPs that have
@@ -213,9 +215,10 @@
 TEST_F(OtpManagerImplTest, GetOtpSuggestions_FetchesSmsOnlyOnce) {
   OtpManagerImpl otp_manager(autofill_manager(), &one_time_token_service_);
 
-  one_time_tokens::OtpFetchReply reply = GetDefaultOtpFetchReply();
+  one_time_tokens::OneTimeToken otp(one_time_tokens::OneTimeTokenType::kSmsOtp,
+                                    kDefaultOtpValue, base::Time::Now());
   EXPECT_CALL(sms_otp_backend_, RetrieveSmsOtp)
-      .WillOnce(RunOnceCallback<0>(GetDefaultOtpFetchReply()));
+      .WillOnce(RunOnceCallback<0>(otp));
   EXPECT_CALL(otp_phish_guard_delegate(), StartOtpPhishGuardCheck)
       .WillOnce(RunOnceCallback<1>(false))
       .WillOnce(RunOnceCallback<1>(false));
@@ -227,7 +230,7 @@
   otp_manager.GetOtpSuggestions(future1.GetCallback());
 
   ASSERT_EQ(future1.Get().size(), 1u);
-  EXPECT_EQ(future1.Get()[0], reply.otp_value->value());
+  EXPECT_EQ(future1.Get()[0], otp.value());
 
   // Adding a second OTP form should not trigger a new SMS OTP retrieval.
   EXPECT_CALL(sms_otp_backend_, RetrieveSmsOtp).Times(0);
@@ -238,7 +241,7 @@
   otp_manager.GetOtpSuggestions(future2.GetCallback());
 
   ASSERT_EQ(future2.Get().size(), 1u);
-  EXPECT_EQ(future2.Get()[0], reply.otp_value->value());
+  EXPECT_EQ(future2.Get()[0], otp.value());
 }
 
 // Tests that if `GetOtpSuggestions` is called twice, only the callback from
@@ -247,12 +250,17 @@
   OtpManagerImpl otp_manager(autofill_manager(), &one_time_token_service_);
 
   // Prepare the handling of SMS requests from the SMS backend.
-  one_time_tokens::OtpFetchReply reply = GetDefaultOtpFetchReply();
-  base::OnceCallback<void(const one_time_tokens::OtpFetchReply&)>
+  one_time_tokens::OneTimeToken otp(one_time_tokens::OneTimeTokenType::kSmsOtp,
+                                    kDefaultOtpValue, base::Time::Now());
+  base::OnceCallback<void(
+      base::expected<one_time_tokens::OneTimeToken,
+                     one_time_tokens::OneTimeTokenRetrievalError>)>
       sms_backend_callback;
   EXPECT_CALL(sms_otp_backend_, RetrieveSmsOtp)
       .WillOnce(
-          [&](base::OnceCallback<void(const one_time_tokens::OtpFetchReply&)>
+          [&](base::OnceCallback<void(
+                  base::expected<one_time_tokens::OneTimeToken,
+                                 one_time_tokens::OneTimeTokenRetrievalError>)>
                   callback) { sms_backend_callback = std::move(callback); });
   EXPECT_CALL(otp_phish_guard_delegate(), StartOtpPhishGuardCheck)
       .WillOnce(RunOnceCallback<1>(false));
@@ -276,28 +284,26 @@
   EXPECT_FALSE(future2.IsReady());
 
   // Now, let the SMS backend respond.
-  std::move(sms_backend_callback).Run(reply);
+  std::move(sms_backend_callback).Run(otp);
 
   // The first future should still not be ready (it was invalidated).
   EXPECT_FALSE(future1.IsReady());
   // The second future should now be ready, and contain the OTP.
   EXPECT_TRUE(future2.IsReady());
   ASSERT_EQ(future2.Get().size(), 1u);
-  EXPECT_EQ(future2.Get()[0], reply.otp_value->value());
+  EXPECT_EQ(future2.Get()[0], otp.value());
 }
 
 // Tests that an empty OTP value received from the backend is not stored.
 TEST_F(OtpManagerImplTest, GetOtpSuggestions_EmptyOtpIsNotStored) {
   OtpManagerImpl otp_manager(autofill_manager(), &one_time_token_service_);
 
-  // Prepare a reply with an empty OTP.
-  one_time_tokens::OtpFetchReply reply = one_time_tokens::OtpFetchReply(
-      one_time_tokens::OneTimeToken(one_time_tokens::OneTimeTokenType::kSmsOtp,
-                                    "", base::Time::Now()),
-      /*request_complete=*/true);
+  // Prepare a otp with an empty OTP.
+  one_time_tokens::OneTimeToken otp(one_time_tokens::OneTimeTokenType::kSmsOtp,
+                                    "", base::Time::Now());
 
   EXPECT_CALL(sms_otp_backend_, RetrieveSmsOtp)
-      .WillOnce(RunOnceCallback<0>(reply));
+      .WillOnce(RunOnceCallback<0>(otp));
   EXPECT_CALL(otp_phish_guard_delegate(), StartOtpPhishGuardCheck)
       .WillOnce(RunOnceCallback<1>(false));
 
@@ -314,17 +320,19 @@
 TEST_F(OtpManagerImplTest, GetOtpSuggestions_FiltersExpiredOtps) {
   OtpManagerImpl otp_manager(autofill_manager(), &one_time_token_service_);
 
-  // Prepare the reply from the SMS backend.
-  one_time_tokens::OtpFetchReply reply = one_time_tokens::OtpFetchReply(
-      one_time_tokens::OneTimeToken(one_time_tokens::OneTimeTokenType::kSmsOtp,
+  // Prepare the otp from the SMS backend.
+  one_time_tokens::OneTimeToken otp(one_time_tokens::OneTimeTokenType::kSmsOtp,
                                     kDefaultOtpValue,
-                                    task_environment_.GetMockClock()->Now()),
-      /*request_complete=*/true);
-  base::OnceCallback<void(const one_time_tokens::OtpFetchReply&)>
+                                    task_environment_.GetMockClock()->Now());
+  base::OnceCallback<void(
+      base::expected<one_time_tokens::OneTimeToken,
+                     one_time_tokens::OneTimeTokenRetrievalError>)>
       sms_backend_callback;
   EXPECT_CALL(sms_otp_backend_, RetrieveSmsOtp)
       .WillOnce(
-          [&](base::OnceCallback<void(const one_time_tokens::OtpFetchReply&)>
+          [&](base::OnceCallback<void(
+                  base::expected<one_time_tokens::OneTimeToken,
+                                 one_time_tokens::OneTimeTokenRetrievalError>)>
                   callback) { sms_backend_callback = std::move(callback); });
   EXPECT_CALL(otp_phish_guard_delegate(), StartOtpPhishGuardCheck)
       .WillOnce(RunOnceCallback<1>(false));
@@ -339,11 +347,11 @@
   EXPECT_FALSE(future1.IsReady());
 
   // Now, let the SMS backend respond.
-  std::move(sms_backend_callback).Run(reply);
+  std::move(sms_backend_callback).Run(otp);
 
   // The future should now be ready, and contain the fresh OTP.
   ASSERT_EQ(future1.Get().size(), 1u);
-  EXPECT_EQ(future1.Get()[0], reply.otp_value->value());
+  EXPECT_EQ(future1.Get()[0], otp.value());
 
   // Advance the clock by 6 minutes to make the OTP expire.
   task_environment_.AdvanceClock(base::Minutes(6));
@@ -359,9 +367,10 @@
   OtpManagerImpl otp_manager(autofill_manager(), &one_time_token_service_);
 
   // Prepare the handling of SMS requests from the SMS backend.
-  one_time_tokens::OtpFetchReply reply = GetDefaultOtpFetchReply();
+  one_time_tokens::OneTimeToken otp(one_time_tokens::OneTimeTokenType::kSmsOtp,
+                                    kDefaultOtpValue, base::Time::Now());
   EXPECT_CALL(sms_otp_backend_, RetrieveSmsOtp)
-      .WillOnce(RunOnceCallback<0>(reply));
+      .WillOnce(RunOnceCallback<0>(otp));
   base::OnceCallback<void(bool)> phish_guard_callback;
   EXPECT_CALL(otp_phish_guard_delegate(), StartOtpPhishGuardCheck)
       .WillOnce([&](const GURL&, base::OnceCallback<void(bool)> callback) {
@@ -396,9 +405,10 @@
   OtpManagerImpl otp_manager(autofill_manager(), &one_time_token_service_);
 
   // Prepare the handling of SMS requests from the SMS backend.
-  one_time_tokens::OtpFetchReply reply = GetDefaultOtpFetchReply();
+  one_time_tokens::OneTimeToken otp(one_time_tokens::OneTimeTokenType::kSmsOtp,
+                                    kDefaultOtpValue, base::Time::Now());
   EXPECT_CALL(sms_otp_backend_, RetrieveSmsOtp)
-      .WillOnce(RunOnceCallback<0>(reply));
+      .WillOnce(RunOnceCallback<0>(otp));
   base::OnceCallback<void(bool)> phish_guard_callback;
   EXPECT_CALL(otp_phish_guard_delegate(), StartOtpPhishGuardCheck)
       .WillOnce([&](const GURL&, base::OnceCallback<void(bool)> callback) {
@@ -419,7 +429,7 @@
   std::move(phish_guard_callback).Run(false);  // No phishing
 
   ASSERT_EQ(future.Get().size(), 1u);
-  EXPECT_EQ(future.Get()[0], reply.otp_value->value());
+  EXPECT_EQ(future.Get()[0], otp.value());
 
   histogram_tester_.ExpectUniqueSample(kPhishGuardCheckPerformedHistogram, true,
                                        1);
@@ -436,9 +446,10 @@
   OtpManagerImpl otp_manager(autofill_manager(), &one_time_token_service_);
 
   // Prepare the handling of SMS requests from the SMS backend.
-  one_time_tokens::OtpFetchReply reply = GetDefaultOtpFetchReply();
+  one_time_tokens::OneTimeToken otp(one_time_tokens::OneTimeTokenType::kSmsOtp,
+                                    kDefaultOtpValue, base::Time::Now());
   EXPECT_CALL(sms_otp_backend_, RetrieveSmsOtp)
-      .WillOnce(RunOnceCallback<0>(reply));
+      .WillOnce(RunOnceCallback<0>(otp));
 
   // Observing an OTP field is supposed to trigger an SMS OTP request.
   AddFormWithOtpField();
@@ -447,7 +458,7 @@
   otp_manager.GetOtpSuggestions(future.GetCallback());
 
   ASSERT_EQ(future.Get().size(), 1u);
-  EXPECT_EQ(future.Get()[0], reply.otp_value->value());
+  EXPECT_EQ(future.Get()[0], otp.value());
 
   histogram_tester_.ExpectUniqueSample(kPhishGuardCheckPerformedHistogram,
                                        false, 1);
@@ -462,12 +473,17 @@
   OtpManagerImpl otp_manager(autofill_manager(), &one_time_token_service_);
 
   // Prepare the handling of SMS requests from the SMS backend.
-  one_time_tokens::OtpFetchReply reply = GetDefaultOtpFetchReply();
-  base::OnceCallback<void(const one_time_tokens::OtpFetchReply&)>
+  one_time_tokens::OneTimeToken otp(one_time_tokens::OneTimeTokenType::kSmsOtp,
+                                    kDefaultOtpValue, base::Time::Now());
+  base::OnceCallback<void(
+      base::expected<one_time_tokens::OneTimeToken,
+                     one_time_tokens::OneTimeTokenRetrievalError>)>
       sms_backend_callback;
   EXPECT_CALL(sms_otp_backend_, RetrieveSmsOtp)
       .WillOnce(
-          [&](base::OnceCallback<void(const one_time_tokens::OtpFetchReply&)>
+          [&](base::OnceCallback<void(
+                  base::expected<one_time_tokens::OneTimeToken,
+                                 one_time_tokens::OneTimeTokenRetrievalError>)>
                   callback) { sms_backend_callback = std::move(callback); });
   base::test::TestFuture<const std::vector<std::string>> future;
   otp_manager.GetOtpSuggestions(future.GetCallback());
@@ -485,7 +501,7 @@
 
   // Now, let the SMS backend respond. This should not affect the already run
   // callback.
-  std::move(sms_backend_callback).Run(reply);
+  std::move(sms_backend_callback).Run(otp);
   EXPECT_TRUE(future.IsReady());
   EXPECT_TRUE(future.Get().empty());
 }
@@ -496,12 +512,17 @@
   OtpManagerImpl otp_manager(autofill_manager(), &one_time_token_service_);
 
   // Prepare the handling of SMS requests from the SMS backend.
-  one_time_tokens::OtpFetchReply reply = GetDefaultOtpFetchReply();
-  base::OnceCallback<void(const one_time_tokens::OtpFetchReply&)>
+  one_time_tokens::OneTimeToken otp(one_time_tokens::OneTimeTokenType::kSmsOtp,
+                                    kDefaultOtpValue, base::Time::Now());
+  base::OnceCallback<void(
+      base::expected<one_time_tokens::OneTimeToken,
+                     one_time_tokens::OneTimeTokenRetrievalError>)>
       sms_backend_callback;
   EXPECT_CALL(sms_otp_backend_, RetrieveSmsOtp)
       .WillOnce(
-          [&](base::OnceCallback<void(const one_time_tokens::OtpFetchReply&)>
+          [&](base::OnceCallback<void(
+                  base::expected<one_time_tokens::OneTimeToken,
+                                 one_time_tokens::OneTimeTokenRetrievalError>)>
                   callback) { sms_backend_callback = std::move(callback); });
 
   base::test::TestFuture<const std::vector<std::string>> future;
@@ -520,7 +541,7 @@
 
   // Now, let the SMS backend respond. This should not affect the already run
   // callback.
-  std::move(sms_backend_callback).Run(reply);
+  std::move(sms_backend_callback).Run(otp);
   EXPECT_TRUE(future.IsReady());
   EXPECT_TRUE(future.Get().empty());
 }
diff --git a/components/autofill/core/browser/payments/amount_extraction_manager.cc b/components/autofill/core/browser/payments/amount_extraction_manager.cc
index 3441abcf..7cc5ed9 100644
--- a/components/autofill/core/browser/payments/amount_extraction_manager.cc
+++ b/components/autofill/core/browser/payments/amount_extraction_manager.cc
@@ -173,10 +173,9 @@
 }
 
 void AmountExtractionManager::FetchAiPageContent() {
-  if (is_fetching_ai_page_content_) {
-    return;
-  }
-  is_fetching_ai_page_content_ = true;
+  CHECK(base::FeatureList::IsEnabled(
+      features::kAutofillEnableAiBasedAmountExtraction));
+
   autofill_manager_->client().GetAiPageContent(
       base::BindOnce(&AmountExtractionManager::OnAiPageContentReceived,
                      weak_ptr_factory_.GetWeakPtr()));
@@ -184,27 +183,20 @@
 
 void AmountExtractionManager::OnAiPageContentReceived(
     std::optional<optimization_guide::proto::AnnotatedPageContent> result) {
-  if (result) {
-    ai_page_content_ =
-        std::make_unique<optimization_guide::proto::AnnotatedPageContent>(
-            std::move(*result));
-  }
-  is_fetching_ai_page_content_ = false;
-  // TODO(crbug.com/444683986): Log ApcGenerationResult to UMA.
-}
-
-void AmountExtractionManager::TriggerCheckoutAmountExtractionWithAi() {
-  if (!ai_page_content_) {
-    // TODO(crbug.com/444685164) If the member variable `ai_page_content_` is
-    // not initialized, another attempt to fetch it will be made. Retry only
-    // once.
+  if (!result) {
+    if (BnplManager* bnpl_manager =
+            autofill_manager_->GetPaymentsBnplManager()) {
+      bnpl_manager->OnAmountExtractionReturnedFromAi(
+          /*extracted_amount_in_micros=*/std::nullopt,
+          /*timeout_reached=*/false);
+    }
+    // Stop the timer because amount extraction is finished with a failure.
+    timeout_timer_.Stop();
     return;
   }
 
-  // Construct request
   optimization_guide::proto::AmountExtractionRequest request;
-  *request.mutable_annotated_page_content() = std::move(*ai_page_content_);
-  ai_page_content_.reset();
+  *request.mutable_annotated_page_content() = std::move(*result);
 
   autofill_manager_->client().GetRemoteModelExecutor()->ExecuteModel(
       optimization_guide::ModelBasedCapabilityKey::kAmountExtraction,
@@ -212,6 +204,17 @@
       {.execution_timeout = kAiBasedAmountExtractionWaitTime},
       base::BindOnce(&AmountExtractionManager::OnCheckoutAmountReceivedFromAi,
                      weak_ptr_factory_.GetWeakPtr()));
+  // TODO(crbug.com/444683986): Log ApcGenerationResult to UMA.
+}
+
+void AmountExtractionManager::TriggerCheckoutAmountExtractionWithAi() {
+  // In case of timeout, cancel the request and show the error dialog.
+  timeout_timer_.Start(
+      FROM_HERE, kAiBasedAmountExtractionWaitTime,
+      base::BindOnce(&AmountExtractionManager::OnTimeoutReached,
+                     weak_ptr_factory_.GetWeakPtr()));
+
+  FetchAiPageContent();
 }
 
 void AmountExtractionManager::TriggerCheckoutAmountExtraction() {
@@ -278,6 +281,10 @@
 void AmountExtractionManager::OnCheckoutAmountReceivedFromAi(
     optimization_guide::OptimizationGuideModelExecutionResult result,
     std::unique_ptr<optimization_guide::ModelQualityLogEntry> log_entry) {
+  // If no timeout, it means the server response came back in time, stop the
+  // timer.
+  timeout_timer_.Stop();
+
   if (!result.response.has_value()) {
     return;
   }
@@ -308,26 +315,45 @@
 
   bnpl_manager->OnAmountExtractionReturnedFromAi(parsed_extracted_amount,
                                                  /*timeout_reached=*/false);
+  // TODO(crbug.com/466136350): Add AmountExtractionManager::Reset() function
+  // and apply here.
 }
 
 void AmountExtractionManager::OnTimeoutReached() {
-  // If the amount is found, ignore this callback.
-  if (!search_request_pending_) {
-    return;
-  }
-  search_request_pending_ = false;
+  // Once timeout is reached, cancel all the pending function calls.
   weak_ptr_factory_.InvalidateWeakPtrs();
-  if (!has_logged_amount_extraction_result_) {
-    autofill_metrics::LogAmountExtractionResult(
-        /*latency=*/std::nullopt,
-        autofill_metrics::AmountExtractionResult::kTimeout,
-        GetMainFrameDriver()->GetPageUkmSourceId());
-    has_logged_amount_extraction_result_ = true;
+
+  if (base::FeatureList::IsEnabled(
+          ::autofill::features::kAutofillEnableAiBasedAmountExtraction)) {
+    if (BnplManager* bnpl_manager =
+            autofill_manager_->GetPaymentsBnplManager()) {
+      bnpl_manager->OnAmountExtractionReturnedFromAi(
+          /*extracted_amount_in_micros=*/std::nullopt,
+          /*timeout_reached=*/true);
+    }
+    // TODO(crbug.com/444683986): Log the metric for the timeout event in
+    // AI-based amount extraction.
+  } else {
+    // If the amount is found, ignore this callback.
+    if (!search_request_pending_) {
+      return;
+    }
+    search_request_pending_ = false;
+    if (BnplManager* bnpl_manager =
+            autofill_manager_->GetPaymentsBnplManager()) {
+      bnpl_manager->OnAmountExtractionReturned(
+          /*extracted_amount=*/std::nullopt,
+          /*timeout_reached=*/true);
+    }
+    if (!has_logged_amount_extraction_result_) {
+      autofill_metrics::LogAmountExtractionResult(
+          /*latency=*/std::nullopt,
+          autofill_metrics::AmountExtractionResult::kTimeout,
+          GetMainFrameDriver()->GetPageUkmSourceId());
+      has_logged_amount_extraction_result_ = true;
+    }
   }
-  if (BnplManager* bnpl_manager = autofill_manager_->GetPaymentsBnplManager()) {
-    bnpl_manager->OnAmountExtractionReturned(/*extracted_amount=*/std::nullopt,
-                                             /*timeout_reached=*/true);
-  }
+
   if constexpr (BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
                 BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)) {
     if (base::FeatureList::IsEnabled(
@@ -338,6 +364,8 @@
               << " reached a timeout.";
     }
   }
+  // TODO(crbug.com/466136350): Add AmountExtractionManager::Reset() function
+  // and apply here.
 }
 
 DenseSet<AmountExtractionManager::EligibleFeature>
diff --git a/components/autofill/core/browser/payments/amount_extraction_manager.h b/components/autofill/core/browser/payments/amount_extraction_manager.h
index be0a7cf5..3d7254ff 100644
--- a/components/autofill/core/browser/payments/amount_extraction_manager.h
+++ b/components/autofill/core/browser/payments/amount_extraction_manager.h
@@ -11,6 +11,7 @@
 #include "base/memory/raw_ref.h"
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
+#include "base/timer/timer.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/filling/filling_product.h"
 #include "components/autofill/core/browser/suggestions/suggestion.h"
@@ -166,18 +167,9 @@
   // search.
   bool search_request_pending_ = false;
 
-  // Member variable to store the fetched page content temporarily. This data is
-  // generated when credit card form is clicked and BNPL feature is available
-  // for this profile. It is about 10Kb in size depending on the merchant
-  // checkout page.
-  std::unique_ptr<optimization_guide::proto::AnnotatedPageContent>
-      ai_page_content_;
-
-  // Flag to indicate if an AI page content fetch is in progress. If set, do not
-  // trigger the next request to generate the page content. This is to avoid
-  // multiple page content requests when a user quickly clicks on the payment
-  // form multiple times or by scripts.
-  bool is_fetching_ai_page_content_ = false;
+  // The timer to enforce the timeout on client-side for AI-based amount
+  // extraction.
+  base::OneShotTimer timeout_timer_;
 
   base::WeakPtrFactory<AmountExtractionManager> weak_ptr_factory_{this};
 };
diff --git a/components/autofill/core/browser/payments/amount_extraction_manager_test_api.h b/components/autofill/core/browser/payments/amount_extraction_manager_test_api.h
index 3479c383..515ad382 100644
--- a/components/autofill/core/browser/payments/amount_extraction_manager_test_api.h
+++ b/components/autofill/core/browser/payments/amount_extraction_manager_test_api.h
@@ -5,9 +5,8 @@
 #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_AMOUNT_EXTRACTION_MANAGER_TEST_API_H_
 #define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_AMOUNT_EXTRACTION_MANAGER_TEST_API_H_
 
-#include <memory>
-
 #include "base/check_deref.h"
+#include "base/memory/raw_ref.h"
 #include "components/autofill/core/browser/payments/amount_extraction_manager.h"
 #include "components/optimization_guide/proto/features/common_quality_data.pb.h"
 
@@ -33,25 +32,6 @@
         search_request_pending;
   }
 
-  bool GetIsFetchingAiPageContent() {
-    return amount_extraction_manager_->is_fetching_ai_page_content_;
-  }
-
-  void SetIsFetchingAiPageContent(bool is_fetching) {
-    amount_extraction_manager_->is_fetching_ai_page_content_ = is_fetching;
-  }
-
-  const optimization_guide::proto::AnnotatedPageContent* GetAiPageContent()
-      const {
-    return amount_extraction_manager_->ai_page_content_.get();
-  }
-
-  void SetAiPageContent() {
-    amount_extraction_manager_->ai_page_content_ =
-        std::make_unique<optimization_guide::proto::AnnotatedPageContent>(
-            optimization_guide::proto::AnnotatedPageContent());
-  }
-
  private:
   const raw_ref<AmountExtractionManager> amount_extraction_manager_;
 };
diff --git a/components/autofill/core/browser/payments/amount_extraction_manager_unittest.cc b/components/autofill/core/browser/payments/amount_extraction_manager_unittest.cc
index 49ab26f..266be6b 100644
--- a/components/autofill/core/browser/payments/amount_extraction_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/amount_extraction_manager_unittest.cc
@@ -9,6 +9,7 @@
 
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/gmock_callback_support.h"
+#include "base/test/gmock_move_support.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/mock_callback.h"
 #include "base/test/protobuf_matchers.h"
@@ -51,6 +52,8 @@
 using ModelExecutionCallback = base::OnceCallback<void(
     optimization_guide::OptimizationGuideModelExecutionResult,
     std::unique_ptr<optimization_guide::ModelQualityLogEntry>)>;
+using ApcFetchCallback = base::OnceCallback<void(
+    std::optional<optimization_guide::proto::AnnotatedPageContent>)>;
 }  // namespace
 
 class MockAutofillDriver : public TestAutofillDriver {
@@ -72,12 +75,7 @@
   MockAutofillClient() = default;
   ~MockAutofillClient() override = default;
 
-  MOCK_METHOD(
-      void,
-      GetAiPageContent,
-      (base::OnceCallback<void(
-           std::optional<optimization_guide::proto::AnnotatedPageContent>)>),
-      (override));
+  MOCK_METHOD(void, GetAiPageContent, (ApcFetchCallback), (override));
   MOCK_METHOD(optimization_guide::RemoteModelExecutor*,
               GetRemoteModelExecutor,
               (),
@@ -957,125 +955,160 @@
   FakeCheckoutAmountReceivedFromAi(123.45, "USD", true);
 }
 
-// This test checks AutofillClient::GetAiPageContent is called when no page
-// content is present and not currently fetching.
-TEST_F(AmountExtractionManagerTest, FetchAiPageContent_StartsFetching) {
-  EXPECT_FALSE(
-      test_api(*amount_extraction_manager_).GetIsFetchingAiPageContent());
-  EXPECT_EQ(test_api(*amount_extraction_manager_).GetAiPageContent(), nullptr);
-
-  EXPECT_CALL(autofill_client(), GetAiPageContent);
-  amount_extraction_manager_->FetchAiPageContent();
-
-  EXPECT_TRUE(
-      test_api(*amount_extraction_manager_).GetIsFetchingAiPageContent());
-}
-
-// This test checks AutofillClient::GetAiPageContent is not called when a fetch
-// is already in progress.
-TEST_F(AmountExtractionManagerTest, FetchAiPageContent_AlreadyFetching) {
-  test_api(*amount_extraction_manager_).SetIsFetchingAiPageContent(true);
-
-  EXPECT_CALL(autofill_client(), GetAiPageContent).Times(0);
-  amount_extraction_manager_->FetchAiPageContent();
-
-  EXPECT_TRUE(
-      test_api(*amount_extraction_manager_).GetIsFetchingAiPageContent());
-}
-
-// This test checks AutofillClient::GetAiPageContent is called and the callback
-// receives a valid value.
-TEST_F(AmountExtractionManagerTest, OnAiPageContentReceived_ValidValue) {
+TEST_F(AmountExtractionManagerTest,
+       AiAmountExtraction_ApcFetchAndModelExecutionSucceeded) {
+  base::test::ScopedFeatureList scoped_feature_list{
+      features::kAutofillEnableAiBasedAmountExtraction};
+  ApcFetchCallback fetch_callback;
   optimization_guide::proto::AnnotatedPageContent test_proto;
-  test_proto.set_tab_id(1234);  // Example data
-  EXPECT_FALSE(
-      test_api(*amount_extraction_manager_).GetIsFetchingAiPageContent());
+  test_proto.set_tab_id(1234);
 
   EXPECT_CALL(autofill_client(), GetAiPageContent)
-      .WillOnce([&](base::OnceCallback<void(
-                        std::optional<
-                            optimization_guide::proto::AnnotatedPageContent>)>
-                        callback) {
-        EXPECT_TRUE(
-            test_api(*amount_extraction_manager_).GetIsFetchingAiPageContent());
-        std::move(callback).Run(std::make_optional(test_proto));
-      });
+      .WillOnce(MoveArg<0>(&fetch_callback));
 
-  amount_extraction_manager_->FetchAiPageContent();
-
-  EXPECT_FALSE(
-      test_api(*amount_extraction_manager_).GetIsFetchingAiPageContent());
-  EXPECT_NE(test_api(*amount_extraction_manager_).GetAiPageContent(), nullptr);
-  EXPECT_THAT(
-      test_api(*amount_extraction_manager_).GetAiPageContent()->tab_id(),
-      Eq(1234));
-}
-
-// This test checks AutofillClient::GetAiPageContent is called and the callback
-// receives nullptr.
-TEST_F(AmountExtractionManagerTest, OnAiPageContentReceived_NullOpt) {
-  EXPECT_FALSE(
-      test_api(*amount_extraction_manager_).GetIsFetchingAiPageContent());
-
-  EXPECT_CALL(autofill_client(), GetAiPageContent)
-      .WillOnce([&](base::OnceCallback<void(
-                        std::optional<
-                            optimization_guide::proto::AnnotatedPageContent>)>
-                        callback) {
-        EXPECT_TRUE(
-            test_api(*amount_extraction_manager_).GetIsFetchingAiPageContent());
-        std::move(callback).Run(std::nullopt);
-      });
-
-  amount_extraction_manager_->FetchAiPageContent();
-
-  EXPECT_FALSE(
-      test_api(*amount_extraction_manager_).GetIsFetchingAiPageContent());
-  EXPECT_THAT(test_api(*amount_extraction_manager_).GetAiPageContent(),
-              nullptr);
-}
-
-// Verify that if the page content is not fetched, `ExecuteModel` should not be
-// called.
-TEST_F(AmountExtractionManagerTest, ShouldNotCallExecuteModel) {
-  ASSERT_EQ(test_api(*amount_extraction_manager_).GetAiPageContent(), nullptr);
-  EXPECT_CALL(*model_executor(), ExecuteModel).Times(0);
   amount_extraction_manager_->TriggerCheckoutAmountExtractionWithAi();
-}
 
-// Verify that when `TriggerCheckoutAmountExtractionWithAi` is called with
-// annotated page contents present, `ExecuteModel` from
-// `RemoteModelExecutor` should be invoked.
-TEST_F(AmountExtractionManagerTest, ShouldCallExecuteModel) {
-  test_api(*amount_extraction_manager_).SetAiPageContent();
+  ASSERT_TRUE(fetch_callback);
+
+  ModelExecutionCallback model_callback;
   optimization_guide::proto::AmountExtractionRequest expected_request;
-  *expected_request.mutable_annotated_page_content() =
-      optimization_guide::proto::AnnotatedPageContent();
-
+  *expected_request.mutable_annotated_page_content() = test_proto;
   optimization_guide::ModelExecutionOptions expected_options{
       .execution_timeout =
           AmountExtractionManager::kAiBasedAmountExtractionWaitTime};
 
-  optimization_guide::proto::AmountExtractionResponse response;
-  response.set_final_checkout_amount(123.45);
-  response.set_currency("USD");
-  response.set_is_successful(true);
-
   EXPECT_CALL(
       *model_executor(),
       ExecuteModel(
           optimization_guide::ModelBasedCapabilityKey::kAmountExtraction,
           EqualsProto(expected_request), Eq(expected_options),
           A<ModelExecutionCallback>()))
-      .WillOnce(base::test::RunOnceCallback<3>(
-          optimization_guide::OptimizationGuideModelExecutionResult(
-              optimization_guide::AnyWrapProto(response),
-              /*execution_info=*/nullptr),
-          /*log_entry=*/nullptr));
+      .WillOnce(MoveArg<3>(&model_callback));
+
+  std::move(fetch_callback).Run(std::make_optional(test_proto));
+
+  ASSERT_TRUE(model_callback);
+  EXPECT_CALL(*autofill_manager().GetPaymentsBnplManager(),
+              OnAmountExtractionReturnedFromAi(
+                  testing::Optional(100 * kMicrosPerDollar),
+                  /*timeout_reached=*/false));
+
+  // Construct response
+  optimization_guide::proto::AmountExtractionResponse response_proto;
+  response_proto.set_final_checkout_amount(100.00);
+  response_proto.set_currency("USD");
+  response_proto.set_is_successful(true);
+
+  std::move(model_callback)
+      .Run(optimization_guide::OptimizationGuideModelExecutionResult(
+               optimization_guide::AnyWrapProto(response_proto), nullptr),
+           nullptr);
+}
+
+TEST_F(AmountExtractionManagerTest, AiAmountExtraction_TimeoutDuringFetch) {
+  base::test::ScopedFeatureList scoped_feature_list{
+      features::kAutofillEnableAiBasedAmountExtraction};
+  ApcFetchCallback fetch_callback;
+  optimization_guide::proto::AnnotatedPageContent test_proto;
+  test_proto.set_tab_id(1234);
+
+  EXPECT_CALL(autofill_client(), GetAiPageContent)
+      .WillOnce(MoveArg<0>(&fetch_callback));
 
   amount_extraction_manager_->TriggerCheckoutAmountExtractionWithAi();
 
-  ASSERT_EQ(test_api(*amount_extraction_manager_).GetAiPageContent(), nullptr);
+  EXPECT_CALL(*autofill_manager().GetPaymentsBnplManager(),
+              OnAmountExtractionReturnedFromAi(Eq(std::nullopt),
+                                               /*timeout_reached=*/true));
+
+  // Fast forward past the timeout limit.
+  task_environment_.FastForwardBy(
+      AmountExtractionManager::kAiBasedAmountExtractionWaitTime +
+      base::Seconds(1));
+
+  // Model should NOT execute because the request already timed out.
+  EXPECT_CALL(*model_executor(), ExecuteModel).Times(0);
+  ASSERT_TRUE(fetch_callback);
+
+  std::move(fetch_callback).Run(std::make_optional(test_proto));
+}
+
+TEST_F(AmountExtractionManagerTest,
+       AiAmountExtraction_TimeoutDuringModelExecution) {
+  base::test::ScopedFeatureList scoped_feature_list{
+      features::kAutofillEnableAiBasedAmountExtraction};
+  ApcFetchCallback fetch_callback;
+  optimization_guide::proto::AnnotatedPageContent test_proto;
+  test_proto.set_tab_id(1234);
+
+  EXPECT_CALL(autofill_client(), GetAiPageContent)
+      .WillOnce(MoveArg<0>(&fetch_callback));
+
+  amount_extraction_manager_->TriggerCheckoutAmountExtractionWithAi();
+  ASSERT_TRUE(fetch_callback);
+
+  ModelExecutionCallback model_callback;
+  optimization_guide::proto::AmountExtractionRequest expected_request;
+  *expected_request.mutable_annotated_page_content() = test_proto;
+  optimization_guide::ModelExecutionOptions expected_options{
+      .execution_timeout =
+          AmountExtractionManager::kAiBasedAmountExtractionWaitTime};
+
+  EXPECT_CALL(
+      *model_executor(),
+      ExecuteModel(
+          optimization_guide::ModelBasedCapabilityKey::kAmountExtraction,
+          EqualsProto(expected_request), Eq(expected_options),
+          A<ModelExecutionCallback>()))
+      .WillOnce(MoveArg<3>(&model_callback));
+
+  std::move(fetch_callback).Run(std::make_optional(test_proto));
+
+  ASSERT_TRUE(model_callback);
+  EXPECT_CALL(*autofill_manager().GetPaymentsBnplManager(),
+              OnAmountExtractionReturnedFromAi(Eq(std::nullopt),
+                                               /*timeout_reached=*/true));
+
+  // Fast forward past the timeout limit.
+  task_environment_.FastForwardBy(
+      AmountExtractionManager::kAiBasedAmountExtractionWaitTime +
+      base::Seconds(1));
+
+  // Construct a valid response
+  optimization_guide::proto::AmountExtractionResponse response_proto;
+  response_proto.set_final_checkout_amount(100.00);
+  response_proto.set_currency("USD");
+  response_proto.set_is_successful(true);
+
+  EXPECT_CALL(*autofill_manager().GetPaymentsBnplManager(),
+              OnAmountExtractionReturnedFromAi)
+      .Times(0);
+
+  // Model execution still returns and verifies its response is ignored.
+  std::move(model_callback)
+      .Run(optimization_guide::OptimizationGuideModelExecutionResult(
+               optimization_guide::AnyWrapProto(response_proto), nullptr),
+           nullptr);
+}
+
+TEST_F(AmountExtractionManagerTest, AiAmountExtraction_FetchReturnsEmpty) {
+  base::test::ScopedFeatureList scoped_feature_list{
+      features::kAutofillEnableAiBasedAmountExtraction};
+  ApcFetchCallback fetch_callback;
+
+  EXPECT_CALL(autofill_client(), GetAiPageContent)
+      .WillOnce(MoveArg<0>(&fetch_callback));
+
+  amount_extraction_manager_->TriggerCheckoutAmountExtractionWithAi();
+
+  EXPECT_CALL(*autofill_manager().GetPaymentsBnplManager(),
+              OnAmountExtractionReturnedFromAi(Eq(std::nullopt),
+                                               /*timeout_reached=*/false));
+
+  EXPECT_CALL(*model_executor(), ExecuteModel).Times(0);
+  ASSERT_TRUE(fetch_callback);
+
+  std::move(fetch_callback).Run(std::nullopt);
 }
 
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
diff --git a/components/contextual_tasks_strings.grdp b/components/contextual_tasks_strings.grdp
index 0aca09f1..5e585f1 100644
--- a/components/contextual_tasks_strings.grdp
+++ b/components/contextual_tasks_strings.grdp
@@ -4,6 +4,9 @@
   <message name ="IDS_CONTEXTUAL_TASKS_CONTEXTUAL_TASKS_TITLE" desc="The title of contextual tasks.">
     Contextual tasks
   </message>
+  <message name="IDS_CONTEXTUAL_TASKS_AI_MODE_TITLE" desc="The title shown in the location bar and tab for AI Mode before a thread title is available." translateable="false">
+    AI Mode
+  </message>
   <message name="IDS_CONTEXTUAL_TASKS_MENU_OPEN_IN_NEW_TAB" desc="The 'Open in new tab' option in the 3-dot menu.">
     Open in new tab
   </message>
diff --git a/components/enterprise/browser/promotion/BUILD.gn b/components/enterprise/browser/promotion/BUILD.gn
index 3b2b742..b5107901 100644
--- a/components/enterprise/browser/promotion/BUILD.gn
+++ b/components/enterprise/browser/promotion/BUILD.gn
@@ -13,3 +13,19 @@
     "//components/pref_registry",
   ]
 }
+
+source_set("promotion") {
+  sources = [
+    "promotion_eligibility_checker.cc",
+    "promotion_eligibility_checker.h",
+  ]
+  public_deps = [ ":prefs" ]
+
+  deps = [
+    "//base",
+    "//components/enterprise/browser/identifiers",
+    "//components/policy/core/common",
+    "//components/prefs",
+    "//components/signin/public/identity_manager",
+  ]
+}
diff --git a/components/enterprise/connectors/core/BUILD.gn b/components/enterprise/connectors/core/BUILD.gn
index 80d2d70..4c3b524b 100644
--- a/components/enterprise/connectors/core/BUILD.gn
+++ b/components/enterprise/connectors/core/BUILD.gn
@@ -99,6 +99,8 @@
 
 source_set("cloud_content_scanning") {
   sources = [
+    "cloud_content_scanning/binary_upload_request.cc",
+    "cloud_content_scanning/binary_upload_request.h",
     "cloud_content_scanning/common.cc",
     "cloud_content_scanning/common.h",
     "cloud_content_scanning/connector_data_pipe_getter.cc",
@@ -112,9 +114,11 @@
   ]
   deps = [
     "//base",
+    "//components/enterprise/common:strings",
     "//components/enterprise/connectors/core",
     "//components/enterprise/obfuscation/core:enterprise_obfuscation",
     "//components/file_access",
+    "//components/policy/core/browser",
     "//components/safe_browsing/core/common",
     "//mojo/public/cpp/bindings",
     "//net",
diff --git a/components/enterprise/connectors/core/DEPS b/components/enterprise/connectors/core/DEPS
index 16355d3..b9b5828 100644
--- a/components/enterprise/connectors/core/DEPS
+++ b/components/enterprise/connectors/core/DEPS
@@ -3,6 +3,7 @@
   "+components/keyed_service",
   "+components/safe_browsing",
   "+components/security_interstitials/core",
+  "+components/policy",
   "+components/url_matcher",
   "+ui/base/clipboard",
   "+ui/base/l10n",
diff --git a/components/enterprise/connectors/core/cloud_content_scanning/binary_upload_request.cc b/components/enterprise/connectors/core/cloud_content_scanning/binary_upload_request.cc
new file mode 100644
index 0000000..9496a7bf
--- /dev/null
+++ b/components/enterprise/connectors/core/cloud_content_scanning/binary_upload_request.cc
@@ -0,0 +1,430 @@
+// 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 "components/enterprise/connectors/core/cloud_content_scanning/binary_upload_request.h"
+
+#include <algorithm>
+
+#include "base/command_line.h"
+#include "base/logging.h"
+#include "base/rand_util.h"
+#include "base/strings/string_number_conversions.h"
+#include "components/enterprise/common/strings.h"
+#include "components/enterprise/connectors/core/analysis_settings.h"
+#include "components/policy/core/browser/browser_policy_connector.h"
+#include "components/safe_browsing/core/common/safebrowsing_switches.h"
+#include "net/base/url_util.h"
+
+namespace enterprise_connectors {
+
+BinaryUploadRequest::Data::Data() = default;
+
+BinaryUploadRequest::Data::Data(const Data& other) {
+  operator=(other);
+}
+
+BinaryUploadRequest::Data::Data(Data&&) = default;
+
+BinaryUploadRequest::Data& BinaryUploadRequest::Data::operator=(
+    const BinaryUploadRequest::Data& other) {
+  contents = other.contents;
+  path = other.path;
+  hash = other.hash;
+  size = other.size;
+  mime_type = other.mime_type;
+  page = other.page.Duplicate();
+  is_obfuscated = other.is_obfuscated;
+  return *this;
+}
+
+BinaryUploadRequest::Data& BinaryUploadRequest::Data::operator=(
+    BinaryUploadRequest::Data&& other) = default;
+BinaryUploadRequest::Data::~Data() = default;
+
+BinaryUploadRequest::BinaryUploadRequest(
+    ContentAnalysisCallback callback,
+    enterprise_connectors::CloudOrLocalAnalysisSettings settings,
+    BrowserPolicyConnectorGetter policy_connector_getter)
+    : content_analysis_callback_(std::move(callback)),
+      cloud_or_local_settings_(std::move(settings)),
+      policy_connector_getter_(std::move(policy_connector_getter)) {}
+
+BinaryUploadRequest::BinaryUploadRequest(
+    ContentAnalysisCallback content_analysis_callback,
+    enterprise_connectors::CloudOrLocalAnalysisSettings settings,
+    BinaryUploadRequest::RequestStartCallback start_callback,
+    BrowserPolicyConnectorGetter policy_connector_getter)
+    : content_analysis_callback_(std::move(content_analysis_callback)),
+      request_start_callback_(std::move(start_callback)),
+      cloud_or_local_settings_(std::move(settings)),
+      policy_connector_getter_(std::move(policy_connector_getter)) {}
+
+BinaryUploadRequest::~BinaryUploadRequest() = default;
+
+void BinaryUploadRequest::set_id(Id id) {
+  id_ = id;
+}
+
+BinaryUploadRequest::Id BinaryUploadRequest::id() const {
+  return id_;
+}
+
+void BinaryUploadRequest::set_per_profile_request(bool per_profile_request) {
+  per_profile_request_ = per_profile_request;
+}
+
+bool BinaryUploadRequest::per_profile_request() const {
+  return per_profile_request_;
+}
+
+void BinaryUploadRequest::set_device_token(const std::string& token) {
+  content_analysis_request_.set_device_token(token);
+}
+
+void BinaryUploadRequest::set_filename(const std::string& filename) {
+  content_analysis_request_.mutable_request_data()->set_filename(filename);
+}
+
+void BinaryUploadRequest::set_digest(const std::string& digest) {
+  content_analysis_request_.mutable_request_data()->set_digest(digest);
+}
+
+void BinaryUploadRequest::clear_dlp_scan_request() {
+  auto* tags = content_analysis_request_.mutable_tags();
+  auto it = std::ranges::find(*tags, "dlp");
+  if (it != tags->end()) {
+    tags->erase(it);
+  }
+}
+
+void BinaryUploadRequest::set_analysis_connector(
+    enterprise_connectors::AnalysisConnector connector) {
+  content_analysis_request_.set_analysis_connector(connector);
+}
+
+void BinaryUploadRequest::set_url(const GURL& url) {
+  content_analysis_request_.mutable_request_data()->set_url(url.spec());
+}
+
+void BinaryUploadRequest::set_source(const std::string& source) {
+  content_analysis_request_.mutable_request_data()->set_source(source);
+}
+
+void BinaryUploadRequest::set_destination(const std::string& destination) {
+  content_analysis_request_.mutable_request_data()->set_destination(
+      destination);
+}
+
+void BinaryUploadRequest::set_csd(safe_browsing::ClientDownloadRequest csd) {
+  *content_analysis_request_.mutable_request_data()->mutable_csd() =
+      std::move(csd);
+}
+
+void BinaryUploadRequest::add_tag(const std::string& tag) {
+  content_analysis_request_.add_tags(tag);
+}
+
+void BinaryUploadRequest::set_email(const std::string& email) {
+  content_analysis_request_.mutable_request_data()->set_email(email);
+}
+
+void BinaryUploadRequest::set_client_metadata(
+    enterprise_connectors::ClientMetadata metadata) {
+  *content_analysis_request_.mutable_client_metadata() = std::move(metadata);
+}
+
+void BinaryUploadRequest::set_content_type(const std::string& type) {
+  content_analysis_request_.mutable_request_data()->set_content_type(type);
+}
+
+void BinaryUploadRequest::set_tab_title(const std::string& tab_title) {
+  content_analysis_request_.mutable_request_data()->set_tab_title(tab_title);
+}
+
+void BinaryUploadRequest::set_user_action_id(
+    const std::string& user_action_id) {
+  content_analysis_request_.set_user_action_id(user_action_id);
+}
+
+void BinaryUploadRequest::set_user_action_requests_count(
+    uint64_t user_action_requests_count) {
+  content_analysis_request_.set_user_action_requests_count(
+      user_action_requests_count);
+}
+
+void BinaryUploadRequest::set_tab_url(const GURL& tab_url) {
+  content_analysis_request_.mutable_request_data()->set_tab_url(tab_url.spec());
+}
+
+void BinaryUploadRequest::set_printer_name(const std::string& printer_name) {
+  content_analysis_request_.mutable_request_data()
+      ->mutable_print_metadata()
+      ->set_printer_name(printer_name);
+}
+
+void BinaryUploadRequest::set_printer_type(
+    enterprise_connectors::ContentMetaData::PrintMetadata::PrinterType
+        printer_type) {
+  content_analysis_request_.mutable_request_data()
+      ->mutable_print_metadata()
+      ->set_printer_type(printer_type);
+}
+
+void BinaryUploadRequest::set_clipboard_source_type(
+    enterprise_connectors::ContentMetaData::CopiedTextSource::
+        CopiedTextSourceType source_type) {
+  content_analysis_request_.mutable_request_data()
+      ->mutable_copied_text_source()
+      ->set_context(source_type);
+}
+
+void BinaryUploadRequest::set_clipboard_source_url(const std::string& url) {
+  content_analysis_request_.mutable_request_data()
+      ->mutable_copied_text_source()
+      ->set_url(url);
+}
+
+void BinaryUploadRequest::set_password(const std::string& password) {
+  content_analysis_request_.mutable_request_data()->set_decryption_key(
+      password);
+}
+
+void BinaryUploadRequest::set_reason(
+    enterprise_connectors::ContentAnalysisRequest::Reason reason) {
+  content_analysis_request_.set_reason(reason);
+}
+
+void BinaryUploadRequest::set_require_metadata_verdict(
+    bool require_metadata_verdict) {
+  content_analysis_request_.set_require_metadata_verdict(
+      require_metadata_verdict);
+}
+
+void BinaryUploadRequest::set_is_content_encrypted(bool is_content_encrypted) {
+  content_analysis_request_.set_is_content_encrypted(is_content_encrypted);
+}
+
+void BinaryUploadRequest::set_is_content_too_large(bool is_content_too_large) {
+  is_content_too_large_ = is_content_too_large;
+}
+
+void BinaryUploadRequest::set_blocking(bool blocking) {
+  content_analysis_request_.set_blocking(blocking);
+}
+
+void BinaryUploadRequest::add_local_ips(const std::string& ip_address) {
+  content_analysis_request_.add_local_ips(ip_address);
+}
+
+void BinaryUploadRequest::set_referrer_chain(
+    const google::protobuf::RepeatedPtrField<safe_browsing::ReferrerChainEntry>
+        referrer_chain) {
+  *content_analysis_request_.mutable_request_data()->mutable_referrer_chain() =
+      std::move(referrer_chain);
+}
+
+void BinaryUploadRequest::set_content_area_account_email(
+    const std::string& email) {
+  content_analysis_request_.mutable_request_data()
+      ->set_content_area_account_email(email);
+}
+
+void BinaryUploadRequest::set_source_content_area_account_email(
+    const std::string& email) {
+  content_analysis_request_.mutable_request_data()
+      ->set_source_content_area_account_email(email);
+}
+
+void BinaryUploadRequest::set_frame_url_chain(
+    const google::protobuf::RepeatedPtrField<std::string> frame_url_chain) {
+  *content_analysis_request_.mutable_request_data()->mutable_frame_url_chain() =
+      std::move(frame_url_chain);
+}
+
+std::string BinaryUploadRequest::SetRandomRequestToken() {
+  DCHECK(request_token().empty());
+  content_analysis_request_.set_request_token(
+      base::HexEncode(base::RandBytesAsVector(128)));
+  return content_analysis_request_.request_token();
+}
+
+enterprise_connectors::AnalysisConnector
+BinaryUploadRequest::analysis_connector() {
+  return content_analysis_request_.analysis_connector();
+}
+
+const std::string& BinaryUploadRequest::device_token() const {
+  return content_analysis_request_.device_token();
+}
+
+const std::string& BinaryUploadRequest::request_token() const {
+  return content_analysis_request_.request_token();
+}
+
+const std::string& BinaryUploadRequest::filename() const {
+  return content_analysis_request_.request_data().filename();
+}
+
+const std::string& BinaryUploadRequest::digest() const {
+  return content_analysis_request_.request_data().digest();
+}
+
+const std::string& BinaryUploadRequest::content_type() const {
+  return content_analysis_request_.request_data().content_type();
+}
+
+const std::string& BinaryUploadRequest::user_action_id() const {
+  return content_analysis_request_.user_action_id();
+}
+
+const std::string& BinaryUploadRequest::tab_title() const {
+  return content_analysis_request_.request_data().tab_title();
+}
+
+const std::string& BinaryUploadRequest::printer_name() const {
+  return content_analysis_request_.request_data()
+      .print_metadata()
+      .printer_name();
+}
+
+uint64_t BinaryUploadRequest::user_action_requests_count() const {
+  return content_analysis_request_.user_action_requests_count();
+}
+
+GURL BinaryUploadRequest::tab_url() const {
+  if (!content_analysis_request_.has_request_data()) {
+    return GURL();
+  }
+  return GURL(content_analysis_request_.request_data().tab_url());
+}
+
+base::optional_ref<const std::string> BinaryUploadRequest::password() const {
+  return content_analysis_request_.request_data().has_decryption_key()
+             ? base::optional_ref(
+                   content_analysis_request_.request_data().decryption_key())
+             : std::nullopt;
+}
+
+enterprise_connectors::ContentAnalysisRequest::Reason
+BinaryUploadRequest::reason() const {
+  return content_analysis_request_.reason();
+}
+
+bool BinaryUploadRequest::blocking() const {
+  return content_analysis_request_.blocking();
+}
+
+bool BinaryUploadRequest::image_paste() const {
+  return image_paste_;
+}
+
+void BinaryUploadRequest::set_image_paste(bool image_paste) {
+  image_paste_ = image_paste;
+}
+
+bool BinaryUploadRequest::is_content_too_large() const {
+  return is_content_too_large_;
+}
+
+bool BinaryUploadRequest::is_content_encrypted() const {
+  return content_analysis_request_.is_content_encrypted();
+}
+
+void BinaryUploadRequest::StartRequest() {
+  if (!request_start_callback_.is_null()) {
+    std::move(request_start_callback_).Run(*this);
+  }
+}
+
+void BinaryUploadRequest::FinishRequest(
+    enterprise_connectors::ScanRequestUploadResult result,
+    enterprise_connectors::ContentAnalysisResponse response) {
+  if (content_analysis_callback_) {
+    std::move(content_analysis_callback_).Run(result, response);
+  }
+}
+
+void BinaryUploadRequest::SerializeToString(std::string* destination) const {
+  content_analysis_request_.SerializeToString(destination);
+}
+
+GURL BinaryUploadRequest::GetUrlWithParams() const {
+  DCHECK(std::holds_alternative<enterprise_connectors::CloudAnalysisSettings>(
+      cloud_or_local_settings_));
+
+  GURL url = GetUrlOverride().value_or(cloud_or_local_settings_.analysis_url());
+  url = net::AppendQueryParameter(url, enterprise::kUrlParamDeviceToken,
+                                  device_token());
+
+  std::string connector;
+  switch (content_analysis_request_.analysis_connector()) {
+    case enterprise_connectors::FILE_ATTACHED:
+      connector = "OnFileAttached";
+      break;
+    case enterprise_connectors::FILE_DOWNLOADED:
+      connector = "OnFileDownloaded";
+      break;
+    case enterprise_connectors::BULK_DATA_ENTRY:
+      connector = "OnBulkDataEntry";
+      break;
+    case enterprise_connectors::PRINT:
+      connector = "OnPrint";
+      break;
+    case enterprise_connectors::FILE_TRANSFER:
+      connector = "OnFileTransfer";
+      break;
+    case enterprise_connectors::ANALYSIS_CONNECTOR_UNSPECIFIED:
+      break;
+  }
+  if (!connector.empty()) {
+    url = net::AppendQueryParameter(url, enterprise::kUrlParamConnector,
+                                    connector);
+  }
+
+  for (const std::string& tag : content_analysis_request_.tags()) {
+    url = net::AppendQueryParameter(url, enterprise::kUrlParamTag, tag);
+  }
+
+  return url;
+}
+
+bool BinaryUploadRequest::IsAuthRequest() const {
+  return false;
+}
+
+const std::string& BinaryUploadRequest::access_token() const {
+  return access_token_;
+}
+
+void BinaryUploadRequest::set_access_token(const std::string& access_token) {
+  access_token_ = access_token;
+}
+
+std::optional<GURL> BinaryUploadRequest::GetUrlOverride() const {
+  // Ignore this flag on Stable and Beta to avoid abuse.
+  if (policy_connector_getter_.is_null()) {
+    return std::nullopt;
+  }
+  policy::BrowserPolicyConnector* policy_connector =
+      policy_connector_getter_.Run();
+  if (!policy_connector || !policy_connector->IsCommandLineSwitchSupported()) {
+    return std::nullopt;
+  }
+
+  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+  if (command_line->HasSwitch(
+          safe_browsing::switches::kCloudBinaryUploadServiceUrlFlag)) {
+    GURL url = GURL(command_line->GetSwitchValueASCII(
+        safe_browsing::switches::kCloudBinaryUploadServiceUrlFlag));
+    if (url.is_valid()) {
+      return url;
+    } else {
+      LOG(ERROR) << "--binary-upload-service-url is set to an invalid URL";
+    }
+  }
+
+  return std::nullopt;
+}
+
+}  // namespace enterprise_connectors
diff --git a/components/enterprise/connectors/core/cloud_content_scanning/binary_upload_request.h b/components/enterprise/connectors/core/cloud_content_scanning/binary_upload_request.h
new file mode 100644
index 0000000..c849b04
--- /dev/null
+++ b/components/enterprise/connectors/core/cloud_content_scanning/binary_upload_request.h
@@ -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.
+
+#ifndef COMPONENTS_ENTERPRISE_CONNECTORS_CORE_CLOUD_CONTENT_SCANNING_BINARY_UPLOAD_REQUEST_H_
+#define COMPONENTS_ENTERPRISE_CONNECTORS_CORE_CLOUD_CONTENT_SCANNING_BINARY_UPLOAD_REQUEST_H_
+
+#include "base/functional/callback.h"
+#include "base/memory/raw_ptr.h"
+#include "base/memory/read_only_shared_memory_region.h"
+#include "base/types/id_type.h"
+#include "base/types/optional_ref.h"
+#include "components/enterprise/common/proto/connectors.pb.h"
+#include "components/enterprise/connectors/core/analysis_settings.h"
+#include "components/enterprise/connectors/core/cloud_content_scanning/common.h"
+#include "url/gurl.h"
+
+namespace policy {
+class BrowserPolicyConnector;
+}  // namespace policy
+
+namespace enterprise_connectors {
+
+// A class to encapsulate the a request for upload. This class will provide
+// all the functionality needed to generate a ContentAnalysisRequest, and
+// subclasses will provide different sources of data to upload (e.g. file,
+// page or string).
+class BinaryUploadRequest {
+ public:
+  using BrowserPolicyConnectorGetter =
+      base::RepeatingCallback<policy::BrowserPolicyConnector*()>;
+  // Callbacks used to pass along the results of scanning. The response protos
+  // will only be populated if the result is SUCCESS. Will run on UI thread.
+  using ContentAnalysisCallback =
+      base::OnceCallback<void(ScanRequestUploadResult,
+                              ContentAnalysisResponse)>;
+
+  // RequestStartCallback: Optional callback, called on the UI thread before
+  // authentication attempts or upload. Useful for tracking individual
+  // uploads.
+  using RequestStartCallback =
+      base::OnceCallback<void(const BinaryUploadRequest&)>;
+
+  // Type alias for safe IDs
+  using Id = base::IdTypeU32<class RequestClass>;
+
+  BinaryUploadRequest(ContentAnalysisCallback,
+                      CloudOrLocalAnalysisSettings settings,
+                      BrowserPolicyConnectorGetter policy_connector_getter);
+  // Optional constructor which accepts RequestStartCallback. Will be called
+  // before request attempts upload.
+  BinaryUploadRequest(ContentAnalysisCallback,
+                      CloudOrLocalAnalysisSettings settings,
+                      RequestStartCallback,
+                      BrowserPolicyConnectorGetter policy_connector_getter);
+  virtual ~BinaryUploadRequest();
+  BinaryUploadRequest(const BinaryUploadRequest&) = delete;
+  BinaryUploadRequest& operator=(const BinaryUploadRequest&) = delete;
+  BinaryUploadRequest(BinaryUploadRequest&&) = delete;
+  BinaryUploadRequest& operator=(BinaryUploadRequest&&) = delete;
+
+  // Structure of data returned in the callback to GetRequestData().
+  struct Data {
+    Data();
+    Data(const Data&);
+    Data(Data&&);
+    Data& operator=(const Data&);
+    Data& operator=(Data&&);
+    ~Data();
+
+    // The data content. Only populated for string requests.
+    std::string contents;
+
+    // The path to the file to be scanned. Only populated for file requests.
+    base::FilePath path;
+
+    // The SHA256 of the data.
+    std::string hash;
+
+    // The size of the data. This can differ from `contents.size()` when the
+    // file is too large for deep scanning. This field will contain the true
+    // size.
+    uint64_t size = 0;
+
+    // The mime type of the data. Only populated for file requests.
+    std::string mime_type;
+
+    // The page's content. Only populated for page requests.
+    base::ReadOnlySharedMemoryRegion page;
+
+    // Whether the file has been obfuscated. Only populated for file requests.
+    bool is_obfuscated = false;
+  };
+
+  // Asynchronously returns the data required to make a MultipartUploadRequest.
+  // `result` is set to SUCCESS if getting the request data succeeded or
+  // some value describing the error.
+  using DataCallback = base::OnceCallback<void(ScanRequestUploadResult, Data)>;
+  virtual void GetRequestData(DataCallback callback) = 0;
+
+  // Returns the URL to send the request to.
+  GURL GetUrlWithParams() const;
+
+  // Returns the metadata to upload, as a ContentAnalysisRequest.
+  const ContentAnalysisRequest& content_analysis_request() const {
+    return content_analysis_request_;
+  }
+
+  const CloudOrLocalAnalysisSettings& cloud_or_local_settings() const {
+    return cloud_or_local_settings_;
+  }
+
+  void set_id(Id id);
+  Id id() const;
+
+  void set_per_profile_request(bool per_profile_request);
+  bool per_profile_request() const;
+
+  // Methods for modifying the ContentAnalysisRequest.
+  void set_analysis_connector(AnalysisConnector connector);
+  void set_url(const GURL& url);
+  void set_source(const std::string& source);
+  void set_destination(const std::string& destination);
+  void set_csd(safe_browsing::ClientDownloadRequest csd);
+  void add_tag(const std::string& tag);
+  void set_email(const std::string& email);
+  void set_device_token(const std::string& token);
+  void set_filename(const std::string& filename);
+  void set_digest(const std::string& digest);
+  void clear_dlp_scan_request();
+  void set_client_metadata(ClientMetadata metadata);
+  void set_content_type(const std::string& type);
+  void set_tab_title(const std::string& tab_title);
+  void set_user_action_id(const std::string& user_action_id);
+  void set_user_action_requests_count(uint64_t user_action_requests_count);
+  void set_tab_url(const GURL& tab_url);
+  void set_printer_name(const std::string& printer_name);
+  void set_printer_type(
+      ContentMetaData::PrintMetadata::PrinterType printer_type);
+  void set_clipboard_source_type(
+      ContentMetaData::CopiedTextSource::CopiedTextSourceType source_type);
+  void set_clipboard_source_url(const std::string& url);
+  void set_password(const std::string& password);
+  void set_reason(ContentAnalysisRequest::Reason reason);
+  void set_require_metadata_verdict(bool require_metadata_verdict);
+  void set_is_content_encrypted(bool is_content_encrypted);
+  void set_is_content_too_large(bool is_content_too_large);
+  void set_blocking(bool blocking);
+  void add_local_ips(const std::string& ip_address);
+  void set_referrer_chain(const google::protobuf::RepeatedPtrField<
+                          safe_browsing::ReferrerChainEntry> referrer_chain);
+  void set_content_area_account_email(const std::string& email);
+  void set_source_content_area_account_email(const std::string& email);
+  void set_frame_url_chain(
+      const google::protobuf::RepeatedPtrField<std::string> frame_url_chain);
+
+  std::string SetRandomRequestToken();
+
+  // Methods for accessing the ContentAnalysisRequest.
+  AnalysisConnector analysis_connector();
+  const std::string& device_token() const;
+  const std::string& request_token() const;
+  const std::string& filename() const;
+  const std::string& digest() const;
+  const std::string& content_type() const;
+  const std::string& user_action_id() const;
+  const std::string& tab_title() const;
+  const std::string& printer_name() const;
+  uint64_t user_action_requests_count() const;
+  GURL tab_url() const;
+  base::optional_ref<const std::string> password() const;
+  ContentAnalysisRequest::Reason reason() const;
+  bool blocking() const;
+  bool is_content_encrypted() const;
+  bool is_content_too_large() const;
+
+  // Called when beginning to try upload.
+  void StartRequest();
+
+  // Finish the request, with the given `result` and `response` from the
+  // server.
+  void FinishRequest(ScanRequestUploadResult result,
+                     ContentAnalysisResponse response);
+
+  // Calls SerializeToString on the appropriate proto request.
+  void SerializeToString(std::string* destination) const;
+
+  // Method used to identify authentication requests.
+  virtual bool IsAuthRequest() const;
+
+  const std::string& access_token() const;
+  void set_access_token(const std::string& access_token);
+
+  void set_image_paste(bool image_paste);
+  bool image_paste() const;
+
+ private:
+  std::optional<GURL> GetUrlOverride() const;
+
+  Id id_;
+  ContentAnalysisRequest content_analysis_request_;
+  ContentAnalysisCallback content_analysis_callback_;
+  RequestStartCallback request_start_callback_;
+
+  // Settings used to determine how the request is used in the cloud or
+  // locally.
+  CloudOrLocalAnalysisSettings cloud_or_local_settings_;
+
+  BrowserPolicyConnectorGetter policy_connector_getter_;
+
+  // Indicates if the request was triggered by a profile-level policy or not.
+  bool per_profile_request_ = false;
+
+  // Access token to be attached in the request headers.
+  std::string access_token_;
+
+  bool image_paste_ = false;
+
+  bool is_content_too_large_ = false;
+};
+
+}  // namespace enterprise_connectors
+
+#endif  // COMPONENTS_ENTERPRISE_CONNECTORS_CORE_CLOUD_CONTENT_SCANNING_BINARY_UPLOAD_REQUEST_H_
diff --git a/components/legion/BUILD.gn b/components/legion/BUILD.gn
index 8873037..b9da72c 100644
--- a/components/legion/BUILD.gn
+++ b/components/legion/BUILD.gn
@@ -73,6 +73,7 @@
     "attestation_handler_impl_unittest.cc",
     "client_impl_unittest.cc",
     "secure_channel_impl_unittest.cc",
+    "secure_session_async_impl_unittest.cc",
   ]
   deps = [
     ":legion",
@@ -80,7 +81,9 @@
     "//base",
     "//base/test:test_support",
     "//components/legion/crypto:unit_tests",
+    "//components/legion/mojom",
     "//components/legion/phosphor:unit_tests",
+    "//mojo/public/cpp/system",
     "//testing/gmock",
     "//testing/gtest",
     "//third_party/oak:oak_proto",
diff --git a/components/legion/secure_session_async_impl.cc b/components/legion/secure_session_async_impl.cc
index 6b9e5da1..c5672f7 100644
--- a/components/legion/secure_session_async_impl.cc
+++ b/components/legion/secure_session_async_impl.cc
@@ -11,9 +11,11 @@
 #include "base/containers/to_vector.h"
 #include "base/functional/bind.h"
 #include "base/location.h"
+#include "base/memory/ptr_util.h"
 #include "components/legion/crypto/constants.h"
 #include "components/legion/mojom/oak_session.mojom.h"
 #include "content/public/browser/service_process_host.h"
+#include "mojo/public/cpp/bindings/callback_helpers.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/oak/chromium/proto/session/session.pb.h"
 
@@ -73,6 +75,17 @@
 
 }  // namespace
 
+// static
+std::unique_ptr<SecureSessionAsyncImpl>
+SecureSessionAsyncImpl::CreateForTesting(  // IN-TEST
+    mojo::Remote<mojom::OakSession> service) {
+  return base::WrapUnique(new SecureSessionAsyncImpl(std::move(service)));
+}
+
+SecureSessionAsyncImpl::SecureSessionAsyncImpl(
+    mojo::Remote<mojom::OakSession> service)
+    : service_(std::move(service)) {}
+
 SecureSessionAsyncImpl::SecureSessionAsyncImpl()
     : service_(content::ServiceProcessHost::Launch<mojom::OakSession>(
           content::ServiceProcessHost::Options()
@@ -105,20 +118,25 @@
 }
 
 void SecureSessionAsyncImpl::Encrypt(const Request& data,
-                                     EncryptOnceCallback callback) {
-  service_->Encrypt(
-      data,
+                                     EncryptOnceCallback original_callback) {
+  auto callback = mojo::WrapCallbackWithDefaultInvokeIfNotRun(
       base::BindOnce(
           [](EncryptOnceCallback callback,
              const std::optional<std::vector<uint8_t>>& encrypted_data) {
             std::move(callback).Run(ConvertToEncryptedMessage(encrypted_data));
           },
-          std::move(callback)));
+          std::move(original_callback)),
+      std::nullopt);
+
+  service_->Encrypt(data, std::move(callback));
 }
 
 void SecureSessionAsyncImpl::Decrypt(
     const oak::session::v1::EncryptedMessage& data,
-    DecryptOnceCallback callback) {
+    DecryptOnceCallback original_callback) {
+  auto callback = mojo::WrapCallbackWithDefaultInvokeIfNotRun(
+      std::move(original_callback), std::nullopt);
+
   service_->Decrypt(ConvertToBytes(data), std::move(callback));
 }
 
diff --git a/components/legion/secure_session_async_impl.h b/components/legion/secure_session_async_impl.h
index 7911852..4f269dae 100644
--- a/components/legion/secure_session_async_impl.h
+++ b/components/legion/secure_session_async_impl.h
@@ -5,6 +5,7 @@
 #ifndef COMPONENTS_LEGION_SECURE_SESSION_ASYNC_IMPL_H_
 #define COMPONENTS_LEGION_SECURE_SESSION_ASYNC_IMPL_H_
 
+#include <memory>
 #include <optional>
 
 #include "components/legion/mojom/oak_session.mojom.h"
@@ -16,6 +17,9 @@
 
 class SecureSessionAsyncImpl : public SecureSession {
  public:
+  static std::unique_ptr<SecureSessionAsyncImpl> CreateForTesting(
+      mojo::Remote<mojom::OakSession> service);
+
   SecureSessionAsyncImpl();
   ~SecureSessionAsyncImpl() override;
 
@@ -30,6 +34,8 @@
                DecryptOnceCallback callback) override;
 
  private:
+  explicit SecureSessionAsyncImpl(mojo::Remote<mojom::OakSession> service);
+
   mojo::Remote<mojom::OakSession> service_;
 };
 
diff --git a/components/legion/secure_session_async_impl_unittest.cc b/components/legion/secure_session_async_impl_unittest.cc
new file mode 100644
index 0000000..8b9d2f7f
--- /dev/null
+++ b/components/legion/secure_session_async_impl_unittest.cc
@@ -0,0 +1,101 @@
+// 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 "components/legion/secure_session_async_impl.h"
+
+#include <cstdint>
+#include <memory>
+#include <optional>
+#include <utility>
+#include <vector>
+
+#include "base/functional/bind.h"
+#include "base/test/bind.h"
+#include "base/test/task_environment.h"
+#include "base/test/test_future.h"
+#include "components/legion/mojom/oak_session.mojom.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/oak/chromium/proto/session/session.pb.h"
+
+namespace legion {
+
+namespace {
+
+// FakeOakSessionService stores callbacks and never executes them on purpose.
+//
+// Otherwise if callbacks are destroyed before disconnection, it leads
+// to a crash.
+class FakeOakSessionService : public mojom::OakSession {
+ public:
+  FakeOakSessionService() = default;
+  ~FakeOakSessionService() override = default;
+
+  mojo::Remote<mojom::OakSession> BindAndCreateRemote() {
+    mojo::Remote<mojom::OakSession> remote;
+    receiver_.Bind(remote.BindNewPipeAndPassReceiver());
+    return remote;
+  }
+
+  // mojom::OakSession:
+  void InitiateHandshake(InitiateHandshakeCallback callback) override {
+    initiate_handshake_callback_ = std::move(callback);
+  }
+  void CompleteHandshake(HandshakeMessage message,
+                         CompleteHandshakeCallback callback) override {
+    complete_handshake_callback_ = std::move(callback);
+  }
+  void Encrypt(const std::vector<uint8_t>& data,
+               EncryptCallback callback) override {
+    encrypt_callback_ = std::move(callback);
+  }
+  void Decrypt(const std::vector<uint8_t>& data,
+               DecryptCallback callback) override {
+    decrypt_callback_ = std::move(callback);
+  }
+
+ private:
+  mojo::Receiver<mojom::OakSession> receiver_{this};
+
+  InitiateHandshakeCallback initiate_handshake_callback_;
+  CompleteHandshakeCallback complete_handshake_callback_;
+  EncryptCallback encrypt_callback_;
+  DecryptCallback decrypt_callback_;
+};
+
+// This class tests that SecureSessionAsyncImpl handles gracefully when remote
+// Mojo service is disconnected (e.g. due crash or memory pressure).
+class SecureSessionAsyncImplTest : public ::testing::Test {
+ public:
+  SecureSessionAsyncImplTest()
+      : fake_oak_session_service_(std::make_unique<FakeOakSessionService>()),
+        secure_session_(SecureSessionAsyncImpl::CreateForTesting(
+            fake_oak_session_service_->BindAndCreateRemote())) {}
+
+ protected:
+  base::test::TaskEnvironment task_environment_;
+
+  std::unique_ptr<FakeOakSessionService> fake_oak_session_service_;
+  std::unique_ptr<SecureSessionAsyncImpl> secure_session_;
+};
+
+TEST_F(SecureSessionAsyncImplTest, EncryptDisconnect) {
+  base::test::TestFuture<std::optional<oak::session::v1::EncryptedMessage>>
+      future;
+  secure_session_->Encrypt({}, future.GetCallback());
+  fake_oak_session_service_.reset();
+  EXPECT_FALSE(future.Get().has_value());
+}
+
+TEST_F(SecureSessionAsyncImplTest, DecryptDisconnect) {
+  base::test::TestFuture<const std::optional<std::vector<uint8_t>>&> future;
+  secure_session_->Decrypt({}, future.GetCallback());
+  fake_oak_session_service_.reset();
+  EXPECT_FALSE(future.Get().has_value());
+}
+
+}  // namespace
+
+}  // namespace legion
diff --git a/components/metrics/dwa/dwa_service.cc b/components/metrics/dwa/dwa_service.cc
index cd1cb232..55665abd 100644
--- a/components/metrics/dwa/dwa_service.cc
+++ b/components/metrics/dwa/dwa_service.cc
@@ -454,6 +454,10 @@
   *encrypted_report.mutable_report_header() = std::move(report_header);
   encrypted_report.set_report_type(
       ::private_metrics::EncryptedPrivateMetricReport::DWA);
+  *encrypted_report.mutable_encrypted_symmetric_key() =
+      std::move(result.value().encrypted_symmetric_key);
+  *encrypted_report.mutable_encapsulated_public_key() =
+      std::move(result.value().encapped_key);
   return encrypted_report;
 }
 
diff --git a/components/metrics/persistent_histograms.cc b/components/metrics/persistent_histograms.cc
index 1f17903e..bd5156d 100644
--- a/components/metrics/persistent_histograms.cc
+++ b/components/metrics/persistent_histograms.cc
@@ -15,7 +15,6 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/persistent_histogram_allocator.h"
 #include "base/strings/string_util.h"
-#include "base/system/sys_info.h"
 #include "base/task/thread_pool.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -254,19 +253,6 @@
     }
   }
 
-#if BUILDFLAG(IS_LINUX)
-  // Linux kernel 4.4.0.* shows a huge number of SIGBUS crashes with persistent
-  // histograms enabled using a mapped file.  Change this to use local memory.
-  // https://bugs.chromium.org/p/chromium/issues/detail?id=753741
-  if (mode == kMappedFile) {
-    int major, minor, bugfix;
-    base::SysInfo::OperatingSystemVersionNumbers(&major, &minor, &bugfix);
-    if (major == 4 && minor == 4 && bugfix == 0) {
-      mode = kLocalMemory;
-    }
-  }
-#endif
-
   InstantiatePersistentHistogramsImpl(metrics_dir, mode);
 }
 
diff --git a/components/one_time_tokens/android/backend/sms/android_sms_otp_backend.cc b/components/one_time_tokens/android/backend/sms/android_sms_otp_backend.cc
index 7d69b24..9f0b79a 100644
--- a/components/one_time_tokens/android/backend/sms/android_sms_otp_backend.cc
+++ b/components/one_time_tokens/android/backend/sms/android_sms_otp_backend.cc
@@ -7,6 +7,7 @@
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "components/one_time_tokens/android/backend/sms/sms_otp_retrieval_api_error_codes.h"
+#include "components/one_time_tokens/android/backend/sms/sms_otp_to_one_time_token_retrieval_error_converter.h"
 #include "components/one_time_tokens/core/browser/one_time_token.h"
 
 namespace one_time_tokens {
@@ -38,7 +39,8 @@
 }
 
 void AndroidSmsOtpBackend::RetrieveSmsOtp(
-    base::OnceCallback<void(const OtpFetchReply&)> callback) {
+    base::OnceCallback<void(
+        base::expected<OneTimeToken, OneTimeTokenRetrievalError>)> callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
 
   if (!initialization_result_.has_value()) {
@@ -50,8 +52,8 @@
 
   // Return early if the downstream backend did not initialize successfully.
   if (!initialization_result_.value()) {
-    std::move(callback).Run(
-        OtpFetchReply{/*otp_value=*/std::nullopt, /*request_complete=*/false});
+    std::move(callback).Run(base::unexpected(
+        OneTimeTokenRetrievalError::kSmsOtpBackendInitializationFailed));
     return;
   }
 
@@ -69,9 +71,8 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
   if (!pending_callbacks_.empty()) {
     std::move(pending_callbacks_.front())
-        .Run(OtpFetchReply{OneTimeToken(OneTimeTokenType::kSmsOtp,
-                                        std::move(value), base::Time::Now()),
-                           /*request_complete_=*/true});
+        .Run(OneTimeToken(OneTimeTokenType::kSmsOtp, std::move(value),
+                          base::Time::Now()));
     pending_callbacks_.pop();
   }
 }
@@ -82,13 +83,8 @@
   // TODO(crbug.com/415272524): Record metrics on the API error codes.
 
   if (!pending_callbacks_.empty()) {
-    // kTimeout means that nothing prevented the request from execution, but the
-    // SMS with the OTP value was not received within some time. All other
-    // errors mean that it was not possible to execute the request.
-    bool request_complete =
-        (error_code == SmsOtpRetrievalApiErrorCode::kTimeout);
     std::move(pending_callbacks_.front())
-        .Run(OtpFetchReply{/*otp_value=*/std::nullopt, request_complete});
+        .Run(base::unexpected(ConvertSmsOtpRetrievalApiErrorCode(error_code)));
     pending_callbacks_.pop();
   }
 }
diff --git a/components/one_time_tokens/android/backend/sms/android_sms_otp_backend.h b/components/one_time_tokens/android/backend/sms/android_sms_otp_backend.h
index c15eeec..5360885 100644
--- a/components/one_time_tokens/android/backend/sms/android_sms_otp_backend.h
+++ b/components/one_time_tokens/android/backend/sms/android_sms_otp_backend.h
@@ -5,17 +5,18 @@
 #ifndef COMPONENTS_ONE_TIME_TOKENS_ANDROID_BACKEND_SMS_ANDROID_SMS_OTP_BACKEND_H_
 #define COMPONENTS_ONE_TIME_TOKENS_ANDROID_BACKEND_SMS_ANDROID_SMS_OTP_BACKEND_H_
 
-#include <optional>
-
 #include "base/containers/queue.h"
 #include "base/functional/callback.h"
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
 #include "base/task/single_thread_task_runner.h"
+#include "base/types/expected.h"
 #include "base/types/pass_key.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/one_time_tokens/android/backend/sms/android_sms_otp_fetch_dispatcher_bridge.h"
 #include "components/one_time_tokens/android/backend/sms/android_sms_otp_fetch_receiver_bridge.h"
+#include "components/one_time_tokens/core/browser/one_time_token.h"
+#include "components/one_time_tokens/core/browser/one_time_token_retrieval_error.h"
 #include "components/one_time_tokens/core/browser/sms_otp_backend.h"
 
 namespace one_time_tokens {
@@ -42,7 +43,9 @@
 
   // SmsOtpBackend:
   void RetrieveSmsOtp(
-      base::OnceCallback<void(const OtpFetchReply&)> callback) override;
+      base::OnceCallback<void(
+          base::expected<OneTimeToken, OneTimeTokenRetrievalError>)> callback)
+      override;
 
   // AndroidSmsOtpFetchReceiverBridge::Consumer
   void OnOtpValueRetrieved(std::string value) override;
@@ -83,7 +86,8 @@
   scoped_refptr<base::SingleThreadTaskRunner> background_task_runner_;
 
   // Callbacks that needs to be invoked after the OTP retrieval is complete.
-  base::queue<base::OnceCallback<void(const OtpFetchReply&)>>
+  base::queue<base::OnceCallback<void(
+      base::expected<OneTimeToken, OneTimeTokenRetrievalError>)>>
       pending_callbacks_;
 
   // All methods should be called on the main thread.
diff --git a/components/one_time_tokens/android/backend/sms/android_sms_otp_backend_unittest.cc b/components/one_time_tokens/android/backend/sms/android_sms_otp_backend_unittest.cc
index 93b47e5..a84eecbf 100644
--- a/components/one_time_tokens/android/backend/sms/android_sms_otp_backend_unittest.cc
+++ b/components/one_time_tokens/android/backend/sms/android_sms_otp_backend_unittest.cc
@@ -99,7 +99,14 @@
   EXPECT_TRUE(base::test::RunUntil(
       [&] { return backend.GetInitializationResultForTesting().has_value(); }));
 
-  backend.RetrieveSmsOtp(base::DoNothing());
+  base::test::TestFuture<
+      base::expected<OneTimeToken, OneTimeTokenRetrievalError>>
+      future;
+  backend.RetrieveSmsOtp(future.GetCallback());
+  auto result = future.Get();
+  ASSERT_FALSE(result.has_value());
+  EXPECT_EQ(result.error(),
+            OneTimeTokenRetrievalError::kSmsOtpBackendInitializationFailed);
 }
 
 TEST_F(AndroidSmsOtpBackendTest, BackendInitSucceeds) {
@@ -181,19 +188,14 @@
   EXPECT_TRUE(base::test::RunUntil(
       [&] { return backend.GetInitializationResultForTesting().has_value(); }));
 
-  base::test::TestFuture<const OtpFetchReply&> future;
+  base::test::TestFuture<
+      base::expected<OneTimeToken, OneTimeTokenRetrievalError>>
+      future;
   backend.RetrieveSmsOtp(future.GetCallback());
   backend.OnOtpValueRetrieved("123456");
-  const OtpFetchReply& actual_result = future.Get();
-  EXPECT_THAT(
-      actual_result,
-      AllOf(
-          Field(&OtpFetchReply::otp_value,
-                testing::Optional(AllOf(Property("type", &OneTimeToken::type,
-                                                 Eq(OneTimeTokenType::kSmsOtp)),
-                                        Property("value", &OneTimeToken::value,
-                                                 Eq(std::string("123456")))))),
-          Field(&OtpFetchReply::request_complete, true)));
+  const base::expected<OneTimeToken, OneTimeTokenRetrievalError>&
+      actual_result = future.Get();
+  EXPECT_THAT(actual_result.value().value(), testing::Eq("123456"));
 }
 
 TEST_F(AndroidSmsOtpBackendTest, OtpValueFetchTimesOut) {
@@ -219,12 +221,16 @@
   EXPECT_TRUE(base::test::RunUntil(
       [&] { return backend.GetInitializationResultForTesting().has_value(); }));
 
-  base::test::TestFuture<const OtpFetchReply&> future;
+  base::test::TestFuture<
+      base::expected<OneTimeToken, OneTimeTokenRetrievalError>>
+      future;
   backend.RetrieveSmsOtp(future.GetCallback());
   backend.OnOtpValueRetrievalError(SmsOtpRetrievalApiErrorCode::kTimeout);
-  const OtpFetchReply& actual_result = future.Get();
-  EXPECT_EQ(actual_result.otp_value, std::nullopt);
-  EXPECT_TRUE(actual_result.request_complete);
+  const base::expected<OneTimeToken, OneTimeTokenRetrievalError>&
+      actual_result = future.Get();
+  ASSERT_FALSE(actual_result.has_value());
+  EXPECT_EQ(actual_result.error(),
+            OneTimeTokenRetrievalError::kSmsOtpBackendTimeout);
 }
 
 TEST_F(AndroidSmsOtpBackendTest, OtpValueFetchFails) {
@@ -250,12 +256,16 @@
   EXPECT_TRUE(base::test::RunUntil(
       [&] { return backend.GetInitializationResultForTesting().has_value(); }));
 
-  base::test::TestFuture<const OtpFetchReply&> future;
+  base::test::TestFuture<
+      base::expected<OneTimeToken, OneTimeTokenRetrievalError>>
+      future;
   backend.RetrieveSmsOtp(future.GetCallback());
   backend.OnOtpValueRetrievalError(
       SmsOtpRetrievalApiErrorCode::kApiNotAvailable);
-  const OtpFetchReply& actual_result = future.Get();
-  EXPECT_EQ(actual_result.otp_value, std::nullopt);
-  EXPECT_FALSE(actual_result.request_complete);
+  const base::expected<OneTimeToken, OneTimeTokenRetrievalError>&
+      actual_result = future.Get();
+  ASSERT_FALSE(actual_result.has_value());
+  EXPECT_EQ(actual_result.error(),
+            OneTimeTokenRetrievalError::kSmsOtpBackendApiNotAvailable);
 }
 }  // namespace one_time_tokens
diff --git a/components/one_time_tokens/core/browser/one_time_token_retrieval_error.h b/components/one_time_tokens/core/browser/one_time_token_retrieval_error.h
index 9c56e4b8..d1e8cd02 100644
--- a/components/one_time_tokens/core/browser/one_time_token_retrieval_error.h
+++ b/components/one_time_tokens/core/browser/one_time_token_retrieval_error.h
@@ -18,7 +18,9 @@
   kSmsOtpBackendApiNotAvailable = 4,
   kSmsOtpBackendUserPermissionRequired = 5,
   kSmsOtpGmscoreVersionNotSupported = 6,
-  kMaxValue = kSmsOtpGmscoreVersionNotSupported,
+  // Error code for when AndroidSmsOtpBackend initialization fails
+  kSmsOtpBackendInitializationFailed = 7,
+  kMaxValue = kSmsOtpBackendInitializationFailed,
 };
 
 }  // namespace one_time_tokens
diff --git a/components/one_time_tokens/core/browser/one_time_token_service_impl.cc b/components/one_time_tokens/core/browser/one_time_token_service_impl.cc
index 15608577..a6da468 100644
--- a/components/one_time_tokens/core/browser/one_time_token_service_impl.cc
+++ b/components/one_time_tokens/core/browser/one_time_token_service_impl.cc
@@ -4,8 +4,6 @@
 
 #include "components/one_time_tokens/core/browser/one_time_token_service_impl.h"
 
-#include <variant>
-
 #include "base/containers/adapters.h"
 #include "base/containers/to_vector.h"
 #include "base/functional/bind.h"
@@ -57,24 +55,24 @@
 }
 
 void OneTimeTokenServiceImpl::OnResponseFromSmsOtpBackend(
-    const OtpFetchReply& reply) {
+    base::expected<OneTimeToken, OneTimeTokenRetrievalError> reply) {
   sms_.has_pending_request = false;
-  if (!reply.request_complete || !reply.otp_value.has_value()) {
+  if (!reply.has_value()) {
     // TODO(crbug.com/415273270) Do proper error handling:
     // - In case of timeout, schedule a refetch if appropriate.
     // - In case of a permission error or API error, report the problems.
-    subscription_manager_.Notify(
-        OneTimeTokenSource::kOnDeviceSms,
-        base::unexpected(OneTimeTokenRetrievalError::kUnknown));
+    subscription_manager_.Notify(OneTimeTokenSource::kOnDeviceSms,
+                                 base::unexpected(reply.error()));
     return;
   }
 
-  cache_.PurgeExpiredAndAdd(*reply.otp_value);
+  const OneTimeToken& token = reply.value();
+  cache_.PurgeExpiredAndAdd(token);
   // Instead of notifying subscribers only if the OTP is actually new,
   // subscribers are always notified. This ensures that newly added subscribers
   // who missed notifications from before their subscription are informed.
   subscription_manager_.Notify(OneTimeTokenSource::kOnDeviceSms,
-                               base::ok(*reply.otp_value));
+                               base::ok(token));
 
   // It's possible that the SMS OTP backend responded with a stale OTP.
   // Therefore, schedule a new retrieval to see if a new OTP arrives.
diff --git a/components/one_time_tokens/core/browser/one_time_token_service_impl.h b/components/one_time_tokens/core/browser/one_time_token_service_impl.h
index 86a56a6..75810d67 100644
--- a/components/one_time_tokens/core/browser/one_time_token_service_impl.h
+++ b/components/one_time_tokens/core/browser/one_time_token_service_impl.h
@@ -7,8 +7,11 @@
 
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
+#include "base/types/expected.h"
 #include "components/keyed_service/core/keyed_service.h"
+#include "components/one_time_tokens/core/browser/one_time_token.h"
 #include "components/one_time_tokens/core/browser/one_time_token_cache.h"
+#include "components/one_time_tokens/core/browser/one_time_token_retrieval_error.h"
 #include "components/one_time_tokens/core/browser/one_time_token_service.h"
 #include "components/one_time_tokens/core/browser/sms_otp_backend.h"
 #include "components/one_time_tokens/core/browser/util/expiring_subscription_manager.h"
@@ -45,7 +48,8 @@
   // Retrieves SMS OTPs from `sms_.backend` if any subscriber is interested.
   // Results are posted to `OnResponseFromSmsOtpBackend`.
   void RetrieveSmsOtpIfNeeded();
-  void OnResponseFromSmsOtpBackend(const OtpFetchReply& reply);
+  void OnResponseFromSmsOtpBackend(
+      base::expected<OneTimeToken, OneTimeTokenRetrievalError> reply);
 
   // Handles subscriptions to the `OneTimeTokenService`.
   ExpiringSubscriptionManager<CallbackSignature> subscription_manager_;
diff --git a/components/one_time_tokens/core/browser/one_time_token_service_impl_unittest.cc b/components/one_time_tokens/core/browser/one_time_token_service_impl_unittest.cc
index 9b06c4d..cc09028 100644
--- a/components/one_time_tokens/core/browser/one_time_token_service_impl_unittest.cc
+++ b/components/one_time_tokens/core/browser/one_time_token_service_impl_unittest.cc
@@ -4,8 +4,6 @@
 
 #include "components/one_time_tokens/core/browser/one_time_token_service_impl.h"
 
-#include <variant>
-
 #include "base/functional/bind.h"
 #include "base/test/gmock_callback_support.h"
 #include "base/test/task_environment.h"
@@ -46,14 +44,17 @@
 class MockSmsOtpBackend : public SmsOtpBackend {
  public:
   void RetrieveSmsOtp(
-      base::OnceCallback<void(const OtpFetchReply&)> callback) override {
+      base::OnceCallback<void(
+          base::expected<OneTimeToken, OneTimeTokenRetrievalError>)> callback)
+      override {
     callbacks_.push_back(std::move(callback));
     RetrieveSmsOtpCalled();
   }
 
   bool HasPendingRetrieveSmsOtpCallbacks() { return !callbacks_.empty(); }
 
-  void SimulateOtpArrived(const OtpFetchReply& reply) {
+  void SimulateOtpArrived(
+      base::expected<OneTimeToken, OneTimeTokenRetrievalError> reply) {
     for (auto& callback : callbacks_) {
       std::move(callback).Run(reply);
     }
@@ -67,7 +68,9 @@
   MOCK_METHOD((void), RetrieveSmsOtpCalled, ());
 
  private:
-  std::list<base::OnceCallback<void(const OtpFetchReply&)>> callbacks_;
+  std::list<base::OnceCallback<void(
+      base::expected<OneTimeToken, OneTimeTokenRetrievalError>)>>
+      callbacks_;
 };
 
 // A helper class to collect results from the OneTimeTokenService callbacks.
@@ -101,19 +104,6 @@
   ~OneTimeTokenServiceImplTest() override = default;
 
  protected:
-  OtpFetchReply GetOtpReply(const std::string& otp_value) {
-    return OtpFetchReply(
-        OneTimeToken(OneTimeTokenType::kSmsOtp, otp_value, base::Time::Now()),
-        /*request_complete=*/true);
-  }
-
-  OtpFetchReply GetDefaultOtpFetchReply() { return GetOtpReply("123456"); }
-
-  OtpFetchReply GetOtpFailureReply() {
-    return OtpFetchReply(std::nullopt,
-                         /*request_complete=*/false);
-  }
-
   base::test::TaskEnvironment task_environment_{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
   MockSmsOtpBackend sms_otp_backend_;
@@ -162,7 +152,8 @@
       base::Time::Now() + base::Minutes(5),
       base::BindRepeating(&OneTimeTokenServiceTestObserver::OnTokenReceived,
                           base::Unretained(&observer)));
-  sms_otp_backend_.SimulateOtpArrived(GetDefaultOtpFetchReply());
+  sms_otp_backend_.SimulateOtpArrived(
+      OneTimeToken(OneTimeTokenType::kSmsOtp, "123456", base::Time::Now()));
 
   ASSERT_THAT(observer.results(),
               ElementsAre(Pair(OneTimeTokenSource::kOnDeviceSms,
@@ -179,14 +170,16 @@
       base::Time::Now() + base::Minutes(5),
       base::BindRepeating(&OneTimeTokenServiceTestObserver::OnTokenReceived,
                           base::Unretained(&observer)));
-  sms_otp_backend_.SimulateOtpArrived(GetOtpReply("1"));
+  sms_otp_backend_.SimulateOtpArrived(
+      OneTimeToken(OneTimeTokenType::kSmsOtp, "1", base::Time::Now()));
   Mock::VerifyAndClearExpectations(&sms_otp_backend_);
 
   // After a few seconds, the backend should be queried a second time.
   EXPECT_CALL(sms_otp_backend_, RetrieveSmsOtpCalled).Times(1);
   task_environment_.FastForwardBy(kSmsRefetchInterval);
   Mock::VerifyAndClearExpectations(&sms_otp_backend_);
-  sms_otp_backend_.SimulateOtpArrived(GetOtpReply("2"));
+  sms_otp_backend_.SimulateOtpArrived(
+      OneTimeToken(OneTimeTokenType::kSmsOtp, "2", base::Time::Now()));
 
   ASSERT_THAT(
       observer.results(),
@@ -214,7 +207,8 @@
                           base::Unretained(&observer2)));
 
   ASSERT_TRUE(sms_otp_backend_.HasPendingRetrieveSmsOtpCallbacks());
-  sms_otp_backend_.SimulateOtpArrived(GetDefaultOtpFetchReply());
+  sms_otp_backend_.SimulateOtpArrived(
+      OneTimeToken(OneTimeTokenType::kSmsOtp, "123456", base::Time::Now()));
 
   ASSERT_EQ(observer1.results().size(), 1u);
   ASSERT_EQ(observer2.results().size(), 1u);
@@ -235,7 +229,8 @@
   task_environment_.FastForwardBy(base::Minutes(6));
 
   ASSERT_TRUE(sms_otp_backend_.HasPendingRetrieveSmsOtpCallbacks());
-  sms_otp_backend_.SimulateOtpArrived(GetDefaultOtpFetchReply());
+  sms_otp_backend_.SimulateOtpArrived(
+      OneTimeToken(OneTimeTokenType::kSmsOtp, "123456", base::Time::Now()));
 
   EXPECT_TRUE(observer.results().empty());
 }
@@ -250,7 +245,8 @@
       base::Time::Now() + base::Minutes(5),
       base::BindRepeating(&OneTimeTokenServiceTestObserver::OnTokenReceived,
                           base::Unretained(&observer1)));
-  sms_otp_backend_.SimulateOtpArrived(GetOtpReply("1"));
+  sms_otp_backend_.SimulateOtpArrived(
+      OneTimeToken(OneTimeTokenType::kSmsOtp, "1", base::Time::Now()));
   ASSERT_THAT(observer1.results(),
               ElementsAre(Pair(OneTimeTokenSource::kOnDeviceSms,
                                OneTimeTokenValueEq("1"))));
@@ -259,7 +255,8 @@
   task_environment_.FastForwardBy(base::Minutes(6));
 
   // Terminate the last callback to the backend.
-  sms_otp_backend_.SimulateOtpArrived(GetOtpFailureReply());
+  sms_otp_backend_.SimulateOtpArrived(
+      base::unexpected(OneTimeTokenRetrievalError::kSmsOtpBackendError));
   EXPECT_FALSE(sms_otp_backend_.HasPendingRetrieveSmsOtpCallbacks());
 
   OneTimeTokenServiceTestObserver observer2;
@@ -268,7 +265,8 @@
       base::BindRepeating(&OneTimeTokenServiceTestObserver::OnTokenReceived,
                           base::Unretained(&observer2)));
   EXPECT_TRUE(sms_otp_backend_.HasPendingRetrieveSmsOtpCallbacks());
-  sms_otp_backend_.SimulateOtpArrived(GetOtpReply("2"));
+  sms_otp_backend_.SimulateOtpArrived(
+      OneTimeToken(OneTimeTokenType::kSmsOtp, "2", base::Time::Now()));
   ASSERT_THAT(observer2.results(),
               ElementsAre(Pair(OneTimeTokenSource::kOnDeviceSms,
                                OneTimeTokenValueEq("2"))));
@@ -287,7 +285,8 @@
                           base::Unretained(&subscriber_observer)));
 
   ASSERT_TRUE(sms_otp_backend_.HasPendingRetrieveSmsOtpCallbacks());
-  sms_otp_backend_.SimulateOtpArrived(GetDefaultOtpFetchReply());
+  sms_otp_backend_.SimulateOtpArrived(
+      OneTimeToken(OneTimeTokenType::kSmsOtp, "123456", base::Time::Now()));
 
   ASSERT_THAT(subscriber_observer.results(),
               ElementsAre(Pair(OneTimeTokenSource::kOnDeviceSms,
@@ -314,7 +313,8 @@
                           base::Unretained(&subscriber_observer)));
 
   ASSERT_TRUE(sms_otp_backend_.HasPendingRetrieveSmsOtpCallbacks());
-  sms_otp_backend_.SimulateOtpArrived(GetDefaultOtpFetchReply());
+  sms_otp_backend_.SimulateOtpArrived(
+      OneTimeToken(OneTimeTokenType::kSmsOtp, "123456", base::Time::Now()));
 
   ASSERT_EQ(subscriber_observer.results().size(), 1u);
 
@@ -343,13 +343,14 @@
                           base::Unretained(&observer)));
 
   ASSERT_TRUE(sms_otp_backend_.HasPendingRetrieveSmsOtpCallbacks());
-  sms_otp_backend_.SimulateOtpArrived(GetOtpFailureReply());
+  sms_otp_backend_.SimulateOtpArrived(
+      base::unexpected(OneTimeTokenRetrievalError::kSmsOtpBackendError));
 
   ASSERT_EQ(observer.results().size(), 1u);
   EXPECT_EQ(observer.results()[0].first, OneTimeTokenSource::kOnDeviceSms);
   const auto& result = observer.results()[0].second;
   ASSERT_FALSE(result.has_value());
-  EXPECT_EQ(result.error(), OneTimeTokenRetrievalError::kUnknown);
+  EXPECT_EQ(result.error(), OneTimeTokenRetrievalError::kSmsOtpBackendError);
 }
 
 // Test GetCachedOneTimeTokens returns cached tokens, including expired ones.
@@ -363,7 +364,8 @@
       base::BindRepeating(&OneTimeTokenServiceTestObserver::OnTokenReceived,
                           base::Unretained(&subscriber_observer)));
 
-  sms_otp_backend_.SimulateOtpArrived(GetOtpReply("123456"));
+  sms_otp_backend_.SimulateOtpArrived(
+      OneTimeToken(OneTimeTokenType::kSmsOtp, "123456", base::Time::Now()));
 
   // Verify that the token is returned by GetCachedOneTimeTokens.
   std::vector<OneTimeToken> cached_tokens = service.GetCachedOneTimeTokens();
diff --git a/components/one_time_tokens/core/browser/sms_otp_backend.cc b/components/one_time_tokens/core/browser/sms_otp_backend.cc
index 8283549..18e738e 100644
--- a/components/one_time_tokens/core/browser/sms_otp_backend.cc
+++ b/components/one_time_tokens/core/browser/sms_otp_backend.cc
@@ -6,15 +6,6 @@
 
 namespace one_time_tokens {
 
-OtpFetchReply::OtpFetchReply(std::optional<OneTimeToken> otp_value,
-                             bool request_complete)
-    : otp_value(std::move(otp_value)), request_complete(request_complete) {}
-
-OtpFetchReply::OtpFetchReply(const OtpFetchReply&) = default;
-OtpFetchReply& OtpFetchReply::operator=(const OtpFetchReply&) = default;
-
-OtpFetchReply::~OtpFetchReply() = default;
-
 SmsOtpBackend::~SmsOtpBackend() = default;
 
 }  // namespace one_time_tokens
diff --git a/components/one_time_tokens/core/browser/sms_otp_backend.h b/components/one_time_tokens/core/browser/sms_otp_backend.h
index 799ac60..2382035 100644
--- a/components/one_time_tokens/core/browser/sms_otp_backend.h
+++ b/components/one_time_tokens/core/browser/sms_otp_backend.h
@@ -5,28 +5,13 @@
 #ifndef COMPONENTS_ONE_TIME_TOKENS_CORE_BROWSER_SMS_OTP_BACKEND_H_
 #define COMPONENTS_ONE_TIME_TOKENS_CORE_BROWSER_SMS_OTP_BACKEND_H_
 
-#include <optional>
-#include <string>
-
 #include "base/functional/callback.h"
+#include "base/types/expected.h"
 #include "components/one_time_tokens/core/browser/one_time_token.h"
+#include "components/one_time_tokens/core/browser/one_time_token_retrieval_error.h"
 
 namespace one_time_tokens {
 
-struct OtpFetchReply {
-  OtpFetchReply(std::optional<OneTimeToken> otp_value, bool request_complete);
-  OtpFetchReply(const OtpFetchReply& rhs);
-  OtpFetchReply& operator=(const OtpFetchReply& rhs);
-  ~OtpFetchReply();
-
-  std::optional<OneTimeToken> otp_value;
-  // True if the request completed successfully. True if OTP value could be
-  // fetched, or if the OTP value was not found within teh allowed timeframe.
-  // False if the request is not complete (e.g. due to fetching backend API
-  // not available, or user permission denied).
-  bool request_complete = false;
-};
-
 // Abstract interface for fetching OTPs sent via SMS.
 class SmsOtpBackend {
  public:
@@ -34,7 +19,9 @@
 
   // Queries the backend for recently received OTPs.
   virtual void RetrieveSmsOtp(
-      base::OnceCallback<void(const OtpFetchReply&)> callback) = 0;
+      base::OnceCallback<
+          void(base::expected<OneTimeToken, OneTimeTokenRetrievalError>)>
+          callback) = 0;
 };
 
 }  // namespace one_time_tokens
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn
index ae78be56..646bf96 100644
--- a/components/password_manager/core/browser/BUILD.gn
+++ b/components/password_manager/core/browser/BUILD.gn
@@ -361,6 +361,7 @@
     sources = [
       "manage_passwords_referrer.h",
       "password_check_referrer_android.h",
+      "password_manager_metrics_util.h",
       "password_manager_setting.h",
       "password_manager_util.h",
       "password_store/android_backend_error.h",
diff --git a/components/password_manager/core/browser/password_manager_metrics_util.h b/components/password_manager/core/browser/password_manager_metrics_util.h
index 024d3de3..2ee1b58 100644
--- a/components/password_manager/core/browser/password_manager_metrics_util.h
+++ b/components/password_manager/core/browser/password_manager_metrics_util.h
@@ -633,6 +633,7 @@
 // numeric values should never be reused.
 //
 // LINT.IfChange(BrowserAssistedLoginType)
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.password_manager
 enum class BrowserAssistedLoginType {
   kFedCmPassive = 0,
   kFedCmActive = 1,
@@ -648,8 +649,10 @@
   kPasskeyStoredInChromeProfile = 11,
   kPasskeyHybrid = 12,
   kPasskeySecurityKey = 13,
+  kPasskeyHybridOrSecurityKey = 14,
+  kPasskeyUnknown = 15,
 
-  kMaxValue = kPasskeySecurityKey,
+  kMaxValue = kPasskeyUnknown,
 };
 // LINT.ThenChange(//tools/metrics/histograms/metadata/password/enums.xml:BrowserAssistedLoginType)
 
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto
index 3f0b0d4..5a97358 100644
--- a/components/policy/proto/device_management_backend.proto
+++ b/components/policy/proto/device_management_backend.proto
@@ -3494,7 +3494,7 @@
 message RegisterBrowserRequest {
   // The name of the machine within its local network. Deprecated, use
   // `browser_device_identifier` instead.
-  optional string machine_name = 1  [deprecated = true];
+  optional string machine_name = 1 [deprecated = true];
   // Platform, e.g., Windows or Mac.
   optional string os_platform = 2;
   // Platform specific version number, e.g., 6.1.7601.0 or 10.12.6
diff --git a/components/privacy_sandbox/privacy_sandbox_features.cc b/components/privacy_sandbox/privacy_sandbox_features.cc
index 7f4026f7..c18c705 100644
--- a/components/privacy_sandbox/privacy_sandbox_features.cc
+++ b/components/privacy_sandbox/privacy_sandbox_features.cc
@@ -105,7 +105,7 @@
 
 BASE_FEATURE(kRelatedWebsiteSetsUi, base::FEATURE_ENABLED_BY_DEFAULT);
 
-BASE_FEATURE(kRollBackModeB, base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kRollBackModeB, base::FEATURE_ENABLED_BY_DEFAULT);
 
 const char kRollBackModeBForcedName[] = "force";
 const base::FeatureParam<bool> kRollBackModeBForced{
diff --git a/components/proto_extras/proto_extras_lib.h b/components/proto_extras/proto_extras_lib.h
index 17e06a2c..0555eec 100644
--- a/components/proto_extras/proto_extras_lib.h
+++ b/components/proto_extras/proto_extras_lib.h
@@ -11,6 +11,7 @@
 #include "base/base64.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/strings/stringprintf.h"
 #include "base/values.h"
 
 namespace absl {
@@ -57,6 +58,16 @@
 // Convert an absl::Cord of bytes into a string.
 std::string Base64EncodeCord(const absl::Cord& cord);
 
+// Serialization for fields marked `debug_redact`
+template <typename T>
+std::string ToValueForDebugRedact(const T& value) {
+  if constexpr (std::is_same_v<T, std::string>) {
+    return base::StringPrintf("<%zu-byte secret>", value.size());
+  } else {
+    return "<secret>";
+  }
+}
+
 }  // namespace proto_extras
 
 #endif  // COMPONENTS_PROTO_EXTRAS_PROTO_EXTRAS_LIB_H_
diff --git a/components/proto_extras/proto_extras_plugin.cc b/components/proto_extras/proto_extras_plugin.cc
index 115be0d..4828b893 100644
--- a/components/proto_extras/proto_extras_plugin.cc
+++ b/components/proto_extras/proto_extras_plugin.cc
@@ -100,6 +100,10 @@
   using enum FieldDescriptor::Type;
   using enum FieldDescriptor::CppStringType;
   auto conversion_function = [&]() -> std::string {
+    if (field->options().debug_redact()) {
+      return "::proto_extras::ToValueForDebugRedact";
+    }
+
     switch (field->cpp_type()) {
       case CPPTYPE_DOUBLE:
       case CPPTYPE_FLOAT:
diff --git a/components/proto_extras/proto_extras_unittest.cc b/components/proto_extras/proto_extras_unittest.cc
index 6f138401..4676491 100644
--- a/components/proto_extras/proto_extras_unittest.cc
+++ b/components/proto_extras/proto_extras_unittest.cc
@@ -279,6 +279,37 @@
   })!"));
 }
 
+TEST(ProtoExtrasToValueTest, TestDebugRedacted) {
+  TestMessage message;
+
+  // `redacted_field` is optional, so it should not be present by default.
+  EXPECT_EQ(ToValue(message), base::test::ParseJson(R"!({
+    "double_field": 0.0,
+    "int32_field": 0,
+    "enum_field": "UNKNOWN",
+    "uint64_field": "0",
+  })!"));
+
+  message.set_redacted_field(6);
+  EXPECT_EQ(ToValue(message), base::test::ParseJson(R"!({
+    "double_field": 0.0,
+    "int32_field": 0,
+    "enum_field": "UNKNOWN",
+    "uint64_field": "0",
+    "redacted_field": "<secret>",
+  })!"));
+
+  message.set_redacted_string_field("13 bytes long");
+  EXPECT_EQ(ToValue(message), base::test::ParseJson(R"!({
+    "double_field": 0.0,
+    "int32_field": 0,
+    "enum_field": "UNKNOWN",
+    "uint64_field": "0",
+    "redacted_field": "<secret>",
+    "redacted_string_field": "<13-byte secret>",
+  })!"));
+}
+
 TEST(ProtoExtrasProto2ToValueTest, Basic) {
   TestMessageProto2 message;
   const std::string expected_empty_message_str = R"({})";
@@ -519,7 +550,6 @@
   EXPECT_EQ(msg1, msg2);
 }
 
-
 TEST(ProtoExtrasEquality, MapField) {
   TestMessage msg1;
   TestMessage msg2;
diff --git a/components/proto_extras/test_proto/test_proto.proto b/components/proto_extras/test_proto/test_proto.proto
index 496ac8c..91c350c1 100644
--- a/components/proto_extras/test_proto/test_proto.proto
+++ b/components/proto_extras/test_proto/test_proto.proto
@@ -64,4 +64,7 @@
 
   optional int32 optional_int_field = 21;
   optional EmptyEmbeddedMessage optional_empty_embedded_message_field = 22;
+
+  optional int32 redacted_field = 23 [debug_redact = true];
+  optional string redacted_string_field = 24 [debug_redact = true];
 }
diff --git a/components/security_interstitials/core/browser/resources/list_of_interstitials.html b/components/security_interstitials/core/browser/resources/list_of_interstitials.html
index 2a3eec84..bd651322 100644
--- a/components/security_interstitials/core/browser/resources/list_of_interstitials.html
+++ b/components/security_interstitials/core/browser/resources/list_of_interstitials.html
@@ -74,9 +74,11 @@
     <li>
       <a href="enterprise-block">Block</a>
     </li>
-    <li>
-      <a href="managed-profile-required">Managed profile required</a>
-    </li>
+    <if expr="not is_ios">
+      <li>
+        <a href="managed-profile-required">Managed profile required</a>
+      </li>
+    </if>
   </ul>
   <h3>SafeBrowsing</h3>
   <h4>Loud</h4>
diff --git a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.cc b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.cc
index 7d03c26..f710a480 100644
--- a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.cc
+++ b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.cc
@@ -11,6 +11,7 @@
 #include <optional>
 #include <string>
 
+#include "base/check_deref.h"
 #include "base/check_is_test.h"
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
@@ -34,6 +35,7 @@
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/signin/public/webdata/token_service_table.h"
 #include "components/signin/public/webdata/token_web_data.h"
+#include "components/unexportable_keys/features.h"
 #include "components/version_info/version_info.h"
 #include "components/webdata/common/web_data_service_base.h"
 #include "crypto/process_bound_string.h"
@@ -52,6 +54,8 @@
 
 namespace {
 
+constexpr base::TimeDelta kWebWrappedKeyFetchDelay = base::Minutes(2);
+
 bool g_ignore_non_official_api_keys_for_testing = false;
 
 const char kAccountIdPrefix[] = "AccountId-";
@@ -527,6 +531,18 @@
 
   loading_primary_account_id_ = primary_account_id;
   web_data_service_request_ = token_web_data_->GetAllTokens(this);
+
+  if (!base::FeatureList::IsEnabled(
+          unexportable_keys::kUnexportableKeyDeletion)) {
+    return;
+  }
+
+  base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(
+          &MutableProfileOAuth2TokenServiceDelegate::StartWebWrappedKeyFetch,
+          weak_ptr_factory_.GetWeakPtr()),
+      kWebWrappedKeyFetchDelay);
 }
 
 void MutableProfileOAuth2TokenServiceDelegate::OnWebDataServiceRequestDone(
@@ -536,6 +552,11 @@
           << (result.get() == nullptr ? -1
                                       : static_cast<int>(result->GetType()));
 
+  if (handle == web_data_service_request_for_gc_) {
+    OnWebWrappedKeyFetchDone(std::move(result));
+    return;
+  }
+
   DCHECK_EQ(web_data_service_request_, handle);
   web_data_service_request_ = 0;
   ScopedBatchChange batch(this);
@@ -859,12 +880,42 @@
       this, client_, refresh_token, 0));
 }
 
-void MutableProfileOAuth2TokenServiceDelegate::CancelWebTokenFetch() {
+void MutableProfileOAuth2TokenServiceDelegate::StartWebWrappedKeyFetch() {
+  if (!token_web_data_) {
+    return;
+  }
+
+  web_data_service_request_for_gc_ =
+      token_web_data_->GetAllWrappedBindingKeys(this);
+}
+
+void MutableProfileOAuth2TokenServiceDelegate::OnWebWrappedKeyFetchDone(
+    std::unique_ptr<WDTypedResult> result) {
+  web_data_service_request_for_gc_.reset();
+  if (!result) {
+    return;
+  }
+
+  CHECK_EQ(result->GetType(), WRAPPED_BINDING_KEYS_RESULT);
+  if (token_binding_helper_) {
+    token_binding_helper_->StartGarbageCollection(
+        static_cast<WDResult<absl::flat_hash_set<std::vector<uint8_t>>>&>(
+            *result)
+            .GetValue());
+  }
+}
+
+void MutableProfileOAuth2TokenServiceDelegate::CancelWebFetches() {
   if (web_data_service_request_ != 0) {
     DCHECK(token_web_data_);
     token_web_data_->CancelRequest(web_data_service_request_);
     web_data_service_request_ = 0;
   }
+
+  if (web_data_service_request_for_gc_.has_value()) {
+    CHECK_DEREF(token_web_data_)
+        .CancelRequest(*std::exchange(web_data_service_request_for_gc_, {}));
+  }
 }
 
 void MutableProfileOAuth2TokenServiceDelegate::ExtractCredentialsInternal(
@@ -904,7 +955,7 @@
 void MutableProfileOAuth2TokenServiceDelegate::Shutdown() {
   VLOG(1) << "MutablePO2TS::Shutdown";
   server_revokes_.clear();
-  CancelWebTokenFetch();
+  CancelWebFetches();
   refresh_tokens_.clear();
   if (token_binding_helper_) {
     token_binding_helper_->ClearAllKeys();
diff --git a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.h b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.h
index 0ef5c67..69c8121 100644
--- a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.h
+++ b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.h
@@ -13,6 +13,7 @@
 #include "base/functional/callback.h"
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
+#include "base/memory/weak_ptr.h"
 #include "base/threading/thread_checker.h"
 #include "base/types/optional_ref.h"
 #include "components/signin/internal/identity_manager/account_tracker_service.h"
@@ -265,8 +266,14 @@
   // Revokes the refresh token on the server.
   void RevokeCredentialsOnServer(const std::string& refresh_token);
 
-  // Cancels any outstanding fetch for tokens from the web database.
-  void CancelWebTokenFetch();
+  // Starts a fetch for wrapped keys from the web database.
+  void StartWebWrappedKeyFetch();
+
+  // Callback for the fetch for wrapped keys from the web database.
+  void OnWebWrappedKeyFetchDone(std::unique_ptr<WDTypedResult> result);
+
+  // Cancels any outstanding fetches from the web database.
+  void CancelWebFetches();
 
   std::string GetRefreshToken(const CoreAccountId& account_id) const;
 
@@ -291,6 +298,10 @@
   // Handle to the request reading tokens from database.
   WebDataServiceBase::Handle web_data_service_request_;
 
+  // Handle to the request reading wrapped keys from database for garbage
+  // collection.
+  std::optional<WebDataServiceBase::Handle> web_data_service_request_for_gc_;
+
   // Flag limiting `ClearUnreadableCredentials()` to take action at most once.
   bool has_cleared_unreadable_credentials_ = false;
 
@@ -321,6 +332,9 @@
   // Callback function that attempts to correct request errors.  Best effort
   // only.  Returns true if the error was fixed and retry should be reattempted.
   FixRequestErrorCallback fix_request_error_callback_;
+
+  base::WeakPtrFactory<MutableProfileOAuth2TokenServiceDelegate>
+      weak_ptr_factory_{this};
 };
 
 #endif  // COMPONENTS_SIGNIN_INTERNAL_IDENTITY_MANAGER_MUTABLE_PROFILE_OAUTH2_TOKEN_SERVICE_DELEGATE_H_
diff --git a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc
index 5d52fdc..7f23974 100644
--- a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc
+++ b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc
@@ -10,6 +10,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/feature_list.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
@@ -47,6 +48,8 @@
 #include "components/signin/public/webdata/token_web_data.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "components/unexportable_keys/fake_unexportable_key_service.h"
+#include "components/unexportable_keys/features.h"
+#include "components/unexportable_keys/mock_unexportable_key_service.h"
 #include "components/webdata/common/web_data_service_base.h"
 #include "components/webdata/common/web_database_service.h"
 #include "crypto/kdf.h"
@@ -164,6 +167,7 @@
   MutableProfileOAuth2TokenServiceDelegateTest()
       : task_environment_(
             base::test::TaskEnvironment::MainThreadType::UI,
+            base::test::TaskEnvironment::TimeSource::MOCK_TIME,
             base::test::TaskEnvironment::ThreadPoolExecutionMode::ASYNC),
         os_crypt_(os_crypt_async::GetTestOSCryptAsyncForTesting(
             /*is_sync_for_unittests=*/true)),
@@ -2269,3 +2273,39 @@
       oauth2_service_delegate_->GetRefreshToken(primary_account).c_str());
   EXPECT_TRUE(oauth2_service_delegate_->server_revokes_.empty());
 }
+
+class MutableProfileOAuth2TokenServiceDelegateGarbageCollectionTest
+    : public MutableProfileOAuth2TokenServiceDelegateTest,
+      public testing::WithParamInterface<bool> {};
+
+TEST_P(MutableProfileOAuth2TokenServiceDelegateGarbageCollectionTest,
+       UnexportableKeyDeletion) {
+  const bool enable_unexportable_key_deletion = GetParam();
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitWithFeatureState(
+      unexportable_keys::kUnexportableKeyDeletion,
+      enable_unexportable_key_deletion);
+
+  testing::StrictMock<unexportable_keys::MockUnexportableKeyService>
+      mock_unexportable_key_service;
+  oauth2_service_delegate_ = CreateOAuth2ServiceDelegate(
+      signin::AccountConsistencyMethod::kDice,
+      std::make_unique<TokenBindingHelper>(mock_unexportable_key_service));
+  oauth2_service_delegate_->SetOnRefreshTokenRevokedNotified(base::DoNothing());
+  test_service_observation_.Observe(oauth2_service_delegate_.get());
+
+  oauth2_service_delegate_->LoadCredentials(CoreAccountId());
+  WaitForRefreshTokensLoaded();
+
+  EXPECT_CALL(mock_unexportable_key_service,
+              GetAllSigningKeysForGarbageCollectionSlowlyAsync)
+      .Times(enable_unexportable_key_deletion ? 1 : 0);
+
+  task_environment_.FastForwardUntilNoTasksRemain();
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    ,
+    MutableProfileOAuth2TokenServiceDelegateGarbageCollectionTest,
+    testing::Bool(),
+    [](const auto& info) { return info.param ? "Enabled" : "Disabled"; });
diff --git a/components/signin/internal/identity_manager/token_binding_helper.cc b/components/signin/internal/identity_manager/token_binding_helper.cc
index c6bf9d4..fba4ee5 100644
--- a/components/signin/internal/identity_manager/token_binding_helper.cc
+++ b/components/signin/internal/identity_manager/token_binding_helper.cc
@@ -4,26 +4,36 @@
 
 #include "components/signin/internal/identity_manager/token_binding_helper.h"
 
+#include <algorithm>
 #include <optional>
 #include <string>
 #include <string_view>
+#include <utility>
+#include <vector>
 
 #include "base/containers/contains.h"
 #include "base/containers/flat_map.h"
 #include "base/containers/span.h"
+#include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
+#include "base/functional/callback_helpers.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/notreached.h"
+#include "base/task/sequenced_task_runner.h"
+#include "base/time/time.h"
 #include "base/types/expected.h"
+#include "base/types/expected_macros.h"
 #include "components/signin/public/base/session_binding_utils.h"
 #include "components/unexportable_keys/background_task_priority.h"
 #include "components/unexportable_keys/service_error.h"
+#include "components/unexportable_keys/unexportable_key_id.h"
 #include "components/unexportable_keys/unexportable_key_loader.h"
 #include "components/unexportable_keys/unexportable_key_service.h"
 #include "crypto/signature_verifier.h"
 #include "google_apis/gaia/core_account_id.h"
 #include "google_apis/gaia/gaia_urls.h"
+#include "third_party/abseil-cpp/absl/container/flat_hash_set.h"
 #include "url/gurl.h"
 
 namespace {
@@ -33,6 +43,8 @@
 constexpr unexportable_keys::BackgroundTaskPriority kTokenBindingPriority =
     unexportable_keys::BackgroundTaskPriority::kBestEffort;
 
+constexpr base::TimeDelta kGarbageCollectionDelay = base::Seconds(10);
+
 base::expected<std::string, TokenBindingHelper::Error> CreateAssertionToken(
     const std::string& header_and_payload,
     crypto::SignatureVerifier::SignatureAlgorithm algorithm,
@@ -124,6 +136,15 @@
       destination_url, std::move(callback)));
 }
 
+void TokenBindingHelper::StartGarbageCollection(
+    absl::flat_hash_set<std::vector<uint8_t>> known_wrapped_keys_in_db) {
+  unexportable_key_service_->GetAllSigningKeysForGarbageCollectionSlowlyAsync(
+      unexportable_keys::BackgroundTaskPriority::kBestEffort,
+      base::BindOnce(&TokenBindingHelper::OnGetAllKeysForGarbageCollection,
+                     weak_ptr_factory_.GetWeakPtr(),
+                     std::move(known_wrapped_keys_in_db)));
+}
+
 std::vector<uint8_t> TokenBindingHelper::GetWrappedBindingKey(
     const CoreAccountId& account_id) const {
   auto it = binding_keys_.find(account_id);
@@ -191,3 +212,56 @@
           .Then(base::BindOnce(&RunCallbackAndRecordMetrics,
                                std::move(callback))));
 }
+
+void TokenBindingHelper::OnGetAllKeysForGarbageCollection(
+    absl::flat_hash_set<std::vector<uint8_t>> known_wrapped_keys_in_db,
+    unexportable_keys::ServiceErrorOr<
+        std::vector<unexportable_keys::UnexportableKeyId>>
+        all_key_ids_or_error) {
+  if (!all_key_ids_or_error.has_value() || all_key_ids_or_error->empty()) {
+    return;
+  }
+
+  // Delay the actual garbage collection to give a chance for pending key
+  // generation tasks to complete.
+  //
+  // TODO(crbug.com/455538313): Instead of adding an arbitrary delay, simply
+  // don't delete keys that were modified after the beginning of the current
+  // Chrome session once we expose that timestamp in the keys.
+  base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(&TokenBindingHelper::DoGarbageCollection,
+                     weak_ptr_factory_.GetWeakPtr(),
+                     std::move(known_wrapped_keys_in_db),
+                     *std::move(all_key_ids_or_error)),
+      kGarbageCollectionDelay);
+}
+
+void TokenBindingHelper::DoGarbageCollection(
+    absl::flat_hash_set<std::vector<uint8_t>> known_wrapped_keys_in_db,
+    std::vector<unexportable_keys::UnexportableKeyId> all_key_ids) {
+  // Construct a set of all wrapped keys that are still used.
+  absl::flat_hash_set<std::vector<uint8_t>> known_wrapped_keys =
+      std::move(known_wrapped_keys_in_db);
+
+  for (const auto& [_, binding_key_data] : binding_keys_) {
+    known_wrapped_keys.insert(binding_key_data.wrapped_key);
+  }
+
+  // Filter out keys from the response that are still used.
+  std::erase_if(all_key_ids, [&](unexportable_keys::UnexportableKeyId key_id) {
+    unexportable_keys::ServiceErrorOr<std::vector<uint8_t>> wrapped_key =
+        unexportable_key_service_->GetWrappedKey(key_id);
+    return !wrapped_key.has_value() ||
+           known_wrapped_keys.contains(*wrapped_key);
+  });
+
+  // TODO(crbug.com/455538313): Add metrics for the number of keys
+  // deleted.
+  std::ranges::for_each(
+      all_key_ids, [&](unexportable_keys::UnexportableKeyId key_id) {
+        unexportable_key_service_->DeleteKeySlowlyAsync(
+            key_id, unexportable_keys::BackgroundTaskPriority::kBestEffort,
+            base::DoNothing());
+      });
+}
diff --git a/components/signin/internal/identity_manager/token_binding_helper.h b/components/signin/internal/identity_manager/token_binding_helper.h
index d1aad4a..c32d340d 100644
--- a/components/signin/internal/identity_manager/token_binding_helper.h
+++ b/components/signin/internal/identity_manager/token_binding_helper.h
@@ -8,13 +8,16 @@
 #include <optional>
 #include <string>
 #include <string_view>
+#include <vector>
 
 #include "base/containers/flat_map.h"
 #include "base/containers/span.h"
 #include "base/functional/callback_forward.h"
 #include "base/memory/raw_ref.h"
+#include "base/memory/weak_ptr.h"
 #include "components/unexportable_keys/service_error.h"
 #include "components/unexportable_keys/unexportable_key_id.h"
+#include "third_party/abseil-cpp/absl/container/flat_hash_set.h"
 
 namespace unexportable_keys {
 class UnexportableKeyService;
@@ -88,6 +91,10 @@
                                    const GURL& destination_url,
                                    GenerateAssertionCallback callback);
 
+  // Starts garbage collection of orphaned keys.
+  void StartGarbageCollection(
+      absl::flat_hash_set<std::vector<uint8_t>> known_wrapped_keys_in_db);
+
   // Returns a wrapped key associated with `account_id`. Returns an empty vector
   // if no key is found.
   std::vector<uint8_t> GetWrappedBindingKey(
@@ -124,10 +131,21 @@
       unexportable_keys::ServiceErrorOr<unexportable_keys::UnexportableKeyId>
           binding_key);
 
+  void OnGetAllKeysForGarbageCollection(
+      absl::flat_hash_set<std::vector<uint8_t>> known_wrapped_keys_in_db,
+      unexportable_keys::ServiceErrorOr<
+          std::vector<unexportable_keys::UnexportableKeyId>> result);
+
+  void DoGarbageCollection(
+      absl::flat_hash_set<std::vector<uint8_t>> known_wrapped_keys_in_db,
+      std::vector<unexportable_keys::UnexportableKeyId> all_key_ids);
+
   const raw_ref<unexportable_keys::UnexportableKeyService>
       unexportable_key_service_;
 
   base::flat_map<CoreAccountId, BindingKeyData> binding_keys_;
+
+  base::WeakPtrFactory<TokenBindingHelper> weak_ptr_factory_{this};
 };
 
 #endif  // COMPONENTS_SIGNIN_INTERNAL_IDENTITY_MANAGER_TOKEN_BINDING_HELPER_H_
diff --git a/components/signin/internal/identity_manager/token_binding_helper_unittest.cc b/components/signin/internal/identity_manager/token_binding_helper_unittest.cc
index ecd1c15..c91d012 100644
--- a/components/signin/internal/identity_manager/token_binding_helper_unittest.cc
+++ b/components/signin/internal/identity_manager/token_binding_helper_unittest.cc
@@ -4,18 +4,29 @@
 
 #include "components/signin/internal/identity_manager/token_binding_helper.h"
 
+#include <memory>
 #include <optional>
 #include <string>
+#include <utility>
+#include <variant>
 #include <vector>
 
+#include "base/containers/to_vector.h"
+#include "base/test/gmock_expected_support.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
 #include "components/signin/public/base/hybrid_encryption_key.h"
 #include "components/signin/public/base/hybrid_encryption_key_test_utils.h"
 #include "components/signin/public/base/session_binding_test_utils.h"
+#include "components/unexportable_keys/features.h"
+#include "components/unexportable_keys/mock_unexportable_key.h"
+#include "components/unexportable_keys/mock_unexportable_key_provider.h"
+#include "components/unexportable_keys/scoped_mock_unexportable_key_provider.h"
 #include "components/unexportable_keys/service_error.h"
 #include "components/unexportable_keys/unexportable_key_id.h"
+#include "components/unexportable_keys/unexportable_key_service.h"
 #include "components/unexportable_keys/unexportable_key_service_impl.h"
 #include "components/unexportable_keys/unexportable_key_task_manager.h"
 #include "crypto/scoped_fake_unexportable_key_provider.h"
@@ -26,7 +37,11 @@
 #include "url/gurl.h"
 
 namespace {
+
 using GenerateAssertionFuture = base::test::TestFuture<std::string>;
+using ::base::test::ErrorIs;
+using ::testing::Eq;
+using ::testing::Return;
 
 constexpr crypto::SignatureVerifier::SignatureAlgorithm
     kAcceptableAlgorithms[] = {crypto::SignatureVerifier::ECDSA_SHA256};
@@ -39,7 +54,9 @@
 
 class TokenBindingHelperTest : public testing::Test {
  public:
-  void RunBackgroundTasks() { task_environment_.RunUntilIdle(); }
+  void RunBackgroundTasks() {
+    task_environment_.FastForwardUntilNoTasksRemain();
+  }
 
   TokenBindingHelper& helper() { return helper_; }
 
@@ -49,6 +66,14 @@
 
   base::HistogramTester& histogram_tester() { return histogram_tester_; }
 
+  unexportable_keys::ScopedMockUnexportableKeyProvider&
+  SwitchToMockKeyProvider() {
+    // Using `emplace()` to destroy the existing scoped object before
+    // constructing a new one.
+    return scoped_key_provider_
+        .emplace<unexportable_keys::ScopedMockUnexportableKeyProvider>();
+  }
+
   unexportable_keys::UnexportableKeyId GenerateNewKey() {
     base::test::TestFuture<
         unexportable_keys::ServiceErrorOr<unexportable_keys::UnexportableKeyId>>
@@ -72,9 +97,12 @@
 
  private:
   base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME,
       // QUEUED - tasks don't run until `RunUntilIdle()` is called.
       base::test::TaskEnvironment::ThreadPoolExecutionMode::QUEUED};
-  crypto::ScopedFakeUnexportableKeyProvider scoped_key_provider_;
+  std::variant<crypto::ScopedFakeUnexportableKeyProvider,
+               unexportable_keys::ScopedMockUnexportableKeyProvider>
+      scoped_key_provider_;
   unexportable_keys::UnexportableKeyTaskManager unexportable_key_task_manager_;
   unexportable_keys::UnexportableKeyServiceImpl unexportable_key_service_{
       unexportable_key_task_manager_,
@@ -238,3 +266,50 @@
                                         TokenBindingHelper::kNoErrorForMetrics,
                                         /*expected_bucket_count=*/1);
 }
+
+TEST_F(TokenBindingHelperTest, StartGarbageCollectionDeletesUnusedKeys) {
+  unexportable_keys::MockUnexportableKeyProvider& mock_key_provider =
+      SwitchToMockKeyProvider().mock();
+
+  std::vector<uint8_t> used_wrapped_key_in_memory = {1, 2, 3};
+  std::vector<uint8_t> used_wrapped_key_in_db = {10, 11, 12};
+  std::vector<uint8_t> unused_wrapped_key1 = {4, 5, 6};
+  std::vector<uint8_t> unused_wrapped_key2 = {7, 8, 9};
+
+  auto create_mock_key = [](const std::vector<uint8_t>& wrapped_key) {
+    auto mock_key = std::make_unique<unexportable_keys::MockUnexportableKey>();
+    ON_CALL(*mock_key, GetWrappedKey).WillByDefault(Return(wrapped_key));
+    return mock_key;
+  };
+
+  auto used_unexportable_key_in_memory =
+      create_mock_key(used_wrapped_key_in_memory);
+  auto used_unexportable_key_in_db = create_mock_key(used_wrapped_key_in_db);
+  auto unused_unexportable_key1 = create_mock_key(unused_wrapped_key1);
+  auto unused_unexportable_key2 = create_mock_key(unused_wrapped_key2);
+
+  EXPECT_CALL(mock_key_provider, GetAllSigningKeysSlowly())
+      .WillOnce(Return(
+          base::ToVector<std::unique_ptr<crypto::UnexportableSigningKey>>({
+              std::move(used_unexportable_key_in_memory),
+              std::move(used_unexportable_key_in_db),
+              std::move(unused_unexportable_key1),
+              std::move(unused_unexportable_key2),
+          })));
+
+  helper().SetBindingKey(CoreAccountId::FromGaiaId(GaiaId("account_id")),
+                         used_wrapped_key_in_memory);
+  helper().StartGarbageCollection({used_wrapped_key_in_db});
+
+  EXPECT_CALL(mock_key_provider,
+              DeleteSigningKeySlowly(Eq(unused_wrapped_key1)));
+  EXPECT_CALL(mock_key_provider,
+              DeleteSigningKeySlowly(Eq(unused_wrapped_key2)));
+  EXPECT_CALL(mock_key_provider,
+              DeleteSigningKeySlowly(Eq(used_wrapped_key_in_memory)))
+      .Times(0);
+  EXPECT_CALL(mock_key_provider,
+              DeleteSigningKeySlowly(Eq(used_wrapped_key_in_db)))
+      .Times(0);
+  RunBackgroundTasks();
+}
diff --git a/components/signin/public/base/signin_feature_map.cc b/components/signin/public/base/signin_feature_map.cc
index d6dd7a1..4f1f49dd 100644
--- a/components/signin/public/base/signin_feature_map.cc
+++ b/components/signin/public/base/signin_feature_map.cc
@@ -20,6 +20,7 @@
 // Array of features exposed through the Java SigninFeatures API.
 const base::Feature* const kFeaturesExposedToJava[] = {
     &switches::kCctSignInPrompt,
+    &switches::kEnableAddSessionRedirect,
     &switches::kEnableSeamlessSignin,
     &switches::kForceStartupSigninPromo,
     &switches::kForceHistoryOptInScreen,
diff --git a/components/signin/public/base/signin_switches.cc b/components/signin/public/base/signin_switches.cc
index 7e32e2f9..764064f 100644
--- a/components/signin/public/base/signin_switches.cc
+++ b/components/signin/public/base/signin_switches.cc
@@ -145,6 +145,10 @@
                    base::Milliseconds(3000));
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 
+#if BUILDFLAG(IS_ANDROID)
+BASE_FEATURE(kEnableAddSessionRedirect, base::FEATURE_ENABLED_BY_DEFAULT);
+#endif
+
 #if BUILDFLAG(IS_IOS)
 BASE_FEATURE(kEnableASWebAuthenticationSession,
              base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/components/signin/public/base/signin_switches.h b/components/signin/public/base/signin_switches.h
index 6b50b80..4c30125 100644
--- a/components/signin/public/base/signin_switches.h
+++ b/components/signin/public/base/signin_switches.h
@@ -139,6 +139,13 @@
                            kChromeIdentitySurveyLaunchWithDelayDuration);
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 
+#if BUILDFLAG(IS_ANDROID)
+// After an account is added via the ADD_SESSION header it will be redirected to
+// the specified URL.
+COMPONENT_EXPORT(SIGNIN_SWITCHES)
+BASE_DECLARE_FEATURE(kEnableAddSessionRedirect);
+#endif
+
 #if BUILDFLAG(IS_IOS)
 // Features to enable using the ASWebAuthenticationSession to add accounts to
 // device.
diff --git a/components/signin/public/browser/web_signin_tracker.cc b/components/signin/public/browser/web_signin_tracker.cc
index f35739d..6323ecd 100644
--- a/components/signin/public/browser/web_signin_tracker.cc
+++ b/components/signin/public/browser/web_signin_tracker.cc
@@ -11,22 +11,23 @@
 #include "components/signin/public/base/signin_switches.h"
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h"
-
+#include "third_party/abseil-cpp/absl/functional/overload.h"
 namespace signin {
 
 WebSigninTracker::WebSigninTracker(
     IdentityManager* identity_manager,
     AccountReconcilor* account_reconcilor,
-    CoreAccountId signin_account,
+    std::variant<CoreAccountId, std::string> signin_account,
     base::OnceCallback<void(WebSigninTracker::Result)> callback,
     std::optional<base::TimeDelta> timeout)
     : identity_manager_(identity_manager),
+      account_reconcilor_(account_reconcilor),
       signin_account_(signin_account),
       callback_(std::move(callback)) {
   CHECK(callback_);
 
   identity_manager_observation_.Observe(identity_manager_);
-  account_reconcilor_observation_.Observe(account_reconcilor);
+  account_reconcilor_observation_.Observe(account_reconcilor_);
 
   if (timeout) {
     timeout_timer_.Start(FROM_HERE, *timeout, this,
@@ -49,8 +50,8 @@
     const signin::AccountsInCookieJarInfo& accounts_in_cookie_jar_info,
     const GoogleServiceAuthError& error) {
   for (const auto& account :
-       accounts_in_cookie_jar_info.GetPotentiallyInvalidSignedInAccounts()) {
-    if (account.valid && account.id == signin_account_) {
+       accounts_in_cookie_jar_info.GetValidSignedInAccounts()) {
+    if (MatchesRequestedAccount(account.id, account.email)) {
       FinishWithResult(Result::kSuccess);
       return;
     }
@@ -69,10 +70,24 @@
     return;
   }
 
-  bool is_auth_error =
-      identity_manager_->HasAccountWithRefreshTokenInPersistentErrorState(
-          signin_account_);
-  FinishWithResult(is_auth_error ? Result::kAuthError : Result::kOtherError);
+  // If account is not on the device ignore errors from the account reconciler.
+  for (const CoreAccountInfo& account :
+       identity_manager_->GetAccountsWithRefreshTokens()) {
+    if (MatchesRequestedAccount(account.account_id, account.email)) {
+      bool is_auth_error = false;
+      if (std::holds_alternative<CoreAccountId>(signin_account_)) {
+        is_auth_error =
+            identity_manager_->HasAccountWithRefreshTokenInPersistentErrorState(
+                std::get<CoreAccountId>(signin_account_));
+      } else {
+        // The account is not on the device and so this will be an auth error.
+        is_auth_error = true;
+      }
+
+      FinishWithResult(is_auth_error ? Result::kAuthError
+                                     : Result::kOtherError);
+    }
+  }
 }
 
 void WebSigninTracker::OnTimeoutReached() {
@@ -86,4 +101,18 @@
   std::move(callback_).Run(result);
 }
 
+bool WebSigninTracker::MatchesRequestedAccount(
+    const CoreAccountId& account_id,
+    const std::string& account_email) {
+  return std::visit(absl::Overload(
+                        [&account_id](const CoreAccountId& requested_id) {
+                          return account_id == requested_id;
+                        },
+                        [&account_email](const std::string& requested_email) {
+                          return gaia::AreEmailsSame(account_email,
+                                                     requested_email);
+                        }),
+                    signin_account_);
+}
+
 }  // namespace signin
diff --git a/components/signin/public/browser/web_signin_tracker.h b/components/signin/public/browser/web_signin_tracker.h
index 725eba17..38a7350 100644
--- a/components/signin/public/browser/web_signin_tracker.h
+++ b/components/signin/public/browser/web_signin_tracker.h
@@ -6,6 +6,7 @@
 #define COMPONENTS_SIGNIN_PUBLIC_BROWSER_WEB_SIGNIN_TRACKER_H_
 
 #include <optional>
+#include <string>
 
 #include "base/functional/callback_forward.h"
 #include "base/memory/raw_ptr.h"
@@ -40,7 +41,7 @@
 
   WebSigninTracker(IdentityManager* identity_manager,
                    AccountReconcilor* account_reconcilor,
-                   CoreAccountId signin_account,
+                   std::variant<CoreAccountId, std::string> signin_account,
                    base::OnceCallback<void(Result)> callback,
                    std::optional<base::TimeDelta> timeout = std::nullopt);
 
@@ -61,9 +62,14 @@
  private:
   void OnTimeoutReached();
   void FinishWithResult(WebSigninTracker::Result result);
+  bool MatchesRequestedAccount(const CoreAccountId& account_id,
+                               const std::string& account_email);
 
   const raw_ptr<IdentityManager> identity_manager_;
-  CoreAccountId signin_account_;
+  const raw_ptr<AccountReconcilor> account_reconcilor_;
+  // Holds either the CoreAccountId of the signed-in account, or the email
+  // address of the account has not been made available in IdentityManager yet.
+  std::variant<CoreAccountId, std::string> signin_account_;
   base::OnceCallback<void(Result)> callback_;
   base::ScopedObservation<IdentityManager, IdentityManager::Observer>
       identity_manager_observation_{this};
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index ee974922..26da91d 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -220,6 +220,7 @@
 <translation id="1339601241726513588">نطاق التسجيل:</translation>
 <translation id="1340482604681802745">عنوان الاستلام</translation>
 <translation id="1343356790768851700">يحدّد هذا الموقع الإلكتروني اهتماماتك، ثم يقدّم إلى المواقع الإلكترونية الأخرى اقتراحات عن الإعلانات ذات الصلة باهتماماتك.</translation>
+<translation id="1343830902827845050">‏سجِّل الدخول إلى Chrome</translation>
 <translation id="1346748346194534595">يمين</translation>
 <translation id="1348779747280417563">تأكيد الاسم</translation>
 <translation id="1352798470428594123">‏يحظر Chrome معظم المواقع الإلكترونية في استخدام ملفات تعريف الارتباط التابعة لجهات خارجية لتتبُّع موقعك الإلكتروني أثناء التصفُّح. انتقِل إلى الإعدادات حتى تتمكّن من <ph name="LINK" />.</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb
index b836b015..9725cf7b 100644
--- a/components/strings/components_strings_id.xtb
+++ b/components/strings/components_strings_id.xtb
@@ -220,6 +220,7 @@
 <translation id="1339601241726513588">Domain pendaftaran:</translation>
 <translation id="1340482604681802745">Alamat pengambilan</translation>
 <translation id="1343356790768851700">Situs ini menentukan hal-hal yang Anda sukai, lalu menyarankan iklan ke situs lain</translation>
+<translation id="1343830902827845050">Login ke Chrome</translation>
 <translation id="1346748346194534595">Kanan</translation>
 <translation id="1348779747280417563">Konfirmasi nama</translation>
 <translation id="1352798470428594123">Chrome membatasi sebagian besar situs agar tidak menggunakan cookie pihak ketiga untuk melacak Anda saat menjelajah. Buka setelan untuk <ph name="LINK" />.</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb
index 99bc2953a..764d84ce 100644
--- a/components/strings/components_strings_ko.xtb
+++ b/components/strings/components_strings_ko.xtb
@@ -220,6 +220,7 @@
 <translation id="1339601241726513588">등록 도메인:</translation>
 <translation id="1340482604681802745">수령 주소</translation>
 <translation id="1343356790768851700">이 사이트는 내 관심분야를 파악한 후 다른 사이트에 광고를 추천합니다.</translation>
+<translation id="1343830902827845050">Chrome에 로그인하세요</translation>
 <translation id="1346748346194534595">오른쪽</translation>
 <translation id="1348779747280417563">이름 확인</translation>
 <translation id="1352798470428594123">Chrome은 대부분의 사이트에 대해 서드 파티 쿠키를 사용하여 탐색 중인 사용자를 추적하지 못하도록 제한합니다. <ph name="LINK" />를 하려면 설정으로 이동하세요.</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb
index 27a74ee..9000eba 100644
--- a/components/strings/components_strings_mn.xtb
+++ b/components/strings/components_strings_mn.xtb
@@ -220,6 +220,7 @@
 <translation id="1339601241726513588">Бүртгэлийн домэйн:</translation>
 <translation id="1340482604681802745">Авах хаяг</translation>
 <translation id="1343356790768851700">Энэ сайт таны дуртай зүйлсийг тодорхойлж, дараа нь бусад сайтад зар санал болгодог</translation>
+<translation id="1343830902827845050">Chrome-д нэвтрэх</translation>
 <translation id="1346748346194534595">Баруун</translation>
 <translation id="1348779747280417563">Нэрийг баталгаажуулах</translation>
 <translation id="1352798470428594123">Chrome таныг үзэх үед хянахын тулд ихэнх сайтыг гуравдагч талын күүкиг ашиглахыг хязгаарлана. <ph name="LINK" />-н тохиргоонд зочилно уу.</translation>
@@ -513,7 +514,7 @@
 <translation id="1812975699435941848">Эрүүл мэндийн боловсрол болон эмнэлгийн сургалт</translation>
 <translation id="1816436748874040213">Хуваалцсан табуудыг гүйлгэж, томруулахыг хүсэх боломжтой</translation>
 <translation id="1816707915923025275">Хөтчийн түүхээсээ хайхын тулд @түүх гэж бичнэ үү</translation>
-<translation id="1817364650920811003">Үүрэг: Chrome-н зөвлөгөө. Хандалтын шошго: <ph name="CHROME_TIP" /></translation>
+<translation id="1817364650920811003">Үүрэг: Chrome-н зөвлөгөө. Хүртээмжийн шошго: <ph name="CHROME_TIP" /></translation>
 <translation id="1818522458013171885">Блокоос гаргах</translation>
 <translation id="1818585559878922121">Баримтат кинонууд</translation>
 <translation id="182139138257690338">Автомат таталтууд</translation>
@@ -822,7 +823,7 @@
 <translation id="2312234273148520048">Амтлагч болон сүмснүүд</translation>
 <translation id="2316087952091171402"><ph name="UPPER_ESTIMATE" />-с бага байна. Таныг дараагийн удаа зочлоход зарим сайт илүү удаан ачаалж магадгүй.</translation>
 <translation id="2316090909467242775">Энэ сэргээх нууц үгийг туршиж үзнэ үү</translation>
-<translation id="2316159751672436664">ChromeOS-н тохиргоонд хандалтын хэрэгслээ хувийн болгоно уу</translation>
+<translation id="2316159751672436664">ChromeOS-н тохиргоонд хүртээмжтэй хэрэгслээ хувийн болгоно уу</translation>
 <translation id="2316887270356262533">1 MB-с бага зай гаргана. Зарим сайтад зочлох үед удаан ачаалж болзошгүй.</translation>
 <translation id="2317259163369394535"><ph name="DOMAIN" /> хэрэглэгчийн нэр, нууц үгийг шаардаж байна.</translation>
 <translation id="2318594867107319532">Бодлогын сүүлийн хугацаа тэмдэглэгч:</translation>
@@ -870,7 +871,7 @@
 <translation id="2378084239755710604">Карт хадгалахыг хаасан.</translation>
 <translation id="237978325638124213">Үнэртэн, үнэртэй уснууд</translation>
 <translation id="2380886658946992094">Хууль ёсны</translation>
-<translation id="2383455408879745299">Chrome-н тохиргоонд хандалтын хэрэгслээ хувийн болгоно уу</translation>
+<translation id="2383455408879745299">Chrome-н тохиргоонд хүртээмжтэй хэрэгслээ хувийн болгоно уу</translation>
 <translation id="2384307209577226199">Байгууллагын өгөгдмөл</translation>
 <translation id="238459632961158867">Вебсайт</translation>
 <translation id="2384823392576123225">Хавчуургаас хайх</translation>
@@ -2804,7 +2805,7 @@
 <translation id="5523118979700054094">Тохиргооны нэр</translation>
 <translation id="5523588073846127669">Худалдаачин энэ виртуал картыг зөвшөөрдөггүй</translation>
 <translation id="5525755241743357906">Хуулсан эсвэл зөөсөн файл</translation>
-<translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, ChromeOS-н тохиргоонд хандалтын хэрэгслээ хувийн болгохын тулд эхлээд tab, дараа нь Enter дээр дарна уу</translation>
+<translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, ChromeOS-н тохиргоонд хүртээмжтэй хэрэгслээ хувийн болгохын тулд эхлээд tab, дараа нь Enter дээр дарна уу</translation>
 <translation id="55293785478302737">Ирмэгийг нь нийлүүлж үдэх</translation>
 <translation id="553377674408670169">Боловсролын ажлын байрууд</translation>
 <translation id="5534785731327961487">Одоогийн ашигтай тусгай санал</translation>
@@ -3226,7 +3227,7 @@
 <translation id="6222527803348563979">Бичгийн цаас</translation>
 <translation id="62231116988543150">Веб аппликэйшнүүдийг суулгах боломжтой байх</translation>
 <translation id="6224281071334553713">Үнэт чулуу болон үнэт эдлэл</translation>
-<translation id="6226163402662242066"><ph name="MANAGE_CHROME_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome-н тохиргоонд хандалтын хэрэгслээ хувийн болгохын тулд эхлээд tab, дараа нь Enter дээр дарна уу</translation>
+<translation id="6226163402662242066"><ph name="MANAGE_CHROME_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome-н тохиргоонд хүртээмжтэй хэрэгслээ хувийн болгохын тулд эхлээд tab, дараа нь Enter дээр дарна уу</translation>
 <translation id="6228346913624365233">Тансаг зэрэглэлийн тээврийн хэрэгслүүд</translation>
 <translation id="6228836011612806720">Дэлгүүрийн шүүмж. Дундаж үнэлгээ нь <ph name="STARS" /> од байна.</translation>
 <translation id="6229196330202833460">Кино болон ТВ-ийн стриминг</translation>
@@ -3282,7 +3283,7 @@
 <translation id="6311642842034740437">Нэртэй байршил</translation>
 <translation id="6312113039770857350">Веб хуудас боломжгүй байна</translation>
 <translation id="6316110367871394043"><ph name="CLOUD_PROVIDER" />-д файл байршуулахыг түр зогсоосон</translation>
-<translation id="63172326633386613">Хандалтын тохиргоог удирдах</translation>
+<translation id="63172326633386613">Хүртээмжтэй тохиргоог удирдах</translation>
 <translation id="6319672966240656136">Та Google-н Дэвшилтэт хамгаалалтын хөтөлбөрт байгаа тул энэ сайтыг блоклосон хэвээр үлдэнэ. <ph name="BEGIN_LEARN_MORE_LINK" />Энэ сануулгын талаар нэмэлт мэдээлэл авах<ph name="END_LEARN_MORE_LINK" /></translation>
 <translation id="6321917430147971392">DNS тохиргоогоо шалгана уу</translation>
 <translation id="6322182122604171028">Windows Hello-г ашиглаж чадсангүй</translation>
@@ -3432,7 +3433,7 @@
 <translation id="6520509611422418552"><ph name="MEMBER_FIRST_NAME" /> "<ph name="GROUP_NAME" />" табын бүлэгт нэгдсэн</translation>
 <translation id="6521745193039995384">Идэвхгүй</translation>
 <translation id="6522682797352430154">Сонгодог хөгжим</translation>
-<translation id="6524830701589638230">Хандалтын тохиргоог удирдах товчлуур, Chrome-н тохиргоонд хандалтын хэрэгслээ хувийн болгохын тулд идэвхжүүлнэ үү</translation>
+<translation id="6524830701589638230">Хүртээмжтэй тохиргоог удирдах товчлуур, Chrome-н тохиргоонд хүртээмжтэй хэрэгслээ хувийн болгохын тулд идэвхжүүлнэ үү</translation>
 <translation id="6527049834925947126">Хүнсний үйлдвэрлэл</translation>
 <translation id="6529173248185917884">Долоо дахь хуйлмал</translation>
 <translation id="6529602333819889595">&amp; Устгах үйлдлийг дахин хийх</translation>
@@ -4487,7 +4488,7 @@
 <translation id="824968735947741546"><ph name="SOURCE" />-с (автоматаар илрүүлсэн) <ph name="TARGET" /> руу орчуулж байна</translation>
 <translation id="8250094606476360498">Энэ хаягийг одоогоор энэ төхөөрөмжид хадгалсан. Үүнийг Google-н бүтээгдэхүүнүүдэд ашиглахын тулд <ph name="ACCOUNT" /> Google Бүртгэлдээ хадгална уу.</translation>
 <translation id="8251493595871259082">Хаягаа бага бичиж бөглөөрэй</translation>
-<translation id="8252991034201168845">Хандалтын тохиргоог удирдах товчлуур, ChromeOS-н тохиргоонд хандалтын хэрэгслээ хувийн болгохын тулд Enter дээр дарна уу</translation>
+<translation id="8252991034201168845">Хүртээмжтэй тохиргоог удирдах товчлуур, ChromeOS-н тохиргоонд хандалтын хэрэгслээ хувийн болгохын тулд Enter дээр дарна уу</translation>
 <translation id="8253091569723639551">Тооцооны хаяг шаардлагатай</translation>
 <translation id="8257387598443225809">Энэ апп нь мобайлд зориулагдсан</translation>
 <translation id="8259239120149678929">ТВ-ийн баримтат кино, бодит явдал</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index ca7809c..2718e69 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -220,6 +220,7 @@
 <translation id="1339601241726513588">Domena za prijavo:</translation>
 <translation id="1340482604681802745">Naslov za prevzem</translation>
 <translation id="1343356790768851700">To spletno mesto določi stvari, ki so vam všeč, in nato predlaga oglase drugim spletnim mestom.</translation>
+<translation id="1343830902827845050">Prijava v Chrome</translation>
 <translation id="1346748346194534595">V desno</translation>
 <translation id="1348779747280417563">Potrditev imena</translation>
 <translation id="1352798470428594123">Chrome večini spletnih mest omejuje uporabo piškotkov tretjih oseb za vaše sledenje med brskanjem. Obiščite nastavitve za <ph name="LINK" />.</translation>
diff --git a/components/webauthn/android/BUILD.gn b/components/webauthn/android/BUILD.gn
index 3e7ad5d..45ffa03 100644
--- a/components/webauthn/android/BUILD.gn
+++ b/components/webauthn/android/BUILD.gn
@@ -84,6 +84,7 @@
     "//base/version_info/android:version_constants_java",
     "//build/android:build_java",
     "//components/externalauth/android:java",
+    "//components/password_manager/core/browser:password_manager_java_enums",
     "//components/ukm/android:java",
     "//content/public/android:content_java",
     "//content/public/common:common_java",
@@ -231,6 +232,7 @@
     "//base:base_java",
     "//base:base_java_test_support",
     "//base:base_junit_test_support",
+    "//components/password_manager/core/browser:password_manager_java_enums",
     "//components/payments/content/android:junit_test_support",
     "//content/public/android:content_java",
     "//mojo/public/mojom/base:base_java",
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java
index 65bfa28..a8eb144 100644
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java
@@ -29,6 +29,7 @@
 import org.chromium.blink.mojom.WebAuthnClientCapability;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
+import org.chromium.components.password_manager.BrowserAssistedLoginType;
 import org.chromium.components.ukm.UkmRecorder;
 import org.chromium.content_public.browser.RenderFrameHost;
 import org.chromium.content_public.browser.WebContents;
@@ -487,6 +488,12 @@
                     result.getMakeCredentialResult(),
                     CredentialRequestResult.MAX_VALUE + 1);
         }
+        if (result.getBrowserAssistedLoginType() != null) {
+            RecordHistogram.recordEnumeratedHistogram(
+                    "PasswordManager.BrowserAssistedLogin.Type",
+                    result.getBrowserAssistedLoginType(),
+                    BrowserAssistedLoginType.MAX_VALUE + 1);
+        }
 
         Integer resultMetricValue = null;
         String event;
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2CredentialRequest.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2CredentialRequest.java
index ce1f663..59591964 100644
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2CredentialRequest.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2CredentialRequest.java
@@ -50,6 +50,7 @@
 import org.chromium.blink_public.common.BlinkFeatures;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
+import org.chromium.components.password_manager.BrowserAssistedLoginType;
 import org.chromium.components.webauthn.Fido2ApiCall.Fido2ApiCallParams;
 import org.chromium.components.webauthn.cred_man.CredManHelper;
 import org.chromium.components.webauthn.cred_man.CredManSupportProvider;
@@ -1356,12 +1357,25 @@
             }
         }
 
+        Integer browserAssistedLoginType = null;
+        if (WebauthnFeatureMap.getInstance()
+                .isEnabled(WebauthnFeatures.WEBAUTHN_ANDROID_CRED_MAN_REQUEST_EXTRA_BUNDLE)) {
+            if (requestType == Fido2ApiRequestType.GET_ASSERTION) {
+                browserAssistedLoginType = BrowserAssistedLoginType.PASSKEY_STORED_IN_GPM;
+            } else if (requestType == Fido2ApiRequestType.GET_ASSERTION_HYBRID) {
+                browserAssistedLoginType = BrowserAssistedLoginType.PASSKEY_HYBRID_OR_SECURITY_KEY;
+            } else if (requestType == Fido2ApiRequestType.GET_ASSERTION_LEGACY) {
+                browserAssistedLoginType = BrowserAssistedLoginType.PASSKEY_UNKNOWN;
+            }
+        }
+
         handleFido2Response(
                 errorCode,
                 response,
                 /* getAssertionOutcome= */ null,
                 /* makeCredentialOutcome= */ null,
-                requestType);
+                requestType,
+                browserAssistedLoginType);
     }
 
     private @Nullable Integer getCredentialRequestResult(
@@ -1451,8 +1465,25 @@
                 break;
         }
 
+        Integer browserAssistedLoginType = null;
+        if (WebauthnFeatureMap.getInstance()
+                .isEnabled(WebauthnFeatures.WEBAUTHN_ANDROID_CRED_MAN_REQUEST_EXTRA_BUNDLE)) {
+            if (requestType == Fido2ApiRequestType.GET_ASSERTION) {
+                browserAssistedLoginType = BrowserAssistedLoginType.PASSKEY_STORED_IN_GPM;
+            } else if (requestType == Fido2ApiRequestType.GET_ASSERTION_HYBRID) {
+                browserAssistedLoginType = BrowserAssistedLoginType.PASSKEY_HYBRID_OR_SECURITY_KEY;
+            } else if (requestType == Fido2ApiRequestType.GET_ASSERTION_LEGACY) {
+                browserAssistedLoginType = BrowserAssistedLoginType.PASSKEY_UNKNOWN;
+            }
+        }
+
         handleFido2Response(
-                errorCode, response, getAssertionOutcome, makeCredentialOutcome, requestType);
+                errorCode,
+                response,
+                getAssertionOutcome,
+                makeCredentialOutcome,
+                requestType,
+                browserAssistedLoginType);
     }
 
     private void handleFido2Response(
@@ -1460,7 +1491,8 @@
             @Nullable Object response,
             @Nullable @GetAssertionOutcome Integer getAssertionOutcome,
             @Nullable @MakeCredentialOutcome Integer makeCredentialOutcome,
-            @Fido2ApiRequestType int requestType) {
+            @Fido2ApiRequestType int requestType,
+            @Nullable Integer browserAssistedLoginType) {
         log(TAG, "handleFido2Response");
         RenderFrameHost frameHost = mAuthenticationContextProvider.getRenderFrameHost();
         if (mCancellableUiState != CancellableUiState.NONE) {
@@ -1562,6 +1594,9 @@
                 if (getAssertionResult != null) {
                     builder.setGetAssertionResult(getAssertionResult);
                 }
+                if (browserAssistedLoginType != null) {
+                    builder.setBrowserAssistedLoginType(browserAssistedLoginType);
+                }
                 requestCallback.onComplete(
                         WebauthnRequestResponse.forSuccessfulGetAssertion(r, builder.build()));
                 return;
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/RequestMetrics.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/RequestMetrics.java
index b48ea5e..29e7c54 100644
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/RequestMetrics.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/RequestMetrics.java
@@ -6,6 +6,7 @@
 
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
+import org.chromium.components.password_manager.BrowserAssistedLoginType;
 
 /** A container for the histograms to be recorded for a WebAuthn request. */
 @NullMarked
@@ -14,16 +15,19 @@
     private final @Nullable @GetAssertionOutcome Integer mGetAssertionOutcome;
     private final @Nullable @CredentialRequestResult Integer mGetAssertionResult;
     private final @Nullable @CredentialRequestResult Integer mMakeCredentialResult;
+    private final @Nullable @BrowserAssistedLoginType Integer mBrowserAssistedLoginType;
 
     private RequestMetrics(
             @Nullable @MakeCredentialOutcome Integer makeCredentialOutcome,
             @Nullable @GetAssertionOutcome Integer getAssertionOutcome,
             @Nullable @CredentialRequestResult Integer getAssertionResult,
-            @Nullable @CredentialRequestResult Integer makeCredentialResult) {
+            @Nullable @CredentialRequestResult Integer makeCredentialResult,
+            @Nullable @BrowserAssistedLoginType Integer browserAssistedLoginType) {
         mMakeCredentialOutcome = makeCredentialOutcome;
         mGetAssertionOutcome = getAssertionOutcome;
         mGetAssertionResult = getAssertionResult;
         mMakeCredentialResult = makeCredentialResult;
+        mBrowserAssistedLoginType = browserAssistedLoginType;
     }
 
     public @Nullable @MakeCredentialOutcome Integer getMakeCredentialOutcome() {
@@ -42,11 +46,16 @@
         return mMakeCredentialResult;
     }
 
+    public @Nullable @BrowserAssistedLoginType Integer getBrowserAssistedLoginType() {
+        return mBrowserAssistedLoginType;
+    }
+
     public static class Builder {
         private @Nullable @MakeCredentialOutcome Integer mMakeCredentialOutcome;
         private @Nullable @GetAssertionOutcome Integer mGetAssertionOutcome;
         private @Nullable @CredentialRequestResult Integer mGetAssertionResult;
         private @Nullable @CredentialRequestResult Integer mMakeCredentialResult;
+        private @Nullable @BrowserAssistedLoginType Integer mBrowserAssistedLoginType;
 
         public Builder setMakeCredentialOutcome(@MakeCredentialOutcome int makeCredentialOutcome) {
             mMakeCredentialOutcome = makeCredentialOutcome;
@@ -68,12 +77,19 @@
             return this;
         }
 
+        public Builder setBrowserAssistedLoginType(
+                @BrowserAssistedLoginType Integer browserAssistedLoginType) {
+            mBrowserAssistedLoginType = browserAssistedLoginType;
+            return this;
+        }
+
         public RequestMetrics build() {
             return new RequestMetrics(
                     mMakeCredentialOutcome,
                     mGetAssertionOutcome,
                     mGetAssertionResult,
-                    mMakeCredentialResult);
+                    mMakeCredentialResult,
+                    mBrowserAssistedLoginType);
         }
     }
 }
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/WebauthnFeatures.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/WebauthnFeatures.java
index 348f8995..ed9143b 100644
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/WebauthnFeatures.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/WebauthnFeatures.java
@@ -17,4 +17,6 @@
     public static final String WEBAUTHN_ANDROID_PASSKEY_CACHE_MIGRATION =
             "WebAuthenticationAndroidPasskeyCacheMigration";
     public static final String WEBAUTHN_ANDROID_CRED_MAN_FOR_DEV = "WebAuthnAndroidCredManForDev";
+    public static final String WEBAUTHN_ANDROID_CRED_MAN_REQUEST_EXTRA_BUNDLE =
+            "WebAuthenticationAndroidCredManRequestExtraBundle";
 }
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManHelper.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManHelper.java
index 58d2092..67c2211 100644
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManHelper.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManHelper.java
@@ -37,6 +37,7 @@
 import org.chromium.blink.mojom.PublicKeyCredentialRequestOptions;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
+import org.chromium.components.password_manager.BrowserAssistedLoginType;
 import org.chromium.components.webauthn.AuthenticationContextProvider;
 import org.chromium.components.webauthn.Barrier;
 import org.chromium.components.webauthn.CredManSupport;
@@ -73,6 +74,12 @@
     protected static final String BUNDLE_KEY_REGISTRATION_RESPONSE_JSON =
             CRED_MAN_PREFIX + "BUNDLE_KEY_REGISTRATION_RESPONSE_JSON";
 
+    @VisibleForTesting
+    static final String CREDENTIAL_SOURCE_KEY = "com.android.chrome.CREDENTIAL_SOURCE";
+
+    @VisibleForTesting static final String GPM_SOURCE = "GPM";
+    @VisibleForTesting static final String REMOTE_SOURCE = "REMOTE";
+
     private @Nullable Barrier mBarrier;
     private final boolean mPlayServicesAvailable;
     private boolean mRequestPasswords;
@@ -643,16 +650,19 @@
                         if (frameHost != null) {
                             frameHost.notifyWebAuthnAssertionRequestSucceeded();
                         }
+                        @BrowserAssistedLoginType
+                        int browserAssistedLoginType = getBrowserAssistedLoginType(data);
+                        RequestMetrics metrics =
+                                new RequestMetrics.Builder()
+                                        .setGetAssertionOutcome(GetAssertionOutcome.SUCCESS)
+                                        .setGetAssertionResult(
+                                                CredentialRequestResult.ANDROID_CRED_MAN_SUCCESS)
+                                        .setBrowserAssistedLoginType(browserAssistedLoginType)
+                                        .build();
                         assumeNonNull(callback);
                         callback.onComplete(
                                 WebauthnRequestResponse.forSuccessfulGetAssertion(
-                                        response,
-                                        new RequestMetrics.Builder()
-                                                .setGetAssertionOutcome(GetAssertionOutcome.SUCCESS)
-                                                .setGetAssertionResult(
-                                                        CredentialRequestResult
-                                                                .ANDROID_CRED_MAN_SUCCESS)
-                                                .build()));
+                                        response, metrics));
                     }
                 };
 
@@ -822,4 +832,17 @@
             return null;
         }
     }
+
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    static @BrowserAssistedLoginType int getBrowserAssistedLoginType(Bundle data) {
+        String credentialSource = data.getString(CREDENTIAL_SOURCE_KEY);
+        int loginType = BrowserAssistedLoginType.PASSKEY_UNKNOWN;
+        if (GPM_SOURCE.equals(credentialSource)) {
+            loginType = BrowserAssistedLoginType.PASSKEY_STORED_IN_GPM;
+        } else if (REMOTE_SOURCE.equals(credentialSource)) {
+            loginType = BrowserAssistedLoginType.PASSKEY_HYBRID_OR_SECURITY_KEY;
+        }
+
+        return loginType;
+    }
 }
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/GpmCredManRequestDecorator.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/GpmCredManRequestDecorator.java
index 2abfa059..6d3eea8a 100644
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/GpmCredManRequestDecorator.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/GpmCredManRequestDecorator.java
@@ -20,6 +20,8 @@
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.components.webauthn.GpmBrowserOptionsHelper;
+import org.chromium.components.webauthn.WebauthnFeatureMap;
+import org.chromium.components.webauthn.WebauthnFeatures;
 
 import java.util.Set;
 
@@ -40,6 +42,8 @@
             "com.android.chrome.PASSWORDS_ONLY_FOR_THE_CHANNEL";
     private static final String PASSWORDS_WITH_NO_USERNAME_INCLUDED =
             "com.android.chrome.PASSWORDS_WITH_NO_USERNAME_INCLUDED";
+    private static final String REQUEST_CUSTOM_CREDENTIAL_KEY =
+            "com.android.chrome.REQUEST_CUSTOM_CREDENTIAL";
 
     private static @Nullable GpmCredManRequestDecorator sInstance;
 
@@ -115,6 +119,10 @@
                 publicKeyCredentialOptionBundle, helper.getRenderFrameHost());
         // Do not include any passkeys from GPM if `helper.getIgnoreGpm()` is true.
         publicKeyCredentialOptionBundle.putBoolean(IGNORE_GPM_KEY, helper.getIgnoreGpm());
+        if (WebauthnFeatureMap.getInstance()
+                .isEnabled(WebauthnFeatures.WEBAUTHN_ANDROID_CRED_MAN_REQUEST_EXTRA_BUNDLE)) {
+            publicKeyCredentialOptionBundle.putBoolean(REQUEST_CUSTOM_CREDENTIAL_KEY, true);
+        }
     }
 
     @Override
diff --git a/components/webauthn/android/junit/src/org/chromium/components/webauthn/Fido2CredentialRequestRobolectricTest.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/Fido2CredentialRequestRobolectricTest.java
index 1c72dea..9062115 100644
--- a/components/webauthn/android/junit/src/org/chromium/components/webauthn/Fido2CredentialRequestRobolectricTest.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/Fido2CredentialRequestRobolectricTest.java
@@ -90,7 +90,8 @@
         })
 @DisableFeatures({
     WebauthnFeatures.WEBAUTHN_ANDROID_CRED_MAN_FOR_DEV,
-    BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_BROWSER_BOUND_KEYS
+    BlinkFeatures.SECURE_PAYMENT_CONFIRMATION_BROWSER_BOUND_KEYS,
+    WebauthnFeatures.WEBAUTHN_ANDROID_CRED_MAN_REQUEST_EXTRA_BUNDLE
 })
 public class Fido2CredentialRequestRobolectricTest {
     private static final String TEST_CHANNEL_EXTRA = "stable";
diff --git a/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/CredManHelperRobolectricTest.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/CredManHelperRobolectricTest.java
index e5f5087..32b09c3 100644
--- a/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/CredManHelperRobolectricTest.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/CredManHelperRobolectricTest.java
@@ -46,6 +46,7 @@
 import org.chromium.base.Callback;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.Features.DisableFeatures;
+import org.chromium.base.test.util.Features.EnableFeatures;
 import org.chromium.blink.mojom.Authenticator.GetCredential_Response;
 import org.chromium.blink.mojom.Authenticator.MakeCredential_Response;
 import org.chromium.blink.mojom.AuthenticatorStatus;
@@ -54,6 +55,7 @@
 import org.chromium.blink.mojom.PublicKeyCredentialCreationOptions;
 import org.chromium.blink.mojom.PublicKeyCredentialDescriptor;
 import org.chromium.blink.mojom.ResidentKeyRequirement;
+import org.chromium.components.password_manager.BrowserAssistedLoginType;
 import org.chromium.components.webauthn.AuthenticationContextProvider;
 import org.chromium.components.webauthn.Barrier;
 import org.chromium.components.webauthn.Fido2ApiTestHelper;
@@ -86,7 +88,10 @@
             ShadowGetCredentialResponse.class,
             ShadowPrepareGetCredentialResponse.class
         })
-@DisableFeatures({WebauthnFeatures.WEBAUTHN_ANDROID_CRED_MAN_FOR_DEV})
+@DisableFeatures({
+    WebauthnFeatures.WEBAUTHN_ANDROID_CRED_MAN_FOR_DEV,
+    WebauthnFeatures.WEBAUTHN_ANDROID_CRED_MAN_REQUEST_EXTRA_BUNDLE
+})
 public class CredManHelperRobolectricTest {
     private CredManHelper mCredManHelper;
     private PublicKeyCredentialCreationOptions mCreationOptions;
@@ -162,6 +167,40 @@
 
     @Test
     @SmallTest
+    @EnableFeatures(WebauthnFeatures.WEBAUTHN_ANDROID_CRED_MAN_REQUEST_EXTRA_BUNDLE)
+    public void testGetBrowserAssistedLoginType_GPM() {
+        Bundle bundle = new Bundle();
+        bundle.putString(CredManHelper.CREDENTIAL_SOURCE_KEY, CredManHelper.GPM_SOURCE);
+        Integer loginType = CredManHelper.getBrowserAssistedLoginType(bundle);
+
+        Assert.assertEquals(
+                Integer.valueOf(BrowserAssistedLoginType.PASSKEY_STORED_IN_GPM), loginType);
+    }
+
+    @Test
+    @SmallTest
+    @EnableFeatures(WebauthnFeatures.WEBAUTHN_ANDROID_CRED_MAN_REQUEST_EXTRA_BUNDLE)
+    public void testGetBrowserAssistedLoginType_Remote() {
+        Bundle bundle = new Bundle();
+        bundle.putString(CredManHelper.CREDENTIAL_SOURCE_KEY, CredManHelper.REMOTE_SOURCE);
+        Integer loginType = CredManHelper.getBrowserAssistedLoginType(bundle);
+
+        Assert.assertEquals(
+                Integer.valueOf(BrowserAssistedLoginType.PASSKEY_HYBRID_OR_SECURITY_KEY),
+                loginType);
+    }
+
+    @Test
+    @SmallTest
+    @EnableFeatures(WebauthnFeatures.WEBAUTHN_ANDROID_CRED_MAN_REQUEST_EXTRA_BUNDLE)
+    public void testGetBrowserAssistedLoginType_Null() {
+        Integer loginType = CredManHelper.getBrowserAssistedLoginType(new Bundle());
+
+        Assert.assertEquals(Integer.valueOf(BrowserAssistedLoginType.PASSKEY_UNKNOWN), loginType);
+    }
+
+    @Test
+    @SmallTest
     public void testStartMakeRequest_default_success() {
         mRequestCallback =
                 WebauthnRequestCallback.forMakeCredential(mMakeCredentialResponseCallback, null);
diff --git a/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/GpmCredManRequestDecoratorRobolectricTest.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/GpmCredManRequestDecoratorRobolectricTest.java
index 96e59cc8..f781be39 100644
--- a/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/GpmCredManRequestDecoratorRobolectricTest.java
+++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/GpmCredManRequestDecoratorRobolectricTest.java
@@ -24,6 +24,8 @@
 import org.robolectric.shadow.api.Shadow;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.Features.EnableFeatures;
+import org.chromium.components.webauthn.WebauthnFeatures;
 
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(
@@ -34,6 +36,7 @@
             ShadowCreateCredentialResponse.class,
             ShadowCreateCredentialException.class
         })
+@EnableFeatures({WebauthnFeatures.WEBAUTHN_ANDROID_CRED_MAN_REQUEST_EXTRA_BUNDLE})
 public class GpmCredManRequestDecoratorRobolectricTest {
     private static final String ORIGIN = "www.coolwebsite.com";
     private static final byte[] USER_ID = new byte[] {3, 5, 8};
diff --git a/components/webauthn/android/webauthn_feature_map.cc b/components/webauthn/android/webauthn_feature_map.cc
index 88f6e0b..bc07c8f 100644
--- a/components/webauthn/android/webauthn_feature_map.cc
+++ b/components/webauthn/android/webauthn_feature_map.cc
@@ -17,6 +17,7 @@
 const base::Feature* const kFeaturesExposedToJava[] = {
     &kWebAuthnAndroidPasskeyCacheMigration,
     &kWebAuthnAndroidCredManForDev,
+    &kWebAuthnAndroidCredManRequestExtraBundle,
 };
 
 // static
diff --git a/components/webauthn/features.cc b/components/webauthn/features.cc
index 8afb6c3..88c30a7 100644
--- a/components/webauthn/features.cc
+++ b/components/webauthn/features.cc
@@ -25,6 +25,11 @@
 const base::FeatureParam<std::string> kWebAuthnAndroidCredManForDevMode{
     &kWebAuthnAndroidCredManForDev, "mode", ""};
 
+// Not yet enabled by default.
+BASE_FEATURE(kWebAuthnAndroidCredManRequestExtraBundle,
+             "WebAuthenticationAndroidCredManRequestExtraBundle",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 #endif  // BUILDFLAG(IS_ANDROID)
 
 #if !BUILDFLAG(IS_ANDROID)
diff --git a/components/webauthn/features.h b/components/webauthn/features.h
index b8f7525..befb463 100644
--- a/components/webauthn/features.h
+++ b/components/webauthn/features.h
@@ -27,6 +27,11 @@
 COMPONENT_EXPORT(WEBAUTHN)
 extern const base::FeatureParam<std::string> kWebAuthnAndroidCredManForDevMode;
 
+// Whether to send a custom bundle values for the CredMan requests. The extras
+// are used by Google Password Manager.
+COMPONENT_EXPORT(WEBAUTHN)
+BASE_DECLARE_FEATURE(kWebAuthnAndroidCredManRequestExtraBundle);
+
 #endif  // BUILDFLAG(IS_ANDROID)
 
 #if !BUILDFLAG(IS_ANDROID)
diff --git a/content/browser/media/capture/pip_screen_capture_coordinator_proxy.h b/content/browser/media/capture/pip_screen_capture_coordinator_proxy.h
index 5b9a237..dd8a150e 100644
--- a/content/browser/media/capture/pip_screen_capture_coordinator_proxy.h
+++ b/content/browser/media/capture/pip_screen_capture_coordinator_proxy.h
@@ -46,6 +46,9 @@
   virtual GlobalRenderFrameHostId GetPipOwnerRenderFrameHostId() const = 0;
   virtual const std::vector<CaptureInfo>& Captures() const = 0;
 
+  virtual std::vector<NativeWindowId> WindowsToExclude(
+      const DesktopMediaID& media_id) const = 0;
+
   virtual void AddObserver(Observer* observer) = 0;
   virtual void RemoveObserver(Observer* observer) = 0;
 };
diff --git a/content/browser/media/capture/pip_screen_capture_coordinator_proxy_impl.cc b/content/browser/media/capture/pip_screen_capture_coordinator_proxy_impl.cc
index 9614cdd..2998bdf 100644
--- a/content/browser/media/capture/pip_screen_capture_coordinator_proxy_impl.cc
+++ b/content/browser/media/capture/pip_screen_capture_coordinator_proxy_impl.cc
@@ -104,6 +104,27 @@
   return captures_;
 }
 
+std::vector<NativeWindowId>
+PipScreenCaptureCoordinatorProxyImpl::WindowsToExclude(
+    const DesktopMediaID& media_id) const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  if (!pip_window_id_) {
+    return {};
+  }
+
+  // The PiP window should not be excluded if there are other
+  // applications capturing the screen.
+  for (const auto& capture : captures_) {
+    if (capture.desktop_media_id == media_id &&
+        capture.render_frame_host_id != pip_owner_render_frame_host_id_) {
+      return {};
+    }
+  }
+
+  return {*pip_window_id_};
+}
+
 void PipScreenCaptureCoordinatorProxyImpl::AddObserver(Observer* observer) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!bound_sequence_task_runner_) {
diff --git a/content/browser/media/capture/pip_screen_capture_coordinator_proxy_impl.h b/content/browser/media/capture/pip_screen_capture_coordinator_proxy_impl.h
index ed158d9..af41ea46a 100644
--- a/content/browser/media/capture/pip_screen_capture_coordinator_proxy_impl.h
+++ b/content/browser/media/capture/pip_screen_capture_coordinator_proxy_impl.h
@@ -15,7 +15,7 @@
 
 class PipScreenCaptureCoordinatorImpl;
 
-class PipScreenCaptureCoordinatorProxyImpl
+class CONTENT_EXPORT PipScreenCaptureCoordinatorProxyImpl
     : public PipScreenCaptureCoordinatorProxy {
  public:
   PipScreenCaptureCoordinatorProxyImpl(
@@ -30,6 +30,9 @@
   GlobalRenderFrameHostId GetPipOwnerRenderFrameHostId() const override;
   const std::vector<CaptureInfo>& Captures() const override;
 
+  std::vector<NativeWindowId> WindowsToExclude(
+      const DesktopMediaID& media_id) const override;
+
   void AddObserver(Observer* observer) override;
   void RemoveObserver(Observer* observer) override;
 
diff --git a/content/browser/media/capture/pip_screen_capture_coordinator_proxy_impl_unittest.cc b/content/browser/media/capture/pip_screen_capture_coordinator_proxy_impl_unittest.cc
new file mode 100644
index 0000000..3eba3cf
--- /dev/null
+++ b/content/browser/media/capture/pip_screen_capture_coordinator_proxy_impl_unittest.cc
@@ -0,0 +1,86 @@
+// 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 "content/browser/media/capture/pip_screen_capture_coordinator_proxy_impl.h"
+
+#include "base/unguessable_token.h"
+#include "content/browser/media/capture/pip_screen_capture_coordinator_impl.h"
+#include "content/public/browser/desktop_media_id.h"
+#include "content/public/test/browser_task_environment.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace content {
+
+class PipScreenCaptureCoordinatorProxyImplTest : public testing::Test {
+ public:
+  PipScreenCaptureCoordinatorProxyImplTest() = default;
+  ~PipScreenCaptureCoordinatorProxyImplTest() override = default;
+
+ protected:
+  BrowserTaskEnvironment task_environment_;
+};
+
+TEST_F(PipScreenCaptureCoordinatorProxyImplTest,
+       WindowsToExcludeReturnsEmptyWhenNoPip) {
+  const GlobalRenderFrameHostId owner_render_frame_host_id(1, 1);
+  const std::vector<PipScreenCaptureCoordinatorProxy::CaptureInfo> captures;
+
+  auto proxy = std::make_unique<PipScreenCaptureCoordinatorProxyImpl>(
+      nullptr,
+      /*initial_pip_window_id=*/std::nullopt, owner_render_frame_host_id,
+      captures);
+
+  const DesktopMediaID media_id(DesktopMediaID::TYPE_SCREEN, 1);
+  EXPECT_TRUE(proxy->WindowsToExclude(media_id).empty());
+}
+
+TEST_F(PipScreenCaptureCoordinatorProxyImplTest,
+       WindowsToExcludeReturnsPipWindowWhenNoCaptures) {
+  const GlobalRenderFrameHostId owner_render_frame_host_id(1, 1);
+  const std::vector<PipScreenCaptureCoordinatorProxy::CaptureInfo> captures;
+  const NativeWindowId pip_window_id = 123;
+
+  auto proxy = std::make_unique<PipScreenCaptureCoordinatorProxyImpl>(
+      nullptr, pip_window_id, owner_render_frame_host_id, captures);
+
+  const DesktopMediaID media_id(DesktopMediaID::TYPE_SCREEN, 1);
+  std::vector<NativeWindowId> excluded_windows =
+      proxy->WindowsToExclude(media_id);
+  ASSERT_EQ(1u, excluded_windows.size());
+  EXPECT_EQ(pip_window_id, excluded_windows[0]);
+}
+
+TEST_F(PipScreenCaptureCoordinatorProxyImplTest,
+       WindowsToExcludeReturnsPipWindowForOwnedCapture) {
+  const GlobalRenderFrameHostId owner_render_frame_host_id(1, 1);
+  const DesktopMediaID media_id(DesktopMediaID::TYPE_SCREEN, 1);
+  const std::vector<PipScreenCaptureCoordinatorProxy::CaptureInfo> captures = {
+      {base::UnguessableToken::Create(), owner_render_frame_host_id, media_id}};
+  const NativeWindowId pip_window_id = 123;
+
+  auto proxy = std::make_unique<PipScreenCaptureCoordinatorProxyImpl>(
+      nullptr, pip_window_id, owner_render_frame_host_id, captures);
+
+  std::vector<NativeWindowId> excluded_windows =
+      proxy->WindowsToExclude(media_id);
+  ASSERT_EQ(1u, excluded_windows.size());
+  EXPECT_EQ(pip_window_id, excluded_windows[0]);
+}
+
+TEST_F(PipScreenCaptureCoordinatorProxyImplTest,
+       WindowsToExcludeReturnsEmptyForUnownedCapture) {
+  const GlobalRenderFrameHostId owner_render_frame_host_id(1, 1);
+  const GlobalRenderFrameHostId other_render_frame_host_id(2, 2);
+  const DesktopMediaID media_id(DesktopMediaID::TYPE_SCREEN, 1);
+  const std::vector<PipScreenCaptureCoordinatorProxy::CaptureInfo> captures = {
+      {base::UnguessableToken::Create(), other_render_frame_host_id, media_id}};
+  const NativeWindowId pip_window_id = 123;
+
+  auto proxy = std::make_unique<PipScreenCaptureCoordinatorProxyImpl>(
+      nullptr, pip_window_id, owner_render_frame_host_id, captures);
+
+  EXPECT_TRUE(proxy->WindowsToExclude(media_id).empty());
+}
+
+}  // namespace content
diff --git a/content/browser/preloading/prefetch/prefetch_container.cc b/content/browser/preloading/prefetch/prefetch_container.cc
index a3833565..ff94d63 100644
--- a/content/browser/preloading/prefetch/prefetch_container.cc
+++ b/content/browser/preloading/prefetch/prefetch_container.cc
@@ -281,6 +281,10 @@
       request_id_(base::UnguessableToken::Create().ToString()) {
   CHECK(request_);
 
+  TRACE_EVENT_END("loading", request_->preload_pipeline_info().GetTrack());
+  TRACE_EVENT_BEGIN("loading", "PrefetchContainer::LoadState::kNotStarted",
+                    request_->preload_pipeline_info().GetTrack());
+
   is_likely_ahead_of_prerender_ =
       CalculateIsLikelyAheadOfPrerender(request_->preload_pipeline_info());
 
@@ -343,6 +347,8 @@
           ->PrefetchWillBeDestroyed(this);
     }
   }
+
+  TRACE_EVENT_END("loading", request_->preload_pipeline_info().GetTrack());
 }
 
 void PrefetchContainer::OnWillBeDestroyed() {
@@ -618,6 +624,8 @@
 }
 
 void PrefetchContainer::SetLoadState(LoadState new_load_state) {
+  TRACE_EVENT_END("loading", request_->preload_pipeline_info().GetTrack());
+
   if (base::FeatureList::IsEnabled(features::kPrefetchGracefulNotification)) {
     CHECK(!is_in_dtor_);
   }
@@ -652,8 +660,51 @@
             load_state_ == LoadState::kFailedDeterminedHead);
       break;
   }
+
+  // Tracing and debugging
+  switch (new_load_state) {
+    case LoadState::kNotStarted:
+      NOTREACHED();
+    case LoadState::kEligible:
+      TRACE_EVENT_BEGIN("loading", "PrefetchContainer::LoadState::kEligible",
+                        request_->preload_pipeline_info().GetTrack());
+      break;
+    case LoadState::kFailedIneligible:
+      TRACE_EVENT_BEGIN("loading",
+                        "PrefetchContainer::LoadState::kFailedIneligible",
+                        request_->preload_pipeline_info().GetTrack());
+      break;
+    case LoadState::kStarted:
+      TRACE_EVENT_BEGIN("loading", "PrefetchContainer::LoadState::kStarted",
+                        request_->preload_pipeline_info().GetTrack());
+      break;
+    case LoadState::kFailedHeldback:
+      TRACE_EVENT_BEGIN("loading",
+                        "PrefetchContainer::LoadState::kFailedHeldback",
+                        request_->preload_pipeline_info().GetTrack());
+      break;
+    case LoadState::kDeterminedHead:
+      TRACE_EVENT_BEGIN("loading",
+                        "PrefetchContainer::LoadState::kDeterminedHead",
+                        request_->preload_pipeline_info().GetTrack());
+      break;
+    case LoadState::kFailedDeterminedHead:
+      TRACE_EVENT_BEGIN("loading",
+                        "PrefetchContainer::LoadState::kFailedDeterminedHead",
+                        request_->preload_pipeline_info().GetTrack());
+      break;
+    case LoadState::kCompleted:
+      TRACE_EVENT_BEGIN("loading", "PrefetchContainer::LoadState::kCompleted",
+                        request_->preload_pipeline_info().GetTrack());
+      break;
+    case LoadState::kFailed:
+      TRACE_EVENT_BEGIN("loading", "PrefetchContainer::LoadState::kFailed",
+                        request_->preload_pipeline_info().GetTrack());
+      break;
+  }
   DVLOG(1) << (*this) << " LoadState " << load_state_ << " -> "
            << new_load_state;
+
   load_state_ = new_load_state;
 }
 
@@ -662,12 +713,18 @@
 }
 
 void PrefetchContainer::OnAddedToPrefetchService() {
+  TRACE_EVENT("loading", "PrefetchContainer::OnAddedToPrefetchService",
+              request_->preload_pipeline_info().GetFlow());
+
   prefetch_container_metrics_.time_added_to_prefetch_service =
       base::TimeTicks::Now();
 }
 
 void PrefetchContainer::OnEligibilityCheckComplete(
     PreloadingEligibility eligibility) {
+  TRACE_EVENT("loading", "PrefetchContainer::OnEligibilityCheckComplete",
+              request_->preload_pipeline_info().GetFlow());
+
   request().preload_pipeline_info().SetPrefetchEligibility(eligibility);
   for (auto& preload_pipeline_info : inherited_preload_pipeline_infos_) {
     preload_pipeline_info->SetPrefetchEligibility(eligibility);
@@ -905,6 +962,9 @@
 }
 
 void PrefetchContainer::OnDeterminedHead(bool is_successful_determined_head) {
+  TRACE_EVENT("loading", "PrefetchContainer::OnDeterminedHead",
+              request_->preload_pipeline_info().GetFlow());
+
   if (base::FeatureList::IsEnabled(features::kPrefetchGracefulNotification) &&
       is_in_dtor_) {
     // This can be called due to the loader cancellation during the
@@ -1056,6 +1116,9 @@
 void PrefetchContainer::OnPrefetchComplete(
     bool is_success,
     const network::URLLoaderCompletionStatus& completion_status) {
+  TRACE_EVENT("loading", "PrefetchContainer::OnPrefetchComplete",
+              request_->preload_pipeline_info().GetFlow());
+
   SetLoadState(is_success ? LoadState::kCompleted : LoadState::kFailed);
   OnPrefetchCompleteInternal(completion_status);
 
@@ -1348,6 +1411,9 @@
 }
 
 void PrefetchContainer::OnPrefetchStarted() {
+  TRACE_EVENT("loading", "PrefetchContainer::OnPrefetchStarted",
+              request_->preload_pipeline_info().GetFlow());
+
   SetLoadState(PrefetchContainer::LoadState::kStarted);
   prefetch_container_metrics_.time_prefetch_started = base::TimeTicks::Now();
 }
diff --git a/content/browser/preloading/prefetch/prefetch_scheduler.cc b/content/browser/preloading/prefetch/prefetch_scheduler.cc
index 8dfa578..968a4cd 100644
--- a/content/browser/preloading/prefetch/prefetch_scheduler.cc
+++ b/content/browser/preloading/prefetch/prefetch_scheduler.cc
@@ -6,6 +6,7 @@
 
 #include "base/auto_reset.h"
 #include "base/check_is_test.h"
+#include "base/trace_event/trace_event.h"
 #include "base/types/pass_key.h"
 #include "content/browser/preloading/prefetch/prefetch_container.h"
 #include "content/browser/preloading/prefetch/prefetch_document_manager.h"
@@ -234,6 +235,9 @@
 }
 
 void PrefetchScheduler::PushAndProgress(PrefetchContainer& prefetch_container) {
+  TRACE_EVENT("loading", "PrefetchScheduler::PushAndProgress",
+              prefetch_container.request().preload_pipeline_info().GetFlow());
+
   // Precondition: Pushing already registered one is not allowed.
   for (auto& it : active_set_) {
     if (it.get() == &prefetch_container) {
@@ -249,6 +253,10 @@
 
 void PrefetchScheduler::PushAndProgressAsync(
     PrefetchContainer& prefetch_container) {
+  TRACE_EVENT("loading", "PrefetchScheduler::PushAndProgressAsync",
+              prefetch_container.request().preload_pipeline_info().GetFlow(),
+              perfetto::Flow::FromPointer(this));
+
   // Precondition: Pushing already registered one is not allowed.
   for (auto& it : active_set_) {
     if (it.get() == &prefetch_container) {
@@ -265,6 +273,10 @@
 void PrefetchScheduler::RemoveAndProgressAsync(
     PrefetchContainer& prefetch_container,
     bool should_progress) {
+  TRACE_EVENT("loading", "PrefetchScheduler::RemoveAndProgressAsync",
+              prefetch_container.request().preload_pipeline_info().GetFlow(),
+              perfetto::Flow::FromPointer(this));
+
   [&]() {
     for (auto it = active_set_.cbegin(); it != active_set_.cend(); ++it) {
       if (it->get() == &prefetch_container) {
@@ -291,6 +303,11 @@
 void PrefetchScheduler::NotifyAttributeMightChangedAndProgressAsync(
     PrefetchContainer& prefetch_container,
     bool should_progress) {
+  TRACE_EVENT("loading",
+              "PrefetchScheduler::NotifyAttributeMightChangedAndProgressAsync",
+              prefetch_container.request().preload_pipeline_info().GetFlow(),
+              perfetto::Flow::FromPointer(this));
+
   if (!should_progress) {
     return;
   }
@@ -320,6 +337,9 @@
   base::AutoReset guard(&progress_reentrancy_guard_, true);
 #endif
 
+  TRACE_EVENT("loading", "PrefetchScheduler::Progress",
+              perfetto::TerminatingFlow::FromPointer(this));
+
   // Note that this doesn't correspond to the update in `ProgressAsync()` in 1:1
   // and there is a case updating `false` to `false` as this method can be
   // called from `PrefetchService` directly.
diff --git a/content/browser/preloading/prefetch/prefetch_service.cc b/content/browser/preloading/prefetch/prefetch_service.cc
index 94a03db2..be76272f 100644
--- a/content/browser/preloading/prefetch/prefetch_service.cc
+++ b/content/browser/preloading/prefetch/prefetch_service.cc
@@ -748,8 +748,13 @@
     CheckEligibilityParams params) {
   const auto prefetch_container = params.prefetch_container;
   CHECK(prefetch_container);
-  TRACE_EVENT_BEGIN("loading", "PrefetchService::CheckEligibility",
-                    perfetto::Track::FromPointer(this));
+
+  TRACE_EVENT_END(
+      "loading",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+  TRACE_EVENT_BEGIN(
+      "loading", "PrefetchService::CheckEligibility",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
 
   // TODO(crbug.com/40215782): Clean up the following checks by: 1)
   // moving each check to a separate function, and 2) requiring that failed
@@ -824,8 +829,13 @@
 void PrefetchService::CheckHasServiceWorker(CheckEligibilityParams params) {
   const auto prefetch_container = params.prefetch_container;
   CHECK(prefetch_container);
-  TRACE_EVENT_BEGIN("loading", "PrefetchService::CheckHasServiceWorker",
-                    perfetto::Track::FromPointer(this));
+
+  TRACE_EVENT_END(
+      "loading",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+  TRACE_EVENT_BEGIN(
+      "loading", "PrefetchService::CheckHasServiceWorker",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
 
   if (params.is_redirect) {
     switch (prefetch_container->service_worker_state()) {
@@ -906,15 +916,22 @@
     ServiceWorkerCapability service_worker_capability) {
   const auto prefetch_container = params.prefetch_container;
 
-  // End "PrefetchService::CheckHasServiceWorker" trace event.
-  TRACE_EVENT_END("loading", perfetto::Track::FromPointer(this));
   TRACE_EVENT("loading", "PrefetchService::OnGotServiceWorkerResult",
               "prefetch_url",
               prefetch_container ? prefetch_container->GetURL().spec() : "");
+
   if (!prefetch_container) {
     std::move(params).Finish(PreloadingEligibility::kEligible);
     return;
   }
+
+  TRACE_EVENT_END(
+      "loading",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+  TRACE_EVENT_BEGIN(
+      "loading", "PrefetchService::OnGotServiceWorkerResult",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+
   if (auto* preloading_attempt = static_cast<PreloadingAttemptImpl*>(
           prefetch_container->request().attempt())) {
     const auto duration =
@@ -970,8 +987,14 @@
   StoragePartition* default_storage_partition =
       browser_context_->GetDefaultStoragePartition();
   CHECK(default_storage_partition);
-  TRACE_EVENT_BEGIN("loading", "PrefetchService::CheckCookies",
-                    perfetto::Track::FromPointer(this));
+
+  TRACE_EVENT_END(
+      "loading",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+  TRACE_EVENT_BEGIN(
+      "loading", "PrefetchService::OnGotServiceWorkerResult check cookies",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+
   net::CookieOptions options = net::CookieOptions::MakeAllInclusive();
   options.set_return_excluded_cookies();
   // `url` is needed to avoid use-after-move.
@@ -988,16 +1011,22 @@
     const net::CookieAccessResultList& excluded_cookies) {
   const auto prefetch_container = params.prefetch_container;
 
-  // End "PrefetchService::CheckCookies" trace event.
-  TRACE_EVENT_END("loading", perfetto::Track::FromPointer(this));
   TRACE_EVENT("loading", "PrefetchService::OnGotCookiesForEligibilityCheck",
               "prefetch_url",
               prefetch_container ? prefetch_container->GetURL().spec() : "");
+
   if (!prefetch_container) {
     std::move(params).Finish(PreloadingEligibility::kEligible);
     return;
   }
 
+  TRACE_EVENT_END(
+      "loading",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+  TRACE_EVENT_BEGIN(
+      "loading", "PrefetchService::OnGotCookiesForEligibilityCheck",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+
   if (!cookie_list.empty()) {
     std::move(params).Finish(PreloadingEligibility::kUserHasCookies);
     return;
@@ -1057,8 +1086,13 @@
     return;
   }
 
-  TRACE_EVENT_BEGIN("loading", "PrefetchService::ProxyCheck",
-                    perfetto::Track::FromPointer(this));
+  TRACE_EVENT_END(
+      "loading",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+  TRACE_EVENT_BEGIN(
+      "loading", "PrefetchService::ProxyCheck",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+
   // Start proxy check for this prefetch, and give ownership of the
   // |ProxyLookupClientImpl| to |prefetch_container|.
   // `url` is needed to avoid use-after-move.
@@ -1077,16 +1111,23 @@
 void PrefetchService::OnGotProxyLookupResult(CheckEligibilityParams params,
                                              bool has_proxy) {
   const auto prefetch_container = params.prefetch_container;
-  // End "PrefetchService::ProxyCheck" trace event.
-  TRACE_EVENT_END("loading", perfetto::Track::FromPointer(this));
+
   TRACE_EVENT("loading", "PrefetchService::OnGotProxyLookupResult",
               "prefetch_url",
               prefetch_container ? prefetch_container->GetURL().spec() : "");
+
   if (!prefetch_container) {
     std::move(params).Finish(PreloadingEligibility::kEligible);
     return;
   }
 
+  TRACE_EVENT_END(
+      "loading",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+  TRACE_EVENT_BEGIN(
+      "loading", "PrefetchService::OnGotProxyLookupResult",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+
   prefetch_container->ReleaseProxyLookupClient();
   if (has_proxy) {
     std::move(params).Finish(PreloadingEligibility::kExistingProxy);
@@ -1100,15 +1141,22 @@
     CheckEligibilityParams params,
     PreloadingEligibility eligibility) {
   const auto prefetch_container = params.prefetch_container;
-  // End "PrefetchService::CheckEligibility" trace event.
-  TRACE_EVENT_END("loading", perfetto::Track::FromPointer(this));
+
   TRACE_EVENT("loading", "PrefetchService::OnGotEligibilityForNonRedirect",
               "prefetch_url",
               prefetch_container ? prefetch_container->GetURL().spec() : "");
+
   if (!prefetch_container) {
     return;
   }
 
+  TRACE_EVENT_END(
+      "loading",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+  TRACE_EVENT_BEGIN(
+      "loading", "PrefetchService::OnGotEligibilityForNonRedirect",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+
   const bool eligible = eligibility == PreloadingEligibility::kEligible;
   bool is_decoy = false;
   if (!eligible) {
@@ -1170,15 +1218,22 @@
     CheckEligibilityParams params,
     PreloadingEligibility eligibility) {
   const auto prefetch_container = params.prefetch_container;
-  // End "PrefetchService::CheckEligibility" trace event.
-  TRACE_EVENT_END("loading", perfetto::Track::FromPointer(this));
+
   TRACE_EVENT("loading", "PrefetchService::OnGotEligibilityForRedirect",
               "prefetch_url",
               prefetch_container ? prefetch_container->GetURL().spec() : "");
+
   if (!prefetch_container) {
     return;
   }
 
+  TRACE_EVENT_END(
+      "loading",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+  TRACE_EVENT_BEGIN(
+      "loading", "PrefetchService::OnGotEligibilityForRedirect",
+      prefetch_container->request().preload_pipeline_info().GetTrack());
+
   // Returns `false` if `OnGotEligibilityForRedirect()` should be early-returned
   // because the prefetch was already terminated during the eligiblity check.
   const auto check_streaming_loader = [&]() {
@@ -1572,6 +1627,8 @@
   CHECK(prefetch_container);
   CHECK_EQ(prefetch_container->GetLoadState(),
            PrefetchContainer::LoadState::kEligible);
+  TRACE_EVENT("loading", "PrefetchService::StartSinglePrefetch",
+              prefetch_container->request().preload_pipeline_info().GetFlow());
 
   // Do not prefetch for a Holdback control group. Called after the checks in
   // `PopNextPrefetchContainer` because we want to compare against the
@@ -1656,7 +1713,10 @@
 
 void PrefetchService::SendPrefetchRequest(
     base::WeakPtr<PrefetchContainer> prefetch_container) {
-  TRACE_EVENT("loading", "PrefetchService::SendPrefetchRequest");
+  CHECK(prefetch_container);
+  TRACE_EVENT("loading", "PrefetchService::SendPrefetchRequest",
+              prefetch_container->request().preload_pipeline_info().GetFlow());
+
   net::NetworkTrafficAnnotationTag traffic_annotation =
       net::DefineNetworkTrafficAnnotation("speculation_rules_prefetch",
                                           R"(
diff --git a/content/browser/preloading/preload_pipeline_info_impl.cc b/content/browser/preloading/preload_pipeline_info_impl.cc
index a82fa76..3862009a 100644
--- a/content/browser/preloading/preload_pipeline_info_impl.cc
+++ b/content/browser/preloading/preload_pipeline_info_impl.cc
@@ -4,6 +4,8 @@
 
 #include "content/browser/preloading/preload_pipeline_info_impl.h"
 
+#include "base/trace_event/trace_event.h"
+
 namespace content {
 
 // static
@@ -28,10 +30,28 @@
 PreloadPipelineInfoImpl::PreloadPipelineInfoImpl(
     PreloadingType planned_max_preloading_type)
     : id_(base::UnguessableToken::Create()),
-      planned_max_preloading_type_(planned_max_preloading_type) {}
+      planned_max_preloading_type_(planned_max_preloading_type),
+      // We use `low` of `Token` because `perfetto::Track::FromPointer()`
+      // crashes by a `DCHECK`. It looks `Tracing::Initialize()` to be not
+      // called.
+      track_(perfetto::Track::Global(id_.GetLowForSerialization())) {
+  TRACE_EVENT_BEGIN("loading", "Navigational preload", track_);
+}
 
 PreloadPipelineInfoImpl::~PreloadPipelineInfoImpl() = default;
 
+const perfetto::Track& PreloadPipelineInfoImpl::GetTrack() const {
+  return track_;
+}
+
+perfetto::Flow PreloadPipelineInfoImpl::GetFlow() const {
+  // Returns consistent flows in its lifecycle as `PreloadPipelineInfo` is
+  // refcounted and not movable.
+
+  return perfetto::Flow::FromPointer(
+      const_cast<PreloadPipelineInfoImpl*>(this));
+}
+
 void PreloadPipelineInfoImpl::SetPrefetchEligibility(
     PreloadingEligibility eligibility) {
   prefetch_eligibility_ = eligibility;
diff --git a/content/browser/preloading/preload_pipeline_info_impl.h b/content/browser/preloading/preload_pipeline_info_impl.h
index a1c2618..88ce385 100644
--- a/content/browser/preloading/preload_pipeline_info_impl.h
+++ b/content/browser/preloading/preload_pipeline_info_impl.h
@@ -11,6 +11,7 @@
 #include "content/browser/preloading/prefetch/prefetch_status.h"
 #include "content/public/browser/preload_pipeline_info.h"
 #include "content/public/browser/preloading.h"
+#include "third_party/perfetto/include/perfetto/tracing/track_event_args.h"
 
 namespace content {
 
@@ -29,6 +30,9 @@
   PreloadPipelineInfoImpl(const PreloadPipelineInfoImpl&) = delete;
   PreloadPipelineInfoImpl& operator=(const PreloadPipelineInfoImpl&) = delete;
 
+  const perfetto::Track& GetTrack() const;
+  perfetto::Flow GetFlow() const;
+
   const base::UnguessableToken& id() const { return id_; }
 
   PreloadingType planned_max_preloading_type() const {
@@ -54,6 +58,8 @@
 
   const PreloadingType planned_max_preloading_type_;
 
+  const perfetto::Track track_;
+
   PreloadingEligibility prefetch_eligibility_ =
       PreloadingEligibility::kUnspecified;
   std::optional<PrefetchStatus> prefetch_status_ = std::nullopt;
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
index 465ebf8..ecd7f71 100644
--- a/content/browser/renderer_host/media/media_stream_manager.cc
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -270,90 +270,6 @@
   }
 }
 
-const char* RequestResultToString(
-    blink::mojom::MediaStreamRequestResult result) {
-  switch (result) {
-    case blink::mojom::MediaStreamRequestResult::OK:
-      return "OK";
-    case blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED:
-      return "PERMISSION_DENIED";
-    case blink::mojom::MediaStreamRequestResult::PERMISSION_DISMISSED:
-      return "PERMISSION_DISMISSED";
-    case blink::mojom::MediaStreamRequestResult::MULTI_CAPTURE_NOT_SUPPORTED:
-      return "MULTI_CAPTURE_NOT_SUPPORTED";
-    case blink::mojom::MediaStreamRequestResult::INVALID_STATE:
-      return "INVALID_STATE";
-    case blink::mojom::MediaStreamRequestResult::NO_HARDWARE:
-      return "NO_HARDWARE";
-    case blink::mojom::MediaStreamRequestResult::INVALID_SECURITY_ORIGIN:
-      return "INVALID_SECURITY_ORIGIN";
-    case blink::mojom::MediaStreamRequestResult::TAB_CAPTURE_FAILURE:
-      return "TAB_CAPTURE_FAILURE";
-    case blink::mojom::MediaStreamRequestResult::SCREEN_CAPTURE_FAILURE:
-      return "SCREEN_CAPTURE_FAILURE";
-    case blink::mojom::MediaStreamRequestResult::CAPTURE_FAILURE:
-      return "CAPTURE_FAILURE";
-    case blink::mojom::MediaStreamRequestResult::CONSTRAINT_NOT_SATISFIED:
-      return "CONSTRAINT_NOT_SATISFIED";
-    case blink::mojom::MediaStreamRequestResult::TRACK_START_FAILURE_AUDIO:
-      return "TRACK_START_FAILURE_AUDIO";
-    case blink::mojom::MediaStreamRequestResult::TRACK_START_FAILURE_VIDEO:
-      return "TRACK_START_FAILURE_VIDEO";
-    case blink::mojom::MediaStreamRequestResult::NOT_SUPPORTED:
-      return "NOT_SUPPORTED";
-    case blink::mojom::MediaStreamRequestResult::FAILED_DUE_TO_SHUTDOWN:
-      return "FAILED_DUE_TO_SHUTDOWN";
-    case blink::mojom::MediaStreamRequestResult::KILL_SWITCH_ON:
-      return "KILL_SWITCH_ON";
-    case blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM:
-      return "PERMISSION_DENIED_BY_SYSTEM";
-    case blink::mojom::MediaStreamRequestResult::DEVICE_IN_USE:
-      return "DEVICE_IN_USE";
-    case blink::mojom::MediaStreamRequestResult::REQUEST_CANCELLED:
-      return "REQUEST_CANCELLED";
-    case blink::mojom::MediaStreamRequestResult::START_TIMEOUT:
-      return "START_TIMEOUT";
-    case blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED_BY_USER:
-      return "PERMISSION_DENIED_BY_USER";
-    case blink::mojom::MediaStreamRequestResult::AUDIO_DEVICE_SOCKET_ERROR:
-      return "AUDIO_DEVICE_SOCKET_ERROR";
-    case blink::mojom::MediaStreamRequestResult::NO_TRANSIENT_ACTIVATION:
-      return "NO_TRANSIENT_ACTIVATION";
-    case blink::mojom::MediaStreamRequestResult::CAPTURE_NOT_ALLOWED_BY_POLICY:
-      return "CAPTURE_NOT_ALLOWED_BY_POLICY";
-    case blink::mojom::MediaStreamRequestResult::
-        INVALID_DISPLAY_CAPTURE_CONSTRAINTS:
-      return "INVALID_DISPLAY_CAPTURE_CONSTRAINTS";
-    case blink::mojom::MediaStreamRequestResult::INVALID_VIDEO_DEVICE_ID:
-      return "INVALID_VIDEO_DEVICE_ID";
-    case blink::mojom::MediaStreamRequestResult::
-        INVALID_GUM_TAB_CAPTURE_CONSTRAINTS:
-      return "INVALID_GUM_TAB_CAPTURE_CONSTRAINTS";
-    case blink::mojom::MediaStreamRequestResult::
-        INVALID_GUM_SCREEN_CAPTURE_CONSTRAINTS:
-      return "INVALID_GUM_SCREEN_CAPTURE_CONSTRAINTS";
-    case blink::mojom::MediaStreamRequestResult::STREAM_NOT_FOUND_IN_REGISTRY:
-      return "STREAM_NOT_FOUND_IN_REGISTRY";
-    case blink::mojom::MediaStreamRequestResult::
-        ANDROID_CANT_REQUEST_PERMISSION:
-      return "ANDROID_CANT_REQUEST_PERMISSION";
-    case blink::mojom::MediaStreamRequestResult::
-        PERMISSION_DENIED_BY_EMBEDDER_CONTEXT:
-      return "PERMISSION_DENIED_BY_EMBEDDER_CONTEXT";
-    case blink::mojom::MediaStreamRequestResult::DLP_PERMISSION_DENIED:
-      return "DLP_PERMISSION_DENIED";
-    case blink::mojom::MediaStreamRequestResult::REGISTRY_REQUEST_UNVERIFIED:
-      return "REGISTRY_REQUEST_UNVERIFIED";
-    case blink::mojom::MediaStreamRequestResult::INVALID_DEVICE_TYPE_REQUEST:
-      return "INVALID_DEVICE_TYPE_REQUEST";
-    case blink::mojom::MediaStreamRequestResult::INVALID_EXTENSION_TYPE_REQUEST:
-      return "INVALID_EXTENSION_TYPE_REQUEST";
-    case blink::mojom::MediaStreamRequestResult::CAPTURED_TAB_DESTROYED:
-      return "CAPTURED_TAB_DESTROYED";
-  }
-  NOTREACHED();
-}
-
 std::string GetGenerateStreamsLogString(
     GlobalRenderFrameHostId render_frame_host_id,
     int requester_id,
@@ -3264,7 +3180,7 @@
   SendLogMessage(base::StringPrintf(
       "FinalizeRequestFailed({label=%s}, {requester_id=%d}, {result=%s})",
       request_it->first.c_str(), request->requester_id,
-      RequestResultToString(result)));
+      base::ToString(result)));
 
   switch (request->request_type()) {
     case blink::MEDIA_DEVICE_ACCESS:
@@ -3625,8 +3541,7 @@
   SendLogMessage(base::StringPrintf(
       "HandleAccessRequestResponse({label=%s}, {request=%s}, {result=%s})",
       label.c_str(), RequestTypeToString(request->request_type()),
-      RequestResultToString(result)));
-
+      base::ToString(result)));
   media_stream_metrics::RecordMediaStreamRequestResponseMetric(
       request->video_type(), request->request_type(), result);
 
diff --git a/content/browser/renderer_host/media/media_stream_metrics.cc b/content/browser/renderer_host/media/media_stream_metrics.cc
index b9acf76..5dd06f2 100644
--- a/content/browser/renderer_host/media/media_stream_metrics.cc
+++ b/content/browser/renderer_host/media/media_stream_metrics.cc
@@ -145,6 +145,22 @@
       // TODO(crbug.com/453600255): Add a new value once all new enum values are
       // added.
       return MediaStreamRequestResult2::kTabCaptureFailure;
+    case MediaStreamRequestResult::CAPTURE_NOT_ENABLED:
+      // TODO(crbug.com/453600255): Add a new value once all new enum values are
+      // added.
+      return MediaStreamRequestResult2::kInvalidState;
+    case MediaStreamRequestResult::SAFE_BROWSING_OBSERVER:
+      // TODO(crbug.com/453600255): Add a new value once all new enum values are
+      // added.
+      return MediaStreamRequestResult2::kPermissionDenied;
+    case MediaStreamRequestResult::CAPTURE_NOT_ALLOWED_FOR_LONG_DOMAINS:
+      // TODO(crbug.com/453600255): Add a new value once all new enum values are
+      // added.
+      return MediaStreamRequestResult2::kInvalidState;
+    case MediaStreamRequestResult::CAPTURE_FROM_BACKGROUND_PAGE_ON_MAC:
+      // TODO(crbug.com/453600255): Add a new value once all new enum values are
+      // added.
+      return MediaStreamRequestResult2::kInvalidState;
   }
   NOTREACHED();
 }
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index bcfdc91..0b1c9da60 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -387,9 +387,6 @@
 // Enable drawing under System Bars within DisplayCutout.
 BASE_FEATURE(kDrawCutoutEdgeToEdge, base::FEATURE_ENABLED_BY_DEFAULT);
 
-// Enable establishing the GPU channel early in renderer startup.
-BASE_FEATURE(kEarlyEstablishGpuChannel, base::FEATURE_ENABLED_BY_DEFAULT);
-
 // Enables canvas 2d methods BeginLayer and EndLayer.
 BASE_FEATURE(kEnableCanvas2DLayers, base::FEATURE_DISABLED_BY_DEFAULT);
 
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index b6277e14..359d4cb 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -122,7 +122,6 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(
     kDisablePartialStorageCleanupForGPUDiskCache);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kDrawCutoutEdgeToEdge);
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kEarlyEstablishGpuChannel);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kEnableCanvas2DLayers);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kEnableJavalessRenderers);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kEnableServiceWorkersForChromeScheme);
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index 9e2a489..298b3da3 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -519,13 +519,12 @@
 
   // Establish the GPU channel now, so its ready when needed and we don't have
   // to wait on a sync call.
-  if (base::FeatureList::IsEnabled(features::kEarlyEstablishGpuChannel)) {
-    gpu_->EstablishGpuChannel(
-        base::BindOnce([](scoped_refptr<gpu::GpuChannelHost> host) {
-          if (host)
-            GetContentClient()->SetGpuInfo(host->gpu_info());
-        }));
-  }
+  gpu_->EstablishGpuChannel(
+      base::BindOnce([](scoped_refptr<gpu::GpuChannelHost> host) {
+        if (host) {
+          GetContentClient()->SetGpuInfo(host->gpu_info());
+        }
+      }));
 
   // NOTE: Do not add interfaces to |binders| within this method. Instead,
   // modify the definition of |ExposeRendererInterfacesToBrowser()| to ensure
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 4765ab08..4a0966b 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -3480,7 +3480,10 @@
       "../browser/renderer_host/media/sub_capture_target_id_web_contents_helper_unittest.cc",
     ]
     if (is_mac) {
-      sources += [ "../browser/media/capture/pip_screen_capture_coordinator_impl_unittest.cc" ]
+      sources += [
+        "../browser/media/capture/pip_screen_capture_coordinator_impl_unittest.cc",
+        "../browser/media/capture/pip_screen_capture_coordinator_proxy_impl_unittest.cc",
+      ]
     }
     if (!is_android && !is_ios) {
       deps += [
diff --git a/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Builder/targets/chromium.memory.json b/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Builder/targets/chromium.memory.json
index b993da0..4d8d10d 100644
--- a/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Builder/targets/chromium.memory.json
+++ b/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Builder/targets/chromium.memory.json
@@ -43,7 +43,8 @@
       },
       {
         "args": [
-          "--test-launcher-print-test-stdio=always"
+          "--test-launcher-print-test-stdio=always",
+          "--gtest_filter=-TestSuiteTest.RunFlakyTests:TestSuiteTest.RunMockTests"
         ],
         "merge": {
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git "a/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests \0501\051/targets/chromium.memory.json" "b/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests \0501\051/targets/chromium.memory.json"
index b993da0..4d8d10d 100644
--- "a/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests \0501\051/targets/chromium.memory.json"
+++ "b/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests \0501\051/targets/chromium.memory.json"
@@ -43,7 +43,8 @@
       },
       {
         "args": [
-          "--test-launcher-print-test-stdio=always"
+          "--test-launcher-print-test-stdio=always",
+          "--gtest_filter=-TestSuiteTest.RunFlakyTests:TestSuiteTest.RunMockTests"
         ],
         "merge": {
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git a/infra/config/generated/builders/ci/linux-chromeos-dbg/targets/chromium.chromiumos.json b/infra/config/generated/builders/ci/linux-chromeos-dbg/targets/chromium.chromiumos.json
index 214acc5..48821523 100644
--- a/infra/config/generated/builders/ci/linux-chromeos-dbg/targets/chromium.chromiumos.json
+++ b/infra/config/generated/builders/ci/linux-chromeos-dbg/targets/chromium.chromiumos.json
@@ -36,6 +36,9 @@
         "test_id_prefix": "ninja://ui/accessibility:accessibility_unittests/"
       },
       {
+        "args": [
+          "--gtest_filter=-TestSuiteTest.RunFlakyTests:TestSuiteTest.RunMockTests"
+        ],
         "merge": {
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
diff --git a/infra/config/generated/builders/try/linux-chromeos-compile-dbg/targets/chromium.chromiumos.json b/infra/config/generated/builders/try/linux-chromeos-compile-dbg/targets/chromium.chromiumos.json
index 214acc5..48821523 100644
--- a/infra/config/generated/builders/try/linux-chromeos-compile-dbg/targets/chromium.chromiumos.json
+++ b/infra/config/generated/builders/try/linux-chromeos-compile-dbg/targets/chromium.chromiumos.json
@@ -36,6 +36,9 @@
         "test_id_prefix": "ninja://ui/accessibility:accessibility_unittests/"
       },
       {
+        "args": [
+          "--gtest_filter=-TestSuiteTest.RunFlakyTests:TestSuiteTest.RunMockTests"
+        ],
         "merge": {
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
diff --git a/infra/config/generated/builders/try/linux-chromeos-dbg/targets/chromium.chromiumos.json b/infra/config/generated/builders/try/linux-chromeos-dbg/targets/chromium.chromiumos.json
index 214acc5..48821523 100644
--- a/infra/config/generated/builders/try/linux-chromeos-dbg/targets/chromium.chromiumos.json
+++ b/infra/config/generated/builders/try/linux-chromeos-dbg/targets/chromium.chromiumos.json
@@ -36,6 +36,9 @@
         "test_id_prefix": "ninja://ui/accessibility:accessibility_unittests/"
       },
       {
+        "args": [
+          "--gtest_filter=-TestSuiteTest.RunFlakyTests:TestSuiteTest.RunMockTests"
+        ],
         "merge": {
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
diff --git a/infra/config/generated/builders/try/linux_chromium_chromeos_asan_rel_ng/targets/chromium.memory.json b/infra/config/generated/builders/try/linux_chromium_chromeos_asan_rel_ng/targets/chromium.memory.json
index b993da0..4d8d10d 100644
--- a/infra/config/generated/builders/try/linux_chromium_chromeos_asan_rel_ng/targets/chromium.memory.json
+++ b/infra/config/generated/builders/try/linux_chromium_chromeos_asan_rel_ng/targets/chromium.memory.json
@@ -43,7 +43,8 @@
       },
       {
         "args": [
-          "--test-launcher-print-test-stdio=always"
+          "--test-launcher-print-test-stdio=always",
+          "--gtest_filter=-TestSuiteTest.RunFlakyTests:TestSuiteTest.RunMockTests"
         ],
         "merge": {
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git a/infra/config/generated/testing/gn_isolate_map.pyl b/infra/config/generated/testing/gn_isolate_map.pyl
index d14837ae..22f2849 100644
--- a/infra/config/generated/testing/gn_isolate_map.pyl
+++ b/infra/config/generated/testing/gn_isolate_map.pyl
@@ -1721,10 +1721,12 @@
   "performance_test_suite_android_trichrome_chrome_google_64_32_bundle": {
     "label": "//chrome/test:performance_test_suite_android_trichrome_chrome_google_64_32_bundle",
     "type": "generated_script",
+    "module_scheme": "flat",
   },
   "performance_test_suite_android_trichrome_chrome_google_bundle": {
     "label": "//chrome/test:performance_test_suite_android_trichrome_chrome_google_bundle",
     "type": "generated_script",
+    "module_scheme": "flat",
   },
   "performance_web_engine_test_suite": {
     "label": "//content/test:performance_web_engine_test_suite",
diff --git a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
index ab3e3074..7fff5373 100644
--- a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
+++ b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
@@ -730,6 +730,11 @@
             "linux-jammy",
         ],
         per_test_modifications = {
+            "angle_unittests": targets.mixin(
+                args = [
+                    "--gtest_filter=-TestSuiteTest.RunFlakyTests:TestSuiteTest.RunMockTests",
+                ],
+            ),
             "browser_tests": targets.mixin(
                 swarming = targets.swarming(
                     shards = 160,
diff --git a/infra/config/subprojects/chromium/ci/chromium.memory.star b/infra/config/subprojects/chromium/ci/chromium.memory.star
index b5de044..c4192305 100644
--- a/infra/config/subprojects/chromium/ci/chromium.memory.star
+++ b/infra/config/subprojects/chromium/ci/chromium.memory.star
@@ -435,6 +435,11 @@
             "linux-jammy",
         ],
         per_test_modifications = {
+            "angle_unittests": targets.mixin(
+                args = [
+                    "--gtest_filter=-TestSuiteTest.RunFlakyTests:TestSuiteTest.RunMockTests",
+                ],
+            ),
             "browser_tests": targets.mixin(
                 # These are very slow on the ASAN trybot for some reason.
                 # crbug.com/1257927
diff --git a/infra/config/targets/binaries.star b/infra/config/targets/binaries.star
index 76938cd..5af4971 100644
--- a/infra/config/targets/binaries.star
+++ b/infra/config/targets/binaries.star
@@ -1926,11 +1926,13 @@
 targets.binaries.generated_script(
     name = "performance_test_suite_android_trichrome_chrome_google_64_32_bundle",
     label = "//chrome/test:performance_test_suite_android_trichrome_chrome_google_64_32_bundle",
+    module_scheme = "flat",
 )
 
 targets.binaries.generated_script(
     name = "performance_test_suite_android_trichrome_chrome_google_bundle",
     label = "//chrome/test:performance_test_suite_android_trichrome_chrome_google_bundle",
+    module_scheme = "flat",
 )
 
 targets.binaries.script(
diff --git a/internal b/internal
index 96d5677..b1e2057 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit 96d567763cde6fce93437285efeffbe518734435
+Subproject commit b1e2057843d44a48732728aaf6989b20398c18c4
diff --git a/ios/chrome/app/resources/Settings.bundle/Experimental.plist b/ios/chrome/app/resources/Settings.bundle/Experimental.plist
index d4437cba5..f63419f 100644
--- a/ios/chrome/app/resources/Settings.bundle/Experimental.plist
+++ b/ios/chrome/app/resources/Settings.bundle/Experimental.plist
@@ -632,6 +632,36 @@
 		</dict>
 		<dict>
 			<key>Type</key>
+			<string>PSToggleSwitchSpecifier</string>
+			<key>Title</key>
+			<string>Disable Composebox AIM eligibility</string>
+			<key>Key</key>
+			<string>ForceDisableAIMEligibility</string>
+			<key>DefaultValue</key>
+			<false/>
+            </dict>
+        <dict>
+			<key>Type</key>
+			<string>PSToggleSwitchSpecifier</string>
+			<key>Title</key>
+			<string>Disable Composebox Create Images eligibility</string>
+			<key>Key</key>
+			<string>ForceDisableCreateImagesEligibility</string>
+			<key>DefaultValue</key>
+			<false/>
+		</dict>
+		<dict>
+			<key>Type</key>
+			<string>PSToggleSwitchSpecifier</string>
+			<key>Title</key>
+			<string>Disable Composebox Pdf Upload eligibility</string>
+			<key>Key</key>
+			<string>ForceDisablePdfUploadEligibility</string>
+			<key>DefaultValue</key>
+			<false/>
+		</dict>
+		<dict>
+			<key>Type</key>
 			<string>PSGroupSpecifier</string>
 			<key>Title</key>
 			<string>Enterprise Settings</string>
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 ac77666..6d6926d6 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
@@ -117,6 +117,7 @@
 <translation id="3581385059720151202">‏البحث عن العناصر المرئية في Chromium</translation>
 <translation id="3582640969619785896">‏سيعرض Chromium خيار حفظ كلمة المرور</translation>
 <translation id="3594315078412605236">‏إدارة "طرق الدفع" في Chromium</translation>
+<translation id="3600428265489994557">‏سجِّل الدخول إلى Chromium</translation>
 <translation id="3617143087229977194">‏يُرجى فتح إعدادات "التطبيقات التلقائية" في نظام التشغيل iOS، ثم النقر على "تطبيق المتصفّح" واختيار Chromium.</translation>
 <translation id="3634039384458740619">‏فتح إعدادات Chromium</translation>
 <translation id="3639997914391704523">‏يجب تسجيل الدخول إلى حسابك على Google ليتمكّن Chromium من التحقُّق من كلمات المرور.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
index 5ffd577..61123e6 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
@@ -117,6 +117,7 @@
 <translation id="3581385059720151202">Telusuri visual di Chromium</translation>
 <translation id="3582640969619785896">Chromium akan menawarkan penyimpanan sandi Anda</translation>
 <translation id="3594315078412605236">Kelola metode pembayaran di Chromium</translation>
+<translation id="3600428265489994557">Login ke Chromium</translation>
 <translation id="3617143087229977194">Buka setelan Aplikasi Default di iOS, lalu ketuk "Aplikasi Browser" dan pilih Chromium.</translation>
 <translation id="3634039384458740619">Buka Setelan Chromium</translation>
 <translation id="3639997914391704523">Chromium dapat memeriksa sandi saat Anda login dengan Akun Google.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb
index d4bf64f..9974fd7 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb
@@ -117,6 +117,7 @@
 <translation id="3581385059720151202">Chromium에서 시각적 검색 수행</translation>
 <translation id="3582640969619785896">Chromium에서 비밀번호 저장을 제안합니다.</translation>
 <translation id="3594315078412605236">Chromium에서 결제 수단 관리</translation>
+<translation id="3600428265489994557">Chromium에 로그인하세요</translation>
 <translation id="3617143087229977194">iOS에서 기본 앱 설정을 열고 '브라우저 앱'을 탭한 다음 Chromium을 선택합니다</translation>
 <translation id="3634039384458740619">Chromium 설정 열기</translation>
 <translation id="3639997914391704523">Google 계정으로 로그인하면 Chromium에서 비밀번호를 확인할 수 있습니다.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_mn.xtb
index d22db6f..ef3a820 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_mn.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_mn.xtb
@@ -117,6 +117,7 @@
 <translation id="3581385059720151202">Chromium-с визуал хайх</translation>
 <translation id="3582640969619785896">Chromium танд нууц үгээ хадгалахыг санал болгоно</translation>
 <translation id="3594315078412605236">Chromium-д төлбөрийн хэрэгслүүдийг удирдах</translation>
+<translation id="3600428265489994557">Chromium-д нэвтрэх</translation>
 <translation id="3617143087229977194">iOS-с Өгөгдмөл аппын тохиргоог нээгээд, "Хөтчийн апп" дээр товшиж, Chromium-г сонгоно уу.</translation>
 <translation id="3634039384458740619">Chromium-н тохиргоог нээх</translation>
 <translation id="3639997914391704523">Chromium нь таныг Google Бүртгэлээрээ нэвтрэх үед таны нууц үгнүүдийг шалгах боломжтой.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
index 1d419ce..6c168845 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
@@ -117,6 +117,7 @@
 <translation id="3581385059720151202">Slikovno iskanje v Chromiumu</translation>
 <translation id="3582640969619785896">Chromium bo ponudil shranjevanje gesla</translation>
 <translation id="3594315078412605236">Upravljanje plačilnih sredstev v Chromiumu</translation>
+<translation id="3600428265489994557">Prijava v Chromium</translation>
 <translation id="3617143087229977194">V sistemu iOS odprite nastavitve privzetih aplikacij, dotaknite se »Browser App« (brskalnik) in izberite Chromium.</translation>
 <translation id="3634039384458740619">Odprite nastavitve za Chromium</translation>
 <translation id="3639997914391704523">Chromium lahko preveri vaša gesla, ko se prijavite z računom Google.</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 d2ce317..63cec12c 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
@@ -16,6 +16,7 @@
 <translation id="124228879633599436">‏إصدار Chrome الحالي قديم. يُرجى تحديثه للحفاظ على أمان بياناتك.</translation>
 <translation id="1258531953614971819">‏نصيحة عن Chrome: يمكنك نقله إلى الشاشة الرئيسية</translation>
 <translation id="1333745675627230582">‏تشغيل لعبة الديناصور في Chrome</translation>
+<translation id="1343830902827845050">‏سجِّل الدخول إلى Chrome</translation>
 <translation id="1352919863522755794">‏تعذَّر على "مدير كلمات المرور في Google" التأكد من كلمات المرور. يُرجى التأكد من الاتصال بالإنترنت.</translation>
 <translation id="1394995526009609883">‏يمكنك تعديل اختياراتك متى شئت من خلال إعدادات Chrome.</translation>
 <translation id="1407843355326180937">‏يمكنك تسجيل الدخول إلى هذا الموقع الإلكتروني وإلى Chrome للحصول على إشاراتك المرجعية وغيرها على جميع أجهزتك.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb
index ab62290..fdc8fc0 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb
@@ -16,6 +16,7 @@
 <translation id="124228879633599436">Chrome Anda belum diupdate. Update agar tetap aman.</translation>
 <translation id="1258531953614971819">Tips Chrome: Pindahkan Chrome ke layar utama</translation>
 <translation id="1333745675627230582">Mainkan Game Chrome Dino</translation>
+<translation id="1343830902827845050">Login ke Chrome</translation>
 <translation id="1352919863522755794">Pengelola Sandi Google tidak dapat memeriksa sandi Anda. Coba periksa koneksi internet Anda.</translation>
 <translation id="1394995526009609883">Anda dapat memperbarui pilihan kapan saja di setelan Chrome.</translation>
 <translation id="1407843355326180937">Login ke situs ini dan Chrome untuk mendapatkan bookmark Anda dan lainnya di semua perangkat.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb
index f869dc9..b75ec2b5 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb
@@ -16,6 +16,7 @@
 <translation id="124228879633599436">Chrome이 최신 버전이 아닙니다. 안전하게 사용하려면 업데이트하세요.</translation>
 <translation id="1258531953614971819">Chrome 도움말: Chrome을 홈 화면으로 이동하세요</translation>
 <translation id="1333745675627230582">Chrome 공룡 게임 플레이</translation>
+<translation id="1343830902827845050">Chrome에 로그인하세요</translation>
 <translation id="1352919863522755794">Google 비밀번호 관리자에서 비밀번호를 확인할 수 없습니다. 인터넷 연결 상태를 확인해 보세요.</translation>
 <translation id="1394995526009609883">Chrome 설정에서 언제든지 선택사항을 업데이트할 수 있습니다</translation>
 <translation id="1407843355326180937">이 사이트 및 Chrome에 로그인하여 모든 기기에서 북마크 등을 사용하세요.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mn.xtb
index 77899f7..00fcbac 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mn.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mn.xtb
@@ -16,6 +16,7 @@
 <translation id="124228879633599436">Таны Chrome хуучирсан байна. Аюулгүй байхын тулд үүнийг шинэчилнэ үү.</translation>
 <translation id="1258531953614971819">Chrome-н зөвлөгөө: Chrome-г үндсэн нүүр лүүгээ зөөгөөрэй</translation>
 <translation id="1333745675627230582">Chrome Dino тоглоомыг тоглох</translation>
+<translation id="1343830902827845050">Chrome-д нэвтрэх</translation>
 <translation id="1352919863522755794">Google Password Manager таны нууц үгнүүдийг шалгаж чадсангүй. Интернэт холболтоо шалгаж үзнэ үү.</translation>
 <translation id="1394995526009609883">Та сонголтуудаа Chrome-н тохиргоонд хүссэн үедээ шинэчлэх боломжтой.</translation>
 <translation id="1407843355326180937">Хавчуурга болон бусад зүйлээ бүх төхөөрөмждөө авахын тулд энэ сайт болон Chrome-д нэвтэрнэ үү.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb
index e234736f..e516f79 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb
@@ -16,6 +16,7 @@
 <translation id="124228879633599436">Vaš Chrome je zastarel. Posodobite ga, da ostanete varni.</translation>
 <translation id="1258531953614971819">Nasvet za Chrome: Chrome premaknite na začetni zaslon</translation>
 <translation id="1333745675627230582">Igranje igre Dino za Chrome</translation>
+<translation id="1343830902827845050">Prijava v Chrome</translation>
 <translation id="1352919863522755794">Googlov upravitelj gesel ni mogel preveriti vaših gesel. Poskusite preveriti internetno povezavo.</translation>
 <translation id="1394995526009609883">Izbire lahko kadar koli posodobite v nastavitvah za Chrome.</translation>
 <translation id="1407843355326180937">Prijavite se na tem spletnem mestu in v Chromu, če želite dostopati do zaznamkov in drugega v vseh napravah.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb
index e2a7c9250..ffe5f555 100644
--- a/ios/chrome/app/strings/resources/ios_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -1854,7 +1854,7 @@
 <translation id="7933880123415105005"><ph name="SEARCH_PROVIDER" />ን ይፈልጉ</translation>
 <translation id="7938254975914653459">FaceTime</translation>
 <translation id="7939856641500914040">የአሰሳ ውሂብን ሰርዝ…</translation>
-<translation id="7941578031639087549">{count,plural, =1{ገፅ ወደ የእርስዎ የንባብ ዝርዝር በመለያዎ ውስጥ ታክሏል፣ {email}}one{{count} ገፅ ወደ የእርስዎ የንባብ ዝርዝር በመለያዎ ውስጥ ታክሏል፣ {email}}other{{count} ገፆች ወደ የእርስዎ የንባብ ዝርዝር በመለያዎ ውስጥ ታክለዋል፣ {email}}}</translation>
+<translation id="7941578031639087549">{count,plural, =1{ገፅ ወደ የእርስዎ የንባብ ዝርዝር በመለያዎ ውስጥ ታክሏል፣ {email}}one{{count} ገጽ ወደ የእርስዎ የንባብ ዝርዝር በመለያዎ ውስጥ ታክሏል፣ {email}}other{{count} ገፆች ወደ የእርስዎ የንባብ ዝርዝር በመለያዎ ውስጥ ታክለዋል፣ {email}}}</translation>
 <translation id="7952353944614086413">የእርስዎ የተከፈቱ ትሮች እና ቡድኖች</translation>
 <translation id="7952670906562503188">{passkey_count} የይለፍ ቁልፎችን እና በመለያ መግቢያ መረጃን መቼም ላለማስቀመጥ የመረጡባቸውን የጣቢያዎች እና መተግበሪያዎች ዝርዝር ሊሰርዙ ነው። ለጣቢያዎች ወይም ለመተግበሪያዎች የፈጠሩት ማንኛውም መለያ አይሰረዝም።</translation>
 <translation id="7958575506592576831">የገፅ ደህንነት መረጃ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index 72f236c..bf33769 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -907,6 +907,7 @@
 <translation id="4525629404718770519">عرض معاينات الروابط</translation>
 <translation id="452750746583162491">مراجعة البيانات المتزامنة</translation>
 <translation id="4532845899244822526">اختيار مجلد</translation>
+<translation id="454217142158335225">يمكنك إعادة فتح علامات التبويب المغلقة من قسمَي "علامات التبويب الأخيرة" و"مجموعات علامات التبويب". ولن يتم إغلاق علامات التبويب المثبَّتة.</translation>
 <translation id="4547181496285029457">العودة إلى أحدث علامة تبويب</translation>
 <translation id="4552042254369397518">جارٍ النسخ…</translation>
 <translation id="4564893319561643483">إخفاء "<ph name="TITLE" />"</translation>
@@ -1839,6 +1840,7 @@
 <translation id="7887174313503389866">يمكنك الاطّلاع على العناصر الرئيسية للتحكّم في الخصوصية والأمان. ولمزيد من الخيارات، انتقِل إلى الإعدادات الفردية.</translation>
 <translation id="7887198238286927132">‏لحماية خصوصيتك، لن يجري Chrome الملء التلقائي لهذا الحقل.</translation>
 <translation id="7887552845761062935">يُرجى النقر مرّتين مع الاستمرار لفتح المزيد من الخيارات</translation>
+<translation id="7888562068293422208">إغلاق الكل؟</translation>
 <translation id="7889910613639381518">‏يمكنك الوصول بسهولة وأمان باستخدام التطبيق المصغّر "مدير كلمات المرور في Google".</translation>
 <translation id="7899199123054742721">وضع علامة "غير مقروءة" على الكل</translation>
 <translation id="7911190106180361398">لا تسمح لك مؤسستك بمزامنة كل البيانات.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index e8bef176..4f4a468 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -907,6 +907,7 @@
 <translation id="4525629404718770519">Tampilkan pratinjau link</translation>
 <translation id="452750746583162491">Tinjau data Anda yang disinkronkan</translation>
 <translation id="4532845899244822526">Pilih folder</translation>
+<translation id="454217142158335225">Anda dapat membuka kembali item yang ditutup dari bagian tab terbaru atau grup tab. Tab yang disematkan tidak akan ditutup.</translation>
 <translation id="4547181496285029457">Kembali ke tab terbaru</translation>
 <translation id="4552042254369397518">Menyalin…</translation>
 <translation id="4564893319561643483">Sembunyikan "<ph name="TITLE" />"</translation>
@@ -1841,6 +1842,7 @@
 <translation id="7887174313503389866">Lihat tur terpandu tentang kontrol privasi dan keamanan utama. Untuk opsi lainnya, buka masing-masing setelan.</translation>
 <translation id="7887198238286927132">Untuk melindungi privasi Anda, Chrome tidak akan melakukan IsiOtomatis pada kolom ini.</translation>
 <translation id="7887552845761062935">Ketuk dua kali dan tahan untuk membuka opsi lainnya</translation>
+<translation id="7888562068293422208">Tutup semua?</translation>
 <translation id="7889910613639381518">Akses mudah dan aman dengan widget Pengelola Sandi Google.</translation>
 <translation id="7899199123054742721">Tandai semua belum dibaca</translation>
 <translation id="7911190106180361398">Organisasi tidak mengizinkan Anda menyinkronkan semuanya.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index aa57a26e..b1cc541c2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -907,6 +907,7 @@
 <translation id="4525629404718770519">링크 미리보기 표시</translation>
 <translation id="452750746583162491">동기화된 데이터 검토</translation>
 <translation id="4532845899244822526">폴더 선택</translation>
+<translation id="454217142158335225">최근 탭 또는 탭 그룹 섹션에서 닫힌 항목을 다시 열 수 있습니다. 탭 고정은 닫히지 않습니다.</translation>
 <translation id="4547181496285029457">최근 탭으로 돌아가기</translation>
 <translation id="4552042254369397518">복사 중…</translation>
 <translation id="4564893319561643483">"<ph name="TITLE" />" 숨기기</translation>
@@ -1841,6 +1842,7 @@
 <translation id="7887174313503389866">주요 개인 정보 보호 및 보안 제어 기능을 둘러보세요. 추가 옵션을 알아보려면 개별 설정으로 이동합니다</translation>
 <translation id="7887198238286927132">Chrome에서는 개인 정보 보호를 위해 이 입력란을 자동 완성하지 않습니다.</translation>
 <translation id="7887552845761062935">더 많은 옵션을 열려면 두 번 탭한 후 길게 누르기</translation>
+<translation id="7888562068293422208">모두 닫으시겠습니까?</translation>
 <translation id="7889910613639381518">Google 비밀번호 관리자 위젯을 사용해 쉽고 안전하게 액세스하세요</translation>
 <translation id="7899199123054742721">모두 읽지않음으로 표시</translation>
 <translation id="7911190106180361398">조직에서 모든 항목을 동기화하도록 허용하지 않습니다.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
index 1da9ccb..c51f939 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -907,6 +907,7 @@
 <translation id="4525629404718770519">Холбоосны урьдчилан үзэлтийг харуулах</translation>
 <translation id="452750746583162491">Синк хийсэн өгөгдлөө шалгах</translation>
 <translation id="4532845899244822526">Хавтас сонгох</translation>
+<translation id="454217142158335225">Та хаасан зүйлсийг саяхны таб эсвэл табын бүлэг хэсгээс дахин нээх боломжтой. Таны бэхэлсэн табуудыг хаахгүй.</translation>
 <translation id="4547181496285029457">Саяхны таб руу буцах</translation>
 <translation id="4552042254369397518">Хуулж байна…</translation>
 <translation id="4564893319561643483">"<ph name="TITLE" />"-г нуух</translation>
@@ -1841,6 +1842,7 @@
 <translation id="7887174313503389866">Нууцлал болон аюулгүй байдлын үндсэн хяналтын талаар хөтөчтэй аялалд хамрагдаарай. Нэмэлт сонголтуудыг харахын тулд хувийн тохиргоо руу очно уу.</translation>
 <translation id="7887198238286927132">Таны нууцлалыг хамгаалахын тулд Chrome энэ талбарыг автоматаар бөглөхгүй.</translation>
 <translation id="7887552845761062935">Бусад сонголтыг нээхийн тулд товшоод удаан дарна уу</translation>
+<translation id="7888562068293422208">Бүгдийг нь хаах уу?</translation>
 <translation id="7889910613639381518">Google Password Manager-н виджеттэйгээр хялбар бөгөөд аюулгүй хандалт.</translation>
 <translation id="7899199123054742721">Бүгдийг уншаагүй гэж тэмдэглэх</translation>
 <translation id="7911190106180361398">Танай байгууллага танд бүх зүйлийг синк хийхийг зөвшөөрдөггүй.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
index 61327b8..5a0c940a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -907,6 +907,7 @@
 <translation id="4525629404718770519">Prikaz predogledov povezav</translation>
 <translation id="452750746583162491">Pregled sinhroniziranih podatkov</translation>
 <translation id="4532845899244822526">Izbira mape</translation>
+<translation id="454217142158335225">Zaprte elemente lahko znova odprete v razdelkih nedavnih zavihkov ali skupin zavihkov. Pripeti zavihki ne bodo zaprti.</translation>
 <translation id="4547181496285029457">Nazaj na prejšnji zavihek</translation>
 <translation id="4552042254369397518">Kopiranje …</translation>
 <translation id="4564893319561643483">Skrij »<ph name="TITLE" />«</translation>
@@ -1841,6 +1842,7 @@
 <translation id="7887174313503389866">Oglejte si vodeno predstavitev ključnih kontrolnikov zasebnosti in varnosti. Če želite več možnosti, odprite posamezne nastavitve.</translation>
 <translation id="7887198238286927132">Chrome zaradi varovanja vaše zasebnosti ne bo samodejno izpolnil tega polja.</translation>
 <translation id="7887552845761062935">Dvakrat se dotaknite in pridržite, če želite odpreti več možnosti</translation>
+<translation id="7888562068293422208">Želite zapreti vse?</translation>
 <translation id="7889910613639381518">Preprost in varen dostop s pripomočkom Googlovega upravitelja gesel.</translation>
 <translation id="7899199123054742721">Označi vse kot neprebrano</translation>
 <translation id="7911190106180361398">Vaša organizacija vam ne dovoli sinhronizirati vsega.</translation>
diff --git a/ios/chrome/browser/authentication/consistency_promo_signin/coordinator/consistency_promo_signin_coordinator.mm b/ios/chrome/browser/authentication/consistency_promo_signin/coordinator/consistency_promo_signin_coordinator.mm
index d938bcd..7876770 100644
--- a/ios/chrome/browser/authentication/consistency_promo_signin/coordinator/consistency_promo_signin_coordinator.mm
+++ b/ios/chrome/browser/authentication/consistency_promo_signin/coordinator/consistency_promo_signin_coordinator.mm
@@ -296,7 +296,7 @@
     // In case of double tap, let the first reauth proceed.
     return;
   }
-  [self.reauthCoordinator stop];
+  [self stopAddAccountFlows];
   self.reauthCoordinator = [[SigninReauthCoordinator alloc]
       initWithBaseViewController:self.navigationController
                          browser:self.browser
@@ -335,6 +335,13 @@
   [self.reauthCoordinator stop];
   self.reauthCoordinator = nil;
 }
+
+// Stop children coordinators that goes through the add account flow.
+- (void)stopAddAccountFlows {
+  [self stopReauthCoordinator];
+  [self stopAddAccountCoordinatorAnimated:NO];
+}
+
 // Does cleanup (metrics and remove coordinator) once the add-account flow is
 // finished. If `hasAccounts == NO` and `signinResult` is successful , the
 // function immediately signs in to Chrome with the identity acquired from the
@@ -380,7 +387,7 @@
   // In case of double-tap, we must stop the already started coordinator. This
   // may occur because, up to iOS 18, the view may have disappeared without
   // calling the signin completion. See crbug.com/395959814
-  [self.addAccountCoordinator stop];
+  [self stopAddAccountFlows];
   if (hasAccounts) {
     RecordConsistencyPromoUserAction(
         signin_metrics::AccountConsistencyPromoAction::ADD_ACCOUNT_STARTED,
diff --git a/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm b/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm
index 9b8f984c..9752b8e 100644
--- a/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm
+++ b/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm
@@ -1624,6 +1624,7 @@
   self.sadTabCoordinator =
       [[SadTabCoordinator alloc] initWithBaseViewController:self.viewController
                                                     browser:self.browser];
+  self.sadTabCoordinator.contextMenuProvider = self.contextMenuProvider;
   [self.sadTabCoordinator setOverscrollDelegate:self];
 
   /* SharingCoordinator is created and started by an ActivityServiceCommand */
@@ -3127,12 +3128,12 @@
 
 #pragma mark - BWGCommands
 
-- (void)startBWGFlowWithEntryPoint:(bwg::EntryPoint)entryPoint {
-  [self startBWGFlowWithImageAttachment:nil entryPoint:entryPoint];
+- (void)startGeminiFlowWithEntryPoint:(bwg::EntryPoint)entryPoint {
+  [self startGeminiFlowWithImageAttachment:nil entryPoint:entryPoint];
 }
 
-- (void)startBWGFlowWithImageAttachment:(UIImage*)image
-                             entryPoint:(bwg::EntryPoint)entryPoint {
+- (void)startGeminiFlowWithImageAttachment:(UIImage*)image
+                                entryPoint:(bwg::EntryPoint)entryPoint {
   if (entryPoint == bwg::EntryPoint::ImageContextMenu) {
     BwgBrowserAgent::FromBrowser(self.browser)
         ->StartGeminiFlow(self.viewController, image);
@@ -3159,7 +3160,7 @@
 - (void)showBWGPromoIfPageIsEligible {
   BwgService* BWGService = BwgServiceFactory::GetForProfile(self.profile);
   if (BWGService->IsBwgAvailableForWebState(self.activeWebState)) {
-    [self startBWGFlowWithEntryPoint:bwg::EntryPoint::Promo];
+    [self startGeminiFlowWithEntryPoint:bwg::EntryPoint::Promo];
   }
 }
 
diff --git a/ios/chrome/browser/composebox/coordinator/BUILD.gn b/ios/chrome/browser/composebox/coordinator/BUILD.gn
index 01dd64fa..86a9936 100644
--- a/ios/chrome/browser/composebox/coordinator/BUILD.gn
+++ b/ios/chrome/browser/composebox/coordinator/BUILD.gn
@@ -84,6 +84,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/features:system_flags",
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/browser/shared/ui/util:util_swift",
     "//ios/chrome/browser/signin/model",
diff --git a/ios/chrome/browser/composebox/coordinator/composebox_input_plate_mediator.mm b/ios/chrome/browser/composebox/coordinator/composebox_input_plate_mediator.mm
index 72fcea4..da2f40e6 100644
--- a/ios/chrome/browser/composebox/coordinator/composebox_input_plate_mediator.mm
+++ b/ios/chrome/browser/composebox/coordinator/composebox_input_plate_mediator.mm
@@ -55,6 +55,7 @@
 #import "ios/chrome/browser/shared/model/utils/mime_type_util.h"
 #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/public/features/system_flags.h"
 #import "ios/chrome/browser/snapshots/model/snapshot_tab_helper.h"
 #import "ios/chrome/browser/url_loading/model/url_loading_params.h"
 #import "ios/chrome/browser/url_loading/model/url_loading_util.h"
@@ -457,8 +458,14 @@
       [_items clearItems];
       break;
     case ComposeboxMode::kAIM:
+      if (![self isEligibleToAIM]) {
+        _modeHolder.mode = ComposeboxMode::kRegularSearch;
+      }
       break;
     case ComposeboxMode::kImageGeneration:
+      if (![self isEligibleToCreateImages]) {
+        _modeHolder.mode = ComposeboxMode::kRegularSearch;
+      }
       [self cleanAttachmentsForImageGeneration];
       break;
   }
@@ -1053,13 +1060,42 @@
       }));
 }
 
+// Checks if the user is eligible for AIM, taking into account experimental
+// settings overrides.
 - (BOOL)isEligibleToAIM {
+  if (experimental_flags::ShouldForceDisableComposeboxAIM()) {
+    return NO;
+  }
   if (!_aimEligibilityService) {
     return NO;
   }
   return _aimEligibilityService->IsAimEligible();
 }
 
+// Checks if the user is eligible to create images, taking into account
+// experimental settings overrides.
+- (BOOL)isEligibleToCreateImages {
+  if (experimental_flags::ShouldForceDisableComposeboxCreateImages()) {
+    return NO;
+  }
+  if (!_aimEligibilityService) {
+    return NO;
+  }
+  return _aimEligibilityService->IsCreateImagesEligible();
+}
+
+// Checks if the user is eligible to upload PDFs, taking into account
+// experimental settings overrides.
+- (BOOL)isEligibleToUploadPdf {
+  if (experimental_flags::ShouldForceDisableComposeboxPdfUpload()) {
+    return NO;
+  }
+  if (!_aimEligibilityService) {
+    return NO;
+  }
+  return _aimEligibilityService->IsPdfUploadEligible();
+}
+
 - (BOOL)isDSEGoogle {
   if (!_templateURLService) {
     return NO;
@@ -1214,16 +1250,35 @@
 /// Updates the consumer actions enabled/disable state.
 - (void)updateConsumerActionsState {
   BOOL hasTabOrFile = _items.hasTabOrFile;
-  [self.consumer disableCreateImageActions:hasTabOrFile];
-
-  BOOL isImageCreation = _modeHolder.mode == ComposeboxMode::kImageGeneration;
-  [self.consumer disableAttachTabActions:isImageCreation];
-  [self.consumer disableAttachFileActions:isImageCreation];
-
+  BOOL canUploadFiles = [self isEligibleToUploadPdf];
+  BOOL canCreateImage = [self isEligibleToCreateImages];
+  BOOL canSearchWithAI = [self isEligibleToAIM];
+  BOOL isImageCreationMode =
+      _modeHolder.mode == ComposeboxMode::kImageGeneration;
   BOOL canAddMoreImages = [self maxNumberOfGalleryItemsAllowed] > 0;
+  BOOL attachmentsAvailable = canCreateImage || canSearchWithAI;
+
+  // Image generation action.
+  [self.consumer disableCreateImageActions:hasTabOrFile];
+  [self.consumer hideCreateImageActions:!canCreateImage];
+
+  // Add tabs action.
+  [self.consumer disableAttachTabActions:isImageCreationMode];
+  [self.consumer hideAttachTabActions:!canSearchWithAI];
+
+  // Add files action.
+  [self.consumer disableAttachFileActions:isImageCreationMode];
+  [self.consumer hideAttachFileActions:!canUploadFiles || !canSearchWithAI];
+
+  // Add pictures from user gallery action.
   [self.consumer disableGalleryActions:!canAddMoreImages];
+  [self.consumer hideGalleryActions:!attachmentsAvailable];
+
+  // Add picture from camera action.
   [self.consumer disableCameraActions:!canAddMoreImages];
+  [self.consumer hideCameraActions:!attachmentsAvailable];
 }
+
 /// Updates the consumer items and maybe trigger AIM.
 - (void)updateConsumerItems {
   DCHECK_CALLED_ON_VALID_SEQUENCE(_sequenceChecker);
diff --git a/ios/chrome/browser/composebox/coordinator/composebox_input_plate_mediator_unittest.mm b/ios/chrome/browser/composebox/coordinator/composebox_input_plate_mediator_unittest.mm
index 57505a6..3566d34 100644
--- a/ios/chrome/browser/composebox/coordinator/composebox_input_plate_mediator_unittest.mm
+++ b/ios/chrome/browser/composebox/coordinator/composebox_input_plate_mediator_unittest.mm
@@ -78,8 +78,12 @@
 }
 - (void)disableCreateImageActions:(BOOL)disabled {
 }
+- (void)hideCameraActions:(BOOL)hidden {
+}
 - (void)disableCameraActions:(BOOL)disabled {
 }
+- (void)hideGalleryActions:(BOOL)hidden {
+}
 - (void)disableGalleryActions:(BOOL)disabled {
 }
 - (void)updateVisibleControls:(ComposeboxInputPlateControls)visibleControls {
diff --git a/ios/chrome/browser/composebox/ui/composebox_input_plate_consumer.h b/ios/chrome/browser/composebox/ui/composebox_input_plate_consumer.h
index 62392f42b..aa0f0d24 100644
--- a/ios/chrome/browser/composebox/ui/composebox_input_plate_consumer.h
+++ b/ios/chrome/browser/composebox/ui/composebox_input_plate_consumer.h
@@ -57,9 +57,15 @@
 // Sets whether the create image actions are disabled.
 - (void)disableCreateImageActions:(BOOL)disabled;
 
+// Sets whether the camera actions are hidden.
+- (void)hideCameraActions:(BOOL)hidden;
+
 // Sets whether the camera actions are disabled.
 - (void)disableCameraActions:(BOOL)disabled;
 
+// Sets whether the gallery actions are hidden.
+- (void)hideGalleryActions:(BOOL)hidden;
+
 // Sets whether the gallery actions are disabled.
 - (void)disableGalleryActions:(BOOL)disabled;
 
diff --git a/ios/chrome/browser/composebox/ui/composebox_input_plate_view_controller.mm b/ios/chrome/browser/composebox/ui/composebox_input_plate_view_controller.mm
index b35d1fe41..2073a65 100644
--- a/ios/chrome/browser/composebox/ui/composebox_input_plate_view_controller.mm
+++ b/ios/chrome/browser/composebox/ui/composebox_input_plate_view_controller.mm
@@ -62,10 +62,8 @@
 /// The vertical padding for the input plate stack view.
 const CGFloat kInputPlateStackViewVerticalCompactPadding = 0.0f;
 const CGFloat kInputPlateStackViewVerticalPadding = 10.0f;
-/// The leading padding for the input plate stack view.
-const CGFloat kInputPlateStackViewLeadingPadding = 10.0f;
-/// The trailing padding for the input plate stack view.
-const CGFloat kInputPlateStackViewTrailingPadding = 12.0f;
+/// The horizontal padding for the input plate stack view.
+const CGFloat kInputPlateStackViewHorizontalPadding = 10.0f;
 /// The font size for the AIM mode button title.
 const CGFloat kAIMButtonFontSize = 14.0f;
 /// The point size for the symbols in the AIM mode button.
@@ -178,8 +176,10 @@
   BOOL _createImageActionsDisabled;
   /// Camera action state.
   BOOL _cameraActionsDisabled;
+  BOOL _cameraActionsHidden;
   /// Gallery action state.
   BOOL _galleryActionsDisabled;
+  BOOL _galleryActionsHidden;
   /// Container for the omnibox.
   UIView* _omniboxContainer;
 
@@ -255,8 +255,8 @@
       _inputPlateStackView, _inputPlateContainerView,
       (LayoutSides::kTop | LayoutSides::kLeading | LayoutSides::kTrailing),
       NSDirectionalEdgeInsetsMake(kInputPlateStackViewVerticalCompactPadding,
-                                  kInputPlateStackViewLeadingPadding, 0,
-                                  kInputPlateStackViewTrailingPadding));
+                                  kInputPlateStackViewHorizontalPadding, 0,
+                                  kInputPlateStackViewHorizontalPadding));
 
   [self updateInputPlateStackViewAnimated:NO];
 
@@ -491,6 +491,14 @@
   [self updatePlusButtonItems];
 }
 
+- (void)hideCameraActions:(BOOL)hidden {
+  if (_cameraActionsHidden == hidden) {
+    return;
+  }
+  _cameraActionsHidden = hidden;
+  [self updatePlusButtonItems];
+}
+
 - (void)disableCameraActions:(BOOL)disabled {
   if (_cameraActionsDisabled == disabled) {
     return;
@@ -499,6 +507,14 @@
   [self updatePlusButtonItems];
 }
 
+- (void)hideGalleryActions:(BOOL)hidden {
+  if (_galleryActionsHidden == hidden) {
+    return;
+  }
+  _galleryActionsHidden = hidden;
+  [self updatePlusButtonItems];
+}
+
 - (void)disableGalleryActions:(BOOL)disabled {
   if (_galleryActionsDisabled == disabled) {
     return;
@@ -1102,12 +1118,18 @@
   createImageAction.attributes = createImageAttributes;
 
   UIMenuElementAttributes galleryAttributes = 0;
+  if (_galleryActionsHidden) {
+    galleryAttributes |= UIMenuElementAttributesHidden;
+  }
   if (_galleryActionsDisabled) {
     galleryAttributes |= UIMenuElementAttributesDisabled;
   }
   galleryAction.attributes = galleryAttributes;
 
   UIMenuElementAttributes cameraAttributes = 0;
+  if (_cameraActionsHidden) {
+    cameraAttributes |= UIMenuElementAttributesHidden;
+  }
   if (_cameraActionsDisabled) {
     cameraAttributes |= UIMenuElementAttributesDisabled;
   }
diff --git a/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.h b/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.h
index ab524cc..ce7a2db4 100644
--- a/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.h
+++ b/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.h
@@ -7,6 +7,8 @@
 
 #import <UIKit/UIKit.h>
 
+#import "ios/chrome/browser/menu/ui_bundled/menu_histograms.h"
+
 namespace web {
 struct ContextMenuParams;
 class WebState;
@@ -42,6 +44,15 @@
     contextMenuConfigurationForWebState:(web::WebState*)webState
                                  params:(web::ContextMenuParams)params;
 
+// Returns a menu for a context menu, based on its associated `webState` and
+// `params`.
+- (UIMenu*)contextMenuForWebState:(web::WebState*)webState
+                           params:(web::ContextMenuParams)params
+                         scenario:(MenuScenarioHistogram)scenario;
+
+// Record the fact that the menu was shown.
+- (void)recordMenuShown:(MenuScenarioHistogram)scenario;
+
 // Stops the provider.
 - (void)stop;
 
diff --git a/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.mm b/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.mm
index c47c40724..1c6ba4e 100644
--- a/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.mm
+++ b/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.mm
@@ -191,57 +191,9 @@
                                                actionProvider:actionProvider];
 }
 
-#pragma mark - Properties
-
-- (web::WebState*)webState {
-  if (base::FeatureList::IsEnabled(kEnableLensOverlay) && _baseWebState) {
-    return _baseWebState.get();
-  }
-  web::WebState* activeWebState =
-      self.browser ? self.browser->GetWebStateList()->GetActiveWebState()
-                   : nullptr;
-  if (activeWebState) {
-    // Check if there is an alternate webState.
-    ReaderModeTabHelper* readerModeTabHelper =
-        ReaderModeTabHelper::FromWebState(activeWebState);
-    if (readerModeTabHelper) {
-      web::WebState* readerModeWebState =
-          readerModeTabHelper->GetReaderModeWebState();
-      if (readerModeWebState) {
-        return readerModeWebState;
-      }
-    }
-  }
-  return activeWebState;
-}
-
-#pragma mark - Private
-
-// Returns a preview for the images in contextual menu for a given image web
-// state.
-- (UIContextMenuContentPreviewProvider)
-    contextMenuContentPreviewProviderForWebState:(web::WebState*)webState
-                                          params:
-                                              (web::ContextMenuParams)params {
-  if (!params.src_url.is_valid() || params.link_url.is_valid()) {
-    return nil;
-  }
-
-  ImagePreviewViewController* previewViewController =
-      [[ImagePreviewViewController alloc]
-          initWithSrcURL:net::NSURLWithGURL(params.src_url)
-                webState:webState];
-  [previewViewController loadPreview];
-  return ^() {
-    return previewViewController;
-  };
-}
-
-// Returns an action based contextual menu for a given web state (link, image,
-// copy and intent detection actions).
-- (UIContextMenuActionProvider)
-    contextMenuActionProviderForWebState:(web::WebState*)webState
-                                  params:(web::ContextMenuParams)params {
+- (UIMenu*)contextMenuForWebState:(web::WebState*)webState
+                           params:(web::ContextMenuParams)params
+                         scenario:(MenuScenarioHistogram)menuScenario {
   // Reset the URL.
   _URLToLoad = GURL();
 
@@ -263,12 +215,6 @@
   web::Referrer referrer(lastCommittedURL, web::ReferrerPolicyDefault);
 
   NSMutableArray<UIMenuElement*>* menuElements = [[NSMutableArray alloc] init];
-  // TODO(crbug.com/40823789) add scenario for not a link and not an image.
-  MenuScenarioHistogram menuScenario =
-      [self getMenuScenarioHistogramWithWebState:webState
-                                         isImage:isImage
-                                          isLink:isLink];
-
   NSString* menuTitle = nil;
   UIAction* showFullURL = nil;
 
@@ -355,8 +301,79 @@
     return nil;
   }
 
-  UIMenu* menu = [UIMenu menuWithTitle:menuTitle children:menuElements];
+  return [UIMenu menuWithTitle:menuTitle children:menuElements];
+}
 
+- (void)recordMenuShown:(MenuScenarioHistogram)scenario {
+  RecordMenuShown(scenario);
+}
+
+#pragma mark - Properties
+
+- (web::WebState*)webState {
+  if (base::FeatureList::IsEnabled(kEnableLensOverlay) && _baseWebState) {
+    return _baseWebState.get();
+  }
+  web::WebState* activeWebState =
+      self.browser ? self.browser->GetWebStateList()->GetActiveWebState()
+                   : nullptr;
+  if (activeWebState) {
+    // Check if there is an alternate webState.
+    ReaderModeTabHelper* readerModeTabHelper =
+        ReaderModeTabHelper::FromWebState(activeWebState);
+    if (readerModeTabHelper) {
+      web::WebState* readerModeWebState =
+          readerModeTabHelper->GetReaderModeWebState();
+      if (readerModeWebState) {
+        return readerModeWebState;
+      }
+    }
+  }
+  return activeWebState;
+}
+
+#pragma mark - Private
+
+// Returns a preview for the images in contextual menu for a given image web
+// state.
+- (UIContextMenuContentPreviewProvider)
+    contextMenuContentPreviewProviderForWebState:(web::WebState*)webState
+                                          params:
+                                              (web::ContextMenuParams)params {
+  if (!params.src_url.is_valid() || params.link_url.is_valid()) {
+    return nil;
+  }
+
+  ImagePreviewViewController* previewViewController =
+      [[ImagePreviewViewController alloc]
+          initWithSrcURL:net::NSURLWithGURL(params.src_url)
+                webState:webState];
+  [previewViewController loadPreview];
+  return ^() {
+    return previewViewController;
+  };
+}
+
+// Returns an action based contextual menu for a given web state (link, image,
+// copy and intent detection actions).
+- (UIContextMenuActionProvider)
+    contextMenuActionProviderForWebState:(web::WebState*)webState
+                                  params:(web::ContextMenuParams)params {
+  const bool isLink = params.link_url.is_valid();
+  const bool isImage = params.src_url.is_valid();
+
+  // TODO(crbug.com/40823789) add scenario for not a link and not an image.
+  MenuScenarioHistogram menuScenario =
+      [self getMenuScenarioHistogramWithWebState:webState
+                                         isImage:isImage
+                                          isLink:isLink];
+
+  UIMenu* menu = [self contextMenuForWebState:webState
+                                       params:params
+                                     scenario:menuScenario];
+  if (menu.children.count == 0) {
+    return nil;
+  }
   UIContextMenuActionProvider actionProvider =
       ^(NSArray<UIMenuElement*>* suggestedActions) {
         RecordMenuShown(menuScenario);
@@ -1090,8 +1107,9 @@
 - (void)openGeminiWithImage:(UIImage*)image {
   id<BWGCommands> handler =
       HandlerForProtocol(_browser->GetCommandDispatcher(), BWGCommands);
-  [handler startBWGFlowWithImageAttachment:image
-                                entryPoint:bwg::EntryPoint::ImageContextMenu];
+  [handler
+      startGeminiFlowWithImageAttachment:image
+                              entryPoint:bwg::EntryPoint::ImageContextMenu];
 }
 
 @end
diff --git a/ios/chrome/browser/drive_file_picker/test/drive_file_picker_egtest.mm b/ios/chrome/browser/drive_file_picker/test/drive_file_picker_egtest.mm
index 873aa8d1..ade8e66 100644
--- a/ios/chrome/browser/drive_file_picker/test/drive_file_picker_egtest.mm
+++ b/ios/chrome/browser/drive_file_picker/test/drive_file_picker_egtest.mm
@@ -88,8 +88,7 @@
 // Tests the presence of the different buttons in the drive file picker.
 - (void)testDriveFilePicker {
   FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
-  [SigninEarlGrey addFakeIdentity:fakeIdentity];
-  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity];
+  [SigninEarlGrey signinWithFakeIdentity:fakeIdentity];
   [DriveFilePickerAppInterface startChoosingSingleFileInCurrentWebState];
   [DriveFilePickerAppInterface showDriveFilePicker];
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:
@@ -108,8 +107,7 @@
 // Tests identity change from the root.
 - (void)testIdentityChangeFromTheRoot {
   FakeSystemIdentity* primaryIdentity = [FakeSystemIdentity fakeIdentity1];
-  [SigninEarlGrey addFakeIdentity:primaryIdentity];
-  [SigninEarlGreyUI signinWithFakeIdentity:primaryIdentity];
+  [SigninEarlGrey signinWithFakeIdentity:primaryIdentity];
 
   FakeSystemIdentity* secondaryIdentity = [FakeSystemIdentity fakeIdentity2];
   [SigninEarlGrey addFakeIdentity:secondaryIdentity];
@@ -135,8 +133,7 @@
 // Tests identity change when browsing a drive folder.
 - (void)testIdentityChangeAfterBrowsing {
   FakeSystemIdentity* primaryIdentity = [FakeSystemIdentity fakeIdentity1];
-  [SigninEarlGrey addFakeIdentity:primaryIdentity];
-  [SigninEarlGreyUI signinWithFakeIdentity:primaryIdentity];
+  [SigninEarlGrey signinWithFakeIdentity:primaryIdentity];
 
   FakeSystemIdentity* secondaryIdentity = [FakeSystemIdentity fakeIdentity2];
   [SigninEarlGrey addFakeIdentity:secondaryIdentity];
@@ -170,8 +167,7 @@
 // Tests the sort button context menu options are present.
 - (void)testSortButtonContextMenuItems {
   FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
-  [SigninEarlGrey addFakeIdentity:fakeIdentity];
-  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity];
+  [SigninEarlGrey signinWithFakeIdentity:fakeIdentity];
   [DriveFilePickerAppInterface startChoosingSingleFileInCurrentWebState];
   [DriveFilePickerAppInterface showDriveFilePicker];
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:
@@ -202,8 +198,7 @@
 // Tests the filter button context menu options are present.
 - (void)testFilterButtonContextMenuItems {
   FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
-  [SigninEarlGrey addFakeIdentity:fakeIdentity];
-  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity];
+  [SigninEarlGrey signinWithFakeIdentity:fakeIdentity];
   [DriveFilePickerAppInterface startChoosingSingleFileInCurrentWebState];
   [DriveFilePickerAppInterface showDriveFilePicker];
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:
@@ -263,8 +258,7 @@
 
   // Initialize the Drive file picker.
   FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
-  [SigninEarlGrey addFakeIdentity:fakeIdentity];
-  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity];
+  [SigninEarlGrey signinWithFakeIdentity:fakeIdentity];
   [DriveFilePickerAppInterface startChoosingSingleFileInCurrentWebState];
   [DriveFilePickerAppInterface showDriveFilePicker];
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:
@@ -290,8 +284,7 @@
 - (void)testMultifileSelection {
   // Initialize the Drive file picker.
   FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
-  [SigninEarlGrey addFakeIdentity:fakeIdentity];
-  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity];
+  [SigninEarlGrey signinWithFakeIdentity:fakeIdentity];
   [DriveFilePickerAppInterface startChoosingMultipleFilesInCurrentWebState];
   [DriveFilePickerAppInterface showDriveFilePicker];
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:
diff --git a/ios/chrome/browser/intelligence/bwg/coordinator/gemini_coordinator_unittest.mm b/ios/chrome/browser/intelligence/bwg/coordinator/gemini_coordinator_unittest.mm
index 1cf1865..79f3d834 100644
--- a/ios/chrome/browser/intelligence/bwg/coordinator/gemini_coordinator_unittest.mm
+++ b/ios/chrome/browser/intelligence/bwg/coordinator/gemini_coordinator_unittest.mm
@@ -136,7 +136,9 @@
 // Tests fullscreen mode exiting when promo shows from the promo entry point.
 TEST_F(GeminiCoordinatorTest, FullscreenExitedOnPromoEntryPoint) {
   feature_list_.InitWithFeatures(
-      {kGeminiNavigationPromo, kAskGeminiChip, kPageActionMenu}, {});
+      {feature_engagement::kIPHiOSGeminiFullscreenPromoFeature,
+       kGeminiNavigationPromo, kAskGeminiChip, kPageActionMenu},
+      {});
   auto* tracker = static_cast<feature_engagement::test::MockTracker*>(
       feature_engagement::TrackerFactory::GetForProfile(
           profile_manager_.GetProfileWithName(kFirstProfileName)));
diff --git a/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper.mm b/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper.mm
index 5f32aba..2b801aa 100644
--- a/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper.mm
+++ b/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper.mm
@@ -359,7 +359,7 @@
 void BwgTabHelper::WasShown(web::WebState* web_state) {
   if (is_bwg_session_active_in_background_) {
     [bwg_commands_handler_
-        startBWGFlowWithEntryPoint:bwg::EntryPoint::TabReopen];
+        startGeminiFlowWithEntryPoint:bwg::EntryPoint::TabReopen];
     cached_snapshot_ = nil;
   }
 }
@@ -601,7 +601,8 @@
   if (IsAskGeminiSnackbarEnabled()) {
     SnackbarMessageAction* action = [[SnackbarMessageAction alloc] init];
     action.handler = ^{
-      [bwg_commands_handler_ startBWGFlowWithEntryPoint:bwg::EntryPoint::Promo];
+      [bwg_commands_handler_
+          startGeminiFlowWithEntryPoint:bwg::EntryPoint::Promo];
     };
     action.title = [NSString stringWithFormat:@"✦ %@", @"Ask Gemini"];
     SnackbarMessage* message =
diff --git a/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper_unittest.mm b/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper_unittest.mm
index 56fdb82..6a070dea 100644
--- a/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper_unittest.mm
+++ b/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper_unittest.mm
@@ -279,7 +279,7 @@
 
 TEST_F(BwgTabHelperTest, TestWasShown_RestoresSession) {
   OCMExpect([mock_bwg_handler_
-      startBWGFlowWithEntryPoint:bwg::EntryPoint::TabReopen]);
+      startGeminiFlowWithEntryPoint:bwg::EntryPoint::TabReopen]);
 
   // Background a session and then show the tab.
   tab_helper_->PrepareBwgFreBackgrounding();
diff --git a/ios/chrome/browser/intelligence/features/BUILD.gn b/ios/chrome/browser/intelligence/features/BUILD.gn
index f2d7950..a760e85 100644
--- a/ios/chrome/browser/intelligence/features/BUILD.gn
+++ b/ios/chrome/browser/intelligence/features/BUILD.gn
@@ -12,6 +12,7 @@
 
   # TODO(crbug.com/430198461): Remove this.
   deps = [
+    "//components/feature_engagement/public:feature_constants",
     "//components/prefs",
     "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/browser/tabs/model/inactive_tabs:features",
diff --git a/ios/chrome/browser/intelligence/features/features.mm b/ios/chrome/browser/intelligence/features/features.mm
index 20b771f..cb3380d 100644
--- a/ios/chrome/browser/intelligence/features/features.mm
+++ b/ios/chrome/browser/intelligence/features/features.mm
@@ -6,6 +6,7 @@
 
 #import "base/check.h"
 #import "base/time/time.h"
+#import "components/feature_engagement/public/feature_constants.h"
 #import "components/prefs/pref_service.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
 #import "ios/chrome/browser/tabs/model/inactive_tabs/features.h"
@@ -238,9 +239,12 @@
 BASE_FEATURE(kGeminiNavigationPromo, base::FEATURE_DISABLED_BY_DEFAULT);
 
 bool IsGeminiNavigationPromoEnabled() {
-  if (!IsPageActionMenuEnabled()) {
+  if (!IsPageActionMenuEnabled() ||
+      !base::FeatureList::IsEnabled(
+          feature_engagement::kIPHiOSGeminiFullscreenPromoFeature)) {
     return false;
   }
+
   return base::FeatureList::IsEnabled(kGeminiNavigationPromo);
 }
 
diff --git a/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_view_controller.mm b/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_view_controller.mm
index 1036642..9b81d454 100644
--- a/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_view_controller.mm
+++ b/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_view_controller.mm
@@ -568,7 +568,7 @@
   RecordAIHubAction(IOSAIHubAction::kGemini);
   PageActionMenuViewController* __weak weakSelf = self;
   [self.pageActionMenuHandler dismissPageActionMenuWithCompletion:^{
-    [weakSelf.BWGHandler startBWGFlowWithEntryPoint:bwg::EntryPoint::AIHub];
+    [weakSelf.BWGHandler startGeminiFlowWithEntryPoint:bwg::EntryPoint::AIHub];
   }];
 }
 
diff --git a/ios/chrome/browser/location_bar/badge/coordinator/location_bar_badge_mediator.mm b/ios/chrome/browser/location_bar/badge/coordinator/location_bar_badge_mediator.mm
index be9427f..e21d30f 100644
--- a/ios/chrome/browser/location_bar/badge/coordinator/location_bar_badge_mediator.mm
+++ b/ios/chrome/browser/location_bar/badge/coordinator/location_bar_badge_mediator.mm
@@ -178,7 +178,7 @@
         }
       }
       [self.BWGCommandHandler
-          startBWGFlowWithEntryPoint:bwg::EntryPoint::OmniboxChip];
+          startGeminiFlowWithEntryPoint:bwg::EntryPoint::OmniboxChip];
       _tracker->NotifyEvent(
           feature_engagement::events::kIOSGeminiContextualCueChipUsed);
       break;
diff --git a/ios/chrome/browser/location_bar/badge/coordinator/location_bar_badge_mediator_unittest.mm b/ios/chrome/browser/location_bar/badge/coordinator/location_bar_badge_mediator_unittest.mm
index edaa9810..19edb7a 100644
--- a/ios/chrome/browser/location_bar/badge/coordinator/location_bar_badge_mediator_unittest.mm
+++ b/ios/chrome/browser/location_bar/badge/coordinator/location_bar_badge_mediator_unittest.mm
@@ -260,7 +260,7 @@
   id mock_bwg_command_handler = OCMProtocolMock(@protocol(BWGCommands));
   mediator_.BWGCommandHandler = mock_bwg_command_handler;
   OCMExpect([mock_bwg_command_handler
-      startBWGFlowWithEntryPoint:bwg::EntryPoint::OmniboxChip]);
+      startGeminiFlowWithEntryPoint:bwg::EntryPoint::OmniboxChip]);
   EXPECT_CALL(
       *mock_tracker_,
       NotifyEvent(feature_engagement::events::kIOSGeminiContextualCueChipUsed));
diff --git a/ios/chrome/browser/location_bar/ui_bundled/location_bar_view_controller.mm b/ios/chrome/browser/location_bar/ui_bundled/location_bar_view_controller.mm
index da3a1d7..ca9364e8 100644
--- a/ios/chrome/browser/location_bar/ui_bundled/location_bar_view_controller.mm
+++ b/ios/chrome/browser/location_bar/ui_bundled/location_bar_view_controller.mm
@@ -1071,7 +1071,8 @@
     _pageActionMenuEntrypointView.newBadgeVisible = NO;
   }
   if (IsDirectBWGEntryPoint()) {
-    [self.BWGHandler startBWGFlowWithEntryPoint:bwg::EntryPoint::OmniboxChip];
+    [self.BWGHandler
+        startGeminiFlowWithEntryPoint:bwg::EntryPoint::OmniboxChip];
   } else {
     RecordAIHubIconTapped();
     [self.pageActionMenuHandler showPageActionMenu];
diff --git a/ios/chrome/browser/menu/ui_bundled/menu_histograms.h b/ios/chrome/browser/menu/ui_bundled/menu_histograms.h
index 2231e9b..1e6547a8 100644
--- a/ios/chrome/browser/menu/ui_bundled/menu_histograms.h
+++ b/ios/chrome/browser/menu/ui_bundled/menu_histograms.h
@@ -48,6 +48,7 @@
   kMenuScenarioHistogramReaderModeContextMenuImageLink = 35,
   kMenuScenarioHistogramReaderModeContextMenuLink = 36,
   kMenuScenarioHistogramTabGroupOverflowMenu = 37,
+  kMenuScenarioHistogramSadTab = 38,
   kMenuScenarioHistogramCount,
 };
 // LINT.ThenChange(/tools/metrics/histograms/metadata/mobile/enums.xml)
diff --git a/ios/chrome/browser/menu/ui_bundled/menu_histograms.mm b/ios/chrome/browser/menu/ui_bundled/menu_histograms.mm
index 8afa5011..965bfe40 100644
--- a/ios/chrome/browser/menu/ui_bundled/menu_histograms.mm
+++ b/ios/chrome/browser/menu/ui_bundled/menu_histograms.mm
@@ -168,6 +168,8 @@
       return kContextMenuReaderModeLinkActionsHistogram;
     case kMenuScenarioHistogramTabGroupOverflowMenu:
       return kContextMenuTabGroupOverflowMenuHistogram;
+    case kMenuScenarioHistogramSadTab:
+      return KContextMenuLinkActionsHistogram;
     case kMenuScenarioHistogramCount:
       NOTREACHED();
   }
diff --git a/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm b/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm
index f52b2e64..e987bc4 100644
--- a/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm
+++ b/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm
@@ -384,10 +384,12 @@
 
 - (void)removePreEditText {
   if (self.textInput.isPreEditing) {
-    [self.textInput exitPreEditState];
     [self.textInput setText:@""];
     [self setUserText:u""];
     [self onTextChanged];
+    // Ensure the pre-edit state is exited after the text is cleared, preventing
+    // stale text from influencing height changes (crbug.com/466997176).
+    [self.textInput exitPreEditState];
   }
 }
 
diff --git a/ios/chrome/browser/policy/model/policy_egtest.mm b/ios/chrome/browser/policy/model/policy_egtest.mm
index 317b44a..b1cff2c 100644
--- a/ios/chrome/browser/policy/model/policy_egtest.mm
+++ b/ios/chrome/browser/policy/model/policy_egtest.mm
@@ -452,9 +452,7 @@
                                         IDS_IOS_MANAGEMENT_UI_DESC)];
 
   // Check the navigation.
-  [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
-                                          kChromeUIManagementURL)]
-      assertWithMatcher:grey_notNil()];
+  [ChromeEarlGrey waitForWebStateVisibleURL:GURL(kChromeUIManagementURL)];
 }
 
 // Tests whether the managed item will be shown if UserPolicy is enabled and
@@ -482,9 +480,7 @@
 
   // Check the navigation without assert the content (which is done in another
   // test case).
-  [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
-                                          kChromeUIManagementURL)]
-      assertWithMatcher:grey_notNil()];
+  [ChromeEarlGrey waitForWebStateVisibleURL:GURL(kChromeUIManagementURL)];
 }
 
 // Tests the chrome://management page when no machine level policy is set.
diff --git a/ios/chrome/browser/popup_menu/ui_bundled/overflow_menu/overflow_menu_mediator.mm b/ios/chrome/browser/popup_menu/ui_bundled/overflow_menu/overflow_menu_mediator.mm
index bbd726d..3515ddb 100644
--- a/ios/chrome/browser/popup_menu/ui_bundled/overflow_menu/overflow_menu_mediator.mm
+++ b/ios/chrome/browser/popup_menu/ui_bundled/overflow_menu/overflow_menu_mediator.mm
@@ -2566,7 +2566,7 @@
 // Starts ask BWG.
 - (void)startAskBWG {
   [self dismissMenu];
-  [self.BWGHandler startBWGFlowWithEntryPoint:bwg::EntryPoint::OverflowMenu];
+  [self.BWGHandler startGeminiFlowWithEntryPoint:bwg::EntryPoint::OverflowMenu];
 }
 
 - (void)startCollapseToolbars {
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 68cdc578..a53eb1a 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
@@ -604,10 +604,6 @@
 // unread items sections should be shown correctly and remain so after a
 // sign-out & sign-in with the same account.
 - (void)testMoveItemThenRefreshSignIn {
-  // TODO(crbug.com/436556292): Re-enable the test on iOS26.
-  if (base::ios::IsRunningOnIOS26OrLater()) {
-    EARL_GREY_TEST_DISABLED(@"Test disabled on iOS 26.");
-  }
   // Sign-in with the Reading List Promo.
   FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
   [SigninEarlGrey addFakeIdentity:fakeIdentity];
@@ -634,30 +630,25 @@
 
   // Mark Page 1 as read.
   OpenReadingList();
-  // TODO(crbug.com/446889046): Investigate if there is a better solution to fix
-  // flakiness on iOS26.
-  base::test::ios::SpinRunLoopWithMinDelay(base::Seconds(1));
+  [ChromeEarlGrey
+      waitForUIElementToAppearWithMatcher:VisibleReadingListItem(kPage1Title)];
   [[EarlGrey selectElementWithMatcher:VisibleReadingListItem(kPage1Title)]
       performAction:grey_longPressWithDuration(kLongPressDuration)];
   [[EarlGrey selectElementWithMatcher:ReadingListMarkAsReadButton()]
       performAction:grey_tap()];
-  // Wait one second since the reading list items may update multiple times.
-  // TODO(crbug.com/40268339): Check if this delay can be replaced by the use of
-  // waitForUIElementToAppearWithMatcher instead.
-  base::test::ios::SpinRunLoopWithMinDelay(base::Seconds(1));
   // Verify that the unread and the read sections headers are visible.
   NSString* readHeaderText =
       l10n_util::GetNSString(IDS_IOS_READING_LIST_READ_HEADER);
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(grey_text(readHeaderText),
-                                          grey_sufficientlyVisible(), nil)]
-      assertWithMatcher:grey_notNil()];
+  // Wait until the header appears since the reading list items may update
+  // multiple times.
+  [ChromeEarlGrey
+      waitForUIElementToAppearWithMatcher:grey_text(readHeaderText)];
+
   NSString* unreadHeaderText =
       l10n_util::GetNSString(IDS_IOS_READING_LIST_UNREAD_HEADER);
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(grey_text(unreadHeaderText),
-                                          grey_sufficientlyVisible(), nil)]
-      assertWithMatcher:grey_notNil()];
+  [ChromeEarlGrey
+      waitForUIElementToAppearWithMatcher:grey_text(unreadHeaderText)];
+
   // Verify that both items are visible and only one of them is unread.
   [ChromeEarlGrey
       waitForUIElementToAppearWithMatcher:ReadingListItem(kPage1Title)];
diff --git a/ios/chrome/browser/sad_tab/ui_bundled/BUILD.gn b/ios/chrome/browser/sad_tab/ui_bundled/BUILD.gn
index e3cdb576..ccc2f4c 100644
--- a/ios/chrome/browser/sad_tab/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/sad_tab/ui_bundled/BUILD.gn
@@ -38,6 +38,7 @@
   deps = [
     ":ui_bundled",
     "//components/ui_metrics",
+    "//ios/chrome/browser/context_menu/ui_bundled:coordinator",
     "//ios/chrome/browser/fullscreen/ui_bundled:coordinators",
     "//ios/chrome/browser/overscroll_actions/ui_bundled",
     "//ios/chrome/browser/shared/coordinator/chrome_coordinator",
@@ -51,6 +52,7 @@
     "//ios/chrome/browser/web/model:tab_helper_delegates",
     "//ios/chrome/common/ui/util",
     "//ios/web",
+    "//ios/web/public/ui",
   ]
 }
 
diff --git a/ios/chrome/browser/sad_tab/ui_bundled/DEPS b/ios/chrome/browser/sad_tab/ui_bundled/DEPS
index d2e3855..a659fc2 100644
--- a/ios/chrome/browser/sad_tab/ui_bundled/DEPS
+++ b/ios/chrome/browser/sad_tab/ui_bundled/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.h",
   "+ios/chrome/browser/fullscreen/ui_bundled",
   "+ios/chrome/browser/overscroll_actions/ui_bundled",
   "+ios/chrome/browser/tabs/model/tabs_dependency_installer_bridge.h",
diff --git a/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_coordinator.h b/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_coordinator.h
index ad12fb7f..aeda70e 100644
--- a/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_coordinator.h
+++ b/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_coordinator.h
@@ -9,6 +9,7 @@
 #import "ios/chrome/browser/web/model/sad_tab_tab_helper_delegate.h"
 
 @protocol OverscrollActionsControllerDelegate;
+@class ContextMenuConfigurationProvider;
 
 // Coordinator that displays a SadTab view.
 @interface SadTabCoordinator : ChromeCoordinator <SadTabTabHelperDelegate>
@@ -20,6 +21,9 @@
 
 @property(nonatomic, readonly) UIViewController* viewController;
 
+@property(nonatomic, strong)
+    ContextMenuConfigurationProvider* contextMenuProvider;
+
 // YES if page load for this URL has failed more than once.
 @property(nonatomic) BOOL repeatedFailure;
 
diff --git a/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_coordinator.mm b/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_coordinator.mm
index 9feb65c7..7a5dabe 100644
--- a/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_coordinator.mm
+++ b/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_coordinator.mm
@@ -6,11 +6,13 @@
 
 #import "base/metrics/histogram_macros.h"
 #import "components/ui_metrics/sadtab_metrics_types.h"
+#import "ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.h"
 #import "ios/chrome/browser/fullscreen/ui_bundled/chrome_coordinator+fullscreen_disabling.h"
 #import "ios/chrome/browser/overscroll_actions/ui_bundled/overscroll_actions_controller.h"
 #import "ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view_controller.h"
 #import "ios/chrome/browser/shared/model/browser/browser.h"
 #import "ios/chrome/browser/shared/model/profile/profile_ios.h"
+#import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h"
 #import "ios/chrome/browser/shared/public/commands/application_commands.h"
 #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
 #import "ios/chrome/browser/shared/public/commands/open_new_tab_command.h"
@@ -20,6 +22,7 @@
 #import "ios/chrome/browser/web/model/sad_tab_tab_helper.h"
 #import "ios/chrome/browser/web/model/web_navigation_browser_agent.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
+#import "ios/web/public/ui/context_menu_params.h"
 #import "ios/web/public/web_state.h"
 
 @interface SadTabCoordinator () <SadTabViewControllerDelegate,
@@ -124,6 +127,28 @@
       openURLInNewTab:command];
 }
 
+- (UIMenu*)sadTabViewController:(SadTabViewController*)sadTabViewController
+    contextMenuConfigurationForURL:(const GURL&)URL {
+  web::WebState* webState =
+      self.browser->GetWebStateList()->GetActiveWebState();
+  if (!webState) {
+    return nil;
+  }
+
+  web::ContextMenuParams params;
+  params.link_url = URL;
+  params.view = sadTabViewController.view;
+
+  UIMenu* menu = [self.contextMenuProvider
+      contextMenuForWebState:webState
+                      params:params
+                    scenario:kMenuScenarioHistogramSadTab];
+  if (menu) {
+    [self.contextMenuProvider recordMenuShown:kMenuScenarioHistogramSadTab];
+  }
+  return menu;
+}
+
 - (void)sadTabViewControllerReload:(SadTabViewController*)sadTabViewController {
   WebNavigationBrowserAgent::FromBrowser(self.browser)->Reload();
 }
diff --git a/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view.h b/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view.h
index ef00709..7eb1eae1 100644
--- a/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view.h
+++ b/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view.h
@@ -12,6 +12,7 @@
 
 @protocol ApplicationCommands;
 @class SadTabView;
+class GURL;
 
 // Describes the mode of the Sad Tab, whether it should offer an attempt to
 // reload content, or whether it should offer a way to provide feedback.
@@ -28,6 +29,10 @@
 - (void)sadTabView:(SadTabView*)sadTabView
     showSuggestionsPageWithURL:(const GURL&)URL;
 
+// Returns the context menu configuration for the suggestions page.
+- (UIMenu*)sadTabView:(SadTabView*)sadTabView
+    contextMenuConfigurationForURL:(const GURL&)URL;
+
 // Instructs the delegate to reload this page.
 - (void)sadTabViewReload:(SadTabView*)sadTabView;
 
diff --git a/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view.mm b/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view.mm
index 48952eea..461e6dc 100644
--- a/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view.mm
+++ b/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view.mm
@@ -312,6 +312,7 @@
 - (UITextView*)footerLabel {
   if (!_footerLabel) {
     _footerLabel = CreateUITextViewWithTextKit1();
+    _footerLabel.editable = NO;
     _footerLabel.backgroundColor = self.backgroundColor;
     _footerLabel.delegate = self;
 
@@ -522,6 +523,19 @@
   }];
 }
 
+- (UITextItemMenuConfiguration*)textView:(UITextView*)textView
+            menuConfigurationForTextItem:(UITextItem*)textItem
+                             defaultMenu:(UIMenu*)defaultMenu {
+  CHECK_EQ(textView, self.footerLabel);
+  CHECK(textItem.link);
+  UIMenu* menu = [self.delegate sadTabView:self
+            contextMenuConfigurationForURL:net::GURLWithNSURL(textItem.link)];
+  if (!menu) {
+    return nil;
+  }
+  return [UITextItemMenuConfiguration configurationWithPreview:nil menu:menu];
+}
+
 @end
 
 #pragma mark -
diff --git a/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view_controller.h b/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view_controller.h
index e8fa645..60c054f 100644
--- a/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view_controller.h
+++ b/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view_controller.h
@@ -20,6 +20,10 @@
 - (void)sadTabViewController:(SadTabViewController*)sadTabViewController
     showSuggestionsPageWithURL:(const GURL&)URL;
 
+// Returns the context menu configuration for the suggestions page.
+- (UIMenu*)sadTabViewController:(SadTabViewController*)sadTabViewController
+    contextMenuConfigurationForURL:(const GURL&)URL;
+
 // Instructs the delegate to reload this page.
 - (void)sadTabViewControllerReload:(SadTabViewController*)sadTabViewController;
 @end
diff --git a/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view_controller.mm b/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view_controller.mm
index a9deccd..55d4aa1 100644
--- a/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view_controller.mm
+++ b/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view_controller.mm
@@ -99,6 +99,12 @@
   [self.delegate sadTabViewController:self showSuggestionsPageWithURL:URL];
 }
 
+- (UIMenu*)sadTabView:(SadTabView*)sadTabView
+    contextMenuConfigurationForURL:(const GURL&)URL {
+  return [self.delegate sadTabViewController:self
+              contextMenuConfigurationForURL:URL];
+}
+
 - (void)sadTabViewReload:(SadTabView*)sadTabView {
   [self.delegate sadTabViewControllerReload:self];
 }
diff --git a/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view_egtest.mm b/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view_egtest.mm
index 4acb06a..87fa2c0 100644
--- a/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view_egtest.mm
+++ b/ios/chrome/browser/sad_tab/ui_bundled/sad_tab_view_egtest.mm
@@ -31,6 +31,17 @@
   return chrome_test_util::ContainsPartialText(
       l10n_util::GetNSString(IDS_SAD_TAB_RELOAD_INCOGNITO));
 }
+
+// A matcher for a link to load the learn more page.
+id<GREYMatcher> learnMoreText() {
+  return grey_text(l10n_util::GetNSString(IDS_SAD_TAB_RELOAD_LEARN_MORE));
+}
+
+// A matcher for a link to load the learn more page.
+id<GREYMatcher> sadTabReloadButton() {
+  return grey_text(
+      l10n_util::GetNSString(IDS_SAD_TAB_RELOAD_LABEL).uppercaseString);
+}
 }  // namespace
 
 // Sad Tab View integration tests for Chrome.
@@ -44,8 +55,7 @@
 // visited within 60 seconds, for this reason this one test can not
 // be easily split up across multiple tests
 // as visiting Sad Tab may not be idempotent.
-// TODO(crbug.com/40671245): Test fails when run on iOS 13.
-- (void)DISABLED_testSadTabView {
+- (void)testSadTabView {
   // Prepare a simple but known URL to avoid testing from the NTP.
   GREYAssertTrue(self.testServer->Start(), @"Server did not start.");
   const GURL simple_URL = self.testServer->GetURL("/destination.html");
@@ -111,4 +121,34 @@
   loadAndCheckSimpleURL();
 }
 
+// Tests that the context menu is correctly shown.
+- (void)testSadTabContextMenu {
+  // Prepare a simple but known URL to avoid testing from the NTP.
+  GREYAssertTrue(self.testServer->Start(), @"Server did not start.");
+
+  // Navigate to the chrome://crash URL and reload to show the Learn More link.
+  const GURL crash_URL = GURL("chrome://crash");
+  [ChromeEarlGrey loadURL:crash_URL waitForCompletion:YES];
+  [[EarlGrey selectElementWithMatcher:sadTabReloadButton()]
+      performAction:grey_tap()];
+
+  // Verify the feedback message is shown.
+  [[EarlGrey selectElementWithMatcher:feedbackSadTabTitleContainsText()]
+      assertWithMatcher:grey_notNil()];
+
+  // Find the text view containing the learn more link and long press it.
+  id<GREYMatcher> feedbackTextView =
+      grey_allOf(learnMoreText(), grey_kindOfClass([UITextView class]),
+                 grey_sufficientlyVisible(), nil);
+  [[EarlGrey selectElementWithMatcher:feedbackTextView]
+      performAction:grey_longPress()];
+
+  // Verify that the context menu is shown with the expected items.
+  // "Open in New Tab" is a standard item in the context menu for links.
+  id<GREYMatcher> openInNewTabMatcher =
+      chrome_test_util::OpenLinkInNewTabButton();
+  [[EarlGrey selectElementWithMatcher:openInNewTabMatcher]
+      assertWithMatcher:grey_sufficientlyVisible()];
+}
+
 @end
diff --git a/ios/chrome/browser/settings/ui_bundled/language/language_settings_egtest.mm b/ios/chrome/browser/settings/ui_bundled/language/language_settings_egtest.mm
index 685e6ff..f16d40c1 100644
--- a/ios/chrome/browser/settings/ui_bundled/language/language_settings_egtest.mm
+++ b/ios/chrome/browser/settings/ui_bundled/language/language_settings_egtest.mm
@@ -147,10 +147,8 @@
   [ChromeEarlGreyUI openSettingsMenu];
 
   // Test accessibility on the Language Settings's main page.
-  {
-    ScopedSynchronizationDisabler disabler;
-    [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
-  }
+  [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
+
   [[EarlGrey selectElementWithMatcher:LanguageSettingsTableView()]
       assertWithMatcher:grey_notNil()];
   [ChromeEarlGrey verifyAccessibilityForCurrentScreen];
@@ -183,10 +181,7 @@
   [ChromeEarlGreyUI openSettingsMenu];
 
   // Go to the Language Settings page.
-  {
-    ScopedSynchronizationDisabler disabler;
-    [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
-  }
+  [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
 
   // Verify that the Translate switch is on and enabled. Toggle it off.
   [[EarlGrey
@@ -243,10 +238,7 @@
   [ChromeEarlGreyUI openSettingsMenu];
 
   // Go to the Language Settings page.
-  {
-    ScopedSynchronizationDisabler disabler;
-    [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
-  }
+  [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
 
   // Go to the Add Language page.
   [[EarlGrey selectElementWithMatcher:AddLanguageButton()]
@@ -324,10 +316,7 @@
                  @"Turkish is expected to be Translate-blocked");
 
   // Go to the Language Settings page.
-  {
-    ScopedSynchronizationDisabler disabler;
-    [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
-  }
+  [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
 
   // Go to the "Turkish" Language Details page.
   NSString* languageEntryLabel =
@@ -411,10 +400,7 @@
   [LanguageSettingsAppInterface setRecentTargetLanguage:@"tr"];
 
   // Go to the Language Settings page.
-  {
-    ScopedSynchronizationDisabler disabler;
-    [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
-  }
+  [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
 
   // Go to the "Turkish" Language Details page.
   NSString* languageEntryLabel =
@@ -441,10 +427,7 @@
   [LanguageSettingsAppInterface setRecentTargetLanguage:@"tr"];
 
   // Go to the Language Settings page.
-  {
-    ScopedSynchronizationDisabler disabler;
-    [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
-  }
+  [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
 
   // Go to the "Turkish" Language Details page.
   NSString* languageEntryLabel =
@@ -475,10 +458,7 @@
                  @"Aragonese is expected to be Translate-blocked");
 
   // Go to the Language Settings page.
-  {
-    ScopedSynchronizationDisabler disabler;
-    [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
-  }
+  [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
 
   // Go to the "Aragonese" Language Details page.
   NSString* languageEntryLabel =
@@ -503,10 +483,7 @@
   [ChromeEarlGreyUI openSettingsMenu];
 
   // Go to the Language Settings page.
-  {
-    ScopedSynchronizationDisabler disabler;
-    [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
-  }
+  [ChromeEarlGreyUI tapSettingsMenuButton:LanguageSettingsButton()];
 
   // Switch on edit mode.
   [[EarlGrey selectElementWithMatcher:SettingsToolbarEditButton()]
diff --git a/ios/chrome/browser/shared/model/url/chrome_url_constants.h b/ios/chrome/browser/shared/model/url/chrome_url_constants.h
index 6b20e52..feb1ba9 100644
--- a/ios/chrome/browser/shared/model/url/chrome_url_constants.h
+++ b/ios/chrome/browser/shared/model/url/chrome_url_constants.h
@@ -26,7 +26,7 @@
 inline constexpr char kChromeUIHistoryURL[] = "chrome://history/";
 inline constexpr char kChromeUIInspectURL[] = "chrome://inspect/";
 inline constexpr char kChromeUIInterstitialsURL[] = "chrome://interstitials";
-inline constexpr char kChromeUIManagementURL[] = "chrome://management";
+inline constexpr char kChromeUIManagementURL[] = "chrome://management/";
 inline constexpr char kChromeUINewTabURL[] = "chrome://newtab/";
 inline constexpr char kChromeUINTPTilesInternalsURL[] =
     "chrome://ntp-tiles-internals/";
diff --git a/ios/chrome/browser/shared/public/commands/bwg_commands.h b/ios/chrome/browser/shared/public/commands/bwg_commands.h
index 9bc26ca..3aadd7f 100644
--- a/ios/chrome/browser/shared/public/commands/bwg_commands.h
+++ b/ios/chrome/browser/shared/public/commands/bwg_commands.h
@@ -16,12 +16,12 @@
 // Commands relating to the BWG flow.
 @protocol BWGCommands
 
-// Starts the BWG flow.
-- (void)startBWGFlowWithEntryPoint:(bwg::EntryPoint)entryPoint;
+// Starts the Gemini flow with an entry point.
+- (void)startGeminiFlowWithEntryPoint:(bwg::EntryPoint)entryPoint;
 
-// Starts the BWG flow with a provided image as attachment.
-- (void)startBWGFlowWithImageAttachment:(UIImage*)image
-                             entryPoint:(bwg::EntryPoint)entryPoint;
+// Starts the Gemini flow with a provided image as attachment.
+- (void)startGeminiFlowWithImageAttachment:(UIImage*)image
+                                entryPoint:(bwg::EntryPoint)entryPoint;
 
 // Dismiss the BWG flow with a completion block.
 - (void)dismissBWGFlowWithCompletion:(ProceduralBlock)completion;
diff --git a/ios/chrome/browser/shared/public/features/system_flags.h b/ios/chrome/browser/shared/public/features/system_flags.h
index 80c2591..455745c 100644
--- a/ios/chrome/browser/shared/public/features/system_flags.h
+++ b/ios/chrome/browser/shared/public/features/system_flags.h
@@ -169,6 +169,16 @@
 // Gets GWS URL base used to generate Lens result panel URLs. Returns nil if
 // there is no alternative URL specified.
 NSString* GetLensResultPanelGwsURL();
+
+// Returns true if Composebox AIM eligibility should be disabled.
+bool ShouldForceDisableComposeboxAIM();
+
+// Returns true if Composebox Create Images eligibility should be disabled.
+bool ShouldForceDisableComposeboxCreateImages();
+
+// Returns true if Composebox Pdf Upload eligibility should be disabled.
+bool ShouldForceDisableComposeboxPdfUpload();
+
 }  // namespace experimental_flags
 
 #endif  // IOS_CHROME_BROWSER_SHARED_PUBLIC_FEATURES_SYSTEM_FLAGS_H_
diff --git a/ios/chrome/browser/shared/public/features/system_flags.mm b/ios/chrome/browser/shared/public/features/system_flags.mm
index 49c094a..2ef1754 100644
--- a/ios/chrome/browser/shared/public/features/system_flags.mm
+++ b/ios/chrome/browser/shared/public/features/system_flags.mm
@@ -65,6 +65,11 @@
 NSString* const kInactiveTabsTestMode = @"InactiveTabsTestMode";
 NSString* const kAsyncStartupOverrideResponse = @"AsyncStartupOverrideResponse";
 NSString* const kLensResultPanelGwsURL = @"LensResultPanelGwsURL";
+NSString* const kForceDisableAIMEligibility = @"ForceDisableAIMEligibility";
+NSString* const kForceDisableCreateImagesEligibility =
+    @"ForceDisableCreateImagesEligibility";
+NSString* const kForceDisablePdfUploadEligibility =
+    @"ForceDisablePdfUploadEligibility";
 }  // namespace
 
 namespace experimental_flags {
@@ -343,4 +348,19 @@
       stringForKey:kLensResultPanelGwsURL];
 }
 
+bool ShouldForceDisableComposeboxAIM() {
+  return [[NSUserDefaults standardUserDefaults]
+      boolForKey:kForceDisableAIMEligibility];
+}
+
+bool ShouldForceDisableComposeboxCreateImages() {
+  return [[NSUserDefaults standardUserDefaults]
+      boolForKey:kForceDisableCreateImagesEligibility];
+}
+
+bool ShouldForceDisableComposeboxPdfUpload() {
+  return [[NSUserDefaults standardUserDefaults]
+      boolForKey:kForceDisablePdfUploadEligibility];
+}
+
 }  // namespace experimental_flags
diff --git a/ios/chrome/browser/shared/public/prototypes/diamond/utils.mm b/ios/chrome/browser/shared/public/prototypes/diamond/utils.mm
index e845d86..162575e 100644
--- a/ios/chrome/browser/shared/public/prototypes/diamond/utils.mm
+++ b/ios/chrome/browser/shared/public/prototypes/diamond/utils.mm
@@ -86,7 +86,7 @@
   } else {
     id<BWGCommands> BWGCommandsHandler =
         HandlerForProtocol(browser->GetCommandDispatcher(), BWGCommands);
-    [BWGCommandsHandler startBWGFlowWithEntryPoint:bwg::EntryPoint::Diamond];
+    [BWGCommandsHandler startGeminiFlowWithEntryPoint:bwg::EntryPoint::Diamond];
   }
 }
 
diff --git a/ios_internal b/ios_internal
index fd52a14..99015ee 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit fd52a146a6011abcc1c9c18a07f113fa192a9161
+Subproject commit 99015ee32eeab799c1a93c516c179cdff36cd173
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins
index 24e1af3..07350c0 100644
--- a/net/http/transport_security_state_static.pins
+++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@
 #   hash function for preloaded entries again (we have already done so once).
 #
 
-# Last updated: 2025-12-07 12:52 UTC
+# Last updated: 2025-12-08 12:53 UTC
 PinsListTimestamp
-1765111979
+1765198383
 
 TestSPKI
 sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json
index 682f6ce4..cc200b8 100644
--- a/net/http/transport_security_state_static_pins.json
+++ b/net/http/transport_security_state_static_pins.json
@@ -31,7 +31,7 @@
 // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets'
 // refer to, and the timestamp at which the pins list was last updated.
 //
-// Last updated: 2025-12-07 12:52 UTC
+// Last updated: 2025-12-08 12:53 UTC
 //
 {
   "pinsets": [
diff --git a/remoting/resources/remoting_strings_mn.xtb b/remoting/resources/remoting_strings_mn.xtb
index aa4ffd91..e1131be 100644
--- a/remoting/resources/remoting_strings_mn.xtb
+++ b/remoting/resources/remoting_strings_mn.xtb
@@ -166,9 +166,9 @@
 <translation id="8073845705237259513">Chrome-ын Алсын Зайнаас Хянах Дэлгэцийг ашиглахын тулд та төхөөрөмждөө Google Account-аа нэмж оруулах хэрэгтэй болно.</translation>
 <translation id="809687642899217504">Миний компьютер</translation>
 <translation id="8116630183974937060">Сүлжээний алдаа гарлаа. Төхөөрөмжөө онлайн байгаа эсэхийг нягтлаад дахин оролдоно уу.</translation>
-<translation id="8295077433896346116"><ph name="PRODUCT_NAME" />-г ашиглахын тулд та 'Хандалтын' зөвшөөрлийг oлгох ёстой бөгөөд ингэснээр алсын машины оролтыг энэ Mac руу оруулах боломжтой болно.
+<translation id="8295077433896346116"><ph name="PRODUCT_NAME" />-г ашиглахын тулд та 'Хүртээмж' зөвшөөрлийг oлгох ёстой бөгөөд ингэснээр алсын машины оролтыг энэ Mac руу оруулах боломжтой болно.
 
-Энэ зөвшөөрлийг олгохын тулд доор байгаа '<ph name="BUTTON_NAME" />' дээр товшино уу. Нээгдэх 'Хандалтын' тохиргооны самбар дээр '<ph name="SERVICE_SCRIPT_NAME" />'-н хажууд байрлах нүдийг тэмдэглэнэ үү.
+Энэ зөвшөөрлийг олгохын тулд доор байгаа '<ph name="BUTTON_NAME" />' дээр товшино уу. Нээгдэх 'Хүртээмж' тохиргооны самбар дээр '<ph name="SERVICE_SCRIPT_NAME" />'-н хажууд байрлах нүдийг тэмдэглэнэ үү.
 
 Хэрэв '<ph name="SERVICE_SCRIPT_NAME" />'-г аль хэдийн тэмдэглэсэн байвал сонголтыг болиулаад, дахин тэмдэглэнэ үү.</translation>
 <translation id="8305209735512572429">Веб баталгаажуулалтыг алсаас хийх явц</translation>
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index cd4902bd..5c799bf8 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -3159,7 +3159,10 @@
     "AutofillReintroduceHybridPasskeyDropdownItem": [
         {
             "platforms": [
-                "android"
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
             ],
             "experiments": [
                 {
@@ -20279,6 +20282,29 @@
             ]
         }
     ],
+    "ProgressiveAccessibility": [
+        {
+            "platforms": [
+                "android",
+                "android_webview",
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "EnabledWithHide",
+                    "params": {
+                        "progressive_accessibility_mode": "disable_on_hide"
+                    },
+                    "enable_features": [
+                        "ProgressiveAccessibility"
+                    ]
+                }
+            ]
+        }
+    ],
     "PropagateWebViewNetworkingSignals": [
         {
             "platforms": [
@@ -20662,47 +20688,6 @@
             ]
         }
     ],
-    "ReclaimOldPrepaintTiles": [
-        {
-            "platforms": [
-                "android",
-                "android_webview",
-                "chromeos",
-                "fuchsia",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "ReclaimOldPrepaintTiles"
-                    ]
-                }
-            ]
-        }
-    ],
-    "ReclaimPrepaintTilesWhenIdle": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "fuchsia",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "ReclaimPrepaintTilesWhenIdle"
-                    ]
-                }
-            ]
-        }
-    ],
     "RedWarningSurvey": [
         {
             "platforms": [
diff --git a/third_party/angle b/third_party/angle
index 1724ab3..5ac8def 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit 1724ab3641c825d2ed6fc76e20c3d20301e73696
+Subproject commit 5ac8def8003e71514d7a6301b86031ae91506b89
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index 126fa052..70561a5 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -611,8 +611,6 @@
 BASE_FEATURE(kEnableDevtoolsDeepLinkViaExtensibilityApi,
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-BASE_FEATURE(kEstablishGpuChannelAsync, base::FEATURE_ENABLED_BY_DEFAULT);
-
 // Whether to respect loading=lazy attribute for images when they are on
 // invisible pages.
 BASE_FEATURE(kEnableLazyLoadImageForInvisiblePage,
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index bb01a62..23f7fcc1 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -379,10 +379,6 @@
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(
     kEnableDevtoolsDeepLinkViaExtensibilityApi);
 
-// Enables establishing the GPU channel asnchronously when requesting a new
-// layer tree frame sink.
-BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kEstablishGpuChannelAsync);
-
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kEnforceNoopenerOnBlobURLNavigation);
 
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kEnableLazyLoadImageForInvisiblePage);
diff --git a/third_party/blink/public/devtools_protocol/domains/DOM.pdl b/third_party/blink/public/devtools_protocol/domains/DOM.pdl
index 06830b0..c9ba4e69f 100644
--- a/third_party/blink/public/devtools_protocol/domains/DOM.pdl
+++ b/third_party/blink/public/devtools_protocol/domains/DOM.pdl
@@ -76,7 +76,6 @@
       picker
       permission-icon
       overscroll-area-parent
-      overscroll-client-area
 
   # Shadow root type.
   type ShadowRootType extends string
diff --git a/third_party/blink/public/mojom/mediastream/media_stream.mojom b/third_party/blink/public/mojom/mediastream/media_stream.mojom
index d6e7202..b9901ee 100644
--- a/third_party/blink/public/mojom/mediastream/media_stream.mojom
+++ b/third_party/blink/public/mojom/mediastream/media_stream.mojom
@@ -110,6 +110,10 @@
   INVALID_DEVICE_TYPE_REQUEST,
   INVALID_EXTENSION_TYPE_REQUEST,
   CAPTURED_TAB_DESTROYED,
+  CAPTURE_NOT_ENABLED,
+  SAFE_BROWSING_OBSERVER,
+  CAPTURE_FROM_BACKGROUND_PAGE_ON_MAC,
+  CAPTURE_NOT_ALLOWED_FOR_LONG_DOMAINS,
 };
 
 // Type of state change for the corresponding requests.
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
index a9c8bff..259d9fe 100644
--- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
+++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -5059,6 +5059,7 @@
   kV8Element_ContainerTimingIgnore_AttributeSetter = 5743,
   kContainerTimingObserverRegistered = 5744,
   kContainerTimingObserverReportedEntries = 5745,
+  kCookieStoreMaxAge = 5746,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots. Also don't add extra
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py b/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
index 7031bf53..90215a07 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
@@ -2846,11 +2846,7 @@
 // 3.9.2. [[Set]]
 // https://webidl.spec.whatwg.org/#legacy-platform-object-set
 // step 1. If O and Receiver are the same object, then:
-// (V8 calls this callback only when that's the case).\
-"""),
-        TextNode("// TODO(https://crbug.com/455600234): remove this CHECK."),
-        TextNode("CHECK(${info}.HolderV2() == ${info}.This());"),
-        TextNode("""\
+// (V8 calls this callback only when that's the case).
 // step 1.1.1. Invoke the indexed property setter with P and V.\
 """),
         make_steps_of_ce_reactions(cg_context),
@@ -3238,11 +3234,7 @@
 // 3.9.2. [[Set]]
 // https://webidl.spec.whatwg.org/#legacy-platform-object-set
 // step 1. If O and Receiver are the same object, then:
-// (V8 calls this callback only when that's the case).\
-"""),
-        TextNode("// TODO(https://crbug.com/455600234): remove this CHECK."),
-        TextNode("CHECK(${info}.HolderV2() == ${info}.This());"),
-        TextNode("""\
+// (V8 calls this callback only when that's the case).
 // step 1.2.1. Invoke the named property setter with P and V.\
 """),
         make_steps_of_ce_reactions(cg_context),
diff --git a/third_party/blink/renderer/core/css/css_default_style_sheets.cc b/third_party/blink/renderer/core/css/css_default_style_sheets.cc
index 3f32022..b766df4 100644
--- a/third_party/blink/renderer/core/css/css_default_style_sheets.cc
+++ b/third_party/blink/renderer/core/css/css_default_style_sheets.cc
@@ -472,8 +472,7 @@
       rule_set_group_cache_.clear();
       return true;
     }
-    case kPseudoIdOverscrollAreaParent:
-    case kPseudoIdOverscrollClientArea: {
+    case kPseudoIdOverscrollAreaParent: {
       if (overscroll_style_sheet_) {
         return false;
       }
diff --git a/third_party/blink/renderer/core/css/css_math_expression_node.cc b/third_party/blink/renderer/core/css/css_math_expression_node.cc
index 2034b73..dac70dd 100644
--- a/third_party/blink/renderer/core/css/css_math_expression_node.cc
+++ b/third_party/blink/renderer/core/css/css_math_expression_node.cc
@@ -5522,6 +5522,27 @@
   return ComputeCSSRandomValue(random_base_value, min, max, step);
 }
 
+CSSPrimitiveValue::UnitType CSSMathExpressionRandomFunction::ResolvedUnitType()
+    const {
+  CSSPrimitiveValue::UnitType min_type = min_->ResolvedUnitType();
+  CSSPrimitiveValue::UnitType max_type = max_->ResolvedUnitType();
+  if (min_type == CSSPrimitiveValue::UnitType::kUnknown ||
+      max_type == CSSPrimitiveValue::UnitType::kUnknown ||
+      min_type != max_type) {
+    return CSSPrimitiveValue::UnitType::kUnknown;
+  }
+  if (!step_) {
+    return min_type;
+  }
+  CSSPrimitiveValue::UnitType step_type = step_->ResolvedUnitType();
+
+  if (step_type == CSSPrimitiveValue::UnitType::kUnknown ||
+      min_type != step_type) {
+    return CSSPrimitiveValue::UnitType::kUnknown;
+  }
+  return min_type;
+}
+
 double CSSMathExpressionRandomFunction::ComputeLengthPx(
     const CSSLengthResolver& length_resolver) const {
   DCHECK(!HasPercentage());
diff --git a/third_party/blink/renderer/core/css/css_math_expression_node.h b/third_party/blink/renderer/core/css/css_math_expression_node.h
index c952395..3f5a768 100644
--- a/third_party/blink/renderer/core/css/css_math_expression_node.h
+++ b/third_party/blink/renderer/core/css/css_math_expression_node.h
@@ -1238,7 +1238,7 @@
   // [1] https://drafts.csswg.org/css-values-4/#math
   bool IsMathFunction() const final { return true; }
   bool MayHaveRelativeUnit() const final;
-  CSSPrimitiveValue::UnitType ResolvedUnitType() const final { NOTREACHED(); }
+  CSSPrimitiveValue::UnitType ResolvedUnitType() const final;
   const CSSMathExpressionNode& PopulateWithTreeScope(
       const TreeScope*) const final {
     NOTREACHED();
diff --git a/third_party/blink/renderer/core/css/css_selector.cc b/third_party/blink/renderer/core/css/css_selector.cc
index acec8c85..c191d52 100644
--- a/third_party/blink/renderer/core/css/css_selector.cc
+++ b/third_party/blink/renderer/core/css/css_selector.cc
@@ -405,8 +405,6 @@
       return kPseudoIdViewTransitionNew;
     case kPseudoOverscrollAreaParent:
       return kPseudoIdOverscrollAreaParent;
-    case kPseudoOverscrollClientArea:
-      return kPseudoIdOverscrollClientArea;
     case kPseudoActive:
     case kPseudoActiveViewTransition:
     case kPseudoActiveViewTransitionType:
@@ -577,8 +575,6 @@
     {"-internal-menulist-popover-with-menulist-anchor",
      CSSSelector::kPseudoMenulistPopoverWithMenulistAnchor},
     {"-internal-multi-select-focus", CSSSelector::kPseudoMultiSelectFocus},
-    {"-internal-overscroll-client-area",
-     CSSSelector::kPseudoOverscrollClientArea},
     {"-internal-popover-in-top-layer", CSSSelector::kPseudoPopoverInTopLayer},
     {"-internal-relative-anchor", CSSSelector::kPseudoRelativeAnchor},
     {"-internal-selector-fragment-anchor",
@@ -845,8 +841,7 @@
     return CSSSelector::kPseudoUnknown;
   }
 
-  if ((match->type == CSSSelector::kPseudoOverscrollAreaParent ||
-       match->type == CSSSelector::kPseudoOverscrollClientArea) &&
+  if (match->type == CSSSelector::kPseudoOverscrollAreaParent &&
       !RuntimeEnabledFeatures::CSSOverscrollGesturesEnabled()) {
     return CSSSelector::kPseudoUnknown;
   }
@@ -971,7 +966,6 @@
       }
       break;
     case kPseudoOverscrollAreaParent:
-    case kPseudoOverscrollClientArea:
     case kPseudoBlinkInternalElement:
       if (Match() != kPseudoElement || mode != kUASheetMode) {
         bits_.set<PseudoTypeField>(kPseudoUnknown);
@@ -1704,7 +1698,6 @@
           GetPseudoType() == kPseudoViewTransitionOld ||
           GetPseudoType() == kPseudoViewTransitionNew ||
           GetPseudoType() == kPseudoOverscrollAreaParent ||
-          GetPseudoType() == kPseudoOverscrollClientArea ||
           IsElementBackedPseudoElement(GetPseudoType()));
 }
 
@@ -1770,7 +1763,6 @@
     case kPseudoViewTransitionNew:
     case kPseudoViewTransitionOld:
     case kPseudoOverscrollAreaParent:
-    case kPseudoOverscrollClientArea:
       return true;
 
     // It's possible that we should support ::slotted() after ::part().
diff --git a/third_party/blink/renderer/core/css/css_selector.h b/third_party/blink/renderer/core/css/css_selector.h
index d86d01f..8052edb 100644
--- a/third_party/blink/renderer/core/css/css_selector.h
+++ b/third_party/blink/renderer/core/css/css_selector.h
@@ -408,7 +408,6 @@
     kPseudoScrollButton,
 
     kPseudoOverscrollAreaParent,
-    kPseudoOverscrollClientArea,
 
     // :link-to(<navigation-location>)
     // TODO(crbug.com/436805487): Should be :link-to(<link-condition>)
diff --git a/third_party/blink/renderer/core/css/css_test_helpers.cc b/third_party/blink/renderer/core/css/css_test_helpers.cc
index 908d3cf..9feaed5 100644
--- a/third_party/blink/renderer/core/css/css_test_helpers.cc
+++ b/third_party/blink/renderer/core/css/css_test_helpers.cc
@@ -356,8 +356,6 @@
       return "kAfterLastInternalPseudoId";
     case kPseudoIdOverscrollAreaParent:
       return "kPseudoIdOverscrollAreaParent";
-    case kPseudoIdOverscrollClientArea:
-      return "kPseudoIdOverscrollClientArea";
     case kPseudoIdInvalid:
       return "kPseudoIdInvalid";
   }
diff --git a/third_party/blink/renderer/core/css/cssom/css_math_random.cc b/third_party/blink/renderer/core/css/cssom/css_math_random.cc
index ccf4fd1..cf4f1efc 100644
--- a/third_party/blink/renderer/core/css/cssom/css_math_random.cc
+++ b/third_party/blink/renderer/core/css/cssom/css_math_random.cc
@@ -83,14 +83,20 @@
 CSSMathExpressionNode* CSSMathRandom::ToCalcExpressionNode() const {
   CSSMathExpressionOperation::Operands operands;
   operands.reserve(3u);
-  for (const auto& value : {min_, max_, step_}) {
+  DCHECK(min_);
+  DCHECK(max_);
+  for (const CSSNumericValue* value : {min_, max_, step_}) {
+    if (!value) {
+      // step_ value can be null since it is optional
+      break;
+    }
     CSSMathExpressionNode* operand = value->ToCalcExpressionNode();
     if (!operand) {
       // TODO(crbug.com/41470626): Remove this when all ToCalcExpressionNode()
       // overrides are implemented.
       NOTREACHED();
     }
-    operands.push_back(value->ToCalcExpressionNode());
+    operands.push_back(operand);
   }
   return CSSMathExpressionRandomFunction::Create(
       RandomValueSharing::Fixed(random_base_value_), std::move(operands));
diff --git a/third_party/blink/renderer/core/css/invalidation/rule_invalidation_data_visitor.cc b/third_party/blink/renderer/core/css/invalidation/rule_invalidation_data_visitor.cc
index 30d73e9c..6daa6a5 100644
--- a/third_party/blink/renderer/core/css/invalidation/rule_invalidation_data_visitor.cc
+++ b/third_party/blink/renderer/core/css/invalidation/rule_invalidation_data_visitor.cc
@@ -102,7 +102,6 @@
     case CSSSelector::kPseudoDir:
     case CSSSelector::kPseudoNot:
     case CSSSelector::kPseudoOverscrollAreaParent:
-    case CSSSelector::kPseudoOverscrollClientArea:
     case CSSSelector::kPseudoPlaceholder:
     case CSSSelector::kPseudoDetailsContent:
     case CSSSelector::kPseudoPermissionIcon:
diff --git a/third_party/blink/renderer/core/css/overscroll.css b/third_party/blink/renderer/core/css/overscroll.css
index 16b7223a..c4cb9de 100644
--- a/third_party/blink/renderer/core/css/overscroll.css
+++ b/third_party/blink/renderer/core/css/overscroll.css
@@ -1,10 +1,8 @@
 ::-internal-overscroll-area-parent(*) {
   display: block;
+  inset: 0;
   overflow: auto;
+  pointer-events: none;
   scrollbar-width: none;
-}
-
-::-internal-overscroll-client-area {
-  display: block;
-  overflow: inherit;
+  position: absolute;
 }
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
index be71ea1..a7d0575 100644
--- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -157,7 +157,6 @@
     case kPseudoIdScrollButtonBlockEnd:
     case kPseudoIdScrollMarker:
     case kPseudoIdOverscrollAreaParent:
-    case kPseudoIdOverscrollClientArea:
       return true;
     default:
       return false;
diff --git a/third_party/blink/renderer/core/css/rule_set.cc b/third_party/blink/renderer/core/css/rule_set.cc
index ad6e9d2d..6ed5b4bf 100644
--- a/third_party/blink/renderer/core/css/rule_set.cc
+++ b/third_party/blink/renderer/core/css/rule_set.cc
@@ -290,7 +290,6 @@
     case CSSSelector::kPseudoViewTransitionOld:
     case CSSSelector::kPseudoScrollMarkerGroup:
     case CSSSelector::kPseudoOverscrollAreaParent:
-    case CSSSelector::kPseudoOverscrollClientArea:
       return true;
     case CSSSelector::kPseudoCue:
     case CSSSelector::kPseudoFirstLine:
diff --git a/third_party/blink/renderer/core/css/selector_checker.cc b/third_party/blink/renderer/core/css/selector_checker.cc
index a4e8351..387ee2ec 100644
--- a/third_party/blink/renderer/core/css/selector_checker.cc
+++ b/third_party/blink/renderer/core/css/selector_checker.cc
@@ -662,7 +662,6 @@
     case CSSSelector::kPseudoScrollMarkerGroup:
     case CSSSelector::kPseudoScrollButton:
     case CSSSelector::kPseudoOverscrollAreaParent:
-    case CSSSelector::kPseudoOverscrollClientArea:
       // These pseudos are not allowed to match featureless elements. When
       // adding new pseudos here, they would typically be allowed if they are
       // logical pseudos which take selector arguments.
@@ -3145,8 +3144,7 @@
       result.dynamic_pseudo = context.pseudo_id;
       return true;
     }
-    case CSSSelector::kPseudoOverscrollAreaParent:
-    case CSSSelector::kPseudoOverscrollClientArea: {
+    case CSSSelector::kPseudoOverscrollAreaParent: {
       return element.GetPseudoIdForStyling() == pseudo_id;
     }
     case CSSSelector::kPseudoScrollButton:
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 79441f3..762c1d4 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -2544,8 +2544,7 @@
                                  kPseudoIdScrollButtonInlineStart,
                                  kPseudoIdScrollButtonInlineEnd,
                                  kPseudoIdScrollButtonBlockEnd,
-                                 kPseudoIdScrollMarker,
-                                 kPseudoIdOverscrollClientArea};
+                                 kPseudoIdScrollMarker};
   for (auto pseudo_id : pseudo_ids) {
     if (const PseudoElement* pseudo_element =
             element.GetPseudoElement(pseudo_id)) {
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index d05a21c3..5b7c75fd 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -4403,8 +4403,6 @@
     context.counters_context.EnterObject(*layout_object);
   }
 
-  AttachOverscrollPseudoElements(children_context);
-
   AttachColumnPseudoElements(children_context);
   AttachPrecedingPseudoElements(children_context);
 
@@ -5699,20 +5697,7 @@
     CHECK(pseudo_element);
     pseudo_element->AttachLayoutTree(context);
     CHECK(pseudo_element->GetLayoutObject());
-    context.previous_in_flow = nullptr;
-    context.parent = pseudo_element->GetLayoutObject();
-    context.next_sibling = nullptr;
-    context.next_sibling_valid = true;
   }
-  PseudoElement* pseudo_element =
-      GetPseudoElement(kPseudoIdOverscrollClientArea);
-  CHECK(pseudo_element);
-  pseudo_element->AttachLayoutTree(context);
-  CHECK(pseudo_element->GetLayoutObject());
-  context.previous_in_flow = nullptr;
-  context.parent = pseudo_element->GetLayoutObject();
-  context.next_sibling = nullptr;
-  context.next_sibling_valid = true;
 }
 
 void Element::AttachTransitionPseudoElements(AttachContext& context) {
@@ -12080,8 +12065,6 @@
   const ScopedCSSNameList* overscroll_area =
       GetComputedStyle()->OverscrollArea();
   data = &EnsureElementRareData();
-  UpdatePseudoElement(kPseudoIdOverscrollClientArea, style_recalc_change,
-                      style_recalc_context);
   for (const ScopedCSSName* name : overscroll_area->GetNames()) {
     UpdatePseudoElement(kPseudoIdOverscrollAreaParent, style_recalc_change,
                         style_recalc_context, name->GetName());
@@ -12892,7 +12875,6 @@
       case kPseudoIdScrollButtonInlineEnd:
       case kPseudoIdScrollButtonBlockEnd:
       case kPseudoIdOverscrollAreaParent:
-      case kPseudoIdOverscrollClientArea:
         if (RuntimeEnabledFeatures::
                 OriginatingElementIsImplicitAnchorEnabled()) {
           return parentElement();
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h
index b8612fd..0ad7513 100644
--- a/third_party/blink/renderer/core/dom/element.h
+++ b/third_party/blink/renderer/core/dom/element.h
@@ -2253,6 +2253,7 @@
 
   void AttachPrecedingPseudoElements(AttachContext& context) {
     AttachDocumentElementPrecedingPseudoElements(context);
+    AttachOverscrollPseudoElements(context);
     AttachPseudoElement(kPseudoIdScrollMarker, context);
     AttachPseudoElement(kPseudoIdMarker, context);
     AttachPseudoElement(kPseudoIdCheckMark, context);
@@ -2295,7 +2296,7 @@
     AttachPseudoElement(kPseudoIdScrollMarkerGroupAfter, context);
   }
 
-  // These pseudo-elements are added as layout parents of the contents of this
+  // These pseudo-elements are added as siblings of the contents of this
   // element's layout children.
   void AttachOverscrollPseudoElements(AttachContext& context);
 
diff --git a/third_party/blink/renderer/core/dom/element_test.cc b/third_party/blink/renderer/core/dom/element_test.cc
index 7e17e2c..8fc1bab0 100644
--- a/third_party/blink/renderer/core/dom/element_test.cc
+++ b/third_party/blink/renderer/core/dom/element_test.cc
@@ -1498,31 +1498,27 @@
   UpdateAllLifecyclePhasesForTest();
 
   Element* scroller = GetElementById("scroller");
-  PseudoElement* overscroll_client_area =
-      scroller->GetPseudoElement(kPseudoIdOverscrollClientArea);
   PseudoElement* overscroll_parent_foo = scroller->GetPseudoElement(
       kPseudoIdOverscrollAreaParent, AtomicString("--foo"));
   PseudoElement* overscroll_parent_bar = scroller->GetPseudoElement(
       kPseudoIdOverscrollAreaParent, AtomicString("--bar"));
 
-  ASSERT_TRUE(overscroll_client_area);
   ASSERT_TRUE(overscroll_parent_foo);
   ASSERT_TRUE(overscroll_parent_bar);
   EXPECT_FALSE(scroller->GetPseudoElement(kPseudoIdOverscrollAreaParent,
                                           AtomicString("--baz")));
 
-  // Parentage of children and pseudos within content:
-  EXPECT_EQ(
-      scroller->GetPseudoElement(kPseudoIdBefore)->GetLayoutObject()->Parent(),
-      overscroll_client_area->GetLayoutObject());
+  // Order of children and pseudos within content:
+  EXPECT_EQ(scroller->GetPseudoElement(kPseudoIdBefore)
+                ->GetLayoutObject()
+                ->PreviousSibling(),
+            overscroll_parent_bar->GetLayoutObject());
   EXPECT_EQ(GetElementById("child")->GetLayoutObject()->PreviousSibling(),
             scroller->GetPseudoElement(kPseudoIdBefore)->GetLayoutObject());
 
-  // Nesting of overscroll client area and overscroll area parents:
-  EXPECT_EQ(overscroll_client_area->GetLayoutObject()->Parent(),
-            overscroll_parent_bar->GetLayoutObject());
+  // Overscroll area parents:
   EXPECT_EQ(overscroll_parent_bar->GetLayoutObject()->Parent(),
-            overscroll_parent_foo->GetLayoutObject());
+            scroller->GetLayoutObject());
   EXPECT_EQ(overscroll_parent_foo->GetLayoutObject()->Parent(),
             scroller->GetLayoutObject());
 
@@ -1547,47 +1543,43 @@
   UpdateAllLifecyclePhasesForTest();
 
   Element* scroller = GetElementById("scroller");
-  PseudoElement* overscroll_client_area =
-      scroller->GetPseudoElement(kPseudoIdOverscrollClientArea);
   PseudoElement* overscroll_parent_foo = scroller->GetPseudoElement(
       kPseudoIdOverscrollAreaParent, AtomicString("--foo"));
   PseudoElement* overscroll_parent_bar = scroller->GetPseudoElement(
       kPseudoIdOverscrollAreaParent, AtomicString("--bar"));
-  ASSERT_TRUE(overscroll_client_area);
   ASSERT_TRUE(overscroll_parent_foo);
   ASSERT_TRUE(overscroll_parent_bar);
 
-  // Nesting of overscroll client area and overscroll area parents:
-  EXPECT_EQ(overscroll_client_area->GetLayoutObject()->Parent(),
-            overscroll_parent_bar->GetLayoutObject());
+  // Overscroll area parents:
   EXPECT_EQ(overscroll_parent_bar->GetLayoutObject()->Parent(),
-            overscroll_parent_foo->GetLayoutObject());
+            scroller->GetLayoutObject());
   EXPECT_EQ(overscroll_parent_foo->GetLayoutObject()->Parent(),
             scroller->GetLayoutObject());
 
+  // Overscroll area order:
+  EXPECT_EQ(overscroll_parent_bar->GetLayoutObject()->PreviousSibling(),
+            overscroll_parent_foo->GetLayoutObject());
+  EXPECT_EQ(overscroll_parent_foo->GetLayoutObject()->PreviousSibling(),
+            nullptr);
+
   // Change the order of --foo and --bar and ensure the pseudo-element
   // structure is updated appropriately.
   scroller->SetInlineStyleProperty(CSSPropertyID::kOverscrollArea,
                                    AtomicString("--bar, --foo"));
   UpdateAllLifecyclePhasesForTest();
 
-  overscroll_client_area =
-      scroller->GetPseudoElement(kPseudoIdOverscrollClientArea);
   overscroll_parent_foo = scroller->GetPseudoElement(
       kPseudoIdOverscrollAreaParent, AtomicString("--foo"));
   overscroll_parent_bar = scroller->GetPseudoElement(
       kPseudoIdOverscrollAreaParent, AtomicString("--bar"));
-  ASSERT_TRUE(overscroll_client_area);
   ASSERT_TRUE(overscroll_parent_foo);
   ASSERT_TRUE(overscroll_parent_bar);
 
-  // Nesting of overscroll client area and overscroll area parents:
-  EXPECT_EQ(overscroll_client_area->GetLayoutObject()->Parent(),
-            overscroll_parent_foo->GetLayoutObject());
-  EXPECT_EQ(overscroll_parent_foo->GetLayoutObject()->Parent(),
+  // Overscroll area order:
+  EXPECT_EQ(overscroll_parent_bar->GetLayoutObject()->PreviousSibling(),
+            nullptr);
+  EXPECT_EQ(overscroll_parent_foo->GetLayoutObject()->PreviousSibling(),
             overscroll_parent_bar->GetLayoutObject());
-  EXPECT_EQ(overscroll_parent_bar->GetLayoutObject()->Parent(),
-            scroller->GetLayoutObject());
 }
 
 TEST_F(ElementTest, OverscrollPseudoElementStyles) {
@@ -1606,28 +1598,16 @@
       #non-scroller::-internal-overscroll-area-parent(*) {
         backface-visibility: hidden;
       }
-      #scroller::-internal-overscroll-client-area,
-      #non-scroller::-internal-overscroll-client-area {
-        backface-visibility: hidden;
-      }
     </style>
     <div id="scroller"></div>
-    <div id="non-scroller"></div>
   )HTML");
 
   UpdateAllLifecyclePhasesForTest();
 
   Element* scroller = GetElementById("scroller");
-  Element* non_scroller = GetElementById("non-scroller");
-  PseudoElement* scroller_client_area =
-      scroller->GetPseudoElement(kPseudoIdOverscrollClientArea);
-  PseudoElement* non_scroller_client_area =
-      non_scroller->GetPseudoElement(kPseudoIdOverscrollClientArea);
   PseudoElement* overscroll_parent_foo = scroller->GetPseudoElement(
       kPseudoIdOverscrollAreaParent, AtomicString("--foo"));
 
-  ASSERT_TRUE(scroller_client_area);
-  ASSERT_TRUE(non_scroller_client_area);
   ASSERT_TRUE(overscroll_parent_foo);
 
   // Computed style of the overscroll area parent pseudo-elements
@@ -1638,10 +1618,6 @@
   EXPECT_EQ(EScrollbarWidth::kNone,
             overscroll_parent_foo->GetComputedStyle()->ScrollbarWidth());
 
-  // The scroller client area should be scrollable
-  EXPECT_EQ(EOverflow::kAuto,
-            scroller_client_area->GetComputedStyle()->OverflowY());
-
   // Computed style of the overscroll area parent pseudo-elements
   EXPECT_EQ(EOverflow::kAuto,
             overscroll_parent_foo->GetComputedStyle()->OverflowX());
@@ -1650,16 +1626,10 @@
   EXPECT_EQ(EScrollbarWidth::kNone,
             overscroll_parent_foo->GetComputedStyle()->ScrollbarWidth());
 
-  // The non scroller client area is not scrollable
-  EXPECT_EQ(EOverflow::kVisible,
-            non_scroller_client_area->GetComputedStyle()->OverflowY());
-
   // Only UA selectors can match these pseudo-elements,
   // backface-visibility should be unchanged.
   EXPECT_EQ(EBackfaceVisibility::kVisible,
             overscroll_parent_foo->GetComputedStyle()->BackfaceVisibility());
-  EXPECT_EQ(EBackfaceVisibility::kVisible,
-            scroller_client_area->GetComputedStyle()->BackfaceVisibility());
 }
 
 TEST_F(ElementTest, GenerateScrollMarkerGroup) {
diff --git a/third_party/blink/renderer/core/dom/layout_tree_builder_traversal.cc b/third_party/blink/renderer/core/dom/layout_tree_builder_traversal.cc
index 1beb22dd..0da9bc6e 100644
--- a/third_party/blink/renderer/core/dom/layout_tree_builder_traversal.cc
+++ b/third_party/blink/renderer/core/dom/layout_tree_builder_traversal.cc
@@ -26,6 +26,7 @@
 
 #include "third_party/blink/renderer/core/dom/layout_tree_builder_traversal.h"
 
+#include "base/containers/adapters.h"
 #include "third_party/blink/renderer/core/css/style_engine.h"
 #include "third_party/blink/renderer/core/dom/column_pseudo_element.h"
 #include "third_party/blink/renderer/core/dom/flat_tree_traversal.h"
@@ -120,8 +121,11 @@
 
 Node* LayoutTreeBuilderTraversal::NextSibling(const Node& node) {
   PseudoId pseudo_id = node.GetPseudoId();
+  AtomicString pseudo_argument;
   Element* parent_element;
   if (pseudo_id != kPseudoIdNone) {
+    const PseudoElement& pseudo_element = To<PseudoElement>(node);
+    pseudo_argument = pseudo_element.GetPseudoArgument();
     parent_element = DynamicTo<Element>(*node.parentNode());
     DCHECK(parent_element);
   }
@@ -190,6 +194,25 @@
         return next;
       }
       [[fallthrough]];
+    case kPseudoIdOverscrollAreaParent:
+      if (const ScopedCSSNameList* overscroll_areas =
+              parent_element->GetComputedStyle()
+                  ? parent_element->GetComputedStyle()->OverscrollArea()
+                  : nullptr;
+          overscroll_areas && !overscroll_areas->GetNames().empty()) {
+        // Only return the first if we fell through to this branch.
+        bool return_next = pseudo_id != kPseudoIdOverscrollAreaParent;
+        for (const auto& name : overscroll_areas->GetNames()) {
+          if (return_next) {
+            Node* next = parent_element->GetPseudoElement(
+                kPseudoIdOverscrollAreaParent, name->GetName());
+            CHECK(next);
+            return next;
+          }
+          return_next = pseudo_argument == name->GetName();
+        }
+      }
+      [[fallthrough]];
     case kPseudoIdCheckMark:
       if (Node* next = parent_element->GetPseudoElement(kPseudoIdBefore))
         return next;
@@ -239,8 +262,6 @@
 
     // All of these pseudo-elements have no next sibling.
     case kPseudoIdScrollMarkerGroupAfter:
-    case kPseudoIdOverscrollAreaParent:
-    case kPseudoIdOverscrollClientArea:
     case kPseudoIdViewTransition:
       return nullptr;
 
@@ -255,17 +276,17 @@
       // Iterate the list of IDs until we hit the entry for |node's| ID. The
       // sibling is the next ID in the list which generates a pseudo-element.
       bool found = false;
-      for (const auto& pseudo_argument :
+      for (const auto& transition_name :
            parent_pseudo->GetContainedViewTransitionNames()) {
         if (!found) {
-          if (pseudo_argument == pseudo_element->view_transition_name()) {
+          if (transition_name == pseudo_element->view_transition_name()) {
             found = true;
           }
           continue;
         }
 
         if (auto* sibling = parent_element->GetPseudoElement(
-                kPseudoIdViewTransitionGroup, pseudo_argument)) {
+                kPseudoIdViewTransitionGroup, transition_name)) {
           return sibling;
         }
       }
@@ -355,14 +376,21 @@
       }
       [[fallthrough]];
     case kPseudoIdOverscrollAreaParent:
-      if (pseudo_id == kPseudoIdOverscrollAreaParent) {
-        const ScopedCSSNameList* overscroll_areas =
-            parent_element->GetComputedStyle()->OverscrollArea();
-        CHECK(overscroll_areas);
-        CHECK(!overscroll_areas->GetNames().empty());
-        if (pseudo_argument !=
-            overscroll_areas->GetNames().front()->GetName()) {
-          return nullptr;
+      if (const ScopedCSSNameList* overscroll_areas =
+              parent_element->GetComputedStyle()
+                  ? parent_element->GetComputedStyle()->OverscrollArea()
+                  : nullptr;
+          overscroll_areas && !overscroll_areas->GetNames().empty()) {
+        // Only return the first if we fell through to this branch.
+        bool return_next = pseudo_id != kPseudoIdOverscrollAreaParent;
+        for (const auto& name : base::Reversed(overscroll_areas->GetNames())) {
+          if (return_next) {
+            Node* next = parent_element->GetPseudoElement(
+                kPseudoIdOverscrollAreaParent, name->GetName());
+            CHECK(next);
+            return next;
+          }
+          return_next = pseudo_argument == name->GetName();
         }
       }
       [[fallthrough]];
@@ -415,9 +443,6 @@
         return previous;
       }
       [[fallthrough]];
-
-    // These pseudo-elements have no previous sibling.
-    case kPseudoIdOverscrollClientArea:
     case kPseudoIdScrollMarkerGroupBefore:
       return nullptr;
     default:
@@ -524,42 +549,16 @@
           current_element->GetPseudoElement(kPseudoIdScrollButtonBlockEnd)) {
     return first;
   }
-  const Element& originating_element =
-      current_element->IsPseudoElement()
-          ? To<PseudoElement>(current_element)->UltimateOriginatingElement()
-          : *current_element;
-  if (!current_element->IsPseudoElement() ||
-      current_element->GetPseudoId() == kPseudoIdOverscrollAreaParent) {
-    if (const ScopedCSSNameList* overscroll_areas =
-            originating_element.GetComputedStyle()
-                ? originating_element.GetComputedStyle()->OverscrollArea()
-                : nullptr;
-        overscroll_areas && !overscroll_areas->GetNames().empty()) {
-      bool return_next = !current_element->IsPseudoElement();
-      for (const auto& name : overscroll_areas->GetNames()) {
-        if (return_next) {
-          Node* next = originating_element.GetPseudoElement(
-              kPseudoIdOverscrollAreaParent, name->GetName());
-          CHECK(next);
-          return next;
-        }
-        if (name->GetName() ==
-            To<PseudoElement>(current_element)->GetPseudoArgument()) {
-          return_next = true;
-        }
-      }
-      CHECK(return_next);
-      return originating_element.GetPseudoElement(
-          kPseudoIdOverscrollClientArea);
-    }
-  }
-
-  // All of these pseudo-elements are part of the contents and NextChild
-  // will never return one of the pseudos that comes before the overscroll
-  // area.
-  if (current_element->GetPseudoId() == kPseudoIdOverscrollClientArea) {
-    // Find the first child of the originating element's content.
-    current_element = &originating_element;
+  if (const ScopedCSSNameList* overscroll_areas =
+          current_element->GetComputedStyle()
+              ? current_element->GetComputedStyle()->OverscrollArea()
+              : nullptr;
+      overscroll_areas && !overscroll_areas->GetNames().empty()) {
+    const auto& name = overscroll_areas->GetNames()[0];
+    Node* first = current_element->GetPseudoElement(
+        kPseudoIdOverscrollAreaParent, name->GetName());
+    CHECK(first);
+    return first;
   }
   if (const ColumnPseudoElementsVector* columns =
           current_element->GetColumnPseudoElements();
diff --git a/third_party/blink/renderer/core/dom/overscroll_pseudo_element_data.h b/third_party/blink/renderer/core/dom/overscroll_pseudo_element_data.h
index ff43ff3..3fb06b11d 100644
--- a/third_party/blink/renderer/core/dom/overscroll_pseudo_element_data.h
+++ b/third_party/blink/renderer/core/dom/overscroll_pseudo_element_data.h
@@ -22,17 +22,12 @@
 // overscroll-area property associated with their originating element.
 // In particular, when an element has `overscroll-area: --name1, --name2;`
 // we will create an ::overscroll-area-parent for each of --name1 and
-// --name2 which allow scrolling into those overscroll areas, and a single
-// ::overscroll-client-area for the originating element's content,
+// --name2 which allow scrolling into those overscroll areas,
 // producing the following layout tree structure:
 // <div id="scroller">
-//   <::overscroll-area-parent(--foo)>
-//     <::overscroll-area-parent(--bar)>
-//       <::overscroll-client-area>
-//         <div id="scroller-child"></div>
-//       </::overscroll-client-area>
-//     </::overscroll-area-parent(--bar)>
-//   </::overscroll-area-parent(--foo)>
+//   <::overscroll-area-parent(--foo)></::overscroll-area-parent(--foo)>
+//   <::overscroll-area-parent(--bar)></::overscroll-area-parent(--bar)>
+//   <div id="scroller-child"></div>
 // </div>
 
 class OverscrollPseudoElementData final
@@ -55,25 +50,20 @@
 
   bool HasPseudoElements() const;
   void ClearPseudoElements();
-  void Trace(Visitor* visitor) const {
-    visitor->Trace(overscroll_client_area_);
-    visitor->Trace(overscroll_parents_);
-  }
+  void Trace(Visitor* visitor) const { visitor->Trace(overscroll_parents_); }
 
   size_t size() const { return overscroll_parents_.size(); }
 
  private:
-  Member<PseudoElement> overscroll_client_area_;
   HeapVector<Member<PseudoElement>> overscroll_parents_;
   HashMap<AtomicString, size_t> overscroll_parent_id_map_;
 };
 
 inline bool OverscrollPseudoElementData::HasPseudoElements() const {
-  return overscroll_client_area_ || !overscroll_parents_.empty();
+  return !overscroll_parents_.empty();
 }
 
 inline void OverscrollPseudoElementData::ClearPseudoElements() {
-  overscroll_client_area_ = nullptr;
   for (PseudoElement* pseudo : overscroll_parents_) {
     pseudo->Dispose();
   }
@@ -86,10 +76,6 @@
     PseudoElement* element,
     const AtomicString& overscroll_area_name) {
   switch (pseudo_id) {
-    case kPseudoIdOverscrollClientArea:
-      CHECK(!overscroll_client_area_);
-      overscroll_client_area_ = element;
-      break;
     case kPseudoIdOverscrollAreaParent: {
       DCHECK(overscroll_area_name);
       overscroll_parents_.push_back(element);
@@ -107,8 +93,6 @@
     PseudoId pseudo_id,
     const AtomicString& overscroll_area_name) const {
   switch (pseudo_id) {
-    case kPseudoIdOverscrollClientArea:
-      return overscroll_client_area_.Get();
     case kPseudoIdOverscrollAreaParent: {
       auto it = overscroll_parent_id_map_.find(overscroll_area_name);
       if (it == overscroll_parent_id_map_.end()) {
diff --git a/third_party/blink/renderer/core/dom/pseudo_element.cc b/third_party/blink/renderer/core/dom/pseudo_element.cc
index 90be7492..d75f5ad 100644
--- a/third_party/blink/renderer/core/dom/pseudo_element.cc
+++ b/third_party/blink/renderer/core/dom/pseudo_element.cc
@@ -134,8 +134,7 @@
          pseudo_id == kPseudoIdCheckMark || pseudo_id == kPseudoIdPickerIcon ||
          pseudo_id == kPseudoIdInterestHint || pseudo_id == kPseudoIdBackdrop ||
          pseudo_id == kPseudoIdMarker || pseudo_id == kPseudoIdColumn ||
-         pseudo_id == kPseudoIdOverscrollAreaParent ||
-         pseudo_id == kPseudoIdOverscrollClientArea);
+         pseudo_id == kPseudoIdOverscrollAreaParent);
   return MakeGarbageCollected<PseudoElement>(parent, pseudo_id,
                                              pseudo_argument);
 }
@@ -188,11 +187,6 @@
                           (AtomicString("::internal-overscroll-area-parent")));
       return overscroll_area_parent;
     }
-    case kPseudoIdOverscrollClientArea: {
-      DEFINE_STATIC_LOCAL(QualifiedName, overscroll_client_area,
-                          (AtomicString("::internal-overscroll-client-area")));
-      return overscroll_client_area;
-    }
     case kPseudoIdScrollMarkerGroup: {
       DEFINE_STATIC_LOCAL(QualifiedName, scroll_marker_group,
                           (AtomicString("::scroll-marker-group")));
@@ -304,7 +298,6 @@
         return RuntimeEnabledFeatures::CSSMarkerNestedPseudoElementEnabled();
       return true;
     case kPseudoIdOverscrollAreaParent:
-    case kPseudoIdOverscrollClientArea:
       return false;
     default:
       return true;
@@ -755,7 +748,6 @@
     case kPseudoIdViewTransitionOld:
     case kPseudoIdColumn:
     case kPseudoIdOverscrollAreaParent:
-    case kPseudoIdOverscrollClientArea:
       return true;
     case kPseudoIdCheckMark:
     case kPseudoIdBefore:
diff --git a/third_party/blink/renderer/core/dom/pseudo_element_data.h b/third_party/blink/renderer/core/dom/pseudo_element_data.h
index 76ad6e9..7507961 100644
--- a/third_party/blink/renderer/core/dom/pseudo_element_data.h
+++ b/third_party/blink/renderer/core/dom/pseudo_element_data.h
@@ -239,7 +239,6 @@
       generated_first_letter_ = element;
       break;
     case kPseudoIdOverscrollAreaParent:
-    case kPseudoIdOverscrollClientArea:
       CHECK(element);
       if (!overscroll_data_) {
         overscroll_data_ = MakeGarbageCollected<OverscrollPseudoElementData>();
@@ -321,8 +320,7 @@
                ? transition_data_->GetPseudoElement(pseudo_id, pseudo_argument)
                : nullptr;
   }
-  if (overscroll_data_ && (pseudo_id == kPseudoIdOverscrollAreaParent ||
-                           pseudo_id == kPseudoIdOverscrollClientArea)) {
+  if (overscroll_data_ && pseudo_id == kPseudoIdOverscrollAreaParent) {
     return overscroll_data_->GetPseudoElement(pseudo_id, pseudo_argument);
   }
   return nullptr;
diff --git a/third_party/blink/renderer/core/frame/ad_tracker.cc b/third_party/blink/renderer/core/frame/ad_tracker.cc
index f39cdb4..d3cf5147 100644
--- a/third_party/blink/renderer/core/frame/ad_tracker.cc
+++ b/third_party/blink/renderer/core/frame/ad_tracker.cc
@@ -302,6 +302,7 @@
     ResourceType resource_type,
     const FetchInitiatorInfo& initiator_info,
     bool known_ad,
+    bool scan_stack_for_ads,
     const subresource_filter::ScopedRule& rule) {
   DCHECK(!rule.IsValid() || known_ad);
 
@@ -321,10 +322,13 @@
 
   // Check if any executing script is an ad.
   std::optional<AdScriptIdentifier> ancestor_ad_script;
-  known_ad = known_ad || IsAdScriptInStackHelper(
-                             StackType::kBottomAndTop,
-                             /*ignore_monkey_patch=*/MonkeyPatchableApi::kNone,
-                             &ancestor_ad_script);
+  if (scan_stack_for_ads) {
+    known_ad =
+        known_ad || IsAdScriptInStackHelper(
+                        StackType::kBottomAndTop,
+                        /*ignore_monkey_patch=*/MonkeyPatchableApi::kNone,
+                        &ancestor_ad_script);
+  }
 
   // If it is a script marked as an ad and it's not in an ad context, append it
   // to the known ad script set. We don't need to keep track of ad scripts in ad
diff --git a/third_party/blink/renderer/core/frame/ad_tracker.h b/third_party/blink/renderer/core/frame/ad_tracker.h
index ebbcbdd..b96eba8 100644
--- a/third_party/blink/renderer/core/frame/ad_tracker.h
+++ b/third_party/blink/renderer/core/frame/ad_tracker.h
@@ -99,8 +99,9 @@
   // Called when a subresource request is about to be sent or is redirected.
   // Returns true if any of the following are true:
   // - the resource is loaded in an ad iframe
-  // - |known_ad| is true
+  // - `known_ad` is true
   // - ad script is in the v8 stack and the resource was not requested by CSS.
+  // This check is only done if `scan_stack_for_ads` is true.
   // Virtual for testing.
   virtual bool CalculateIfAdSubresource(
       ExecutionContext* execution_context,
@@ -108,6 +109,7 @@
       ResourceType resource_type,
       const FetchInitiatorInfo& initiator_info,
       bool known_ad,
+      bool scan_stack_for_ads,
       const subresource_filter::ScopedRule& rule);
 
   // Called when an async task is created. Check at this point for ad script on
diff --git a/third_party/blink/renderer/core/frame/ad_tracker_test.cc b/third_party/blink/renderer/core/frame/ad_tracker_test.cc
index 8c5c2f8..4d70749c 100644
--- a/third_party/blink/renderer/core/frame/ad_tracker_test.cc
+++ b/third_party/blink/renderer/core/frame/ad_tracker_test.cc
@@ -196,10 +196,11 @@
       ResourceType resource_type,
       const FetchInitiatorInfo& initiator_info,
       bool known_ad,
+      bool scan_stack_for_ads,
       const subresource_filter::ScopedRule& rule) override {
     bool observed_result = AdTracker::CalculateIfAdSubresource(
         execution_context, request_url, resource_type, initiator_info, known_ad,
-        rule);
+        scan_stack_for_ads, rule);
 
     String resource_url = request_url.GetString();
     is_ad_.insert(resource_url, observed_result);
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
index 4484028..78d301e 100644
--- a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
@@ -312,8 +312,6 @@
       return protocol::DOM::PseudoTypeEnum::ViewTransitionOld;
     case kPseudoIdOverscrollAreaParent:
       return protocol::DOM::PseudoTypeEnum::OverscrollAreaParent;
-    case kPseudoIdOverscrollClientArea:
-      return protocol::DOM::PseudoTypeEnum::OverscrollClientArea;
     case kAfterLastInternalPseudoId:
     case kPseudoIdNone:
     case kPseudoIdInvalid:
diff --git a/third_party/blink/renderer/core/layout/layout_shift_tracker.cc b/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
index 12698af..dd4e334 100644
--- a/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
+++ b/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
@@ -859,9 +859,9 @@
   while (it != attributions_.end() && it->node_id != kInvalidDOMNodeId) {
     value.BeginDictionary();
     value.SetInteger("node_id", it->node_id);
-    RectToTracedValue(gfx::ToEnclosingRect(it->old_visual_rect), value,
+    RectToTracedValue(gfx::ToRoundedRect(it->old_visual_rect), value,
                       "old_rect");
-    RectToTracedValue(gfx::ToEnclosingRect(it->new_visual_rect), value,
+    RectToTracedValue(gfx::ToRoundedRect(it->new_visual_rect), value,
                       "new_rect");
     if (should_include_names) {
       Node* node = DOMNodeIds::NodeForId(it->node_id);
diff --git a/third_party/blink/renderer/core/loader/base_fetch_context.cc b/third_party/blink/renderer/core/loader/base_fetch_context.cc
index a368648..e536869 100644
--- a/third_party/blink/renderer/core/loader/base_fetch_context.cc
+++ b/third_party/blink/renderer/core/loader/base_fetch_context.cc
@@ -83,6 +83,7 @@
     base::optional_ref<const KURL> alias_url,
     ResourceType type,
     const FetchInitiatorInfo& initiator_info,
+    bool scan_stack_for_ads,
     subresource_filter::ScopedRule* out_rule) {
   // A derived class should override this if they have more signals than just
   // the SubresourceFilter.
diff --git a/third_party/blink/renderer/core/loader/base_fetch_context.h b/third_party/blink/renderer/core/loader/base_fetch_context.h
index 7c26f5c..95cd2d25 100644
--- a/third_party/blink/renderer/core/loader/base_fetch_context.h
+++ b/third_party/blink/renderer/core/loader/base_fetch_context.h
@@ -97,6 +97,7 @@
       base::optional_ref<const KURL> alias_url,
       ResourceType type,
       const FetchInitiatorInfo& initiator_info,
+      bool scan_stack_for_ads,
       subresource_filter::ScopedRule* out_rule) override;
 
  protected:
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
index 624dc22..a759a4e 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
@@ -1388,13 +1388,18 @@
     base::optional_ref<const KURL> alias_url,
     ResourceType type,
     const FetchInitiatorInfo& initiator_info,
+    bool scan_stack_for_ads,
     subresource_filter::ScopedRule* out_rule) {
   CHECK(!out_rule);
 
   // Mark the resource as an Ad if the BaseFetchContext thinks it's an ad.
+  // `scan_stack_for_ads` is only used by the `AdTracker` and is used later in
+  // this function, `BaseFetchContext::CalculateIfAdSubresource` doesn't need
+  // it.
   subresource_filter::ScopedRule rule;
   bool known_ad = BaseFetchContext::CalculateIfAdSubresource(
-      resource_request, alias_url, type, initiator_info, /*out_rule=*/&rule);
+      resource_request, alias_url, type, initiator_info,
+      /*scan_stack_for_ads=*/false, /*out_rule=*/&rule);
   if (GetResourceFetcherProperties().IsDetached() ||
       !GetFrame()->GetAdTracker()) {
     return known_ad;
@@ -1405,7 +1410,8 @@
   const KURL& url =
       alias_url.has_value() ? alias_url.value() : resource_request.Url();
   return GetFrame()->GetAdTracker()->CalculateIfAdSubresource(
-      document_->domWindow(), url, type, initiator_info, known_ad, rule);
+      document_->domWindow(), url, type, initiator_info, known_ad,
+      scan_stack_for_ads, rule);
 }
 
 void FrameFetchContext::DidObserveLoadingBehavior(
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.h b/third_party/blink/renderer/core/loader/frame_fetch_context.h
index aa97d98..22b0f928 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context.h
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context.h
@@ -141,6 +141,7 @@
       base::optional_ref<const KURL> alias_url,
       ResourceType type,
       const FetchInitiatorInfo& initiator_info,
+      bool scan_stack_for_ads,
       subresource_filter::ScopedRule* out_rule) override;
 
   // LoadingBehaviorObserver overrides:
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc b/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc
index 869ec72..0391a13 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc
@@ -294,6 +294,7 @@
     EXPECT_EQ(expect_is_ad, GetFetchContext()->CalculateIfAdSubresource(
                                 request, std::nullopt /* alias_url */,
                                 ResourceType::kMock, initiator_info,
+                                /*scan_stack_for_ads=*/false,
                                 /*out_rule=*/nullptr));
     return reason;
   }
@@ -1750,6 +1751,7 @@
               GetFetchContext()->CalculateIfAdSubresource(
                   resource_request, alias_url, ResourceType::kScript,
                   options.initiator_info,
+                  /*scan_stack_for_ads=*/false,
                   /*out_rule=*/nullptr));
   }
 }
diff --git a/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc b/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc
index 39ee416..2d5fe20 100644
--- a/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc
+++ b/third_party/blink/renderer/core/speculation_rules/document_speculation_rules.cc
@@ -833,7 +833,12 @@
           // ComputedStyle, i.e. a ComputedStyle that wasn't updated during a
           // style update because the element isn't currently being rendered,
           // but is not discarded either. We ignore these links as well.
-          if (stale_links_.Contains(link)) {
+          // We also check LockedAncestorPreventingStyle here
+          // because stale_links_ may not be populated for newly inserted links
+          // (AddLink doesn't check for locked ancestors to avoid triggering
+          // slot assignment during node insertion).
+          if (stale_links_.Contains(link) ||
+              DisplayLockUtilities::LockedAncestorPreventingStyle(*link)) {
             return;
           }
 
@@ -966,11 +971,11 @@
   DCHECK(!base::Contains(stale_links_, link));
 
   pending_links_.insert(link);
-  // TODO(crbug.com/1371522): A stale link is guaranteed to not match, so we
-  // should put it into |unmatched_links_| directly and skip queueing an update.
-  if (DisplayLockUtilities::LockedAncestorPreventingStyle(*link)) {
-    stale_links_.insert(link);
-  }
+  // We don't check LockedAncestorPreventingStyle here because this
+  // function can be called during node insertion (InsertedInto), at which point
+  // slot assignment recalculation is forbidden. The check for display-locked
+  // ancestors is done later in AddLinkBasedSpeculationCandidates when we
+  // actually process the links.
 }
 
 void DocumentSpeculationRules::RemoveLink(HTMLAnchorElementBase* link) {
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h
index 74d379e..b8d3ce36 100644
--- a/third_party/blink/renderer/core/style/computed_style.h
+++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -2477,8 +2477,7 @@
         pseudo == kPseudoIdScrollButtonBlockEnd) {
       return HasPseudoElementStyle(kPseudoIdScrollButton);
     }
-    if (pseudo == kPseudoIdOverscrollClientArea ||
-        pseudo == kPseudoIdOverscrollAreaParent) {
+    if (pseudo == kPseudoIdOverscrollAreaParent) {
       return HasOverscrollArea();
     }
     if (!HasPseudoElementStyle(pseudo)) {
diff --git a/third_party/blink/renderer/core/style/computed_style_constants.h b/third_party/blink/renderer/core/style/computed_style_constants.h
index ec0a6142..d4c6791 100644
--- a/third_party/blink/renderer/core/style/computed_style_constants.h
+++ b/third_party/blink/renderer/core/style/computed_style_constants.h
@@ -98,7 +98,6 @@
   kPseudoIdViewTransitionNew,
 
   kPseudoIdOverscrollAreaParent,
-  kPseudoIdOverscrollClientArea,
 
   // Internal IDs follow:
   kPseudoIdFirstLineInherited,
@@ -126,7 +125,7 @@
   kPseudoIdInvalid,
   kFirstPublicPseudoId = kPseudoIdFirstLine,
   kLastTrackedPublicPseudoId = kPseudoIdGrammarError,
-  kLastPublicPseudoId = kPseudoIdOverscrollClientArea,
+  kLastPublicPseudoId = kPseudoIdOverscrollAreaParent,
   kFirstInternalPseudoId = kPseudoIdFirstLineInherited,
 };
 
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
index 699cdcec..25e9c511 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -1422,7 +1422,6 @@
   switch (To<PseudoElement>(node).GetPseudoId()) {
     case kPseudoIdBackdrop:
     case kPseudoIdOverscrollAreaParent:
-    case kPseudoIdOverscrollClientArea:
     case kPseudoIdViewTransition:
     case kPseudoIdViewTransitionGroup:
     case kPseudoIdViewTransitionGroupChildren:
diff --git a/third_party/blink/renderer/modules/cookie_store/cookie_store.cc b/third_party/blink/renderer/modules/cookie_store/cookie_store.cc
index d4daa3ca..d6cbd8d8 100644
--- a/third_party/blink/renderer/modules/cookie_store/cookie_store.cc
+++ b/third_party/blink/renderer/modules/cookie_store/cookie_store.cc
@@ -95,6 +95,7 @@
   base::Time expiry_time;
   if (base::FeatureList::IsEnabled(blink::features::kCookieStoreAPIMaxAge) &&
       options->hasMaxAge()) {
+    UseCounter::Count(execution_context, WebFeature::kCookieStoreMaxAge);
     if (options->expires().has_value()) {
       // If both maxAge and expires are provided, throw an error.
       exception_state.ThrowTypeError(
diff --git a/third_party/blink/renderer/modules/cookie_store/cookie_store_unittest.cc b/third_party/blink/renderer/modules/cookie_store/cookie_store_unittest.cc
index 73664ad..1a06ecd 100644
--- a/third_party/blink/renderer/modules/cookie_store/cookie_store_unittest.cc
+++ b/third_party/blink/renderer/modules/cookie_store/cookie_store_unittest.cc
@@ -415,6 +415,8 @@
   EXPECT_EQ("cookie-name", cookie.Name());
   EXPECT_EQ("cookie-value", cookie.Value());
   EXPECT_FALSE(cookie.IsPersistent());
+  EXPECT_FALSE(v8_testing_scope.GetDocument().IsUseCounted(
+      WebFeature::kCookieStoreMaxAge));
 }
 
 TEST_F(CookieStoreTest, MaxAgeSupported) {
@@ -451,6 +453,8 @@
   EXPECT_LT((cookie.ExpiryDate() - cookie.CreationDate() - base::Seconds(300))
                 .magnitude(),
             base::Seconds(1));
+  EXPECT_TRUE(v8_testing_scope.GetDocument().IsUseCounted(
+      WebFeature::kCookieStoreMaxAge));
 }
 
 TEST_F(CookieStoreTest, MaxAgeNegativeValue) {
@@ -479,6 +483,8 @@
   EXPECT_FALSE(exception_state.HadException());
   EXPECT_TRUE(promise_tester.IsFulfilled());
   EXPECT_THAT(GetAllCookies(), IsEmpty());
+  EXPECT_TRUE(v8_testing_scope.GetDocument().IsUseCounted(
+      WebFeature::kCookieStoreMaxAge));
 }
 
 TEST_F(CookieStoreTest, MaxAgeAndExpiry) {
@@ -511,6 +517,8 @@
   EXPECT_EQ("Cookie expires and maxAge cannot both be specified",
             exception_state.Message());
   EXPECT_THAT(GetAllCookies(), IsEmpty());
+  EXPECT_TRUE(v8_testing_scope.GetDocument().IsUseCounted(
+      WebFeature::kCookieStoreMaxAge));
 }
 
 }  // namespace
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
index ce807db2..3bfc7f3 100644
--- a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
+++ b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
@@ -112,84 +112,6 @@
   }
 }
 
-const char* MediaStreamRequestResultToString(MediaStreamRequestResult value) {
-  switch (value) {
-    case MediaStreamRequestResult::OK:
-      return "OK";
-    case MediaStreamRequestResult::PERMISSION_DENIED:
-      return "PERMISSION_DENIED";
-    case MediaStreamRequestResult::PERMISSION_DISMISSED:
-      return "PERMISSION_DISMISSED";
-    case MediaStreamRequestResult::INVALID_STATE:
-      return "INVALID_STATE";
-    case MediaStreamRequestResult::NO_HARDWARE:
-      return "NO_HARDWARE";
-    case MediaStreamRequestResult::INVALID_SECURITY_ORIGIN:
-      return "INVALID_SECURITY_ORIGIN";
-    case MediaStreamRequestResult::TAB_CAPTURE_FAILURE:
-      return "TAB_CAPTURE_FAILURE";
-    case MediaStreamRequestResult::SCREEN_CAPTURE_FAILURE:
-      return "SCREEN_CAPTURE_FAILURE";
-    case MediaStreamRequestResult::CAPTURE_FAILURE:
-      return "CAPTURE_FAILURE";
-    case MediaStreamRequestResult::CONSTRAINT_NOT_SATISFIED:
-      return "CONSTRAINT_NOT_SATISFIED";
-    case MediaStreamRequestResult::TRACK_START_FAILURE_AUDIO:
-      return "TRACK_START_FAILURE_AUDIO";
-    case MediaStreamRequestResult::TRACK_START_FAILURE_VIDEO:
-      return "TRACK_START_FAILURE_VIDEO";
-    case MediaStreamRequestResult::MULTI_CAPTURE_NOT_SUPPORTED:
-      return "MULTI_CAPTURE_NOT_SUPPORTED";
-    case MediaStreamRequestResult::NOT_SUPPORTED:
-      return "NOT_SUPPORTED";
-    case MediaStreamRequestResult::FAILED_DUE_TO_SHUTDOWN:
-      return "FAILED_DUE_TO_SHUTDOWN";
-    case MediaStreamRequestResult::KILL_SWITCH_ON:
-      return "KILL_SWITCH_ON";
-    case MediaStreamRequestResult::PERMISSION_DENIED_BY_SYSTEM:
-      return "PERMISSION_DENIED_BY_SYSTEM";
-    case MediaStreamRequestResult::DEVICE_IN_USE:
-      return "DEVICE_IN_USE";
-    case MediaStreamRequestResult::REQUEST_CANCELLED:
-      return "REQUEST_CANCELLED";
-    case MediaStreamRequestResult::START_TIMEOUT:
-      return "START_TIMEOUT";
-    case MediaStreamRequestResult::PERMISSION_DENIED_BY_USER:
-      return "PERMISSION_DENIED_BY_USER";
-    case MediaStreamRequestResult::AUDIO_DEVICE_SOCKET_ERROR:
-      return "AUDIO_DEVICE_SOCKET_ERROR";
-    case MediaStreamRequestResult::NO_TRANSIENT_ACTIVATION:
-      return "NO_TRANSIENT_ACTIVATION";
-    case MediaStreamRequestResult::CAPTURE_NOT_ALLOWED_BY_POLICY:
-      return "CAPTURE_NOT_ALLOWED_BY_POLICY";
-    case MediaStreamRequestResult::INVALID_DISPLAY_CAPTURE_CONSTRAINTS:
-      return "INVALID_DISPLAY_CAPTURE_CONSTRAINTS";
-    case MediaStreamRequestResult::INVALID_GUM_TAB_CAPTURE_CONSTRAINTS:
-      return "INVALID_GUM_TAB_CAPTURE_CONSTRAINTS";
-    case MediaStreamRequestResult::INVALID_GUM_SCREEN_CAPTURE_CONSTRAINTS:
-      return "INVALID_GUM_SCREEN_CAPTURE_CONSTRAINTS";
-    case MediaStreamRequestResult::INVALID_VIDEO_DEVICE_ID:
-      return "INVALID_VIDEO_DEVICE_ID";
-    case MediaStreamRequestResult::STREAM_NOT_FOUND_IN_REGISTRY:
-      return "STREAM_NOT_FOUND_IN_REGISTRY";
-    case MediaStreamRequestResult::ANDROID_CANT_REQUEST_PERMISSION:
-      return "ANDROID_CANT_REQUEST_PERMISSION";
-    case MediaStreamRequestResult::PERMISSION_DENIED_BY_EMBEDDER_CONTEXT:
-      return "PERMISSION_DENIED_BY_EMBEDDER_CONTEXT";
-    case MediaStreamRequestResult::DLP_PERMISSION_DENIED:
-      return "DLP_PERMISSION_DENIED";
-    case MediaStreamRequestResult::REGISTRY_REQUEST_UNVERIFIED:
-      return "REGISTRY_REQUEST_UNVERIFIED";
-    case MediaStreamRequestResult::INVALID_DEVICE_TYPE_REQUEST:
-      return "INVALID_DEVICE_TYPE_REQUEST";
-    case MediaStreamRequestResult::INVALID_EXTENSION_TYPE_REQUEST:
-      return "INVALID_EXTENSION_TYPE_REQUEST";
-    case MediaStreamRequestResult::CAPTURED_TAB_DESTROYED:
-      return "CAPTURED_TAB_DESTROYED";
-  }
-  NOTREACHED();
-}
-
 void SendLogMessage(const std::string& message) {
   blink::WebRtcLogMessage("UMP::" + message);
 }
@@ -239,7 +161,7 @@
   const MediaStreamDevice& device = source->device();
   String str = String::Format("OnTrackStarted({session_id=%s}, {result=%s})",
                               device.session_id().ToString().c_str(),
-                              MediaStreamRequestResultToString(result));
+                              base::ToString(result).c_str());
   return str.Utf8();
 }
 
@@ -344,6 +266,7 @@
     case MediaStreamRequestResult::CAPTURE_NOT_ALLOWED_BY_POLICY:
     case MediaStreamRequestResult::PERMISSION_DENIED_BY_EMBEDDER_CONTEXT:
     case MediaStreamRequestResult::DLP_PERMISSION_DENIED:
+    case MediaStreamRequestResult::SAFE_BROWSING_OBSERVER:
       return "Permission denied";
     case MediaStreamRequestResult::PERMISSION_DISMISSED:
       return "Permission dismissed";
@@ -352,6 +275,9 @@
     case MediaStreamRequestResult::REGISTRY_REQUEST_UNVERIFIED:
     case MediaStreamRequestResult::INVALID_DEVICE_TYPE_REQUEST:
     case MediaStreamRequestResult::INVALID_EXTENSION_TYPE_REQUEST:
+    case MediaStreamRequestResult::CAPTURE_NOT_ENABLED:
+    case MediaStreamRequestResult::CAPTURE_NOT_ALLOWED_FOR_LONG_DOMAINS:
+    case MediaStreamRequestResult::CAPTURE_FROM_BACKGROUND_PAGE_ON_MAC:
       return "Invalid state";
     case MediaStreamRequestResult::NO_HARDWARE:
       return "Requested device not found";
@@ -2219,8 +2145,7 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   SendLogMessage(base::StringPrintf(
       "DelayedGetUserMediaRequestSucceeded({request_id=%d}, {result=%s})",
-      request_id,
-      MediaStreamRequestResultToString(MediaStreamRequestResult::OK)));
+      request_id, base::ToString(MediaStreamRequestResult::OK)));
   UpdateRequestResult(user_media_request, MediaStreamRequestResult::OK);
   DeleteUserMediaRequest(user_media_request);
   if (!user_media_request->IsTransferredTrackRequest()) {
@@ -2264,7 +2189,7 @@
   UpdateRequestResult(user_media_request, result);
   SendLogMessage(base::StringPrintf(
       "DelayedGetUserMediaRequestFailed({request_id=%d}, {result=%s})",
-      request_id, MediaStreamRequestResultToString(result)));
+      request_id, base::ToString(result)));
   DeleteUserMediaRequest(user_media_request);
   switch (result) {
     case MediaStreamRequestResult::OK:
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_request.cc b/third_party/blink/renderer/modules/mediastream/user_media_request.cc
index b36e174c..eccff41 100644
--- a/third_party/blink/renderer/modules/mediastream/user_media_request.cc
+++ b/third_party/blink/renderer/modules/mediastream/user_media_request.cc
@@ -942,6 +942,7 @@
     case Result::PERMISSION_DENIED:
     case Result::PERMISSION_DENIED_BY_SYSTEM:
     case Result::PERMISSION_DISMISSED:
+    case Result::SAFE_BROWSING_OBSERVER:
     case Result::INVALID_DEVICE_TYPE_REQUEST:
       // TODO(crbug.com/453600255): Use `result_enum` kAbortError for
       // INVALID_DEVICE_TYPE_REQUEST once all new enum values are added.
@@ -977,6 +978,11 @@
     case Result::CAPTURED_TAB_DESTROYED:
       // TODO(crbug.com/453600255): Use `result_enum` kNotFoundError for
       // CAPTURED_TAB_DESTROYED once all new enum values are added.
+    case Result::CAPTURE_NOT_ENABLED:
+    case Result::CAPTURE_NOT_ALLOWED_FOR_LONG_DOMAINS:
+    case Result::CAPTURE_FROM_BACKGROUND_PAGE_ON_MAC:
+      // TODO(crbug.com/453600255): Use `result_enum` kInvalidStateError for
+      // CAPTURE_FROM_BACKGROUND_PAGE_ON_MAC once all new enum values are added.
     case Result::TAB_CAPTURE_FAILURE:
     case Result::STREAM_NOT_FOUND_IN_REGISTRY:
     case Result::REGISTRY_REQUEST_UNVERIFIED:
diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_context.h b/third_party/blink/renderer/platform/loader/fetch/fetch_context.h
index cc16d8f7..cfde8379 100644
--- a/third_party/blink/renderer/platform/loader/fetch/fetch_context.h
+++ b/third_party/blink/renderer/platform/loader/fetch/fetch_context.h
@@ -220,11 +220,14 @@
   // which case it checks the latter. If `out_rule` is non-null and the
   // SubresourceFilter identifies the current resource as an ad based on its
   // URL, then `out_rule` will be populated with the matching filterlist rule.
+  // `scan_stack_for_ads` should be true once per request, and should be called
+  // while the v8 stack that triggered this request is still available.
   virtual bool CalculateIfAdSubresource(
       const ResourceRequestHead& resource_request,
       base::optional_ref<const KURL> alias_url,
       ResourceType type,
       const FetchInitiatorInfo& initiator_info,
+      bool scan_stack_for_ads,
       subresource_filter::ScopedRule* out_rule) {
     return false;
   }
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
index 0bb40a7..b6460db 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
@@ -622,7 +622,8 @@
 
     if (Context().CalculateIfAdSubresource(
             *new_request, /*alias_url=*/std::nullopt, resource_type,
-            options.initiator_info, /*out_rule=*/nullptr)) {
+            options.initiator_info, /*scan_stack_for_ads=*/false,
+            /*out_rule=*/nullptr)) {
       new_request->SetIsAdResource();
     }
 
@@ -1539,7 +1540,8 @@
     if (!resource_->GetResourceRequest().IsAdResource() &&
         Context().CalculateIfAdSubresource(
             resource_->GetResourceRequest(), alias_url, resource_type,
-            options.initiator_info, /*out_rule=*/nullptr)) {
+            options.initiator_info, /*scan_stack_for_ads=*/false,
+            /*out_rule=*/nullptr)) {
       resource_->SetIsAdResource();
       cname_alias_info_for_testing_.was_ad_tagged_based_on_alias = true;
     }
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_request_utils.cc b/third_party/blink/renderer/platform/loader/fetch/resource_request_utils.cc
index 77e02f52..02e1922 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_request_utils.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_request_utils.cc
@@ -205,7 +205,8 @@
 
   if (context.CalculateIfAdSubresource(
           resource_request, /*alias_url=*/std::nullopt, resource_type,
-          options.initiator_info, /*out_rule=*/nullptr)) {
+          options.initiator_info, /*scan_stack_for_ads=*/false,
+          /*out_rule=*/nullptr)) {
     resource_request.SetIsAdResource();
   }
 
@@ -312,7 +313,8 @@
 
   if (context.CalculateIfAdSubresource(
           resource_request, /*alias_url=*/std::nullopt, resource_type,
-          options.initiator_info, /*out_rule=*/nullptr)) {
+          options.initiator_info, /*scan_stack_for_ads=*/true,
+          /*out_rule=*/nullptr)) {
     resource_request.SetIsAdResource();
   }
   if (blocked_reason) {
diff --git a/third_party/blink/renderer/platform/loader/testing/mock_fetch_context.h b/third_party/blink/renderer/platform/loader/testing/mock_fetch_context.h
index 70b3211..a08b537 100644
--- a/third_party/blink/renderer/platform/loader/testing/mock_fetch_context.h
+++ b/third_party/blink/renderer/platform/loader/testing/mock_fetch_context.h
@@ -116,6 +116,7 @@
       base::optional_ref<const KURL> alias_url,
       ResourceType type,
       const FetchInitiatorInfo& initiator_info,
+      bool scan_stack_for_ads,
       subresource_filter::ScopedRule* out_rule) override {
     const KURL url =
         alias_url.has_value() ? alias_url.value() : resource_request.Url();
diff --git a/third_party/blink/renderer/platform/widget/widget_base.cc b/third_party/blink/renderer/platform/widget/widget_base.cc
index 0896ed98..c5d467a 100644
--- a/third_party/blink/renderer/platform/widget/widget_base.cc
+++ b/third_party/blink/renderer/platform/widget/widget_base.cc
@@ -814,15 +814,11 @@
                      std::move(render_frame_metadata_observer_remote),
                      std::move(render_frame_metadata_observer),
                      std::move(params), std::move(callback));
-  bool needs_sync_composite_for_test =
-      layer_tree_view_ && LayerTreeHost()->in_composite_for_test();
-  if (base::FeatureList::IsEnabled(features::kEstablishGpuChannelAsync) &&
-      !needs_sync_composite_for_test) {
-    Platform::Current()->EstablishGpuChannel(std::move(finish_callback));
+  if (layer_tree_view_ && LayerTreeHost()->in_composite_for_test()) {
+    std::move(finish_callback)
+        .Run(Platform::Current()->EstablishGpuChannelSync());
   } else {
-    scoped_refptr<gpu::GpuChannelHost> gpu_channel_host =
-        Platform::Current()->EstablishGpuChannelSync();
-    std::move(finish_callback).Run(gpu_channel_host);
+    Platform::Current()->EstablishGpuChannel(std::move(finish_callback));
   }
 }
 
diff --git a/third_party/blink/renderer/platform/widget/widget_base.h b/third_party/blink/renderer/platform/widget/widget_base.h
index b0c594a3..ccb287a9 100644
--- a/third_party/blink/renderer/platform/widget/widget_base.h
+++ b/third_party/blink/renderer/platform/widget/widget_base.h
@@ -435,8 +435,7 @@
 
   // Finishes the call to RequestNewLayerTreeFrameSink() once the
   // |gpu_channel_host| is available.
-  // TODO(crbug.com/1278147): Clean up these parameters using either a struct or
-  // saving on WidgetBase if kEstablishGpuChannelAsync launches.
+  // TODO(crbug.com/40208065): Clean up these parameters using a struct.
   void FinishRequestNewLayerTreeFrameSink(
       const KURL& url,
       mojo::PendingReceiver<viz::mojom::blink::CompositorFrameSink>
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 35ca1c47..eabf4415 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1830,9 +1830,6 @@
 
 crbug.com/1204498 external/wpt/service-workers/service-worker/client-navigate.https.html [ Failure Pass Timeout ]
 
-# crbug.com/40771785 This test fails when SplitCacheByNetworkIsolationKey is enabled.
-crbug.com/40771785 http/tests/devtools/network/network-prefetch.js [ Failure ]
-
 # On all platforms media tests don't currently use gpu-accelerated (proprietary)
 # codecs, so no benefit to running them again with gpu acceleration enabled.
 crbug.com/555703 virtual/media-gpu-accelerated/* [ Failure Skip ]
@@ -2125,8 +2122,6 @@
 crbug.com/808834 [ Linux ] external/wpt/css/css-pseudo/first-letter-001.html [ Failure ]
 crbug.com/808834 [ Win ] external/wpt/css/css-pseudo/first-letter-001.html [ Failure ]
 
-crbug.com/41320107 virtual/threaded/http/tests/devtools/tracing/idle-callback.js [ Crash Failure Pass Timeout ]
-
 # failures in external/wpt/css/css-animations/ and web-animations/ from Mozilla tests
 crbug.com/849859 external/wpt/css/css-animations/Element-getAnimations-dynamic-changes.tentative.html [ Failure ]
 
@@ -9148,14 +9143,10 @@
 # Temporarily disable tests to land frontend changes
 crbug.com/325441197 http/tests/devtools/elements/elements-panel-limited-children.js [ Failure Pass ]
 crbug.com/325441197 http/tests/devtools/elements/inspect-limited-children.js [ Failure Pass ]
-crbug.com/325441197 http/tests/devtools/elements/styles/show-all-properties.js [ Failure Pass ]
 crbug.com/325441197 http/tests/devtools/security/origin-view-ct-compliance.js [ Failure Pass ]
 crbug.com/325441197 http/tests/devtools/security/origin-view-noncryptographic-secure-origin.js [ Failure Pass ]
 crbug.com/325441197 http/tests/devtools/security/origin-view-then-interstitial.js [ Failure Pass ]
 crbug.com/325441197 http/tests/devtools/security/security-details-updated-with-security-state.js [ Failure Pass ]
-crbug.com/325441197 http/tests/devtools/security/security-explanation-ordering.js [ Failure Pass ]
-crbug.com/325441197 http/tests/devtools/service-workers/service-workers-redundant.js [ Failure Pass ]
-crbug.com/325441197 http/tests/devtools/service-workers/service-workers-view.js [ Failure Pass ]
 crbug.com/325441197 http/tests/devtools/a11y-axe-core/sources/global-listeners-sidebar-a11y-test.js [ Failure Pass ]
 crbug.com/325441197 http/tests/devtools/elements/event-listener-sidebar-custom-framework.js [ Failure Pass ]
 crbug.com/325441197 http/tests/devtools/elements/event-listener-sidebar-jquery1.js [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/document-rules-details-element.https.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/document-rules-details-element.https.html
new file mode 100644
index 0000000..923f584
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/document-rules-details-element.https.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<title>Speculation rules: no crash with selector_matches and details element</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/utils.js"></script>
+
+<body>
+<script>
+  setup(() => assertSpeculationRulesIsSupported());
+
+  // This test verifies that using selector_matches with links inside a
+  // <details> element does not cause a crash. This is a regression test for
+  // a bug where forcing style computation on links inside a closed <details>
+  // element would cause DidStyleChildren to incorrectly remove links from
+  // stale_links_, leading to a DCHECK failure in CSSSelectorPredicate::Matches.
+  test(() => {
+    // Create a closed details element with a link inside.
+    const details = document.createElement('details');
+    document.body.appendChild(details);
+
+    const summary = document.createElement('summary');
+    summary.textContent = 'Click to expand';
+    details.appendChild(summary);
+
+    const link = document.createElement('a');
+    link.href = 'https://example.com/test';
+    link.className = 'test-link';
+    link.textContent = 'Link inside details';
+    details.appendChild(link);
+
+    // Insert a document rule with selector_matches.
+    const script = document.createElement('script');
+    script.type = 'speculationrules';
+    script.textContent = JSON.stringify({
+      prefetch: [{
+        source: 'document',
+        eagerness: 'immediate',
+        where: { selector_matches: 'a.test-link' }
+      }]
+    });
+    document.head.appendChild(script);
+
+    // Force style computation on the link. This triggers a forced update
+    // which temporarily allows style computation on display-locked elements.
+    // Before the fix, this would cause a crash when the speculation rules
+    // tried to match the selector against the link.
+    getComputedStyle(link).display;
+
+    // If we get here without crashing, the test passes.
+    assert_true(true, 'No crash occurred');
+  }, 'selector_matches with link inside closed details should not crash');
+
+  test(() => {
+    // Create a closed details element with a link inside.
+    const details = document.createElement('details');
+    document.body.appendChild(details);
+
+    const summary = document.createElement('summary');
+    summary.textContent = 'Click to expand';
+    details.appendChild(summary);
+
+    const link = document.createElement('a');
+    link.href = 'https://example.com/test2';
+    link.className = 'toggle-link';
+    link.textContent = 'Link for toggle test';
+    details.appendChild(link);
+
+    // Insert a document rule with selector_matches.
+    const script = document.createElement('script');
+    script.type = 'speculationrules';
+    script.textContent = JSON.stringify({
+      prefetch: [{
+        source: 'document',
+        eagerness: 'immediate',
+        where: { selector_matches: 'a.toggle-link' }
+      }]
+    });
+    document.head.appendChild(script);
+
+    // Rapidly toggle the details element and force style computation.
+    for (let i = 0; i < 10; i++) {
+      details.open = !details.open;
+      getComputedStyle(link).display;
+    }
+
+    // Ensure details is closed at the end.
+    details.open = false;
+    getComputedStyle(link).display;
+
+    // If we get here without crashing, the test passes.
+    assert_true(true, 'No crash occurred during rapid toggling');
+  }, 'Rapid toggling of details with selector_matches should not crash');
+
+</script>
+</body>
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles/show-all-properties-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/styles/show-all-properties-expected.txt
index 43ff64f..ae098719 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/styles/show-all-properties-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles/show-all-properties-expected.txt
@@ -56,7 +56,7 @@
     --var-47: 47px;
     --var-48: 48px;
     --var-49: 49px;
-Show All Properties (150 more)
+Show all properties (150 more)
 
 [expanded] 
 div { (user agent stylesheet)
diff --git a/third_party/blink/web_tests/http/tests/devtools/network/network-prefetch-expected.txt b/third_party/blink/web_tests/http/tests/devtools/network/network-prefetch-expected.txt
deleted file mode 100644
index 600c418a..0000000
--- a/third_party/blink/web_tests/http/tests/devtools/network/network-prefetch-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-fromPrefetchCache flag must be set for prefetched resousces.
-
-http://127.0.0.1:8000/devtools/network/resources/network-prefetch-target.html
-fromPrefetchCache: true
-
diff --git a/third_party/blink/web_tests/http/tests/devtools/network/network-prefetch.js b/third_party/blink/web_tests/http/tests/devtools/network/network-prefetch.js
deleted file mode 100644
index 0d613f1..0000000
--- a/third_party/blink/web_tests/http/tests/devtools/network/network-prefetch.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// 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';
-
-(async function() {
-  TestRunner.addResult(`fromPrefetchCache flag must be set for prefetched resousces.\n`);
-
-  await TestRunner.showPanel('network');
-  const ret = await TestRunner.evaluateInPageAsync(`
-    (function(){
-      return new Promise(resolve => {
-        const link = document.createElement('link');
-        link.rel = 'prefetch';
-        link.href = 'resources/network-prefetch-target.html';
-        link.addEventListener('load', resolve);
-        document.body.appendChild(link);
-      });
-    })();
-  `);
-  NetworkTestRunner.recordNetwork();
-  await TestRunner.addIframe('resources/network-prefetch-target.html');
-  var request1 = NetworkTestRunner.networkRequests().pop();
-  TestRunner.addResult(request1.url());
-  TestRunner.addResult('fromPrefetchCache: ' + request1.fromPrefetchCache());
-  TestRunner.completeTest();
-})();
diff --git a/third_party/blink/web_tests/http/tests/devtools/network/resources/network-prefetch-target.html b/third_party/blink/web_tests/http/tests/devtools/network/resources/network-prefetch-target.html
deleted file mode 100644
index 0b2e28f..0000000
--- a/third_party/blink/web_tests/http/tests/devtools/network/resources/network-prefetch-target.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<!DOCTYPE html>
-<title>Prefetch target</title>
diff --git a/third_party/blink/web_tests/http/tests/devtools/security/security-explanation-ordering-expected.txt b/third_party/blink/web_tests/http/tests/devtools/security/security-explanation-ordering-expected.txt
index 4ce11ce..815fab2 100644
--- a/third_party/blink/web_tests/http/tests/devtools/security/security-explanation-ordering-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/security/security-explanation-ordering-expected.txt
@@ -3,10 +3,10 @@
 <DIV class=security-explanation security-explanation-secure >
     <DEVTOOLS-ICON role=presentation name=lock class=security-property security-property-secure >
         <#document-fragment >
-            <SPAN style=--icon-url: var(--image-file-lock); >
-            </SPAN>
             <STYLE >
             </STYLE>
+            <SPAN style=--icon-url: var(--image-file-lock); >
+            </SPAN>
         </#document-fragment>
     </DEVTOOLS-ICON>
     <DIV class=security-explanation-text >
@@ -24,6 +24,24 @@
         <DEVTOOLS-BUTTON role=button class=origin-button jslog=Action; track: click; context: security.view-certificate >
 View certificate
             <#document-fragment >
+                <#comment >
+                </#comment>
+                <STYLE >
+                    <#comment >
+                    </#comment>
+                    <#comment >
+                    </#comment>
+                </STYLE>
+                <BUTTON class=outlined >
+                    <#comment >
+                    </#comment>
+                    <#comment >
+                    </#comment>
+                    <#comment >
+                    </#comment>
+                    <SLOT >
+                    </SLOT>
+                </BUTTON>
             </#document-fragment>
         </DEVTOOLS-BUTTON>
     </DIV>
@@ -31,10 +49,10 @@
 <DIV class=security-explanation security-explanation-secure >
     <DEVTOOLS-ICON role=presentation name=lock class=security-property security-property-secure >
         <#document-fragment >
-            <SPAN style=--icon-url: var(--image-file-lock); >
-            </SPAN>
             <STYLE >
             </STYLE>
+            <SPAN style=--icon-url: var(--image-file-lock); >
+            </SPAN>
         </#document-fragment>
     </DEVTOOLS-ICON>
     <DIV class=security-explanation-text >
@@ -52,12 +70,12 @@
     </DIV>
 </DIV>
 <DIV class=security-explanation security-explanation-info >
-    <DEVTOOLS-ICON role=presentation name=info class=security-property security-property-info >
+    <DEVTOOLS-ICON role=presentation name=indeterminate-question-box class=security-property security-property-info >
         <#document-fragment >
-            <SPAN style=--icon-url: var(--image-file-info); >
-            </SPAN>
             <STYLE >
             </STYLE>
+            <SPAN style=--icon-url: var(--image-file-indeterminate-question-box); >
+            </SPAN>
         </#document-fragment>
     </DEVTOOLS-ICON>
     <DIV class=security-explanation-text >
@@ -75,12 +93,12 @@
     </DIV>
 </DIV>
 <DIV class=security-explanation security-explanation-info >
-    <DEVTOOLS-ICON role=presentation name=info class=security-property security-property-info >
+    <DEVTOOLS-ICON role=presentation name=indeterminate-question-box class=security-property security-property-info >
         <#document-fragment >
-            <SPAN style=--icon-url: var(--image-file-info); >
-            </SPAN>
             <STYLE >
             </STYLE>
+            <SPAN style=--icon-url: var(--image-file-indeterminate-question-box); >
+            </SPAN>
         </#document-fragment>
     </DEVTOOLS-ICON>
     <DIV class=security-explanation-text >
diff --git a/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-redundant-expected.txt b/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-redundant-expected.txt
index 90c40707..5bec48c 100644
--- a/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-redundant-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-redundant-expected.txt
@@ -11,14 +11,14 @@
 Received
 Status
 #N activated and is running
-stop
+Stop
 Clients
 Push
 Push
 Sync
 Sync
-Periodic Sync
-Periodic Sync
+Periodic sync
+Periodic sync
 Update Cycle
 Version
 Update Activity
@@ -50,7 +50,7 @@
 Received
 Status
 #N activated and is running
-stop
+Stop
 #N waiting to activate
 skipWaiting
 Received
@@ -59,8 +59,8 @@
 Push
 Sync
 Sync
-Periodic Sync
-Periodic Sync
+Periodic sync
+Periodic sync
 Update Cycle
 Version
 Update Activity
@@ -92,14 +92,14 @@
 Received
 Status
 #N activated and is running
-stop
+Stop
 Clients
 Push
 Push
 Sync
 Sync
-Periodic Sync
-Periodic Sync
+Periodic sync
+Periodic sync
 Update Cycle
 Version
 Update Activity
diff --git a/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-view-expected.txt b/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-view-expected.txt
index 3ce26a9..f9ba455 100644
--- a/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-view-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/service-workers/service-workers-view-expected.txt
@@ -11,14 +11,14 @@
 Received
 Status
 #N activated and is running
-stop
+Stop
 Clients
 Push
 Push
 Sync
 Sync
-Periodic Sync
-Periodic Sync
+Periodic sync
+Periodic sync
 Update Cycle
 Version
 Update Activity
@@ -48,14 +48,14 @@
 Received
 Status
 #N activated and is running
-stop
+Stop
 Clients
 Push
 Push
 Sync
 Sync
-Periodic Sync
-Periodic Sync
+Periodic sync
+Periodic sync
 Update Cycle
 Version
 Update Activity
@@ -84,14 +84,14 @@
 Received
 Status
 #N activated and is running
-stop
+Stop
 Clients
 Push
 Push
 Sync
 Sync
-Periodic Sync
-Periodic Sync
+Periodic sync
+Periodic sync
 Update Cycle
 Version
 Update Activity
@@ -121,14 +121,14 @@
 Received
 Status
 #N activated and is running
-stop
+Stop
 Clients
 Push
 Push
 Sync
 Sync
-Periodic Sync
-Periodic Sync
+Periodic sync
+Periodic sync
 Update Cycle
 Version
 Update Activity
@@ -162,8 +162,8 @@
 Push
 Sync
 Sync
-Periodic Sync
-Periodic Sync
+Periodic sync
+Periodic sync
 Update Cycle
 Version
 Update Activity
diff --git a/third_party/blink/web_tests/virtual/threaded/http/tests/devtools/isolated-code-cache/README.txt b/third_party/blink/web_tests/virtual/threaded/http/tests/devtools/isolated-code-cache/README.txt
deleted file mode 100644
index 5a5ba8b1..0000000
--- a/third_party/blink/web_tests/virtual/threaded/http/tests/devtools/isolated-code-cache/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-This suite runs the tests in devtools/isolated-code-cache with a threaded
-compositor. This is required for requestIdleCallback to work.
diff --git a/third_party/blink/web_tests/virtual/threaded/http/tests/devtools/tracing/README.txt b/third_party/blink/web_tests/virtual/threaded/http/tests/devtools/tracing/README.txt
deleted file mode 100644
index 886785dd..0000000
--- a/third_party/blink/web_tests/virtual/threaded/http/tests/devtools/tracing/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-# This suite runs the tests in LayoutTests/inspector/tracing with additional flags.
-# See the virtual_test_suites() method in tools/blinkpy/web_tests/port/base.py.
diff --git a/third_party/blink/web_tests/virtual/threaded/http/tests/devtools/tracing/idle-callback-expected.txt b/third_party/blink/web_tests/virtual/threaded/http/tests/devtools/tracing/idle-callback-expected.txt
deleted file mode 100644
index 524a294..0000000
--- a/third_party/blink/web_tests/virtual/threaded/http/tests/devtools/tracing/idle-callback-expected.txt
+++ /dev/null
@@ -1,91 +0,0 @@
-Tests Timeline events emitted when idle callback is scheduled and fired.
-
-RequestIdleCallback Properties:
-{
-    data : {
-        frame : <string>
-        id : <number>
-        stackTrace : <object>
-        timeout : 0
-    }
-    endTime : <number>
-    frameId : <string>
-    stackTrace : <object>
-    startTime : <number>
-    type : "RequestIdleCallback"
-}
-Text details for RequestIdleCallback: idle-callback.html:10
-RequestIdleCallback Properties:
-{
-    data : {
-        frame : <string>
-        id : <number>
-        stackTrace : <object>
-        timeout : 0
-    }
-    endTime : <number>
-    frameId : <string>
-    stackTrace : <object>
-    startTime : <number>
-    type : "RequestIdleCallback"
-}
-Text details for RequestIdleCallback: idle-callback.html:12
-RequestIdleCallback Properties:
-{
-    data : {
-        frame : <string>
-        id : <number>
-        stackTrace : <object>
-        timeout : 0
-    }
-    endTime : <number>
-    frameId : <string>
-    stackTrace : <object>
-    startTime : <number>
-    type : "RequestIdleCallback"
-}
-Text details for RequestIdleCallback: idle-callback.html:15
-CancelIdleCallback Properties:
-{
-    data : {
-        frame : <string>
-        id : <number>
-        stackTrace : <object>
-    }
-    endTime : <number>
-    frameId : <string>
-    stackTrace : <object>
-    startTime : <number>
-    type : "CancelIdleCallback"
-}
-Text details for CancelIdleCallback: idle-callback.html:11
-FireIdleCallback Properties:
-{
-    data : {
-        allottedMilliseconds : <number>
-        frame : <string>
-        id : <number>
-        timedOut : <boolean>
-    }
-    endTime : <number>
-    frameId : <string>
-    startTime : <number>
-    type : "FireIdleCallback"
-}
-Text details for FireIdleCallback: idle-callback.html:12
-FireIdleCallback Properties:
-{
-    data : {
-        allottedMilliseconds : <number>
-        frame : <string>
-        id : <number>
-        timedOut : <boolean>
-    }
-    endTime : <number>
-    frameId : <string>
-    startTime : <number>
-    type : "FireIdleCallback"
-}
-Text details for FireIdleCallback: idle-callback.html:15
-FireIdleCallback has a warning
-
diff --git a/third_party/blink/web_tests/virtual/threaded/http/tests/devtools/tracing/idle-callback.js b/third_party/blink/web_tests/virtual/threaded/http/tests/devtools/tracing/idle-callback.js
deleted file mode 100644
index 6474c43d..0000000
--- a/third_party/blink/web_tests/virtual/threaded/http/tests/devtools/tracing/idle-callback.js
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(async function() {
-  TestRunner.addResult(`Tests Timeline events emitted when idle callback is scheduled and fired.\n`);
-  await TestRunner.loadModule('performance_test_runner');
-  await TestRunner.evaluateInPagePromise(`
-      function performActions(idleWarningAddOn)
-      {
-          var callback;
-          var promise = new Promise((fulfill) => callback = fulfill);
-          var requestId = window.requestIdleCallback(idleCallback);
-          window.cancelIdleCallback(requestId);
-          window.requestIdleCallback(idleCallback);
-          function idleCallback()
-          {
-              window.requestIdleCallback(slowIdleCallback);
-          }
-          function slowIdleCallback(deadline)
-          {
-              while (deadline.timeRemaining()) {};
-              var addOnDeadline = performance.now() + idleWarningAddOn;
-              while (performance.now() < addOnDeadline) {};
-              if (callback)
-                  callback();
-          }
-          return promise;
-      }
-  `);
-
-  PerformanceTestRunner.invokeAsyncWithTimeline(
-      `(() => performActions(${TimelineModel.TimelineModel.Thresholds.IdleCallbackAddon}))`, finish);
-
-  function finish() {
-    PerformanceTestRunner.printTimelineRecordsWithDetails('RequestIdleCallback');
-    PerformanceTestRunner.printTimelineRecordsWithDetails('CancelIdleCallback');
-    PerformanceTestRunner.printTimelineRecordsWithDetails('FireIdleCallback');
-    TestRunner.completeTest();
-  }
-})();
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-typed-om/random.html b/third_party/blink/web_tests/wpt_internal/css/css-typed-om/random.html
index a200269..1b0062a 100644
--- a/third_party/blink/web_tests/wpt_internal/css/css-typed-om/random.html
+++ b/third_party/blink/web_tests/wpt_internal/css/css-typed-om/random.html
@@ -99,4 +99,8 @@
   assert_less_than_equal(computedHeight.value, 300);
 }, 'CSSMathRandom random(min, max) with px');
 
+test(t => {
+  const target = document.getElementById("test");
+  target.style.scale = new CSSScale(new CSSMathRandom(0.3, 1, 3), 3);
+}, 'CSSMathRandom in CSSScale not crash');
 </script>
\ No newline at end of file
diff --git a/third_party/chromite b/third_party/chromite
index eec00b3..4822269 160000
--- a/third_party/chromite
+++ b/third_party/chromite
@@ -1 +1 @@
-Subproject commit eec00b35328af2e160bfc59e1c7f85c75cf049dd
+Subproject commit 48222691c960596767a373b752130b684ab0f776
diff --git a/third_party/dawn b/third_party/dawn
index d07825e..6a6f6d3 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit d07825efa003125c46a2819c37081dbde0528277
+Subproject commit 6a6f6d3d7fd705597a8a94c2d1e041b8b8e70b43
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 9d9a726..dbb61cf 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 9d9a7262df8a7db685524e449c0c08fc3f5f0e8c
+Subproject commit dbb61cf4b27a8ca13ac62ce7b72c22ad2664b460
diff --git a/third_party/harfbuzz-ng/BUILD.gn b/third_party/harfbuzz-ng/BUILD.gn
index 2b71f831..8c93f98 100644
--- a/third_party/harfbuzz-ng/BUILD.gn
+++ b/third_party/harfbuzz-ng/BUILD.gn
@@ -98,6 +98,7 @@
       "src/src/hb-aat-map.hh",
       "src/src/hb-aat.h",
       "src/src/hb-algs.hh",
+      "src/src/hb-alloc-pool.hh",
       "src/src/hb-array.hh",
       "src/src/hb-atomic.hh",
       "src/src/hb-bimap.hh",
@@ -134,6 +135,7 @@
       "src/src/hb-font.cc",
       "src/src/hb-font.hh",
       "src/src/hb-fontations.h",
+      "src/src/hb-free-pool.hh",
       "src/src/hb-geometry.hh",
       "src/src/hb-harfrust.cc",
       "src/src/hb-icu.cc",
@@ -252,7 +254,6 @@
       "src/src/hb-ot-var-varc-table.hh",
       "src/src/hb-ot-var.cc",
       "src/src/hb-ot-vorg-table.hh",
-      "src/src/hb-pool.hh",
       "src/src/hb-priority-queue.hh",
       "src/src/hb-repacker.hh",
       "src/src/hb-sanitize.hh",
diff --git a/third_party/harfbuzz-ng/README.chromium b/third_party/harfbuzz-ng/README.chromium
index 02fa727..3fc4e44 100644
--- a/third_party/harfbuzz-ng/README.chromium
+++ b/third_party/harfbuzz-ng/README.chromium
@@ -1,10 +1,10 @@
 Name: harfbuzz-ng
 Short Name: harfbuzz-ng
 URL: http://harfbuzz.org
-Version: 11.4.4-6
-CPEPrefix: cpe:/a:harfbuzz_project:harfbuzz:11.4.4
-Date: 2025-08-26
-Revision: 7d936359a27abb2d7cb14ecc102463bb15c11843
+Version: 12.2.0-55
+CPEPrefix: cpe:/a:harfbuzz_project:harfbuzz:12.2.0
+Date: 2025-12-08
+Revision: 31695252eb6ed25096893aec7f848889dad874bc
 Update Mechanism: Manual
 Security Critical: yes
 Shipped: yes
diff --git a/third_party/harfbuzz-ng/src b/third_party/harfbuzz-ng/src
index 7d93635..3169525 160000
--- a/third_party/harfbuzz-ng/src
+++ b/third_party/harfbuzz-ng/src
@@ -1 +1 @@
-Subproject commit 7d936359a27abb2d7cb14ecc102463bb15c11843
+Subproject commit 31695252eb6ed25096893aec7f848889dad874bc
diff --git a/third_party/libc++/src b/third_party/libc++/src
index 07572e7..c03062d 160000
--- a/third_party/libc++/src
+++ b/third_party/libc++/src
@@ -1 +1 @@
-Subproject commit 07572e7b169225ef3a999584cba9d9004631ae66
+Subproject commit c03062d6c9382e7eeb455660308f4d2652b700bd
diff --git a/third_party/llvm-libc/src b/third_party/llvm-libc/src
index a351f264..03f822d 160000
--- a/third_party/llvm-libc/src
+++ b/third_party/llvm-libc/src
@@ -1 +1 @@
-Subproject commit a351f26463daf1887755e0cd622b0d8bf753cd9f
+Subproject commit 03f822d2a88c8f68f6a92c5cb3e79ccc3002e8a9
diff --git a/third_party/perfetto b/third_party/perfetto
index ec42dd38..46644e5 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit ec42dd387c2ab14c7369136e86898be936248315
+Subproject commit 46644e5dfbad39286dbb24876d2b0d29fc83fb22
diff --git a/third_party/skia b/third_party/skia
index d5a6b6a..767c4ce 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit d5a6b6af6d12b261a917c19a3504193c2472ae63
+Subproject commit 767c4ce9e29cb4ef69b48ca0c83048381fe14235
diff --git a/third_party/swiftshader b/third_party/swiftshader
index 518a9f6..42f6e05 160000
--- a/third_party/swiftshader
+++ b/third_party/swiftshader
@@ -1 +1 @@
-Subproject commit 518a9f63228dceb1c77d778f694bd319909075ab
+Subproject commit 42f6e059416806f28b7078b5ca67856b28a2cbb0
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps
index 53bfad2..8b33d33 160000
--- a/third_party/vulkan-deps
+++ b/third_party/vulkan-deps
@@ -1 +1 @@
-Subproject commit 53bfad22ed15add63473fce8301a2863436117d0
+Subproject commit 8b33d336e1abd821451118bfc47ef163b8becb1a
diff --git a/third_party/vulkan-validation-layers/src b/third_party/vulkan-validation-layers/src
index 2e94023..c715441 160000
--- a/third_party/vulkan-validation-layers/src
+++ b/third_party/vulkan-validation-layers/src
@@ -1 +1 @@
-Subproject commit 2e94023f2581aaa7f5a4d6fe0ee670d9b5e10187
+Subproject commit c715441d1d69d96db0105e44ddac21c0720922ea
diff --git a/third_party/webrtc b/third_party/webrtc
index bfe5317..7442f8c 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit bfe531707560d16644de452e51e2c4fe40c46b91
+Subproject commit 7442f8c253a726265aad5e24b035e53e4d5249a1
diff --git a/tools/bisect-builds.py b/tools/bisect-builds.py
index c0eda09..13ce759 100755
--- a/tools/bisect-builds.py
+++ b/tools/bisect-builds.py
@@ -1967,11 +1967,22 @@
     change_log_url_fn = GetShortChangeLogURL
 
   if verify_range:
-    good_rev_fetch = archive_build.get_download_job(rev_list[0],
-                                                    'good_rev_fetch').start()
-    bad_rev_fetch = archive_build.get_download_job(rev_list[-1],
-                                                   'bad_rev_fetch').start()
+    good_rev_fetch = None
+    bad_rev_fetch = None
     try:
+      bad_rev_fetch = archive_build.get_download_job(rev_list[-1],
+                                                    'bad_rev_fetch').start()
+      bad_download = bad_rev_fetch.wait_for()
+      # Start fetching the good revision in parallel with the bad evaluation.
+      good_rev_fetch = archive_build.get_download_job(rev_list[0],
+                                                      'good_rev_fetch').start()
+      answer = EvaluateRevision(archive_build, bad_download, rev_list[-1],
+                                try_args, evaluate)
+      if answer != 'b':
+        print(f'Expecting revision {rev_list[-1]} to be bad but got {answer}. '
+              'Please make sure that the issue can be reproduced for --bad.')
+        raise SystemExit
+
       good_download = good_rev_fetch.wait_for()
       answer = EvaluateRevision(archive_build, good_download, rev_list[0],
                                 try_args, evaluate)
@@ -1979,19 +1990,14 @@
         print(f'Expecting revision {rev_list[0]} to be good but got {answer}. '
               'Please make sure the --good is a good revision.')
         raise SystemExit
-      bad_download = bad_rev_fetch.wait_for()
-      answer = EvaluateRevision(archive_build, bad_download, rev_list[-1],
-                                try_args, evaluate)
-      if answer != 'b':
-        print(f'Expecting revision {rev_list[-1]} to be bad but got {answer}. '
-              'Please make sure that the issue can be reproduced for --bad.')
-        raise SystemExit
     except (KeyboardInterrupt, SystemExit):
       print('Cleaning up...')
       return None, None
     finally:
-      good_rev_fetch.stop()
-      bad_rev_fetch.stop()
+      if good_rev_fetch:
+        good_rev_fetch.stop()
+      if bad_rev_fetch:
+        bad_rev_fetch.stop()
 
   prefetch = {}
   try:
diff --git a/tools/dump_process_memory/dump_process.cc b/tools/dump_process_memory/dump_process.cc
index 5384e10..d90177d 100644
--- a/tools/dump_process_memory/dump_process.cc
+++ b/tools/dump_process_memory/dump_process.cc
@@ -165,9 +165,8 @@
         ((region.start / kPageSize) + i) * sizeof(PageMapEntry);
     PageMapEntry entry;
     proc_pagemap->Seek(base::File::FROM_BEGIN, pagemap_offset);
-    int size_read = proc_pagemap->ReadAtCurrentPos(
-        reinterpret_cast<char*>(&entry), sizeof(PageMapEntry));
-    if (size_read != sizeof(PageMapEntry)) {
+    if (proc_pagemap->ReadAtCurrentPos(base::byte_span_from_ref(entry)) !=
+        sizeof(PageMapEntry)) {
       PLOG(ERROR) << "Cannot read from /proc/pid/pagemap at offset "
                   << pagemap_offset;
       return false;
@@ -178,22 +177,20 @@
   }
 
   // Writing data page by page to avoid allocating too much memory.
-  std::vector<char> buffer(kPageSize);
+  std::vector<uint8_t> buffer(kPageSize);
   for (size_t i = 0; i < size_in_pages; ++i) {
     uint64_t address = region.start + i * kPageSize;
     // Works because the upper half of the address space is reserved for the
     // kernel on at least ARM64 and x86_64 bit architectures.
     CHECK(address <= std::numeric_limits<int64_t>::max());
     proc_mem->Seek(base::File::FROM_BEGIN, static_cast<int64_t>(address));
-    int size_read = proc_mem->ReadAtCurrentPos(&buffer[0], kPageSize);
-    if (size_read != kPageSize) {
+    if (proc_mem->ReadAtCurrentPos(buffer) != kPageSize) {
       PLOG(ERROR) << "Cannot read from /proc/pid/mem at offset " << address;
       return false;
     }
 
     int64_t output_offset = i * kPageSize;
-    int size_written = output_file.Write(output_offset, &buffer[0], kPageSize);
-    if (size_written != kPageSize) {
+    if (output_file.Write(output_offset, buffer) != kPageSize) {
       PLOG(ERROR) << "Cannot write to output file";
       return false;
     }
diff --git a/tools/metrics/histograms/metadata/android/enums.xml b/tools/metrics/histograms/metadata/android/enums.xml
index 07160cd8..3b297e6 100644
--- a/tools/metrics/histograms/metadata/android/enums.xml
+++ b/tools/metrics/histograms/metadata/android/enums.xml
@@ -673,7 +673,8 @@
   <int value="152" label="Profile.hasCustomHeader"/>
   <int value="153" label="Profile.clearCustomHeader"/>
   <int value="154" label="Profile.clearAllCustomHeaders"/>
-  <int value="155" label="WebSettingsCompat.setBackForwardCacheSettings"/>
+  <int value="155"
+      label="WebSettingsCompat.setBackForwardCacheSettings (deprecated)"/>
   <int value="156" label="WebSettingsCompat.getBackForwardCacheSettings"/>
   <int value="157" label="BackForwardCacheSettings.getTimeoutInSeconds"/>
   <int value="158" label="BackForwardCacheSettings.getMaxPagesInCache"/>
diff --git a/tools/metrics/histograms/metadata/blink/enums.xml b/tools/metrics/histograms/metadata/blink/enums.xml
index 6f0ebe7..125c6d4 100644
--- a/tools/metrics/histograms/metadata/blink/enums.xml
+++ b/tools/metrics/histograms/metadata/blink/enums.xml
@@ -6384,6 +6384,7 @@
   <int value="5743" label="V8Element_ContainerTimingIgnore_AttributeSetter"/>
   <int value="5744" label="ContainerTimingObserverRegistered"/>
   <int value="5745" label="ContainerTimingObserverReportedEntries"/>
+  <int value="5746" label="CookieStoreMaxAge"/>
 </enum>
 
 <!-- LINT.ThenChange(//third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom:WebFeature) -->
diff --git a/tools/metrics/histograms/metadata/mobile/enums.xml b/tools/metrics/histograms/metadata/mobile/enums.xml
index f499afc..07038fc 100644
--- a/tools/metrics/histograms/metadata/mobile/enums.xml
+++ b/tools/metrics/histograms/metadata/mobile/enums.xml
@@ -280,6 +280,7 @@
   <int value="35" label="Image-Link on a Reader Mode page"/>
   <int value="36" label="Link on a Reader Mode page"/>
   <int value="37" label="Tab Group button in the Overflow Menu"/>
+  <int value="38" label="Sad Tab Menu"/>
 </enum>
 
 <enum name="IOSShareAction">
diff --git a/tools/metrics/histograms/metadata/password/enums.xml b/tools/metrics/histograms/metadata/password/enums.xml
index 17aa599a..494c775 100644
--- a/tools/metrics/histograms/metadata/password/enums.xml
+++ b/tools/metrics/histograms/metadata/password/enums.xml
@@ -299,9 +299,10 @@
   <int value="9" label="Passkey stored in Windows Hello"/>
   <int value="10" label="Passkey stored in iCloud Keychain"/>
   <int value="11" label="Passkey stored in Chrome profile"/>
-  <int value="12" label="Passkey other source"/>
+  <int value="12" label="Passkey hybrid flow"/>
   <int value="13" label="Passkey from a security key"/>
-  <int value="14" label="Passkey hybrid flow"/>
+  <int value="14" label="Passkey hybrid or security key"/>
+  <int value="15" label="Passkey unknown source"/>
 </enum>
 
 <!-- LINT.ThenChange(//components/password_manager/core/browser/password_manager_metrics_util.h:BrowserAssistedLoginType) -->
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml
index 2272b6d1..3872af4 100644
--- a/tools/metrics/histograms/metadata/sync/histograms.xml
+++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -322,7 +322,7 @@
 </histogram>
 
 <histogram name="Sync.BookmarkAccountStorageMoveDialog.Download.{Action}"
-    enum="BooleanHit" expires_after="2026-01-01">
+    enum="BooleanHit" expires_after="2026-06-01">
   <owner>amelies@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -344,7 +344,7 @@
 </histogram>
 
 <histogram name="Sync.BookmarkAccountStorageMoveDialog.Upload.{Action}"
-    enum="BookmarkAccountStorageMoveDialogType" expires_after="2026-01-01">
+    enum="BookmarkAccountStorageMoveDialogType" expires_after="2026-06-01">
   <owner>amelies@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
diff --git a/ui/accessibility/mojom/ax_node_data.mojom b/ui/accessibility/mojom/ax_node_data.mojom
index e711ad0e..ff78be5 100644
--- a/ui/accessibility/mojom/ax_node_data.mojom
+++ b/ui/accessibility/mojom/ax_node_data.mojom
@@ -22,9 +22,6 @@
   map<ax.mojom.StringAttribute, string> string_attributes;
   map<ax.mojom.IntAttribute, int32> int_attributes;
   map<ax.mojom.FloatAttribute, float> float_attributes;
-  // If bool_attributes_data is present, bool_attributes will be ignored.
-  // TODO: crbug.com/422234724 - Deprecate when the AXBitset experiment is over.
-  map<ax.mojom.BoolAttribute, bool>? bool_attributes;
   map<ax.mojom.IntListAttribute, array<int32>>
       intlist_attributes;
   map<ax.mojom.StringListAttribute, array<string>>
diff --git a/ui/accessibility/mojom/ax_node_data_mojom_traits.cc b/ui/accessibility/mojom/ax_node_data_mojom_traits.cc
index 29e44b4..7414fa88 100644
--- a/ui/accessibility/mojom/ax_node_data_mojom_traits.cc
+++ b/ui/accessibility/mojom/ax_node_data_mojom_traits.cc
@@ -56,16 +56,6 @@
 
   if (bitset_from_mojo.has_value()) {
     out->bool_attributes = bitset_from_mojo.value();
-  } else {
-    std::optional<base::flat_map<ax::mojom::BoolAttribute, bool>> map_from_mojo;
-    if (!data.ReadBoolAttributes(&map_from_mojo)) {
-      return false;
-    }
-    if (map_from_mojo.has_value()) {
-      for (const auto& [attr, value] : map_from_mojo.value()) {
-        out->bool_attributes.Set(attr, value);
-      }
-    }
   }
 
   auto& intlist_attributes = out->intlist_attributes.container();
diff --git a/ui/accessibility/mojom/ax_node_data_mojom_traits.h b/ui/accessibility/mojom/ax_node_data_mojom_traits.h
index 8bbb5326..d92f11e 100644
--- a/ui/accessibility/mojom/ax_node_data_mojom_traits.h
+++ b/ui/accessibility/mojom/ax_node_data_mojom_traits.h
@@ -44,13 +44,6 @@
   float_attributes(const ui::AXNodeData& p) {
     return p.float_attributes.container();
   }
-  // Return std::nullopt to prevent writing to the legacy `bool_attributes`
-  // field. The field remains in Mojom only for backward compatibility when
-  // reading.
-  static std::optional<base::flat_map<ax::mojom::BoolAttribute, bool>>
-  bool_attributes(const ui::AXNodeData& p) {
-    return std::nullopt;
-  }
   static std::optional<ui::AXBitset<ax::mojom::BoolAttribute>>
   bool_attributes_data(const ui::AXNodeData& p) {
     return p.bool_attributes;