diff --git a/DEPS b/DEPS
index f49ee136..9a8fed4 100644
--- a/DEPS
+++ b/DEPS
@@ -312,11 +312,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '5ed21229cdd96f23e833046cb6b177ee656f3967',
+  'skia_revision': '7a5b34ce9bbfe214ceee101952190fc44b432944',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '4f5a631dc76e29f03342dade37470c9a0539ce5f',
+  'v8_revision': '858896197cffa32f7e50bf1159718529edc1b3de',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # 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': '0339e4bc4757f5ac2597ca7583df9ec622f822f0',
+  'devtools_frontend_revision': '1c14e2a7b5f957c71e9e1ffe11e2bd09a6769178',
   # 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': '2562ad0ac0307c50c34f291d3f879eb3350c08f3',
+  'dawn_revision': '67ec6b21abee630c159414ce379de2762281d23f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -532,7 +532,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.
-  'compiler_rt_revision': '298fd1dc22321033fb73b4c78ad6e89979e0128c',
+  'compiler_rt_revision': '23fabde38f30838cf001a28e63570136b71e0ece',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling clusterfuzz-data
   # and whatever else without interference from each other.
@@ -1193,7 +1193,7 @@
       'packages': [
           {
               'package': 'chromium/chrome/android/orderfiles/arm',
-              'version': 'cazruRFLVk6i7Uzvsovdqwt6VgbOcOU4Ji6d3QVNMhEC',
+              'version': '3dI0bIk97EbZroZccefgABXuDXpKt5h6eBh72ejJSBIC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -1204,7 +1204,7 @@
       'packages': [
           {
               'package': 'chromium/chrome/android/orderfiles/arm64',
-              'version': '8TFiQtiF-vZ1x1XYK7Mx9YkGrnswvzUVqNNpJgedD-QC',
+              'version': 'x_oR72PeizUGeJ5J_X-_ORjzwnlrknOUKAefrN1KVRIC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -1215,7 +1215,7 @@
       'packages': [
           {
               'package': 'chromium/android_webview/tools/orderfiles/arm',
-              'version': 'EjK4MswSRhtKwUdTPSheYynpsuhEK0dgbq26lLOQmfEC',
+              'version': 'bJEl-C6xT3A3mwjub5kIk5ZK55SJNdxSCZ98Dp3YeRcC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -1226,7 +1226,7 @@
       'packages': [
           {
               'package': 'chromium/android_webview/tools/orderfiles/arm64',
-              'version': 'wN2Rrxvu8pn5g9YH_bU21IyKR3-MvWgv9_LrrK5W2asC',
+              'version': 'QTAIBnikq6CiEP9zgBNWhD64nmY45MvEjVDtr88VXSEC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -1611,7 +1611,7 @@
     'packages': [
       {
         'package': 'chromium/chrome/test/data/variations/cipd',
-        'version': 'z8mmMbla9a6OmM6ObkIleAJDN0LTcp38hGVVvRmKFSAC',
+        'version': 'RaoUO2UL-nMDqrswCRmUxMFiqOeZ3cidTFgTs0WD1w0C',
       },
     ],
     'dep_type': 'cipd',
@@ -1622,7 +1622,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '5f117309cf85351b5d6d528aac6a7a6c10a3a1e3',
+    '7db2a580417bce0e9be1d8539c3d94ea2b9a695d',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -2608,7 +2608,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + 'd972f3eb1be39376d6e296e0fa98e0817d56ee45',
+    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + 'efc223a2387fd7f45ccf51346af95a4ec5f59f69',
 
   'src/base/tracing/test/data': {
     'bucket': 'perfetto',
@@ -2979,7 +2979,7 @@
     Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'),
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '9881db6d2acd8b52c85f16ae2d1a4f4617396bbc',
+    Var('webrtc_git') + '/src.git' + '@' + '5e6ccdf2d66b38451bdcf254b1c3451cdbeff71d',
 
   # 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.
@@ -3123,7 +3123,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'QvtER0lzp0QzSAVTe5mpS05BVQykBzueOwzW8ikQx_MC',
+        'version': 'cV-xXUukgohZpKnI47CqykKr2JzWvfVcPSgU3uV5GlEC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3134,7 +3134,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'If-KEWohmHgm2Mbincn5wBr-X3eL2_u3R11qp5s5hm0C',
+        'version': '8nOVc16PWX1vOL2FAJPm8X8Lk57BHqt0zzQIkXHR3YAC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3167,7 +3167,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/projector_app/app',
-        'version': 'UznFVx8kElPrYRIt687_xoM-_uiGNE6w0Gqrn3I7g4kC',
+        'version': '_fk7DWhQrmGXlta2PCDBJHIZdZDGMJlsUFgYRmFLkN4C',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3749,7 +3749,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        '59b076414e3e5ec964fa7cb0a7fbb44e005f626b',
+        'ac8e3955b71b12b6cebf395c38bfc3503da5234a',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/ash/app_list/views/search_result_view.cc b/ash/app_list/views/search_result_view.cc
index 19b5309..838034a 100644
--- a/ash/app_list/views/search_result_view.cc
+++ b/ash/app_list/views/search_result_view.cc
@@ -1286,7 +1286,6 @@
 }
 
 void SearchResultView::Layout(PassKey) {
-  // TODO(crbug.com/40220083) add test coverage for search result view layout.
   gfx::Rect rect(GetContentsBounds());
   if (rect.IsEmpty()) {
     return;
diff --git a/ash/capture_mode/capture_mode_controller.cc b/ash/capture_mode/capture_mode_controller.cc
index 8c942307..ea631e2 100644
--- a/ash/capture_mode/capture_mode_controller.cc
+++ b/ash/capture_mode/capture_mode_controller.cc
@@ -222,7 +222,6 @@
 base::FilePath SelectFilePathForCapturedFile(
     const base::FilePath& current_path,
     const base::FilePath& fallback_path) {
-  // TODO(b/323146997): Revisit the behavior if enforced by policy.
   if (base::PathExists(current_path.DirName()))
     return current_path;
   DCHECK(base::PathExists(fallback_path.DirName()));
diff --git a/ash/capture_mode/capture_mode_session_focus_cycler.h b/ash/capture_mode/capture_mode_session_focus_cycler.h
index d2708b7..2b8af09 100644
--- a/ash/capture_mode/capture_mode_session_focus_cycler.h
+++ b/ash/capture_mode/capture_mode_session_focus_cycler.h
@@ -39,8 +39,6 @@
  public:
   // The different groups which can receive focus during a capture mode session.
   // A group may have multiple items which can receive focus.
-  // TODO(crbug.com/40170806): Investigate removing the groups concept and
-  // having one flat list.
   enum class FocusGroup {
     kNone = 0,
     // The buttons to select the capture type and source on the capture bar.
@@ -118,10 +116,6 @@
     HighlightableView();
     virtual ~HighlightableView();
 
-    // TODO(crbug.com/40170806): This can result in multiple of these objects
-    // thinking they have focus if CaptureModeSessionFocusCycler does not call
-    // PseudoFocus or PseudoBlur properly. Investigate if there is a better
-    // approach.
     bool has_focus_ = false;
 
    private:
diff --git a/base/metrics/field_trial.cc b/base/metrics/field_trial.cc
index c6bec84..d565012ebe 100644
--- a/base/metrics/field_trial.cc
+++ b/base/metrics/field_trial.cc
@@ -631,7 +631,7 @@
     std::string_view trial_name;
     std::string_view group_name;
     bool is_overridden;
-    if (subtle::NoBarrier_Load(&entry->activated) &&
+    if (entry->activated.load(std::memory_order_relaxed) &&
         entry->GetState(trial_name, group_name, is_overridden)) {
       result.emplace(trial_name);
     }
@@ -954,8 +954,9 @@
     DCHECK(new_entry)
         << "Failed to allocate a new entry, likely because the allocator is "
            "full. Consider increasing kFieldTrialAllocationSize.";
-    subtle::NoBarrier_Store(&new_entry->activated,
-                            subtle::NoBarrier_Load(&prev_entry->activated));
+    new_entry->activated.store(
+        prev_entry->activated.load(std::memory_order_relaxed),
+        std::memory_order_relaxed);
     new_entry->pickle_size = pickle.size();
 
     // TODO(lawrencewu): Modify base::Pickle to be able to write over a section
@@ -1070,7 +1071,7 @@
     FieldTrial* trial = CreateFieldTrial(
         trial_name, group_name, /*is_low_anonymity=*/false, is_overridden);
     trial->ref_ = mem_iter.GetAsReference(entry);
-    if (subtle::NoBarrier_Load(&entry->activated)) {
+    if (entry->activated.load(std::memory_order_relaxed)) {
       // Mark the trial as "used" and notify observers, if any.
       // This is useful to ensure that field trials created in child
       // processes are properly reported in crash reports.
@@ -1153,7 +1154,7 @@
 
   internal::FieldTrialEntry* entry =
       allocator->GetAsObject<internal::FieldTrialEntry>(ref);
-  subtle::NoBarrier_Store(&entry->activated, trial_state.activated);
+  entry->activated.store(trial_state.activated, std::memory_order_relaxed);
   entry->pickle_size = pickle.size();
 
   // TODO(lawrencewu): Modify base::Pickle to be able to write over a section in
@@ -1185,7 +1186,7 @@
     // hit from the child re-synchronizing activation state.
     internal::FieldTrialEntry* entry =
         allocator->GetAsObject<internal::FieldTrialEntry>(ref);
-    subtle::NoBarrier_Store(&entry->activated, 1);
+    entry->activated.store(true, std::memory_order_relaxed);
   }
 }
 
diff --git a/base/metrics/field_trial_entry.h b/base/metrics/field_trial_entry.h
index 5e53110..bf72c81 100644
--- a/base/metrics/field_trial_entry.h
+++ b/base/metrics/field_trial_entry.h
@@ -8,12 +8,12 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <atomic>
 #include <map>
 #include <string>
 #include <string_view>
 #include <vector>
 
-#include "base/atomicops.h"
 #include "base/base_export.h"
 #include "base/compiler_specific.h"
 #include "base/metrics/persistent_memory_allocator.h"
@@ -47,11 +47,8 @@
   }
 
   // Whether or not this field trial is activated. This is really just a
-  // boolean but using a 32 bit value for portability reasons. It should be
-  // accessed via NoBarrier_Load()/NoBarrier_Store() to prevent the compiler
-  // from doing unexpected optimizations because it thinks that only one
-  // thread is accessing the memory location.
-  subtle::Atomic32 activated;
+  // boolean but using a 32 bit value for portability reasons.
+  std::atomic<uint32_t> activated;
 
   // On e.g. x86, alignof(uint64_t) is 4.  Ensure consistent size and
   // alignment of `pickle_size` across platforms. This can be considered
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index c0552ea1..e97a02a 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-29.20251025.102.1
+30.20251101.102.1
diff --git a/chrome/browser/ash/attestation/enrollment_id_upload_manager.cc b/chrome/browser/ash/attestation/enrollment_id_upload_manager.cc
index 824ee30..401ae5b 100644
--- a/chrome/browser/ash/attestation/enrollment_id_upload_manager.cc
+++ b/chrome/browser/ash/attestation/enrollment_id_upload_manager.cc
@@ -187,7 +187,7 @@
     const std::string& enrollment_id,
     policy::CloudPolicyClient::Result result) {
   const std::string printable_enrollment_id =
-      base::ToLowerASCII(base::HexEncode(enrollment_id));
+      base::HexEncodeLower(enrollment_id);
 
   if (!result.IsSuccess()) {
     LOG(ERROR) << "Failed to upload Enrollment Identifier \""
diff --git a/chrome/browser/ash/drive/drive_integration_service.cc b/chrome/browser/ash/drive/drive_integration_service.cc
index e86a3f3f..8f03640 100644
--- a/chrome/browser/ash/drive/drive_integration_service.cc
+++ b/chrome/browser/ash/drive/drive_integration_service.cc
@@ -524,7 +524,7 @@
     hasher.Update(GetProfileSalt());
     hasher.Update("-");
     hasher.Update(GetAccountId().GetAccountIdKey());
-    return base::ToLowerASCII(base::HexEncode(hasher.Finish()));
+    return base::HexEncodeLower(hasher.Finish());
   }
 
   bool IsMetricsCollectionEnabled() override {
diff --git a/chrome/browser/ash/drive/drivefs_test_support.cc b/chrome/browser/ash/drive/drivefs_test_support.cc
index f9abb1fa..0cebf5b 100644
--- a/chrome/browser/ash/drive/drivefs_test_support.cc
+++ b/chrome/browser/ash/drive/drivefs_test_support.cc
@@ -47,7 +47,7 @@
         md5.Update(FakeDriveFsHelper::kPredefinedProfileSalt);
         md5.Update("-");
         md5.Update(user->GetAccountId().GetAccountIdKey());
-        return base::ToLowerASCII(base::HexEncode(md5.Finish()));
+        return base::HexEncodeLower(md5.Finish());
       }));
 }
 FakeDriveFsHelper::~FakeDriveFsHelper() = default;
diff --git a/chrome/browser/ash/policy/reporting/install_event_log_util.cc b/chrome/browser/ash/policy/reporting/install_event_log_util.cc
index b3a4035..1640c404 100644
--- a/chrome/browser/ash/policy/reporting/install_event_log_util.cc
+++ b/chrome/browser/ash/policy/reporting/install_event_log_util.cc
@@ -79,7 +79,7 @@
   crypto::obsolete::Md5 hasher = MakeMd5HasherForPolicyEventId();
   hasher.Update(base::as_byte_span(*event_json));
   hasher.Update(base::as_byte_span(*context_json));
-  return base::ToLowerASCII(base::HexEncode(hasher.Finish()));
+  return base::HexEncodeLower(hasher.Finish());
 }
 
 }  // namespace
diff --git a/chrome/browser/ash/printing/enterprise/enterprise_printers_provider.cc b/chrome/browser/ash/printing/enterprise/enterprise_printers_provider.cc
index 59f31ab..bf018e8 100644
--- a/chrome/browser/ash/printing/enterprise/enterprise_printers_provider.cc
+++ b/chrome/browser/ash/printing/enterprise/enterprise_printers_provider.cc
@@ -37,7 +37,7 @@
 
 namespace printing {
 std::string PolicyPrinterId(const std::string& json) {
-  return base::ToLowerASCII(base::HexEncode(crypto::obsolete::Md5::Hash(json)));
+  return base::HexEncodeLower(crypto::obsolete::Md5::Hash(json));
 }
 }  // namespace printing
 
diff --git a/chrome/browser/ash/printing/server_printers_fetcher.cc b/chrome/browser/ash/printing/server_printers_fetcher.cc
index a1cab58..0bb7df8 100644
--- a/chrome/browser/ash/printing/server_printers_fetcher.cc
+++ b/chrome/browser/ash/printing/server_printers_fetcher.cc
@@ -38,8 +38,7 @@
 
 // Not in namespace {} so it can be friended by crypto/obsolete/md5.
 std::string ServerPrinterId(const std::string& url) {
-  return "server-" +
-         base::ToLowerASCII(base::HexEncode(crypto::obsolete::Md5::Hash(url)));
+  return "server-" + base::HexEncodeLower(crypto::obsolete::Md5::Hash(url));
 }
 
 }  // namespace printing
diff --git a/chrome/browser/ash/printing/usb_printer_util.cc b/chrome/browser/ash/printing/usb_printer_util.cc
index 1f300c9..18c5962 100644
--- a/chrome/browser/ash/printing/usb_printer_util.cc
+++ b/chrome/browser/ash/printing/usb_printer_util.cc
@@ -227,8 +227,7 @@
   md5.Update(GetManufacturerName(device_info));
   md5.Update(GetProductName(device_info));
   Md5UpdateString16(md5, GetSerialNumber(device_info));
-  return base::StringPrintf("usb-%s",
-                            base::ToLowerASCII(base::HexEncode(md5.Finish())));
+  return base::StringPrintf("usb-%s", base::HexEncodeLower(md5.Finish()));
 }
 
 // Creates a mojom filter which can be used to identify a basic USB printer.
diff --git a/chrome/browser/ash/printing/zeroconf_printer_detector.cc b/chrome/browser/ash/printing/zeroconf_printer_detector.cc
index d118b8c..f031029e 100644
--- a/chrome/browser/ash/printing/zeroconf_printer_detector.cc
+++ b/chrome/browser/ash/printing/zeroconf_printer_detector.cc
@@ -155,8 +155,7 @@
   md5.Update(metadata.usb_MDL);
   md5.Update(metadata.ty);
   md5.Update(metadata.rp);
-  return base::StringPrintf("zeroconf-%s",
-                            base::ToLowerASCII(base::HexEncode(md5.Finish())));
+  return base::StringPrintf("zeroconf-%s", base::HexEncodeLower(md5.Finish()));
 }
 
 // Attempt to fill |detected_printer| using the information in
diff --git a/chrome/browser/ash/smb_client/smbfs_share.cc b/chrome/browser/ash/smb_client/smbfs_share.cc
index 38332dd1..681e301 100644
--- a/chrome/browser/ash/smb_client/smbfs_share.cc
+++ b/chrome/browser/ash/smb_client/smbfs_share.cc
@@ -312,7 +312,7 @@
 
 std::string SmbFsShare::GenerateStableMountId() const {
   const auto input = GenerateStableMountIdInput();
-  return base::ToLowerASCII(base::HexEncode(crypto::hash::Sha256(input)));
+  return base::HexEncodeLower(crypto::hash::Sha256(input));
 }
 
 std::string SmbFsShare::GenerateStableMountIdInput() const {
diff --git a/chrome/browser/ash/system_web_apps/system_web_app_manager.cc b/chrome/browser/ash/system_web_apps/system_web_app_manager.cc
index 957d0cd..7969c919 100644
--- a/chrome/browser/ash/system_web_apps/system_web_app_manager.cc
+++ b/chrome/browser/ash/system_web_apps/system_web_app_manager.cc
@@ -199,7 +199,8 @@
   install_options.add_to_search = delegate.ShouldShowInSearchAndShelf();
   install_options.add_to_management = false;
   install_options.is_disabled = is_disabled;
-  install_options.force_reinstall = force_update;
+  install_options.force_reinstall =
+      force_update || delegate.ShouldForceReinstall();
   install_options.uninstall_and_replace =
       delegate.GetAppIdsToUninstallAndReplace();
   install_options.system_app_type = type;
diff --git a/chrome/browser/ash/system_web_apps/system_web_app_manager_unittest.cc b/chrome/browser/ash/system_web_apps/system_web_app_manager_unittest.cc
index 01447cd7..204b056 100644
--- a/chrome/browser/ash/system_web_apps/system_web_app_manager_unittest.cc
+++ b/chrome/browser/ash/system_web_apps/system_web_app_manager_unittest.cc
@@ -49,6 +49,7 @@
 #include "components/webapps/browser/installable/installable_metrics.h"
 #include "content/public/test/test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/idle/idle.h"
 #include "ui/base/idle/scoped_set_idle_state.h"
 #include "url/gurl.h"
@@ -268,7 +269,25 @@
   EXPECT_TRUE(IsInstalled(AppUrl3()));
 }
 
-TEST_F(SystemWebAppManagerTest, AlwaysUpdate) {
+class SystemWebAppManagerInstallationTest
+    : public SystemWebAppManagerTest,
+      public testing::WithParamInterface<bool> {
+ protected:
+  std::unique_ptr<UnittestingSystemAppDelegate> CreateSystemAppDelegate(
+      SystemWebAppType type,
+      const std::string& name,
+      const GURL& url,
+      web_app::WebAppInstallInfoFactory info_factory) {
+    auto system_app_delegate = std::make_unique<UnittestingSystemAppDelegate>(
+        type, name, url, info_factory);
+    system_app_delegate->SetShouldForceReinstall(ShouldForceReinstall());
+    return system_app_delegate;
+  }
+
+  bool ShouldForceReinstall() const { return GetParam(); }
+};
+
+TEST_P(SystemWebAppManagerInstallationTest, AlwaysUpdate) {
   system_web_app_manager().SetUpdatePolicy(
       SystemWebAppManager::UpdatePolicy::kAlwaysUpdate);
 
@@ -276,9 +295,9 @@
     SystemWebAppDelegateMap system_apps;
     system_apps.emplace(
         SystemWebAppType::SETTINGS,
-        std::make_unique<UnittestingSystemAppDelegate>(
-            SystemWebAppType::SETTINGS, kSettingsAppInternalName, AppUrl1(),
-            GetApp1WebAppInfoFactory()));
+        CreateSystemAppDelegate(SystemWebAppType::SETTINGS,
+                                kSettingsAppInternalName, AppUrl1(),
+                                GetApp1WebAppInfoFactory()));
     system_web_app_manager().SetSystemAppsForTesting(std::move(system_apps));
   }
   system_web_app_manager().set_current_version(base::Version("1.0.0.0"));
@@ -293,9 +312,9 @@
 
     system_apps.emplace(
         SystemWebAppType::SETTINGS,
-        std::make_unique<UnittestingSystemAppDelegate>(
-            SystemWebAppType::SETTINGS, kSettingsAppInternalName, AppUrl1(),
-            GetApp1WebAppInfoFactory()));
+        CreateSystemAppDelegate(SystemWebAppType::SETTINGS,
+                                kSettingsAppInternalName, AppUrl1(),
+                                GetApp1WebAppInfoFactory()));
     system_apps.emplace(SystemWebAppType::CAMERA,
                         std::make_unique<UnittestingSystemAppDelegate>(
                             SystemWebAppType::CAMERA, kCameraAppInternalName,
@@ -305,10 +324,11 @@
   // This one returns because on_apps_synchronized runs immediately.
   StartAndWaitForAppsToSynchronize();
   EXPECT_TRUE(IsInstalled(AppUrl1()));
+  EXPECT_TRUE(WasReinstalled(AppUrl1()));
   EXPECT_TRUE(IsInstalled(AppUrl2()));
 }
 
-TEST_F(SystemWebAppManagerTest, UpdateOnVersionChange) {
+TEST_P(SystemWebAppManagerInstallationTest, UpdateOnVersionChange) {
   system_web_app_manager().SetUpdatePolicy(
       SystemWebAppManager::UpdatePolicy::kOnVersionChange);
 
@@ -316,9 +336,9 @@
     SystemWebAppDelegateMap system_apps;
     system_apps.emplace(
         SystemWebAppType::SETTINGS,
-        std::make_unique<UnittestingSystemAppDelegate>(
-            SystemWebAppType::SETTINGS, kSettingsAppInternalName, AppUrl1(),
-            GetApp1WebAppInfoFactory()));
+        CreateSystemAppDelegate(SystemWebAppType::SETTINGS,
+                                kSettingsAppInternalName, AppUrl1(),
+                                GetApp1WebAppInfoFactory()));
     system_web_app_manager().SetSystemAppsForTesting(std::move(system_apps));
     system_web_app_manager().set_current_version(base::Version("1.0.0.0"));
   }
@@ -330,14 +350,14 @@
     SystemWebAppDelegateMap system_apps;
     system_apps.emplace(
         SystemWebAppType::SETTINGS,
-        std::make_unique<UnittestingSystemAppDelegate>(
-            SystemWebAppType::SETTINGS, kSettingsAppInternalName, AppUrl1(),
-            GetApp1WebAppInfoFactory()));
+        CreateSystemAppDelegate(SystemWebAppType::SETTINGS,
+                                kSettingsAppInternalName, AppUrl1(),
+                                GetApp1WebAppInfoFactory()));
     // Create another app. The version hasn't changed, but we should immediately
     // install anyway, as if a user flipped a chrome://flag. The first app won't
     // force reinstall.
     system_apps.emplace(SystemWebAppType::CAMERA,
-                        std::make_unique<UnittestingSystemAppDelegate>(
+                        CreateSystemAppDelegate(
                             SystemWebAppType::CAMERA, kCameraAppInternalName,
                             AppUrl2(), GetApp2WebAppInfoFactory()));
 
@@ -345,6 +365,7 @@
   }
   StartAndWaitForAppsToSynchronize();
   EXPECT_TRUE(IsInstalled(AppUrl1()));
+  EXPECT_EQ(WasReinstalled(AppUrl1()), ShouldForceReinstall());
   EXPECT_TRUE(IsInstalled(AppUrl2()));
 
   // Bump the version number, and an update will trigger, and force
@@ -352,6 +373,7 @@
   system_web_app_manager().set_current_version(base::Version("2.0.0.0"));
   StartAndWaitForAppsToSynchronize();
   EXPECT_TRUE(IsInstalled(AppUrl1()));
+  EXPECT_TRUE(WasReinstalled(AppUrl1()));
   EXPECT_TRUE(IsInstalled(AppUrl2()));
   EXPECT_TRUE(IsVersionCorrect(base::Version("2.0.0.0")));
 
@@ -361,12 +383,12 @@
     SystemWebAppDelegateMap system_apps;
     system_apps.emplace(
         SystemWebAppType::SETTINGS,
-        std::make_unique<UnittestingSystemAppDelegate>(
+        CreateSystemAppDelegate(
             SystemWebAppType::SETTINGS, kSettingsAppInternalName, AppUrl3(),
             base::BindRepeating(&GetWebAppInstallInfo, AppUrl3())));
 
     system_apps.emplace(SystemWebAppType::CAMERA,
-                        std::make_unique<UnittestingSystemAppDelegate>(
+                        CreateSystemAppDelegate(
                             SystemWebAppType::CAMERA, kCameraAppInternalName,
                             AppUrl2(), GetApp2WebAppInfoFactory()));
 
@@ -379,7 +401,8 @@
   EXPECT_TRUE(IsInstalled(AppUrl3()));
 }
 
-TEST_F(SystemWebAppManagerTest, UpdateOnVersionChangeEvenIfIconsBroken) {
+TEST_P(SystemWebAppManagerInstallationTest,
+       UpdateOnVersionChangeEvenIfIconsBroken) {
   system_web_app_manager().SetUpdatePolicy(
       SystemWebAppManager::UpdatePolicy::kOnVersionChange);
 
@@ -387,9 +410,9 @@
     SystemWebAppDelegateMap system_apps;
     system_apps.emplace(
         SystemWebAppType::SETTINGS,
-        std::make_unique<UnittestingSystemAppDelegate>(
-            SystemWebAppType::SETTINGS, kSettingsAppInternalName, AppUrl1(),
-            GetApp1WebAppInfoFactory()));
+        CreateSystemAppDelegate(SystemWebAppType::SETTINGS,
+                                kSettingsAppInternalName, AppUrl1(),
+                                GetApp1WebAppInfoFactory()));
     system_web_app_manager().SetSystemAppsForTesting(std::move(system_apps));
   }
   system_web_app_manager().set_current_version(base::Version("1.0.0.0"));
@@ -407,12 +430,15 @@
   system_web_app_manager().set_current_version(base::Version("1.0.0.1"));
   StartAndWaitForAppsToSynchronize();
   EXPECT_TRUE(IsInstalled(AppUrl1()));
+  EXPECT_TRUE(WasReinstalled(AppUrl1()));
   EXPECT_TRUE(IsVersionCorrect(base::Version("1.0.0.1")));
 }
 
-TEST_F(SystemWebAppManagerTest, RetryBrokenIcons) {
+TEST_P(SystemWebAppManagerInstallationTest, RetryBrokenIcons) {
   // We don't want to force reinstall by default, we want to check that we
-  // correctly set to force reinstall when icons are broken.
+  // correctly set to force reinstall when icons are broken. The only exception
+  // to this is if the app decides to override the app update policy and force a
+  // reinstall.
   system_web_app_manager().SetUpdatePolicy(
       SystemWebAppManager::UpdatePolicy::kOnVersionChange);
 
@@ -420,9 +446,9 @@
     SystemWebAppDelegateMap system_apps;
     system_apps.emplace(
         SystemWebAppType::SETTINGS,
-        std::make_unique<UnittestingSystemAppDelegate>(
-            SystemWebAppType::SETTINGS, kSettingsAppInternalName, AppUrl1(),
-            GetApp1WebAppInfoFactory()));
+        CreateSystemAppDelegate(SystemWebAppType::SETTINGS,
+                                kSettingsAppInternalName, AppUrl1(),
+                                GetApp1WebAppInfoFactory()));
     system_web_app_manager().SetSystemAppsForTesting(std::move(system_apps));
   }
 
@@ -437,7 +463,7 @@
     // Icons not broken.
     system_web_app_manager().set_icons_are_broken(false);
     StartAndWaitForAppsToSynchronize();
-    EXPECT_FALSE(WasReinstalled(AppUrl1()));
+    EXPECT_EQ(WasReinstalled(AppUrl1()), ShouldForceReinstall());
   }
 
   {
@@ -448,7 +474,7 @@
   }
 }
 
-TEST_F(SystemWebAppManagerTest, AbortOnExceedRetryLimit) {
+TEST_P(SystemWebAppManagerInstallationTest, AbortOnExceedRetryLimit) {
   base::HistogramTester histograms;
 
   // We don't want to force reinstall by default, we want to check that we
@@ -460,9 +486,9 @@
     SystemWebAppDelegateMap system_apps;
     system_apps.emplace(
         SystemWebAppType::SETTINGS,
-        std::make_unique<UnittestingSystemAppDelegate>(
-            SystemWebAppType::SETTINGS, kSettingsAppInternalName, AppUrl1(),
-            GetApp1WebAppInfoFactory()));
+        CreateSystemAppDelegate(SystemWebAppType::SETTINGS,
+                                kSettingsAppInternalName, AppUrl1(),
+                                GetApp1WebAppInfoFactory()));
     system_web_app_manager().SetSystemAppsForTesting(std::move(system_apps));
     system_web_app_manager().set_icons_are_broken(true);
   }
@@ -506,13 +532,13 @@
   }
 }
 
-TEST_F(SystemWebAppManagerTest, UpdateOnLocaleChange) {
+TEST_P(SystemWebAppManagerInstallationTest, UpdateOnLocaleChange) {
   system_web_app_manager().SetUpdatePolicy(
       SystemWebAppManager::UpdatePolicy::kOnVersionChange);
 
   SystemWebAppDelegateMap system_apps;
   system_apps.emplace(SystemWebAppType::SETTINGS,
-                      std::make_unique<UnittestingSystemAppDelegate>(
+                      CreateSystemAppDelegate(
                           SystemWebAppType::SETTINGS, kSettingsAppInternalName,
                           AppUrl1(), GetApp1WebAppInfoFactory()));
   system_web_app_manager().SetSystemAppsForTesting(std::move(system_apps));
@@ -533,16 +559,21 @@
       provider().registrar_unsafe().GetAppLatestInstallTime(
           GetAppIdFromInstallUrl(AppUrl1()));
 
-  // Do not reinstall because locale is not changed.
+  // Do not reinstall if the locale does not change unless the app overrides the
+  // app update policy.
   StartAndWaitForAppsToSynchronize();
   EXPECT_TRUE(IsInstalled(AppUrl1()));
   base::Time retry_time_post_synchronize =
       provider().registrar_unsafe().GetAppLatestInstallTime(
           GetAppIdFromInstallUrl(AppUrl1()));
-  EXPECT_EQ(last_retry_time, retry_time_post_synchronize);
+  if (ShouldForceReinstall()) {
+    EXPECT_NE(last_retry_time, retry_time_post_synchronize);
+  } else {
+    EXPECT_EQ(last_retry_time, retry_time_post_synchronize);
+  }
 }
 
-TEST_F(SystemWebAppManagerTest, InstallResultHistogram) {
+TEST_P(SystemWebAppManagerInstallationTest, InstallResultHistogram) {
   base::HistogramTester histograms;
   const std::string settings_app_install_result_histogram =
       std::string(SystemWebAppManager::kInstallResultHistogramName) + ".Apps." +
@@ -562,9 +593,9 @@
     SystemWebAppDelegateMap system_apps;
     system_apps.emplace(
         SystemWebAppType::SETTINGS,
-        std::make_unique<UnittestingSystemAppDelegate>(
-            SystemWebAppType::SETTINGS, kSettingsAppInternalName, AppUrl1(),
-            GetApp1WebAppInfoFactory()));
+        CreateSystemAppDelegate(SystemWebAppType::SETTINGS,
+                                kSettingsAppInternalName, AppUrl1(),
+                                GetApp1WebAppInfoFactory()));
     system_web_app_manager().SetSystemAppsForTesting(std::move(system_apps));
 
     histograms.ExpectTotalCount(
@@ -597,11 +628,11 @@
     SystemWebAppDelegateMap system_apps;
     system_apps.emplace(
         SystemWebAppType::SETTINGS,
-        std::make_unique<UnittestingSystemAppDelegate>(
-            SystemWebAppType::SETTINGS, kSettingsAppInternalName, AppUrl1(),
-            GetNullWebAppInfoFactory()));
+        CreateSystemAppDelegate(SystemWebAppType::SETTINGS,
+                                kSettingsAppInternalName, AppUrl1(),
+                                GetNullWebAppInfoFactory()));
     system_apps.emplace(SystemWebAppType::CAMERA,
-                        std::make_unique<UnittestingSystemAppDelegate>(
+                        CreateSystemAppDelegate(
                             SystemWebAppType::CAMERA, kCameraAppInternalName,
                             AppUrl2(), GetNullWebAppInfoFactory()));
     system_web_app_manager().SetSystemAppsForTesting(std::move(system_apps));
@@ -627,9 +658,9 @@
     SystemWebAppDelegateMap system_apps;
     system_apps.emplace(
         SystemWebAppType::SETTINGS,
-        std::make_unique<UnittestingSystemAppDelegate>(
-            SystemWebAppType::SETTINGS, kSettingsAppInternalName, AppUrl1(),
-            GetApp1WebAppInfoFactory()));
+        CreateSystemAppDelegate(SystemWebAppType::SETTINGS,
+                                kSettingsAppInternalName, AppUrl1(),
+                                GetApp1WebAppInfoFactory()));
     system_web_app_manager().SetSystemAppsForTesting(std::move(system_apps));
 
     histograms.ExpectTotalCount(
@@ -668,19 +699,19 @@
   }
 }
 
-TEST_F(SystemWebAppManagerTest,
+TEST_P(SystemWebAppManagerInstallationTest,
        InstallDurationHistogram_ExcludeNonForceInstall) {
   base::HistogramTester histograms;
 
   SystemWebAppDelegateMap system_apps;
   system_apps.emplace(SystemWebAppType::SETTINGS,
-                      std::make_unique<UnittestingSystemAppDelegate>(
+                      CreateSystemAppDelegate(
                           SystemWebAppType::SETTINGS, kSettingsAppInternalName,
                           AppUrl1(), GetApp1WebAppInfoFactory()));
-  system_apps.emplace(SystemWebAppType::CAMERA,
-                      std::make_unique<UnittestingSystemAppDelegate>(
-                          SystemWebAppType::CAMERA, kCameraAppInternalName,
-                          AppUrl2(), GetApp2WebAppInfoFactory()));
+  system_apps.emplace(
+      SystemWebAppType::CAMERA,
+      CreateSystemAppDelegate(SystemWebAppType::CAMERA, kCameraAppInternalName,
+                              AppUrl2(), GetApp2WebAppInfoFactory()));
   system_web_app_manager().SetSystemAppsForTesting(std::move(system_apps));
   system_web_app_manager().SetUpdatePolicy(
       SystemWebAppManager::UpdatePolicy::kOnVersionChange);
@@ -704,13 +735,13 @@
   }
 }
 
-TEST_F(SystemWebAppManagerTest, AbandonFailedInstalls) {
+TEST_P(SystemWebAppManagerInstallationTest, AbandonFailedInstalls) {
   system_web_app_manager().SetUpdatePolicy(
       SystemWebAppManager::UpdatePolicy::kOnVersionChange);
 
   SystemWebAppDelegateMap system_apps;
   system_apps.emplace(SystemWebAppType::SETTINGS,
-                      std::make_unique<UnittestingSystemAppDelegate>(
+                      CreateSystemAppDelegate(
                           SystemWebAppType::SETTINGS, kSettingsAppInternalName,
                           AppUrl1(), GetApp1WebAppInfoFactory()));
   system_web_app_manager().SetSystemAppsForTesting(std::move(system_apps));
@@ -778,13 +809,13 @@
 }
 
 // Same test, but for locale change.
-TEST_F(SystemWebAppManagerTest, AbandonFailedInstallsLocaleChange) {
+TEST_P(SystemWebAppManagerInstallationTest, AbandonFailedInstallsLocaleChange) {
   system_web_app_manager().SetUpdatePolicy(
       SystemWebAppManager::UpdatePolicy::kOnVersionChange);
 
   SystemWebAppDelegateMap system_apps;
   system_apps.emplace(SystemWebAppType::SETTINGS,
-                      std::make_unique<UnittestingSystemAppDelegate>(
+                      CreateSystemAppDelegate(
                           SystemWebAppType::SETTINGS, kSettingsAppInternalName,
                           AppUrl1(), GetApp1WebAppInfoFactory()));
 
@@ -852,14 +883,14 @@
   EXPECT_TRUE(WasReinstalled(AppUrl1()));
 }
 
-TEST_F(SystemWebAppManagerTest, SucceedsAfterOneRetry) {
+TEST_P(SystemWebAppManagerInstallationTest, SucceedsAfterOneRetry) {
   system_web_app_manager().SetUpdatePolicy(
       SystemWebAppManager::UpdatePolicy::kOnVersionChange);
 
   // Set up and install a baseline
   SystemWebAppDelegateMap system_apps;
   system_apps.emplace(SystemWebAppType::SETTINGS,
-                      std::make_unique<UnittestingSystemAppDelegate>(
+                      CreateSystemAppDelegate(
                           SystemWebAppType::SETTINGS, kSettingsAppInternalName,
                           AppUrl1(), GetApp1WebAppInfoFactory()));
 
@@ -922,14 +953,14 @@
   EXPECT_TRUE(IsVersionCorrect(base::Version("3.0.0.0")));
 }
 
-TEST_F(SystemWebAppManagerTest, ForceReinstallFeature) {
+TEST_P(SystemWebAppManagerInstallationTest, ForceReinstallFeature) {
   system_web_app_manager().SetUpdatePolicy(
       SystemWebAppManager::UpdatePolicy::kOnVersionChange);
 
   // Register a test system app.
   SystemWebAppDelegateMap system_apps;
   system_apps.emplace(SystemWebAppType::SETTINGS,
-                      std::make_unique<UnittestingSystemAppDelegate>(
+                      CreateSystemAppDelegate(
                           SystemWebAppType::SETTINGS, kSettingsAppInternalName,
                           AppUrl1(), GetApp1WebAppInfoFactory()));
 
@@ -953,7 +984,7 @@
   }
 }
 
-TEST_F(SystemWebAppManagerTest, IsSWABeforeSync) {
+TEST_P(SystemWebAppManagerInstallationTest, IsSWABeforeSync) {
   system_web_app_manager().SetUpdatePolicy(
       SystemWebAppManager::UpdatePolicy::kOnVersionChange);
 
@@ -962,9 +993,9 @@
     SystemWebAppDelegateMap system_apps;
     system_apps.emplace(
         SystemWebAppType::SETTINGS,
-        std::make_unique<UnittestingSystemAppDelegate>(
-            SystemWebAppType::SETTINGS, kSettingsAppInternalName, AppUrl1(),
-            GetApp1WebAppInfoFactory()));
+        CreateSystemAppDelegate(SystemWebAppType::SETTINGS,
+                                kSettingsAppInternalName, AppUrl1(),
+                                GetApp1WebAppInfoFactory()));
     system_web_app_manager().SetSystemAppsForTesting(std::move(system_apps));
   }
   system_web_app_manager().set_current_version(base::Version("1.0.0.0"));
@@ -980,9 +1011,9 @@
     SystemWebAppDelegateMap system_apps;
     system_apps.emplace(
         SystemWebAppType::SETTINGS,
-        std::make_unique<UnittestingSystemAppDelegate>(
-            SystemWebAppType::SETTINGS, kSettingsAppInternalName, AppUrl1(),
-            GetApp1WebAppInfoFactory()));
+        CreateSystemAppDelegate(SystemWebAppType::SETTINGS,
+                                kSettingsAppInternalName, AppUrl1(),
+                                GetApp1WebAppInfoFactory()));
     unsynced_system_web_app_manager->SetSystemAppsForTesting(
         std::move(system_apps));
   }
@@ -991,6 +1022,10 @@
       web_app::GenerateAppId(/*manifest_id=*/std::nullopt, AppUrl1())));
 }
 
+INSTANTIATE_TEST_SUITE_P(SystemWebAppManagerInstallationTests,
+                         SystemWebAppManagerInstallationTest,
+                         testing::Bool());
+
 class TimerSystemAppDelegate : public UnittestingSystemAppDelegate {
  public:
   TimerSystemAppDelegate(SystemWebAppType type,
diff --git a/chrome/browser/ash/system_web_apps/test_support/test_system_web_app_installation.cc b/chrome/browser/ash/system_web_apps/test_support/test_system_web_app_installation.cc
index 089cd4f..6dc7960d 100644
--- a/chrome/browser/ash/system_web_apps/test_support/test_system_web_app_installation.cc
+++ b/chrome/browser/ash/system_web_apps/test_support/test_system_web_app_installation.cc
@@ -106,6 +106,10 @@
   return info_factory_.Run();
 }
 
+bool UnittestingSystemAppDelegate::ShouldForceReinstall() const {
+  return should_force_reinstall_;
+}
+
 std::vector<std::string>
 UnittestingSystemAppDelegate::GetAppIdsToUninstallAndReplace() const {
   return uninstall_and_replace_;
@@ -209,6 +213,10 @@
   return should_animate_theme_changes_;
 }
 
+void UnittestingSystemAppDelegate::SetShouldForceReinstall(bool value) {
+  should_force_reinstall_ = value;
+}
+
 void UnittestingSystemAppDelegate::SetAppIdsToUninstallAndReplace(
     const std::vector<webapps::AppId>& ids) {
   uninstall_and_replace_ = ids;
diff --git a/chrome/browser/ash/system_web_apps/test_support/test_system_web_app_installation.h b/chrome/browser/ash/system_web_apps/test_support/test_system_web_app_installation.h
index f8d5a63..f71bde0 100644
--- a/chrome/browser/ash/system_web_apps/test_support/test_system_web_app_installation.h
+++ b/chrome/browser/ash/system_web_apps/test_support/test_system_web_app_installation.h
@@ -42,7 +42,7 @@
                                                const apps::AppLaunchParams&)>;
 
   std::unique_ptr<web_app::WebAppInstallInfo> GetWebAppInfo() const override;
-
+  bool ShouldForceReinstall() const override;
   std::vector<std::string> GetAppIdsToUninstallAndReplace() const override;
   gfx::Size GetMinimumWindowSize() const override;
   BrowserDelegate* GetWindowForLaunch(Profile* profile,
@@ -73,6 +73,7 @@
   bool IsUrlInSystemAppScope(const GURL& url) const override;
   bool UseSystemThemeColor() const override;
   bool ShouldAnimateThemeChanges() const override;
+  void SetShouldForceReinstall(bool);
   void SetAppIdsToUninstallAndReplace(const std::vector<webapps::AppId>&);
   void SetMinimumWindowSize(const gfx::Size&);
   void SetShouldReuseExistingWindow(bool);
@@ -102,6 +103,7 @@
   web_app::WebAppInstallInfoFactory info_factory_;
   std::vector<webapps::AppId> uninstall_and_replace_;
   gfx::Size minimum_window_size_;
+  bool should_force_reinstall_ = false;
   bool single_window_ = true;
   bool show_new_window_menu_option_ = false;
   bool include_launch_directory_ = false;
diff --git a/chrome/browser/component_updater/metadata_table_chromeos.cc b/chrome/browser/component_updater/metadata_table_chromeos.cc
index 6135151b..29a0b6a 100644
--- a/chrome/browser/component_updater/metadata_table_chromeos.cc
+++ b/chrome/browser/component_updater/metadata_table_chromeos.cc
@@ -60,8 +60,8 @@
 // The result is converted to lowercase to stay compatible with
 // CryptoLib::HexEncodeToBuffer().
 std::string HashUsername(std::string_view username) {
-  return base::ToLowerASCII(base::HexEncode(
-      base::SHA1Hash(base::as_byte_span(base::ToLowerASCII(username)))));
+  return base::HexEncodeLower(
+      base::SHA1Hash(base::as_byte_span(base::ToLowerASCII(username))));
 }
 
 const std::string& GetRequiredStringFromDict(const base::Value& dict,
diff --git a/chrome/browser/device_identity/chromeos/token_encryptor.cc b/chrome/browser/device_identity/chromeos/token_encryptor.cc
index 93eedc10..943b0e5 100644
--- a/chrome/browser/device_identity/chromeos/token_encryptor.cc
+++ b/chrome/browser/device_identity/chromeos/token_encryptor.cc
@@ -59,8 +59,7 @@
 
   // Return a concatenation of the nonce (counter) and the encrypted data, both
   // hex-encoded.
-  return base::ToLowerASCII(base::HexEncode(nonce) +
-                            base::HexEncode(ciphertext));
+  return base::HexEncodeLower(nonce) + base::HexEncodeLower(ciphertext);
 }
 
 std::string CryptohomeTokenEncryptor::DecryptWithSystemSalt(
@@ -99,8 +98,8 @@
     return token;
   }
 
-  return base::ToLowerASCII(base::HexEncode(
-      crypto::aes_ctr::Encrypt(key_, nonce_, base::as_byte_span(token))));
+  return base::HexEncodeLower(
+      crypto::aes_ctr::Encrypt(key_, nonce_, base::as_byte_span(token)));
 }
 
 std::string CryptohomeTokenEncryptor::WeakDecryptWithSystemSalt(
diff --git a/chrome/browser/devtools/devtools_file_helper.cc b/chrome/browser/devtools/devtools_file_helper.cc
index d665f3c..12582bb 100644
--- a/chrome/browser/devtools/devtools_file_helper.cc
+++ b/chrome/browser/devtools/devtools_file_helper.cc
@@ -44,7 +44,7 @@
 
 namespace devtools {
 std::string Md5OfUrlAsHexForDevTools(std::string_view url) {
-  return base::ToLowerASCII(base::HexEncode(crypto::obsolete::Md5::Hash(url)));
+  return base::HexEncodeLower(crypto::obsolete::Md5::Hash(url));
 }
 }  // namespace devtools
 
diff --git a/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc b/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
index bfee768..1209f581 100644
--- a/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
+++ b/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
@@ -168,7 +168,7 @@
 }
 
 std::string GetCertFingerprint1(const net::X509Certificate& cert) {
-  return base::ToLowerASCII(base::HexEncode(base::SHA1Hash(cert.cert_span())));
+  return base::HexEncodeLower(base::SHA1Hash(cert.cert_span()));
 }
 
 // Generates a gtest failure whenever extension JS reports failure.
diff --git a/chrome/browser/extensions/api/image_writer_private/operation.cc b/chrome/browser/extensions/api/image_writer_private/operation.cc
index 999c44e3..f097080 100644
--- a/chrome/browser/extensions/api/image_writer_private/operation.cc
+++ b/chrome/browser/extensions/api/image_writer_private/operation.cc
@@ -305,7 +305,7 @@
 
   if (read_size == 0) {
     // Nothing to read, we are done.
-    std::move(callback).Run(base::ToLowerASCII(base::HexEncode(md5.Finish())));
+    std::move(callback).Run(base::HexEncodeLower(md5.Finish()));
   } else {
     int64_t offset = base::checked_cast<int64_t>(bytes_processed);
     auto target = base::span(buffer).first(read_size);
diff --git a/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc b/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc
index 1da1e641..75bb7fea 100644
--- a/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc
+++ b/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc
@@ -207,8 +207,8 @@
 TEST_F(ImageWriterWriteFromUrlOperationTest, VerifyFile) {
   auto buffer = base::HeapArray<uint8_t>::Uninit(kTestFileSize);
   base::ReadFile(test_utils_.GetImagePath(), buffer);
-  std::string expected_hash = base::ToLowerASCII(
-      base::HexEncode(crypto::obsolete::Md5::HashForTesting(buffer.as_span())));
+  std::string expected_hash = base::HexEncodeLower(
+      crypto::obsolete::Md5::HashForTesting(buffer.as_span()));
 
   scoped_refptr<WriteFromUrlOperationForTest> operation =
       CreateOperation(GURL(""), expected_hash);
diff --git a/chrome/browser/extensions/updater/local_extension_cache_unittest.cc b/chrome/browser/extensions/updater/local_extension_cache_unittest.cc
index af6c0e5..f2e4747 100644
--- a/chrome/browser/extensions/updater/local_extension_cache_unittest.cc
+++ b/chrome/browser/extensions/updater/local_extension_cache_unittest.cc
@@ -84,8 +84,8 @@
                                         const base::Time& timestamp,
                                         base::FilePath* filename) {
     std::string data(size, 0);
-    const std::string hex_hash = base::ToLowerASCII(
-        base::HexEncode(crypto::hash::Sha256(base::as_byte_span(data))));
+    const std::string hex_hash =
+        base::HexEncodeLower(crypto::hash::Sha256(base::as_byte_span(data)));
 
     const base::FilePath file =
         GetExtensionFileName(dir, id, version, hex_hash);
diff --git a/chrome/browser/glic/browser_ui/glic_border_view_interactive_uitest.cc b/chrome/browser/glic/browser_ui/glic_border_view_interactive_uitest.cc
index 81822f6..14a425f 100644
--- a/chrome/browser/glic/browser_ui/glic_border_view_interactive_uitest.cc
+++ b/chrome/browser/glic/browser_ui/glic_border_view_interactive_uitest.cc
@@ -209,8 +209,9 @@
 class GlicBorderViewUiTest : public test::InteractiveGlicTest {
  public:
   GlicBorderViewUiTest() {
-    // Toggling this feature is only possible via command line.
-    features_.InitFromCommandLine("UiGpuRasterization", "");
+    // Toggling UiGpuRasterization is only possible via command line.
+    features_.InitFromCommandLine("UiGpuRasterization",
+                                  "GlicForceSimplifiedBorder");
   }
   ~GlicBorderViewUiTest() override = default;
 
diff --git a/chrome/browser/glic/browser_ui/glic_tab_underline_view_interactive_uitest.cc b/chrome/browser/glic/browser_ui/glic_tab_underline_view_interactive_uitest.cc
index 8749b37..e75b168 100644
--- a/chrome/browser/glic/browser_ui/glic_tab_underline_view_interactive_uitest.cc
+++ b/chrome/browser/glic/browser_ui/glic_tab_underline_view_interactive_uitest.cc
@@ -169,7 +169,8 @@
     const std::string enabled_features =
         base::StrCat({multitab_feature_name, ",", underline_feature_name, ",",
                       "UiGpuRasterization"});
-    features_.InitFromCommandLine(enabled_features, /*disable_features=*/"");
+    features_.InitFromCommandLine(
+        enabled_features, /*disable_features=*/"GlicForceSimplifiedBorder");
   }
   ~GlicTabUnderlineViewUiTest() override = default;
 
diff --git a/chrome/browser/media/router/discovery/discovery_network_monitor.cc b/chrome/browser/media/router/discovery/discovery_network_monitor.cc
index 28553f8..4d88084 100644
--- a/chrome/browser/media/router/discovery/discovery_network_monitor.cc
+++ b/chrome/browser/media/router/discovery/discovery_network_monitor.cc
@@ -40,8 +40,7 @@
     combined_ids = combined_ids + "!" + network_info.network_id;
   }
 
-  return base::ToLowerASCII(
-      base::HexEncode(crypto::hash::Sha256(combined_ids)));
+  return base::HexEncodeLower(crypto::hash::Sha256(combined_ids));
 }
 
 }  // namespace
diff --git a/chrome/browser/permissions/permission_request_manager_browsertest.cc b/chrome/browser/permissions/permission_request_manager_browsertest.cc
index 997af8c..b52e892 100644
--- a/chrome/browser/permissions/permission_request_manager_browsertest.cc
+++ b/chrome/browser/permissions/permission_request_manager_browsertest.cc
@@ -1608,18 +1608,15 @@
       permissions::PermissionRequestManager::AutoResponseType::ACCEPT_ALL);
 
   // Request notification permission.
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  permissions::PermissionRequestObserver observer(web_contents);
-  ASSERT_TRUE(content::ExecJs(web_contents, R"(
-              new Promise(resolve => {
-                Notification.requestPermission().then(function (permission) {
-                  resolve(permission);
-                });
-              })
-            )",
-                              content::EXECUTE_SCRIPT_NO_USER_GESTURE));
-  observer.Wait();
+  auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
+  auto request_supported = std::make_unique<permissions::MockPermissionRequest>(
+      kInitialURL, permissions::RequestType::kNotifications,
+      permissions::PermissionRequestGestureType::GESTURE,
+      /*request_state=*/nullptr);
+  GetPermissionRequestManager()->AddRequest(web_contents->GetPrimaryMainFrame(),
+                                            std::move(request_supported));
+
+  bubble_factory()->WaitForPermissionBubble();
   EXPECT_EQ(1, bubble_factory()->show_count());
 
   // Close the tab.
@@ -1647,18 +1644,15 @@
       permissions::PermissionRequestManager::AutoResponseType::ACCEPT_ALL);
 
   // Request notification permission.
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  permissions::PermissionRequestObserver observer(web_contents);
-  ASSERT_TRUE(content::ExecJs(web_contents, R"(
-              new Promise(resolve => {
-                Notification.requestPermission().then(function (permission) {
-                  resolve(permission);
-                });
-              })
-            )",
-                              content::EXECUTE_SCRIPT_NO_USER_GESTURE));
-  observer.Wait();
+  auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
+  auto request_supported = std::make_unique<permissions::MockPermissionRequest>(
+      kInitialURL, permissions::RequestType::kNotifications,
+      permissions::PermissionRequestGestureType::GESTURE,
+      /*request_state=*/nullptr);
+  GetPermissionRequestManager()->AddRequest(web_contents->GetPrimaryMainFrame(),
+                                            std::move(request_supported));
+
+  bubble_factory()->WaitForPermissionBubble();
   EXPECT_EQ(1, bubble_factory()->show_count());
 
   // Navigate away.
@@ -1751,6 +1745,330 @@
       "Permissions.PredictionService.Geolocation.PostPromptSessionDuration", 1);
 }
 
+IN_PROC_BROWSER_TEST_F(PermissionRequestManagerBrowserTest,
+                       PostPromptSessionDuration_10s_Notifications) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  base::HistogramTester histogram_tester;
+  const GURL kInitialURL =
+      embedded_test_server()->GetURL("/permissions/killswitch_tester.html");
+
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), kInitialURL));
+  bubble_factory()->set_response_type(
+      permissions::PermissionRequestManager::AutoResponseType::ACCEPT_ALL);
+
+  // Request notification permission.
+  auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
+  auto request_supported = std::make_unique<permissions::MockPermissionRequest>(
+      kInitialURL, permissions::RequestType::kNotifications,
+      permissions::PermissionRequestGestureType::GESTURE,
+      /*request_state=*/nullptr);
+  GetPermissionRequestManager()->AddRequest(web_contents->GetPrimaryMainFrame(),
+                                            std::move(request_supported));
+
+  bubble_factory()->WaitForPermissionBubble();
+  GetPermissionRequestManager()
+      ->set_notification_request_first_display_time_for_testing(
+          base::TimeTicks::Now() - base::Seconds(5));
+
+  // Close the tab.
+  browser()->tab_strip_model()->CloseWebContentsAt(
+      browser()->tab_strip_model()->active_index(),
+      TabCloseTypes::CLOSE_USER_GESTURE);
+
+  // Histogram should be recorded.
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Notifications."
+      "PostPromptSessionDuration10s",
+      1);
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Notifications.PostPromptSessionDuration",
+      1);
+}
+
+IN_PROC_BROWSER_TEST_F(PermissionRequestManagerBrowserTest,
+                       PostPromptSessionDuration_10s_Geolocation) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  base::HistogramTester histogram_tester;
+  const GURL kInitialURL =
+      embedded_test_server()->GetURL("/permissions/killswitch_tester.html");
+
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), kInitialURL));
+  bubble_factory()->set_response_type(
+      permissions::PermissionRequestManager::AutoResponseType::ACCEPT_ALL);
+
+  // Request geolocation permission.
+  auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
+  auto request_supported = std::make_unique<permissions::MockPermissionRequest>(
+      kInitialURL, permissions::RequestType::kGeolocation,
+      permissions::PermissionRequestGestureType::GESTURE,
+      /*request_state=*/nullptr);
+  GetPermissionRequestManager()->AddRequest(web_contents->GetPrimaryMainFrame(),
+                                            std::move(request_supported));
+
+  bubble_factory()->WaitForPermissionBubble();
+  GetPermissionRequestManager()
+      ->set_geolocation_request_first_display_time_for_testing(
+          base::TimeTicks::Now() - base::Seconds(5));
+
+  // Close the tab.
+  browser()->tab_strip_model()->CloseWebContentsAt(
+      browser()->tab_strip_model()->active_index(),
+      TabCloseTypes::CLOSE_USER_GESTURE);
+
+  // Histogram should be recorded.
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Geolocation.PostPromptSessionDuration10s",
+      1);
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Geolocation.PostPromptSessionDuration", 1);
+}
+
+IN_PROC_BROWSER_TEST_F(PermissionRequestManagerBrowserTest,
+                       PostPromptSessionDuration_1m_Notifications) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  base::HistogramTester histogram_tester;
+  const GURL kInitialURL =
+      embedded_test_server()->GetURL("/permissions/killswitch_tester.html");
+
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), kInitialURL));
+  bubble_factory()->set_response_type(
+      permissions::PermissionRequestManager::AutoResponseType::ACCEPT_ALL);
+
+  // Request notification permission.
+  auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
+  auto request_supported = std::make_unique<permissions::MockPermissionRequest>(
+      kInitialURL, permissions::RequestType::kNotifications,
+      permissions::PermissionRequestGestureType::GESTURE,
+      /*request_state=*/nullptr);
+  GetPermissionRequestManager()->AddRequest(web_contents->GetPrimaryMainFrame(),
+                                            std::move(request_supported));
+
+  bubble_factory()->WaitForPermissionBubble();
+  GetPermissionRequestManager()
+      ->set_notification_request_first_display_time_for_testing(
+          base::TimeTicks::Now() - base::Seconds(30));
+
+  // Close the tab.
+  browser()->tab_strip_model()->CloseWebContentsAt(
+      browser()->tab_strip_model()->active_index(),
+      TabCloseTypes::CLOSE_USER_GESTURE);
+
+  // Histogram should be recorded.
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Notifications."
+      "PostPromptSessionDuration10s",
+      0);
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Notifications.PostPromptSessionDuration1m",
+      1);
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Notifications.PostPromptSessionDuration",
+      1);
+}
+
+IN_PROC_BROWSER_TEST_F(PermissionRequestManagerBrowserTest,
+                       PostPromptSessionDuration_Notifications_Over1m) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  base::HistogramTester histogram_tester;
+  const GURL kInitialURL =
+      embedded_test_server()->GetURL("/permissions/killswitch_tester.html");
+
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), kInitialURL));
+  bubble_factory()->set_response_type(
+      permissions::PermissionRequestManager::AutoResponseType::ACCEPT_ALL);
+
+  // Request notification permission.
+  auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
+  auto request_supported = std::make_unique<permissions::MockPermissionRequest>(
+      kInitialURL, permissions::RequestType::kNotifications,
+      permissions::PermissionRequestGestureType::GESTURE,
+      /*request_state=*/nullptr);
+  GetPermissionRequestManager()->AddRequest(web_contents->GetPrimaryMainFrame(),
+                                            std::move(request_supported));
+
+  bubble_factory()->WaitForPermissionBubble();
+  GetPermissionRequestManager()
+      ->set_notification_request_first_display_time_for_testing(
+          base::TimeTicks::Now() - base::Seconds(70));
+
+  // Close the tab.
+  browser()->tab_strip_model()->CloseWebContentsAt(
+      browser()->tab_strip_model()->active_index(),
+      TabCloseTypes::CLOSE_USER_GESTURE);
+
+  // Histogram should be recorded.
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Notifications."
+      "PostPromptSessionDuration10s",
+      0);
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Notifications.PostPromptSessionDuration1m",
+      0);
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Notifications.PostPromptSessionDuration",
+      1);
+}
+
+IN_PROC_BROWSER_TEST_F(PermissionRequestManagerBrowserTest,
+                       PostPromptSessionDuration_1m_Geolocation) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  base::HistogramTester histogram_tester;
+  const GURL kInitialURL =
+      embedded_test_server()->GetURL("/permissions/killswitch_tester.html");
+
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), kInitialURL));
+  bubble_factory()->set_response_type(
+      permissions::PermissionRequestManager::AutoResponseType::ACCEPT_ALL);
+
+  // Request geolocation permission.
+  auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
+  auto request_supported = std::make_unique<permissions::MockPermissionRequest>(
+      kInitialURL, permissions::RequestType::kGeolocation,
+      permissions::PermissionRequestGestureType::GESTURE,
+      /*request_state=*/nullptr);
+  GetPermissionRequestManager()->AddRequest(web_contents->GetPrimaryMainFrame(),
+                                            std::move(request_supported));
+
+  bubble_factory()->WaitForPermissionBubble();
+  GetPermissionRequestManager()
+      ->set_geolocation_request_first_display_time_for_testing(
+          base::TimeTicks::Now() - base::Seconds(30));
+
+  // Close the tab.
+  browser()->tab_strip_model()->CloseWebContentsAt(
+      browser()->tab_strip_model()->active_index(),
+      TabCloseTypes::CLOSE_USER_GESTURE);
+
+  // Histogram should be recorded.
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Geolocation.PostPromptSessionDuration10s",
+      0);
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Geolocation.PostPromptSessionDuration1m",
+      1);
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Geolocation.PostPromptSessionDuration", 1);
+}
+
+IN_PROC_BROWSER_TEST_F(PermissionRequestManagerBrowserTest,
+                       PostPromptSessionDuration_Geolocation_Over1m) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  base::HistogramTester histogram_tester;
+  const GURL kInitialURL =
+      embedded_test_server()->GetURL("/permissions/killswitch_tester.html");
+
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), kInitialURL));
+  bubble_factory()->set_response_type(
+      permissions::PermissionRequestManager::AutoResponseType::ACCEPT_ALL);
+
+  // Request geolocation permission.
+  auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
+  auto request_supported = std::make_unique<permissions::MockPermissionRequest>(
+      kInitialURL, permissions::RequestType::kGeolocation,
+      permissions::PermissionRequestGestureType::GESTURE,
+      /*request_state=*/nullptr);
+  GetPermissionRequestManager()->AddRequest(web_contents->GetPrimaryMainFrame(),
+                                            std::move(request_supported));
+
+  bubble_factory()->WaitForPermissionBubble();
+  GetPermissionRequestManager()
+      ->set_geolocation_request_first_display_time_for_testing(
+          base::TimeTicks::Now() - base::Seconds(70));
+
+  // Close the tab.
+  browser()->tab_strip_model()->CloseWebContentsAt(
+      browser()->tab_strip_model()->active_index(),
+      TabCloseTypes::CLOSE_USER_GESTURE);
+
+  // Histogram should be recorded.
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Geolocation.PostPromptSessionDuration10s",
+      0);
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Geolocation.PostPromptSessionDuration1m",
+      0);
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Geolocation.PostPromptSessionDuration", 1);
+}
+
+IN_PROC_BROWSER_TEST_F(PermissionRequestManagerBrowserTest,
+                       PostPromptSessionDuration_5m_Notifications) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  base::HistogramTester histogram_tester;
+  const GURL kInitialURL =
+      embedded_test_server()->GetURL("/permissions/killswitch_tester.html");
+
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), kInitialURL));
+  bubble_factory()->set_response_type(
+      permissions::PermissionRequestManager::AutoResponseType::ACCEPT_ALL);
+
+  // Request notification permission.
+  auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
+  auto request_supported = std::make_unique<permissions::MockPermissionRequest>(
+      kInitialURL, permissions::RequestType::kNotifications,
+      permissions::PermissionRequestGestureType::GESTURE,
+      /*request_state=*/nullptr);
+  GetPermissionRequestManager()->AddRequest(web_contents->GetPrimaryMainFrame(),
+                                            std::move(request_supported));
+
+  bubble_factory()->WaitForPermissionBubble();
+  GetPermissionRequestManager()
+      ->set_notification_request_first_display_time_for_testing(
+          base::TimeTicks::Now() - base::Minutes(3));
+
+  // Close the tab.
+  browser()->tab_strip_model()->CloseWebContentsAt(
+      browser()->tab_strip_model()->active_index(),
+      TabCloseTypes::CLOSE_USER_GESTURE);
+
+  // Histogram should be recorded.
+  histogram_tester.ExpectUniqueSample(
+      "Permissions.PredictionService.Notifications.PostPromptSessionDuration5m",
+      base::Minutes(3).InMilliseconds(), 1);
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Notifications.PostPromptSessionDuration",
+      1);
+}
+
+IN_PROC_BROWSER_TEST_F(PermissionRequestManagerBrowserTest,
+                       PostPromptSessionDuration_5m_Geolocation) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  base::HistogramTester histogram_tester;
+  const GURL kInitialURL =
+      embedded_test_server()->GetURL("/permissions/killswitch_tester.html");
+
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), kInitialURL));
+  bubble_factory()->set_response_type(
+      permissions::PermissionRequestManager::AutoResponseType::ACCEPT_ALL);
+
+  // Request notification permission.
+  auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
+  auto request_supported = std::make_unique<permissions::MockPermissionRequest>(
+      kInitialURL, permissions::RequestType::kGeolocation,
+      permissions::PermissionRequestGestureType::GESTURE,
+      /*request_state=*/nullptr);
+  GetPermissionRequestManager()->AddRequest(web_contents->GetPrimaryMainFrame(),
+                                            std::move(request_supported));
+
+  bubble_factory()->WaitForPermissionBubble();
+  GetPermissionRequestManager()
+      ->set_notification_request_first_display_time_for_testing(
+          base::TimeTicks::Now() - base::Minutes(3));
+
+  // Close the tab.
+  browser()->tab_strip_model()->CloseWebContentsAt(
+      browser()->tab_strip_model()->active_index(),
+      TabCloseTypes::CLOSE_USER_GESTURE);
+
+  // Histogram should be recorded.
+  histogram_tester.ExpectUniqueSample(
+      "Permissions.PredictionService.Notifications.PostPromptSessionDuration5m",
+      base::Minutes(3).InMilliseconds(), 1);
+  histogram_tester.ExpectTotalCount(
+      "Permissions.PredictionService.Notifications.PostPromptSessionDuration",
+      1);
+}
+
 class PermissionRequestManagerApproximateLocationBrowserTest
     : public PermissionRequestManagerBrowserTestBase {
   base::test::ScopedFeatureList scoped_feature_list_ =
diff --git a/chrome/browser/profile_resetter/resettable_settings_snapshot.cc b/chrome/browser/profile_resetter/resettable_settings_snapshot.cc
index f7b2971..0a17afd 100644
--- a/chrome/browser/profile_resetter/resettable_settings_snapshot.cc
+++ b/chrome/browser/profile_resetter/resettable_settings_snapshot.cc
@@ -84,7 +84,7 @@
   std::sort(enabled_extensions_.begin(), enabled_extensions_.end());
 
   // Choose a random ID for this snapshot and store it.
-  guid_ = base::ToLowerASCII(base::HexEncode(crypto::RandBytesAsArray<16>()));
+  guid_ = base::HexEncodeLower(crypto::RandBytesAsArray<16>());
 }
 
 ResettableSettingsSnapshot::~ResettableSettingsSnapshot() {
diff --git a/chrome/browser/safe_browsing/threat_details_unittest.cc b/chrome/browser/safe_browsing/threat_details_unittest.cc
index bdc49eb..00a669297 100644
--- a/chrome/browser/safe_browsing/threat_details_unittest.cc
+++ b/chrome/browser/safe_browsing/threat_details_unittest.cc
@@ -72,8 +72,8 @@
 namespace {
 
 std::string ComputeMd5(std::string_view data) {
-  return base::ToLowerASCII(base::HexEncode(
-      crypto::obsolete::Md5::HashForTesting(base::as_byte_span(data))));
+  return base::HexEncodeLower(
+      crypto::obsolete::Md5::HashForTesting(base::as_byte_span(data)));
 }
 
 // Mixture of HTTP and HTTPS.  No special treatment for HTTPS.
diff --git a/chrome/browser/shell_integration_mac_unittest.mm b/chrome/browser/shell_integration_mac_unittest.mm
index dc79229..29ce73df 100644
--- a/chrome/browser/shell_integration_mac_unittest.mm
+++ b/chrome/browser/shell_integration_mac_unittest.mm
@@ -10,46 +10,34 @@
 #include "components/version_info/channel.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#include "chrome/test/base/scoped_channel_override.h"
+#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+
 namespace shell_integration {
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-// A test fixture that allows for overriding the channel on macOS.
-class ShellIntegrationMacTest : public testing::Test {
- public:
-  ShellIntegrationMacTest() = default;
 
- protected:
-  class ScopedChannelOverrider {
-   public:
-    explicit ScopedChannelOverrider(version_info::Channel channel)
-        : original_channel_(chrome::GetChannel()) {
-      chrome::SetChannelForTesting(channel);
-    }
-    ~ScopedChannelOverrider() {
-      chrome::SetChannelForTesting(original_channel_);
-    }
-
-   private:
-    version_info::Channel original_channel_;
-  };
-};
-
-TEST_F(ShellIntegrationMacTest, GetDirectLaunchUrlScheme) {
+TEST(ShellIntegrationMacTest, GetDirectLaunchUrlScheme) {
   // Test each channel on Mac.
   {
-    ScopedChannelOverrider stable(version_info::Channel::STABLE);
+    chrome::ScopedChannelOverride stable(
+        chrome::ScopedChannelOverride::Channel::kStable);
     EXPECT_EQ("google-chrome", GetDirectLaunchUrlScheme());
   }
   {
-    ScopedChannelOverrider beta(version_info::Channel::BETA);
+    chrome::ScopedChannelOverride beta(
+        chrome::ScopedChannelOverride::Channel::kBeta);
     EXPECT_EQ("google-chrome-beta", GetDirectLaunchUrlScheme());
   }
   {
-    ScopedChannelOverrider dev(version_info::Channel::DEV);
+    chrome::ScopedChannelOverride dev(
+        chrome::ScopedChannelOverride::Channel::kDev);
     EXPECT_EQ("google-chrome-dev", GetDirectLaunchUrlScheme());
   }
   {
-    ScopedChannelOverrider canary(version_info::Channel::CANARY);
+    chrome::ScopedChannelOverride canary(
+        chrome::ScopedChannelOverride::Channel::kCanary);
     EXPECT_EQ("google-chrome-canary", GetDirectLaunchUrlScheme());
   }
 }
diff --git a/chrome/browser/shortcuts/shortcut_creator_linux.cc b/chrome/browser/shortcuts/shortcut_creator_linux.cc
index 0a73cd1..0470c3c 100644
--- a/chrome/browser/shortcuts/shortcut_creator_linux.cc
+++ b/chrome/browser/shortcuts/shortcut_creator_linux.cc
@@ -39,8 +39,7 @@
 namespace {
 
 base::SafeBaseName GenerateIconFilename(const GURL& url) {
-  std::string url_hash =
-      base::ToLowerASCII(base::HexEncode(crypto::hash::Sha256(url.spec())));
+  std::string url_hash = base::HexEncodeLower(crypto::hash::Sha256(url.spec()));
   std::optional<base::SafeBaseName> base_name =
       base::SafeBaseName::Create(base::StrCat({"shortcut-", url_hash, ".png"}));
   CHECK(base_name);
diff --git a/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc b/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc
index 0f35e19..de95adb 100644
--- a/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc
+++ b/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc
@@ -39,7 +39,7 @@
 
 namespace spellcheck {
 std::string Md5AsHexForDictionaryChecksum(std::string_view data) {
-  return base::ToLowerASCII(base::HexEncode(crypto::obsolete::Md5::Hash(data)));
+  return base::HexEncodeLower(crypto::obsolete::Md5::Hash(data));
 }
 }  // namespace spellcheck
 
diff --git a/chrome/browser/sync/test/integration/single_client_webauthn_credentials_sync_test.cc b/chrome/browser/sync/test/integration/single_client_webauthn_credentials_sync_test.cc
index 5a9ede0..cd1728b 100644
--- a/chrome/browser/sync/test/integration/single_client_webauthn_credentials_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_webauthn_credentials_sync_test.cc
@@ -967,8 +967,8 @@
     sync_pb::WebauthnCredentialSpecifics specifics3 = NewPasskey();
     expected_sync_ids.push_back(specifics3.sync_id());
     fake_server_->InjectEntity(CreateEntityWithCustomClientTagHash(
-        /*client_tag_hash=*/base::ToLowerASCII(
-            base::HexEncode(base::as_byte_span(specifics3.sync_id()))),
+        /*client_tag_hash=*/
+        base::HexEncodeLower(base::as_byte_span(specifics3.sync_id())),
         specifics3));
   }
 
@@ -1033,8 +1033,8 @@
     sync_pb::WebauthnCredentialSpecifics specifics3 = NewPasskey();
     expected_sync_ids.push_back(specifics3.sync_id());
     fake_server_->InjectEntity(CreateEntityWithCustomClientTagHash(
-        /*client_tag_hash=*/base::ToLowerASCII(
-            base::HexEncode(base::as_byte_span(specifics3.sync_id()))),
+        /*client_tag_hash=*/
+        base::HexEncodeLower(base::as_byte_span(specifics3.sync_id())),
         specifics3));
   }
 
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionController.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionController.java
index e884992..ad74d4f 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionController.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionController.java
@@ -665,7 +665,7 @@
             // top. We restrict its position and height to allow scrolling and avoid rendering
             // offscreen.
             int windowHeight = mWindowAndroid.getDisplay().getDisplayHeight();
-            int maxHeight = windowHeight - keyboardHeight;
+            int maxHeight = windowHeight - keyboardHeight - statusBarHeight;
             mControlContainer.setMaxHeight(maxHeight);
 
             int maxTranslation = -(windowHeight - layer.getHeight() - statusBarHeight);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionControllerTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionControllerTest.java
index e071154..fdf16bad 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionControllerTest.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionControllerTest.java
@@ -1107,7 +1107,7 @@
         doReturn(430).when(mDisplayAndroid).getDisplayHeight();
         mKeyboardHeightSupplier.set(401);
         verify(mControlContainerView).setTranslationY(-(430f - TOOLBAR_HEIGHT - statusBarHeight));
-        verify(mControlContainer, atLeast(1)).setMaxHeight(30);
+        verify(mControlContainer, atLeast(1)).setMaxHeight(20);
     }
 
     @Test
diff --git a/chrome/browser/ui/ash/wallpaper/wallpaper_controller_client_impl.cc b/chrome/browser/ui/ash/wallpaper/wallpaper_controller_client_impl.cc
index 7b2dff02..8508c6a 100644
--- a/chrome/browser/ui/ash/wallpaper/wallpaper_controller_client_impl.cc
+++ b/chrome/browser/ui/ash/wallpaper/wallpaper_controller_client_impl.cc
@@ -124,7 +124,7 @@
   // presumably meant to lowercase the input string before hashing, but it did
   // not.
   base::Extend(data, base::as_byte_span(files_id_unhashed));
-  return base::ToLowerASCII(base::HexEncode(base::SHA1Hash(data)));
+  return base::HexEncodeLower(base::SHA1Hash(data));
 }
 
 // Returns true if wallpaper files id can be returned successfully.
diff --git a/chrome/browser/ui/webui/certificate_manager/client_cert_sources_writable_unittest.cc b/chrome/browser/ui/webui/certificate_manager/client_cert_sources_writable_unittest.cc
index 9cf56514..610b1ac 100644
--- a/chrome/browser/ui/webui/certificate_manager/client_cert_sources_writable_unittest.cc
+++ b/chrome/browser/ui/webui/certificate_manager/client_cert_sources_writable_unittest.cc
@@ -85,7 +85,7 @@
 }
 
 std::string HexHash(base::span<const uint8_t> data) {
-  return base::ToLowerASCII(base::HexEncode(crypto::SHA256Hash(data)));
+  return base::HexEncodeLower(crypto::SHA256Hash(data));
 }
 
 class FakeCertificateManagerPage
diff --git a/chrome/browser/ui/webui/certificate_manager/user_cert_sources_unittest.cc b/chrome/browser/ui/webui/certificate_manager/user_cert_sources_unittest.cc
index 6033984..336d4f56 100644
--- a/chrome/browser/ui/webui/certificate_manager/user_cert_sources_unittest.cc
+++ b/chrome/browser/ui/webui/certificate_manager/user_cert_sources_unittest.cc
@@ -128,13 +128,11 @@
 
   ASSERT_EQ(infos.size(), 2u);
   EXPECT_EQ(infos[0]->sha256hash_hex,
-            base::ToLowerASCII(
-                base::HexEncode(net::X509Certificate::CalculateFingerprint256(
-                    test_cert_1->cert_buffer()))));
+            base::HexEncodeLower(net::X509Certificate::CalculateFingerprint256(
+                test_cert_1->cert_buffer())));
   EXPECT_EQ(infos[1]->sha256hash_hex,
-            base::ToLowerASCII(
-                base::HexEncode(net::X509Certificate::CalculateFingerprint256(
-                    test_cert_2->cert_buffer()))));
+            base::HexEncodeLower(net::X509Certificate::CalculateFingerprint256(
+                test_cert_2->cert_buffer())));
 }
 
 TEST_F(UserCertSourcesUnitTest, TestImportCertificate) {
@@ -318,11 +316,11 @@
 
   base::test::TestFuture<certificate_manager::mojom::ActionResultPtr>
       delete_future;
-  source.DeleteCertificate("",
-                           base::ToLowerASCII(base::HexEncode(
-                               net::X509Certificate::CalculateFingerprint256(
-                                   test_cert_1->cert_buffer()))),
-                           delete_future.GetCallback());
+  source.DeleteCertificate(
+      "",
+      base::HexEncodeLower(net::X509Certificate::CalculateFingerprint256(
+          test_cert_1->cert_buffer())),
+      delete_future.GetCallback());
   certificate_manager::mojom::ActionResultPtr delete_result =
       delete_future.Take();
   ASSERT_TRUE(delete_result);
@@ -332,9 +330,8 @@
       GetAllCertsFromDB();
   ASSERT_EQ(remaining_certs.size(), 1u);
   EXPECT_EQ(remaining_certs[0].sha256hash_hex,
-            base::ToLowerASCII(
-                base::HexEncode(net::X509Certificate::CalculateFingerprint256(
-                    test_cert_2->cert_buffer()))));
+            base::HexEncodeLower(net::X509Certificate::CalculateFingerprint256(
+                test_cert_2->cert_buffer())));
   EXPECT_TRUE(fake_page->metadata_update_called());
 }
 
@@ -364,11 +361,11 @@
 
   base::test::TestFuture<certificate_manager::mojom::ActionResultPtr>
       delete_future;
-  source.DeleteCertificate("",
-                           base::ToLowerASCII(base::HexEncode(
-                               net::X509Certificate::CalculateFingerprint256(
-                                   test_cert_1->cert_buffer()))),
-                           delete_future.GetCallback());
+  source.DeleteCertificate(
+      "",
+      base::HexEncodeLower(net::X509Certificate::CalculateFingerprint256(
+          test_cert_1->cert_buffer())),
+      delete_future.GetCallback());
   certificate_manager::mojom::ActionResultPtr delete_result =
       delete_future.Take();
   EXPECT_TRUE(delete_result.is_null());
@@ -408,11 +405,11 @@
                     static_cast<int>(CACertificateManagementPermission::kNone));
   base::test::TestFuture<certificate_manager::mojom::ActionResultPtr>
       delete_future;
-  source.DeleteCertificate("",
-                           base::ToLowerASCII(base::HexEncode(
-                               net::X509Certificate::CalculateFingerprint256(
-                                   test_cert_1->cert_buffer()))),
-                           delete_future.GetCallback());
+  source.DeleteCertificate(
+      "",
+      base::HexEncodeLower(net::X509Certificate::CalculateFingerprint256(
+          test_cert_1->cert_buffer())),
+      delete_future.GetCallback());
   certificate_manager::mojom::ActionResultPtr delete_result =
       delete_future.Take();
   EXPECT_TRUE(delete_result->is_error());
diff --git a/chrome/browser/ui/webui/connectors_internals/device_trust_utils.cc b/chrome/browser/ui/webui/connectors_internals/device_trust_utils.cc
index b4922fba..ac0b065a 100644
--- a/chrome/browser/ui/webui/connectors_internals/device_trust_utils.cc
+++ b/chrome/browser/ui/webui/connectors_internals/device_trust_utils.cc
@@ -165,9 +165,8 @@
   }
 
   return connectors_internals::mojom::CertificateMetadata::New(
-      base::ToLowerASCII(base::HexEncode(certificate->serial_number())),
-      base::ToLowerASCII(
-          base::HexEncode(certificate->CalculateChainFingerprint256())),
+      base::HexEncodeLower(certificate->serial_number()),
+      base::HexEncodeLower(certificate->CalculateChainFingerprint256()),
       base::UnlocalizedTimeFormatWithPattern(certificate->valid_start(),
                                              "MMM d, yyyy"),
       base::UnlocalizedTimeFormatWithPattern(certificate->valid_expiry(),
diff --git a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
index 496c9cb..1b62745 100644
--- a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
+++ b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
@@ -507,7 +507,7 @@
     dict.Set("expiration", base::NumberToString(item->expiration.InSeconds()));
     dict.Set("last_used_time", base::TimeFormatHTTP(item->last_used_time));
     dict.Set("size", base::NumberToString(item->size));
-    dict.Set("hash", base::ToLowerASCII(base::HexEncode(item->hash)));
+    dict.Set("hash", base::HexEncodeLower(item->hash));
     dict_list.Append(std::move(dict));
   }
   AllowJavascript();
diff --git a/chrome/browser/web_applications/os_integration/web_app_uninstallation_via_os_settings_registration_win.cc b/chrome/browser/web_applications/os_integration/web_app_uninstallation_via_os_settings_registration_win.cc
index 7f4b0946..8c72949 100644
--- a/chrome/browser/web_applications/os_integration/web_app_uninstallation_via_os_settings_registration_win.cc
+++ b/chrome/browser/web_applications/os_integration/web_app_uninstallation_via_os_settings_registration_win.cc
@@ -30,8 +30,8 @@
 // Deliberately not in namespace{} so it can be friended by
 // crypto::obsolete::Md5.
 std::wstring Md5AsHexForUninstall(const std::wstring& key) {
-  return base::ASCIIToWide(base::ToLowerASCII(
-      base::HexEncode(crypto::obsolete::Md5::Hash(base::as_byte_span(key)))));
+  return base::ASCIIToWide(base::HexEncodeLower(
+      crypto::obsolete::Md5::Hash(base::as_byte_span(key))));
 }
 
 }  // namespace internals
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index c094d1dd..cde71f2 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1761976497-06cead0a5728a9a7ac90f3241746256a493ef7e5-93e6fae7c4b463985d5c02e215f15c78aeeeed63.profdata
+chrome-android32-main-1762041312-169e4a909a97a2bf47ba27f27d6606cb834ea489-00b822863d8d0c0d2b9bd92a9e886e1eac7c763c.profdata
diff --git a/chrome/build/android-desktop-x64.pgo.txt b/chrome/build/android-desktop-x64.pgo.txt
index 185f9637..a652ff07 100644
--- a/chrome/build/android-desktop-x64.pgo.txt
+++ b/chrome/build/android-desktop-x64.pgo.txt
@@ -1 +1 @@
-chrome-android-desktop-x64-main-1761976497-036f396c9995ce36cfce11b449301b33dabfe97c-93e6fae7c4b463985d5c02e215f15c78aeeeed63.profdata
+chrome-android-desktop-x64-main-1762041312-c59a2ec1ffac2635f5609371ff20faee92d8ac0c-00b822863d8d0c0d2b9bd92a9e886e1eac7c763c.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index f3eb8cd..ce1f201 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1761976497-dc60266066e070954e26b78cc7785003a5e1cc75-93e6fae7c4b463985d5c02e215f15c78aeeeed63.profdata
+chrome-linux-main-1762041312-0dccdf69e3c6357233b5450a32b97f987744076b-00b822863d8d0c0d2b9bd92a9e886e1eac7c763c.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 492e5c8..9659003 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1761983958-5e03c5a0d7bb060540613c6a0e6dd24fa64fe9fa-47ed8db11bbf739df7173496d6d2b0bddbdf459d.profdata
+chrome-mac-arm-main-1762048720-864305bfd18ac008b08ba50e281e63e2f166b4d4-b8bc17f084467c881f507f344067d23574c087e9.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 56a3624..a4034aa1 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1761976497-e823362955ef1b61399670d5e9d1b39a4a1440e7-93e6fae7c4b463985d5c02e215f15c78aeeeed63.profdata
+chrome-mac-main-1762041312-02ca7022e969a8d5bcf13ef37882ee4287b9b2b5-00b822863d8d0c0d2b9bd92a9e886e1eac7c763c.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index 6c2aa1a..04950a8 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1761976497-afb524a9a5d2de5987bb2a3b6540280426454b11-93e6fae7c4b463985d5c02e215f15c78aeeeed63.profdata
+chrome-win-arm64-main-1762041312-f7915c6e4e4b019b6b1f21f2151b0ae5c616e22a-00b822863d8d0c0d2b9bd92a9e886e1eac7c763c.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index c3302c2..eedccaa 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1761965856-758e3977fe0b43baa9a0cdda8c149165caf83dab-2987de5ff09a2a23141136d97738db3352e750aa.profdata
+chrome-win32-main-1762030690-aa3708947e8c5ff6a995acec42785c7ac31f7b81-59588e33a36c4bf65d0a34536eb9cada56fb3dff.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index d702de89..961aa30 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1761944367-95c52c745e2c49b3877eaf1a09028fee6f18337b-1ba3748204ff41e43ff2920b24fa594f45a7edb2.profdata
+chrome-win64-main-1762030690-f25f4dcf0d393ce5f5afae9c10ca95d672c33403-59588e33a36c4bf65d0a34536eb9cada56fb3dff.profdata
diff --git a/chrome/test/chromedriver/chrome_launcher.cc b/chrome/test/chromedriver/chrome_launcher.cc
index acedd65..da2a4227 100644
--- a/chrome/test/chromedriver/chrome_launcher.cc
+++ b/chrome/test/chromedriver/chrome_launcher.cc
@@ -1052,7 +1052,7 @@
 std::string GenerateExtensionId(std::string_view input) {
   auto hash = crypto::hash::Sha256(input);
   auto hash_first16 = base::span<uint8_t>(hash).first<16>();
-  std::string output = base::ToLowerASCII(base::HexEncode(hash_first16));
+  std::string output = base::HexEncodeLower(hash_first16);
   ConvertHexadecimalToIDAlphabet(output);
   return output;
 }
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index bbefd02..661d2e5 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-16469.0.0-1072828
\ No newline at end of file
+16470.0.0-1072847
\ No newline at end of file
diff --git a/chromeos/ash/experiences/system_web_apps/types/system_web_app_delegate.cc b/chromeos/ash/experiences/system_web_apps/types/system_web_app_delegate.cc
index d08581d..2146cef 100644
--- a/chromeos/ash/experiences/system_web_apps/types/system_web_app_delegate.cc
+++ b/chromeos/ash/experiences/system_web_apps/types/system_web_app_delegate.cc
@@ -32,6 +32,10 @@
 
 SystemWebAppDelegate::~SystemWebAppDelegate() = default;
 
+bool SystemWebAppDelegate::ShouldForceReinstall() const {
+  return false;
+}
+
 std::vector<std::string> SystemWebAppDelegate::GetAppIdsToUninstallAndReplace()
     const {
   return {};
diff --git a/chromeos/ash/experiences/system_web_apps/types/system_web_app_delegate.h b/chromeos/ash/experiences/system_web_apps/types/system_web_app_delegate.h
index f4d82be..9d5d6c6 100644
--- a/chromeos/ash/experiences/system_web_apps/types/system_web_app_delegate.h
+++ b/chromeos/ash/experiences/system_web_apps/types/system_web_app_delegate.h
@@ -77,6 +77,11 @@
   // Returns a WebAppInstallInfo struct to complete installation.
   virtual std::unique_ptr<web_app::WebAppInstallInfo> GetWebAppInfo() const = 0;
 
+  // Decides whether the `SystemWebAppManager` should override its default app
+  // update policy and trigger a force reinstall on system start. If false is
+  // returned, the default app update policy is applied.
+  virtual bool ShouldForceReinstall() const;
+
   // Returns a vector of AppIDs. Each app_id (a string id) may correspond to any
   // ChromeOS app: ChromeApp, WebApp, Arc++ etc. The apps specified will have
   // their data migrated to this System App.
diff --git a/clank b/clank
index 5f11730..7db2a58 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 5f117309cf85351b5d6d528aac6a7a6c10a3a1e3
+Subproject commit 7db2a580417bce0e9be1d8539c3d94ea2b9a695d
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index 4a0c618..c48b1011 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "74.11",
-  "log_list_timestamp": "2025-10-31T12:53:08Z",
+  "version": "74.12",
+  "log_list_timestamp": "2025-11-01T12:53:38Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/permissions/permission_request_manager.h b/components/permissions/permission_request_manager.h
index a5c6d08..38f3cd71 100644
--- a/components/permissions/permission_request_manager.h
+++ b/components/permissions/permission_request_manager.h
@@ -247,6 +247,16 @@
     current_request_first_display_time_ = time;
   }
 
+  void set_notification_request_first_display_time_for_testing(
+      base::TimeTicks time) {
+    notification_request_first_display_time_ = time;
+  }
+
+  void set_geolocation_request_first_display_time_for_testing(
+      base::TimeTicks time) {
+    geolocation_request_first_display_time_ = time;
+  }
+
   std::optional<PermissionUiSelector::PredictionGrantLikelihood>
   prediction_grant_likelihood_for_testing() const {
     return prediction_grant_likelihood_;
diff --git a/components/permissions/permission_uma_util.cc b/components/permissions/permission_uma_util.cc
index 924aca5..87259376 100644
--- a/components/permissions/permission_uma_util.cc
+++ b/components/permissions/permission_uma_util.cc
@@ -2459,11 +2459,34 @@
 
   base::TimeDelta duration =
       base::TimeTicks::Now() - request_first_display_time;
+  std::string permission_string =
+      PermissionUtil::GetPermissionString(permission);
+
+  // Record the original histogram for up to 1 hour.
   base::UmaHistogramLongTimes100(
-      base::StrCat({"Permissions.PredictionService.",
-                    PermissionUtil::GetPermissionString(permission),
+      base::StrCat({"Permissions.PredictionService.", permission_string,
                     ".PostPromptSessionDuration"}),
       duration);
+
+      // UmaHistogramCustomTimes(name, sample, Milliseconds(1), Hours(1), 100);
+
+  // Record finer-grained histograms for the first minute.
+  if (duration <= base::Seconds(10)) {
+    base::UmaHistogramCustomTimes(
+        base::StrCat({"Permissions.PredictionService.", permission_string,
+                      ".PostPromptSessionDuration10s"}),
+        duration, base::Milliseconds(1), base::Milliseconds(10), 10);
+  } else if (duration <= base::Minutes(1)) {
+    base::UmaHistogramCustomTimes(
+        base::StrCat({"Permissions.PredictionService.", permission_string,
+                      ".PostPromptSessionDuration1m"}),
+        duration, base::Milliseconds(11), base::Minutes(1), 25);
+  } else if (duration <= base::Minutes(5)) {
+    base::UmaHistogramCustomTimes(
+        base::StrCat({"Permissions.PredictionService.", permission_string,
+                      ".PostPromptSessionDuration5m"}),
+        duration, base::Minutes(1), base::Minutes(5), 15);
+  }
 }
 
 }  // namespace permissions
diff --git a/content/browser/background_fetch/storage/get_initialization_data_task.h b/content/browser/background_fetch/storage/get_initialization_data_task.h
index d926904..6380c803 100644
--- a/content/browser/background_fetch/storage/get_initialization_data_task.h
+++ b/content/browser/background_fetch/storage/get_initialization_data_task.h
@@ -14,7 +14,6 @@
 #include "base/memory/scoped_refptr.h"
 #include "content/browser/background_fetch/background_fetch_registration_id.h"
 #include "content/browser/background_fetch/storage/database_task.h"
-#include "content/browser/service_worker/service_worker_info.h"
 #include "content/common/background_fetch/background_fetch_types.h"
 #include "content/common/content_export.h"
 #include "net/base/isolation_info.h"
diff --git a/content/browser/cookie_store/cookie_store_manager.cc b/content/browser/cookie_store/cookie_store_manager.cc
index 3b514fc..19ea418 100644
--- a/content/browser/cookie_store/cookie_store_manager.cc
+++ b/content/browser/cookie_store/cookie_store_manager.cc
@@ -13,6 +13,7 @@
 #include "content/browser/cookie_store/cookie_change_subscriptions.pb.h"
 #include "content/browser/renderer_host/render_frame_host_impl.h"
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
+#include "content/browser/service_worker/service_worker_info.h"
 #include "content/browser/service_worker/service_worker_metrics.h"
 #include "content/browser/service_worker/service_worker_registration.h"
 #include "content/browser/service_worker/service_worker_version.h"
diff --git a/content/browser/indexed_db/indexed_db_internals_ui.cc b/content/browser/indexed_db/indexed_db_internals_ui.cc
index c430c677..a9e68b9 100644
--- a/content/browser/indexed_db/indexed_db_internals_ui.cc
+++ b/content/browser/indexed_db/indexed_db_internals_ui.cc
@@ -26,6 +26,7 @@
 #include "content/browser/indexed_db/indexed_db_internals.mojom-forward.h"
 #include "content/browser/indexed_db/indexed_db_internals.mojom.h"
 #include "content/browser/renderer_host/render_frame_host_impl.h"
+#include "content/browser/service_worker/service_worker_info.h"
 #include "content/browser/worker_host/shared_worker_service_impl.h"
 #include "content/grit/indexed_db_resources.h"
 #include "content/grit/indexed_db_resources_map.h"
diff --git a/content/browser/renderer_host/code_cache_host_impl.h b/content/browser/renderer_host/code_cache_host_impl.h
index 8b0faa8..9a8b3ab 100644
--- a/content/browser/renderer_host/code_cache_host_impl.h
+++ b/content/browser/renderer_host/code_cache_host_impl.h
@@ -12,13 +12,14 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
 #include "build/build_config.h"
-#include "components/services/storage/public/mojom/cache_storage_control.mojom.h"
+#include "components/services/storage/public/mojom/cache_storage_control.mojom-forward.h"
 #include "content/common/content_export.h"
 #include "mojo/public/cpp/base/big_buffer.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
 #include "mojo/public/cpp/bindings/unique_receiver_set.h"
-#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
+#include "net/base/network_isolation_key.h"
+#include "third_party/blink/public/common/storage_key/storage_key.h"
 #include "third_party/blink/public/mojom/loader/code_cache.mojom.h"
 
 class GURL;
diff --git a/content/browser/service_worker/service_worker_context_core_observer.h b/content/browser/service_worker/service_worker_context_core_observer.h
index 069f7fe6..ea6f4fc 100644
--- a/content/browser/service_worker/service_worker_context_core_observer.h
+++ b/content/browser/service_worker/service_worker_context_core_observer.h
@@ -11,7 +11,6 @@
 
 #include "base/functional/callback.h"
 #include "base/time/time.h"
-#include "content/browser/service_worker/service_worker_info.h"
 #include "content/browser/service_worker/service_worker_version.h"
 #include "content/public/browser/global_routing_id.h"
 #include "content/public/browser/service_worker_context_observer.h"
@@ -29,6 +28,7 @@
 
 struct ConsoleMessage;
 struct ServiceWorkerRegistrationInformation;
+struct ServiceWorkerVersionInfo;
 
 class ServiceWorkerContextCoreObserver {
  public:
diff --git a/content/browser/service_worker/service_worker_identifiability_metrics.cc b/content/browser/service_worker/service_worker_identifiability_metrics.cc
index 17389ce..dbe9393 100644
--- a/content/browser/service_worker/service_worker_identifiability_metrics.cc
+++ b/content/browser/service_worker/service_worker_identifiability_metrics.cc
@@ -5,6 +5,7 @@
 #include "content/browser/service_worker/service_worker_identifiability_metrics.h"
 
 #include "base/containers/contains.h"
+#include "content/browser/service_worker/service_worker_info.h"
 #include "content/public/browser/worker_type.h"
 #include "services/metrics/public/cpp/delegating_ukm_recorder.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
diff --git a/content/browser/service_worker/service_worker_identifiability_metrics.h b/content/browser/service_worker/service_worker_identifiability_metrics.h
index eea290e25..6db0eaa 100644
--- a/content/browser/service_worker/service_worker_identifiability_metrics.h
+++ b/content/browser/service_worker/service_worker_identifiability_metrics.h
@@ -11,12 +11,13 @@
 #include <set>
 
 #include "content/browser/service_worker/service_worker_context_core_observer.h"
-#include "content/browser/service_worker/service_worker_info.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_client.mojom.h"
 
 namespace content {
 
+struct ServiceWorkerVersionInfo;
+
 struct VersionIdentifiabilityInfo {
   VersionIdentifiabilityInfo() = default;
   VersionIdentifiabilityInfo(ukm::SourceId ukm_source_id, const GURL& origin)
diff --git a/content/browser/service_worker/service_worker_main_resource_loader_unittest.cc b/content/browser/service_worker/service_worker_main_resource_loader_unittest.cc
index 256bbaf..fb8c143 100644
--- a/content/browser/service_worker/service_worker_main_resource_loader_unittest.cc
+++ b/content/browser/service_worker/service_worker_main_resource_loader_unittest.cc
@@ -17,6 +17,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
 #include "base/timer/elapsed_timer.h"
+#include "components/services/storage/public/mojom/cache_storage_control.mojom.h"
 #include "content/browser/loader/navigation_loader_interceptor.h"
 #include "content/browser/loader/response_head_update_params.h"
 #include "content/browser/service_worker/embedded_worker_test_helper.h"
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
index 90ac673..315ab51d5 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -33,6 +33,7 @@
 #include "base/time/default_tick_clock.h"
 #include "base/trace_event/trace_event.h"
 #include "base/uuid.h"
+#include "components/services/storage/public/mojom/cache_storage_control.mojom.h"
 #include "components/services/storage/public/mojom/service_worker_database.mojom-forward.h"
 #include "content/browser/bad_message.h"
 #include "content/browser/child_process_security_policy_impl.h"
diff --git a/content/browser/service_worker/test_service_worker_observer.cc b/content/browser/service_worker/test_service_worker_observer.cc
index 52f3d77..e4e6ebc 100644
--- a/content/browser/service_worker/test_service_worker_observer.cc
+++ b/content/browser/service_worker/test_service_worker_observer.cc
@@ -9,6 +9,7 @@
 #include "base/run_loop.h"
 #include "base/test/test_simple_task_runner.h"
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
+#include "content/browser/service_worker/service_worker_info.h"
 
 namespace content {
 
diff --git a/content/browser/worker_host/shared_worker_host.h b/content/browser/worker_host/shared_worker_host.h
index 7803905..e5270e6 100644
--- a/content/browser/worker_host/shared_worker_host.h
+++ b/content/browser/worker_host/shared_worker_host.h
@@ -36,6 +36,7 @@
 #include "services/device/public/cpp/compute_pressure/buildflags.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
 #include "services/network/public/cpp/cross_origin_embedder_policy.h"
+#include "services/network/public/mojom/client_security_state.mojom.h"
 #include "services/network/public/mojom/url_loader_factory.mojom-forward.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
 #include "third_party/blink/public/mojom/blob/blob_url_store.mojom-forward.h"
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
index 1a285d4..bc66a60a 100644
--- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-122bda87810c0337dd42879fedff887591f9b16a
\ No newline at end of file
+40f49817fb6a8e675b9e1955cd270dd44f6a4b0c
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
index 92b4235a..866e336 100644
--- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-2816fb020bc4cac17cf7ae160dcfb0ef61b31918
\ No newline at end of file
+f9eba55946f213b9b477a8fd5dce53e5b8be40ee
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
index 37335f15..303220e 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-89af5c2a2a92e157dc69bd566537ec1f192f685e
\ No newline at end of file
+291d57e5a713343500bf31f88ff4ff3c4e5d9a14
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
index 33e23ca..fb1b568 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-27b80ad0005ca42414ca1393a21401043d51156d
\ No newline at end of file
+d2598be8c7ffafb7cbe7ed52b332ce2ec5a9064f
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
index 856da708e..f41ab77 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-02fcdfd4347352af51974beb7adee707275a947f
\ No newline at end of file
+b2ac599b11e7cce0eb53ce78afe9fb3ebc179e3c
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
index 635da75..1f8d971 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-e73965ef9a37b0044882f3dddb5eceb09db60f34
\ No newline at end of file
+36c966906cce7ef5014235f2b8b34eb0281e7332
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
index 9134573..96d35866 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-1d275f4117516be66e4b695d2bc3406ebf6104f2
\ No newline at end of file
+fdf546c3aa1b7c4d8949e2e3a8d78bf9c10b0050
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
index b627597..0801c06 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-d711c9f9188709d43caec62387418461cfcbdb95
\ No newline at end of file
+b7b1a731b318842f30db60a57b827fde291a5f92
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
index 67380276..84504bc 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-a49a957ac59fc8265f0b4a0033a9438414f588e2
\ No newline at end of file
+dded48f59edb71b98eeb4411c83bb1efd4e22a6b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 53a98d86..d7b32d4 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-c6ba5b70a958e5ca1cc319cc2f9aa2225dfa1ad2
\ No newline at end of file
+800a5365da727a06435d5d6ebab37d9b2bc176f2
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 6ea3454c..1c3ada6 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-78c98bec5b98595f48b4e27f1585c4a2ed926625
\ No newline at end of file
+267b0fc7f1c56802ff2c0414ed6378652f402008
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
index 5d930a2..f5c07e4 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-54b31cbf2ab6a7a66f06768e14bec36fddb5a075
\ No newline at end of file
+bdd646c9ba43803a152eb3173668afcad0c76e3f
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index 80762a6..f9cbf8b 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-b77e540f2b9cb48112880dcca780c3a02e16688b
\ No newline at end of file
+9a8d8df2f742862884c5ce6f7915a7fc8894c74e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 96c9040..30396e16 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-ea24611d5d442cd785c79aac3dd72ec913a34f20
\ No newline at end of file
+817f515b89a3fc6ca3f5c8d5f1c8eebe34b44fdc
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index 39395950..cacc025 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-db5f0b3ec0bd7e5157ca31f910a2d3e35bb58e26
\ No newline at end of file
+e5bd159e89580b1e705ed10d6e18660fbb832055
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
index c065950..8ea3187d 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-bd31ee793aa51c2057f1c5e06ca4d816d05882c9
\ No newline at end of file
+468da8beb21696f417c6042ee5c230ee9c4d9e8f
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index 650ef1dc4..0ac6fdf 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-64cbda6ad58761f3ed2d79fab50b2e3510bd60fc
\ No newline at end of file
+324c714f7da2cbd86e9251b0573beac1ca24f660
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 3accf05..5bb3c1bd 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-8de71e1b17e2c7c10eb43eb2b0202a4f6159f670
\ No newline at end of file
+f9910e1d7fef85153b7238a11d80e95da08c5647
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
index d462b27..c23a7f9 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-4b8c1efe670ecc67783b538e2ffd821e93b8c0d9
\ No newline at end of file
+34a54267531bc23bc7c76415cff7f768859d92e1
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
index 5117a10a..0824c9a 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-330d9cc8ac67d6b04dec31f2d867a129cecdae1a
\ No newline at end of file
+5b33acb3a466a5fb3d1e9f82e7296a467aeb8601
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index 9b0c00a..603c4e0 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-dd501e9c7bc9f52c817e5bf6471e7412ffff5de5
\ No newline at end of file
+5cbe51600d491133d02038e82a72569b0e87b265
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
index 34aa70d..fba39a41 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-e9e09abf6bd885599e2f31f8091e8751f1dafe2b
\ No newline at end of file
+47cf91b3c66ad40011114151cde9505c46ebca1c
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index 1bd4dc7..caa5f0b 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-b3520676d913a10a9584c23ab344a6770972df9f
\ No newline at end of file
+5900a21123b17161b89fc980bfc7e129c32ffed3
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
index d5811795..4211d59 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-2903eb720ab1cda61d43f9c60f7548e57b6045b6
\ No newline at end of file
+1643c1d6032cef656a86cb9d99d9c6cf440c9963
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index dfa3c32..8f8208f 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-0c71ad32636a7cc1c924a4998d5c6e2c812e8571
\ No newline at end of file
+34cb29a885fe759fe24a84f8897c083e8bfe9472
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
index 9955f79..789e669 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-d94d2991d64caab772b6d14d3271ad46db48ada4
\ No newline at end of file
+57b370a833a0a3eeedd0151f9ada59ff54a38007
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index 0a9d98ed..8c45d0c 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-bb091231417d8ff0ed057848294125b5ce78dc5b
\ No newline at end of file
+b2ae655e91367885ac42429472f49027919c1f47
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 1a9a93b..1bcff931 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-e723f17b7582943186e927de0c28cd8e0ffcf36d
\ No newline at end of file
+4b204268cc2f91d49eb2bfd416385e7edd264695
\ No newline at end of file
diff --git a/ios_internal b/ios_internal
index 59b0764..ac8e395 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit 59b076414e3e5ec964fa7cb0a7fbb44e005f626b
+Subproject commit ac8e3955b71b12b6cebf395c38bfc3503da5234a
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins
index 8bd2d843..554337c1 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-10-31 12:53 UTC
+# Last updated: 2025-11-01 12:53 UTC
 PinsListTimestamp
-1761915188
+1762001618
 
 TestSPKI
 sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json
index 27282c8..45f640d 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-10-31 12:53 UTC
+// Last updated: 2025-11-01 12:53 UTC
 //
 {
   "pinsets": [
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index ac71901..da70e988 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -11483,6 +11483,23 @@
             ]
         }
     ],
+    "GlicForceSimplifiedBorder": [
+        {
+            "platforms": [
+                "mac",
+                "windows",
+                "linux"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "GlicForceSimplifiedBorder"
+                    ]
+                }
+            ]
+        }
+    ],
     "GlicFreWarming": [
         {
             "platforms": [
diff --git a/third_party/blink/renderer/core/css/document_style_environment_variables.cc b/third_party/blink/renderer/core/css/document_style_environment_variables.cc
index 5c3304d3..81afcef7 100644
--- a/third_party/blink/renderer/core/css/document_style_environment_variables.cc
+++ b/third_party/blink/renderer/core/css/document_style_environment_variables.cc
@@ -55,10 +55,8 @@
     StyleEnvironmentVariables& parent,
     Document& document)
     : StyleEnvironmentVariables(parent), document_(&document) {
-  if (RuntimeEnabledFeatures::CSSPreferredTextScaleEnabled()) {
-    SetPreferredTextScale(
-        document_->GetSettings()->GetAccessibilityFontScaleFactor());
-  }
+  SetPreferredTextScale(
+      document_->GetSettings()->GetAccessibilityFontScaleFactor());
 }
 
 void DocumentStyleEnvironmentVariables::RecordVariableUsage(
diff --git a/third_party/blink/renderer/core/css/style_environment_variables.cc b/third_party/blink/renderer/core/css/style_environment_variables.cc
index 0da04b7e..cbfe3edf 100644
--- a/third_party/blink/renderer/core/css/style_environment_variables.cc
+++ b/third_party/blink/renderer/core/css/style_environment_variables.cc
@@ -49,9 +49,7 @@
   instance->SetVariable(UADefinedVariable::kKeyboardInsetHeight,
                         kKeyboardInsetDefault);
 
-  if (RuntimeEnabledFeatures::CSSPreferredTextScaleEnabled()) {
-    instance->SetVariable(UADefinedVariable::kPreferredTextScale, "1");
-  }
+  instance->SetVariable(UADefinedVariable::kPreferredTextScale, "1");
 }
 
 }  // namespace.
diff --git a/third_party/blink/renderer/core/page/page.cc b/third_party/blink/renderer/core/page/page.cc
index 98af8e34..9689843 100644
--- a/third_party/blink/renderer/core/page/page.cc
+++ b/third_party/blink/renderer/core/page/page.cc
@@ -1079,9 +1079,7 @@
       }
       break;
     case ChangeType::kFontScaleFactor:
-      if (!RuntimeEnabledFeatures::CSSPreferredTextScaleEnabled()) {
-        break;
-      }
+
       for (Frame* frame = MainFrame(); frame;
            frame = frame->Tree().TraverseNext()) {
         LocalFrame* local_frame = DynamicTo<LocalFrame>(frame);
diff --git a/third_party/blink/renderer/modules/media_capabilities/media_capabilities_test.cc b/third_party/blink/renderer/modules/media_capabilities/media_capabilities_test.cc
index 10f7ba7..a9bb53f 100644
--- a/third_party/blink/renderer/modules/media_capabilities/media_capabilities_test.cc
+++ b/third_party/blink/renderer/modules/media_capabilities/media_capabilities_test.cc
@@ -46,6 +46,7 @@
 #include "third_party/blink/renderer/platform/testing/task_environment.h"
 #include "third_party/blink/renderer/platform/testing/testing_platform_support.h"
 #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_view.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 #include "third_party/blink/renderer/platform/wtf/wtf_size_t.h"
@@ -70,7 +71,7 @@
     receiver_.Bind(
         mojo::PendingReceiver<media::mojom::blink::VideoDecodePerfHistory>(
             std::move(handle)));
-    receiver_.set_disconnect_handler(base::BindOnce(
+    receiver_.set_disconnect_handler(blink::BindOnce(
         &MockPerfHistoryService::OnConnectionError, base::Unretained(this)));
   }
 
@@ -93,8 +94,8 @@
         mojo::PendingReceiver<media::mojom::blink::WebrtcVideoPerfHistory>(
             std::move(handle)));
     receiver_.set_disconnect_handler(
-        base::BindOnce(&MockWebrtcPerfHistoryService::OnConnectionError,
-                       base::Unretained(this)));
+        blink::BindOnce(&MockWebrtcPerfHistoryService::OnConnectionError,
+                        base::Unretained(this)));
   }
 
   void OnConnectionError() { receiver_.reset(); }
@@ -120,7 +121,7 @@
     receiver_.Bind(
         mojo::PendingReceiver<media::mojom::blink::MediaMetricsProvider>(
             std::move(handle)));
-    receiver_.set_disconnect_handler(base::BindOnce(
+    receiver_.set_disconnect_handler(blink::BindOnce(
         &FakeMediaMetricsProvider::OnConnectionError, base::Unretained(this)));
   }
 
diff --git a/third_party/blink/renderer/modules/mediacapturefromelement/canvas_capture_handler.cc b/third_party/blink/renderer/modules/mediacapturefromelement/canvas_capture_handler.cc
index a5035bc..a44d45d 100644
--- a/third_party/blink/renderer/modules/mediacapturefromelement/canvas_capture_handler.cc
+++ b/third_party/blink/renderer/modules/mediacapturefromelement/canvas_capture_handler.cc
@@ -308,12 +308,13 @@
   DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_);
   DCHECK_EQ(pending_send_new_frame_calls_, 0u);
   if (last_frame_ && delegate_) {
-    io_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&CanvasCaptureHandler::CanvasCaptureHandlerDelegate::
-                           SendNewFrameOnIOThread,
-                       delegate_->GetWeakPtrForIOThread(), last_frame_,
-                       base::TimeTicks::Now()));
+    PostCrossThreadTask(
+        *io_task_runner_, FROM_HERE,
+        CrossThreadBindOnce(
+            &CanvasCaptureHandler::CanvasCaptureHandlerDelegate::
+                SendNewFrameOnIOThread,
+            delegate_->GetWeakPtrForIOThread(), last_frame_,
+            base::TimeTicks::Now()));
   }
   deferred_request_refresh_frame_ = false;
 }
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc
index 33e0b47b..72609340 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc
@@ -1340,7 +1340,7 @@
 
  protected:
   static base::OnceClosure AsClosure(CaptureVersionCb& cb) {
-    return base::BindOnce(&CaptureVersionCb::Call, base::Unretained(&cb));
+    return blink::BindOnce(&CaptureVersionCb::Call, base::Unretained(&cb));
   }
 
   static scoped_refptr<media::VideoFrame> MakeFrame(
diff --git a/third_party/blink/renderer/modules/mediastream/web_media_player_ms.cc b/third_party/blink/renderer/modules/mediastream/web_media_player_ms.cc
index 1b2ff56f..48b8dc2 100644
--- a/third_party/blink/renderer/modules/mediastream/web_media_player_ms.cc
+++ b/third_party/blink/renderer/modules/mediastream/web_media_player_ms.cc
@@ -63,6 +63,7 @@
 #include "third_party/blink/renderer/platform/timer.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_copier_media.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
 
 // Put this macro in a scope to prevent `client_` from being GC'd.
 // This is important for any method that might be called from anywhere
@@ -245,15 +246,13 @@
     // |gpu_memory_buffer_pool_| deletion is going to be posted to
     // |media_task_runner_|. base::Unretained() usage is fine since
     // |gpu_memory_buffer_pool_| outlives the task.
-    //
-    // TODO(crbug.com/964947): Converting this to PostCrossThreadTask requires
-    // re-binding a CrossThreadOnceFunction instance.
-    media_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(
+    PostCrossThreadTask(
+        *media_task_runner_, FROM_HERE,
+        CrossThreadBindOnce(
             &media::GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame,
-            base::Unretained(gpu_memory_buffer_pool_.get()), std::move(frame),
-            base::BindPostTaskToCurrentDefault(base::BindOnce(
+            CrossThreadUnretained(gpu_memory_buffer_pool_.get()),
+            std::move(frame),
+            base::BindPostTaskToCurrentDefault(blink::BindOnce(
                 &FrameDeliverer::EnqueueFrame,
                 weak_factory_for_pool_.GetWeakPtr(), original_frame_id))));
   }
@@ -1494,7 +1493,7 @@
   }
 
   compositor_->SetOnFramePresentedCallback(
-      base::BindPostTaskToCurrentDefault(base::BindOnce(
+      base::BindPostTaskToCurrentDefault(blink::BindOnce(
           &WebMediaPlayerMS::OnNewFramePresentedCallback, weak_this_)));
 
   compositor_->SetForceBeginFrames(true);
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 973b8fbf..121c6f7 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1505,10 +1505,6 @@
       name: "CSSPositionStickyStaticScrollPosition",
       status: "test",
     },
-    {
-      name: "CSSPreferredTextScale",
-      status: "stable",
-    },
     // https://drafts.csswg.org/css-values-5/#progress
     // progress()
     {
diff --git a/third_party/blink/renderer/platform/wtf/cross_thread_copier_media.h b/third_party/blink/renderer/platform/wtf/cross_thread_copier_media.h
index a80f05a..d240ad39 100644
--- a/third_party/blink/renderer/platform/wtf/cross_thread_copier_media.h
+++ b/third_party/blink/renderer/platform/wtf/cross_thread_copier_media.h
@@ -31,6 +31,8 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_CROSS_THREAD_COPIER_MEDIA_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_CROSS_THREAD_COPIER_MEDIA_H_
 
+#include "base/functional/callback.h"
+#include "base/memory/scoped_refptr.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_copier_base.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_copier_std.h"
@@ -111,6 +113,14 @@
   STATIC_ONLY(CrossThreadCopier);
 };
 
+template <>
+struct CrossThreadCopier<
+    base::OnceCallback<void(scoped_refptr<media::VideoFrame>)>>
+    : public CrossThreadCopierByValuePassThrough<
+          base::OnceCallback<void(scoped_refptr<media::VideoFrame>)>> {
+  STATIC_ONLY(CrossThreadCopier);
+};
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_CROSS_THREAD_COPIER_MEDIA_H_
diff --git a/third_party/compiler-rt/src b/third_party/compiler-rt/src
index 298fd1d..23fabde 160000
--- a/third_party/compiler-rt/src
+++ b/third_party/compiler-rt/src
@@ -1 +1 @@
-Subproject commit 298fd1dc22321033fb73b4c78ad6e89979e0128c
+Subproject commit 23fabde38f30838cf001a28e63570136b71e0ece
diff --git a/third_party/dawn b/third_party/dawn
index 2562ad0..67ec6b21 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit 2562ad0ac0307c50c34f291d3f879eb3350c08f3
+Subproject commit 67ec6b21abee630c159414ce379de2762281d23f
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 0339e4b..1c14e2a 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 0339e4bc4757f5ac2597ca7583df9ec622f822f0
+Subproject commit 1c14e2a7b5f957c71e9e1ffe11e2bd09a6769178
diff --git a/third_party/perfetto b/third_party/perfetto
index d972f3e..efc223a 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit d972f3eb1be39376d6e296e0fa98e0817d56ee45
+Subproject commit efc223a2387fd7f45ccf51346af95a4ec5f59f69
diff --git a/third_party/rust/chromium_crates_io/patches/temporal_rs/0001-Constrain-durations-proactively-before-passing-to-IC.patch b/third_party/rust/chromium_crates_io/patches/temporal_rs/0001-Constrain-durations-proactively-before-passing-to-IC.patch
new file mode 100644
index 0000000..70cc276
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/patches/temporal_rs/0001-Constrain-durations-proactively-before-passing-to-IC.patch
@@ -0,0 +1,116 @@
+From 450f0bf62bade57f077d2ece410746eb7be73747 Mon Sep 17 00:00:00 2001
+From: Manish Goregaokar <manishearth@google.com>
+Date: Sat, 1 Nov 2025 18:40:29 +0000
+Subject: [PATCH] Constrain durations proactively before passing to ICU4X
+
+This uplifts https://github.com/boa-dev/temporal/pull/615. It ought to
+prevent debug assertions and pathologically slow behavior when
+attempting to do date arithmetic with very large durations. These
+durations are too large to produce a valid in-range date anyway, so we
+can proactively error when we see them.
+
+Change-Id: Id2426776556b4451335b7d0f775b43b3c5b92ac7
+---
+ .../src/builtins/compiled/duration/tests.rs   | 21 +++++++++-
+ .../src/builtins/core/calendar.rs             | 39 +++++++++++++++++++
+ 2 files changed, 59 insertions(+), 1 deletion(-)
+
+diff --git a/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/compiled/duration/tests.rs b/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/compiled/duration/tests.rs
+index 72ae0e4a1f67b..0b6acac85cb18 100644
+--- a/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/compiled/duration/tests.rs
++++ b/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/compiled/duration/tests.rs
+@@ -1,7 +1,8 @@
+ use crate::{
+     duration::DateDuration,
+     options::{
+-        OffsetDisambiguation, RelativeTo, RoundingIncrement, RoundingMode, RoundingOptions, Unit,
++        OffsetDisambiguation, Overflow, RelativeTo, RoundingIncrement, RoundingMode,
++        RoundingOptions, Unit,
+     },
+     partial::PartialDuration,
+     Calendar, PlainDate, TimeZone, ZonedDateTime,
+@@ -626,6 +627,24 @@ fn add_normalized_time_duration_out_of_range() {
+     assert!(err.is_err())
+ }
+ 
++#[test]
++fn add_large_durations() {
++    // Testcases found by fuzzing <https://github.com/unicode-org/icu4x/pull/7206>
++    let base = PlainDate::new(2000, 1, 1, Calendar::from_str("dangi").unwrap()).unwrap();
++
++    let test_duration = Duration::from(DateDuration::new(4294901760, 256, 0, 0).unwrap());
++    assert!(base.add(&test_duration, Some(Overflow::Constrain)).is_err());
++
++    let test_duration = Duration::from(DateDuration::new(0, 1281, 0, 8589934592).unwrap());
++    assert!(base.add(&test_duration, Some(Overflow::Constrain)).is_err());
++
++    let test_duration = Duration::from(DateDuration::new(2046820352, 0, 0, 0).unwrap());
++    assert!(base.add(&test_duration, Some(Overflow::Constrain)).is_err());
++
++    let test_duration = Duration::from(DateDuration::new(0, 0, 2516582400, 0).unwrap());
++    assert!(base.add(&test_duration, Some(Overflow::Constrain)).is_err());
++}
++
+ #[test]
+ fn test_rounding_boundaries() {
+     let relative_to = PlainDate::new(2000, 1, 1, Calendar::default()).unwrap();
+diff --git a/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/calendar.rs b/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/calendar.rs
+index d1508eee29c8d..d4b55eb74529e 100644
+--- a/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/calendar.rs
++++ b/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/calendar.rs
+@@ -250,6 +250,43 @@ impl<'a> TryFrom<&'a CalendarFields> for DateFields<'a> {
+         Ok(this)
+     }
+ }
++
++/// See <https://github.com/unicode-org/icu4x/issues/7207>
++///
++/// We don't want to trigger any pathological or panicky testcases in ICU4X.
++///
++/// To aid in that, we early constrain date durations to things that have no hope of producing a datetime
++/// that is within Temporal range.
++fn early_constrain_date_duration(duration: &IcuDateDuration) -> Result<(), TemporalError> {
++    // Temporal range is -271821-04-20 to +275760-09-13
++    // This is (roughly) the maximum year duration that can exist for ISO
++    const TEMPORAL_MAX_ISO_YEAR_DURATION: u32 = 275760 + 271821;
++    // Double it. No calendar has years that are half the size of ISO years.
++    const YEAR_DURATION: u32 = 2 * TEMPORAL_MAX_ISO_YEAR_DURATION;
++    // Assume every year is a leap year, calculate a month range
++    const MONTH_DURATION: u32 = YEAR_DURATION * 13;
++    // Our longest year is 390 days
++    const DAY_DURATION: u32 = YEAR_DURATION * 390;
++    const WEEK_DURATION: u32 = DAY_DURATION / 7;
++
++    let err = Err(TemporalError::range().with_enum(ErrorMessage::IntermediateDateTimeOutOfRange));
++
++    if duration.years > YEAR_DURATION {
++        return err;
++    }
++    if duration.months > MONTH_DURATION {
++        return err;
++    }
++    if duration.weeks > WEEK_DURATION {
++        return err;
++    }
++    if duration.days > DAY_DURATION.into() {
++        return err;
++    }
++
++    Ok(())
++}
++
+ // ==== Public `CalendarSlot` methods ====
+ 
+ impl Calendar {
+@@ -437,6 +474,8 @@ impl Calendar {
+             weeks: u32::try_from(duration.weeks.abs()).map_err(|_| invalid)?,
+             days: u64::try_from(duration.days.abs()).map_err(|_| invalid)?,
+         };
++
++        early_constrain_date_duration(&duration)?;
+         let mut options = DateAddOptions::default();
+         options.overflow = Some(overflow.into());
+         let calendar_date = self.0.from_iso(*date.to_icu4x().inner());
+-- 
+2.51.1.930.gacf6e81ea2-goog
+
diff --git a/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/compiled/duration/tests.rs b/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/compiled/duration/tests.rs
index 72ae0e4..0b6acac8 100644
--- a/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/compiled/duration/tests.rs
+++ b/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/compiled/duration/tests.rs
@@ -1,7 +1,8 @@
 use crate::{
     duration::DateDuration,
     options::{
-        OffsetDisambiguation, RelativeTo, RoundingIncrement, RoundingMode, RoundingOptions, Unit,
+        OffsetDisambiguation, Overflow, RelativeTo, RoundingIncrement, RoundingMode,
+        RoundingOptions, Unit,
     },
     partial::PartialDuration,
     Calendar, PlainDate, TimeZone, ZonedDateTime,
@@ -627,6 +628,24 @@
 }
 
 #[test]
+fn add_large_durations() {
+    // Testcases found by fuzzing <https://github.com/unicode-org/icu4x/pull/7206>
+    let base = PlainDate::new(2000, 1, 1, Calendar::from_str("dangi").unwrap()).unwrap();
+
+    let test_duration = Duration::from(DateDuration::new(4294901760, 256, 0, 0).unwrap());
+    assert!(base.add(&test_duration, Some(Overflow::Constrain)).is_err());
+
+    let test_duration = Duration::from(DateDuration::new(0, 1281, 0, 8589934592).unwrap());
+    assert!(base.add(&test_duration, Some(Overflow::Constrain)).is_err());
+
+    let test_duration = Duration::from(DateDuration::new(2046820352, 0, 0, 0).unwrap());
+    assert!(base.add(&test_duration, Some(Overflow::Constrain)).is_err());
+
+    let test_duration = Duration::from(DateDuration::new(0, 0, 2516582400, 0).unwrap());
+    assert!(base.add(&test_duration, Some(Overflow::Constrain)).is_err());
+}
+
+#[test]
 fn test_rounding_boundaries() {
     let relative_to = PlainDate::new(2000, 1, 1, Calendar::default()).unwrap();
 
diff --git a/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/calendar.rs b/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/calendar.rs
index d1508eee..d4b55eb7 100644
--- a/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/calendar.rs
+++ b/third_party/rust/chromium_crates_io/vendor/temporal_rs-v0_1/src/builtins/core/calendar.rs
@@ -250,6 +250,43 @@
         Ok(this)
     }
 }
+
+/// See <https://github.com/unicode-org/icu4x/issues/7207>
+///
+/// We don't want to trigger any pathological or panicky testcases in ICU4X.
+///
+/// To aid in that, we early constrain date durations to things that have no hope of producing a datetime
+/// that is within Temporal range.
+fn early_constrain_date_duration(duration: &IcuDateDuration) -> Result<(), TemporalError> {
+    // Temporal range is -271821-04-20 to +275760-09-13
+    // This is (roughly) the maximum year duration that can exist for ISO
+    const TEMPORAL_MAX_ISO_YEAR_DURATION: u32 = 275760 + 271821;
+    // Double it. No calendar has years that are half the size of ISO years.
+    const YEAR_DURATION: u32 = 2 * TEMPORAL_MAX_ISO_YEAR_DURATION;
+    // Assume every year is a leap year, calculate a month range
+    const MONTH_DURATION: u32 = YEAR_DURATION * 13;
+    // Our longest year is 390 days
+    const DAY_DURATION: u32 = YEAR_DURATION * 390;
+    const WEEK_DURATION: u32 = DAY_DURATION / 7;
+
+    let err = Err(TemporalError::range().with_enum(ErrorMessage::IntermediateDateTimeOutOfRange));
+
+    if duration.years > YEAR_DURATION {
+        return err;
+    }
+    if duration.months > MONTH_DURATION {
+        return err;
+    }
+    if duration.weeks > WEEK_DURATION {
+        return err;
+    }
+    if duration.days > DAY_DURATION.into() {
+        return err;
+    }
+
+    Ok(())
+}
+
 // ==== Public `CalendarSlot` methods ====
 
 impl Calendar {
@@ -437,6 +474,8 @@
             weeks: u32::try_from(duration.weeks.abs()).map_err(|_| invalid)?,
             days: u64::try_from(duration.days.abs()).map_err(|_| invalid)?,
         };
+
+        early_constrain_date_duration(&duration)?;
         let mut options = DateAddOptions::default();
         options.overflow = Some(overflow.into());
         let calendar_date = self.0.from_iso(*date.to_icu4x().inner());
diff --git a/third_party/skia b/third_party/skia
index 5ed21229..7a5b34c 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 5ed21229cdd96f23e833046cb6b177ee656f3967
+Subproject commit 7a5b34ce9bbfe214ceee101952190fc44b432944
diff --git a/third_party/webrtc b/third_party/webrtc
index 9881db6..5e6ccdf 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit 9881db6d2acd8b52c85f16ae2d1a4f4617396bbc
+Subproject commit 5e6ccdf2d66b38451bdcf254b1c3451cdbeff71d
diff --git a/tools/metrics/histograms/metadata/permissions/histograms.xml b/tools/metrics/histograms/metadata/permissions/histograms.xml
index 7e8a9487..7c2635a7 100644
--- a/tools/metrics/histograms/metadata/permissions/histograms.xml
+++ b/tools/metrics/histograms/metadata/permissions/histograms.xml
@@ -1116,6 +1116,47 @@
   <token key="PermissionType" variants="CpssSupportedTypes"/>
 </histogram>
 
+<histogram
+    name="Permissions.PredictionService.{PermissionType}.PostPromptSessionDuration10s"
+    units="ms" expires_after="2026-10-27">
+  <owner>elklm@chromium.org</owner>
+  <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
+  <summary>
+    Records the duration of the browsing session up to 10 seconds on a given
+    origin after a Notifications or Geolocation permission prompt has been
+    displayed and until the tab is closed or a cross-origin navigation occurs.
+  </summary>
+  <token key="PermissionType" variants="CpssSupportedTypes"/>
+</histogram>
+
+<histogram
+    name="Permissions.PredictionService.{PermissionType}.PostPromptSessionDuration1m"
+    units="ms" expires_after="2026-10-27">
+  <owner>elklm@chromium.org</owner>
+  <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
+  <summary>
+    Records the duration of the browsing session between 11 seconds and 1 minute
+    on a given origin after a Notifications or Geolocation permission prompt has
+    been displayed and until the tab is closed or a cross-origin navigation
+    occurs.
+  </summary>
+  <token key="PermissionType" variants="CpssSupportedTypes"/>
+</histogram>
+
+<histogram
+    name="Permissions.PredictionService.{PermissionType}.PostPromptSessionDuration5m"
+    units="ms" expires_after="2026-10-27">
+  <owner>elklm@chromium.org</owner>
+  <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
+  <summary>
+    Records the duration of the browsing session between 1 minute and 5 minutes
+    on a given origin after a Notifications or Geolocation permission prompt has
+    been displayed and until the tab is closed or a cross-origin navigation
+    occurs.
+  </summary>
+  <token key="PermissionType" variants="CpssSupportedTypes"/>
+</histogram>
+
 <histogram name="Permissions.PredictionService.{PermissionType}{Gesture}"
     enum="PermissionRequestLikelihood" expires_after="2026-09-30">
   <owner>elklm@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 73ad456c..e385482 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@
             "full_remote_path": "perfetto-luci-artifacts/v52.0/linux-arm64/trace_processor_shell"
         },
         "win": {
-            "hash": "a4664a47b90d0abc272a40a0c1fe4d0ac8e7d3d8",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/d972f3eb1be39376d6e296e0fa98e0817d56ee45/trace_processor_shell.exe"
+            "hash": "ced6756b3eade9b0e59768e2863b94fa17420fbd",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/efc223a2387fd7f45ccf51346af95a4ec5f59f69/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "46d798c1864490cbb2ee053d6eda436184470e69",
@@ -22,7 +22,7 @@
         },
         "linux": {
             "hash": "ee16e387fead87383d2c66a04c574976bc1c58ab",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/d972f3eb1be39376d6e296e0fa98e0817d56ee45/trace_processor_shell"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/efc223a2387fd7f45ccf51346af95a4ec5f59f69/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/v8 b/v8
index 4f5a631..8588961 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit 4f5a631dc76e29f03342dade37470c9a0539ce5f
+Subproject commit 858896197cffa32f7e50bf1159718529edc1b3de