diff --git a/DEPS b/DEPS
index 12842f2..aa8d772 100644
--- a/DEPS
+++ b/DEPS
@@ -295,19 +295,19 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'src_internal_revision': '1352cfbc23726d06daa6dc8320c8eea7da7ce099',
+  'src_internal_revision': '0e4d05ade90a328d85fdf0516544ba6491b6ec35',
   # 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': 'dc1958e7118c351cef5adae548337f7f11746b95',
+  'skia_revision': '6d29cd66e2059acd5491a733c2c7dfd3c4f8b2f6',
   # 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': 'ad9041e4d0f760e0c1c87d79a60b9ff1d2c77f96',
+  'v8_revision': '06588c16dc5fb1d32c50f884015b90e327dd444c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '94ee620d2e2f771d350e14ca90804bf1457834d3',
+  'angle_revision': 'dfefcbc68cc3627e6cd80c83ce67815fb5b6efd9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -319,7 +319,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
-  'boringssl_revision': '5622da92e1e7bacb5d0785ff5650a5a23b143b84',
+  'boringssl_revision': '45f35e007cf55285581fae079b721c63922871b9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
@@ -371,7 +371,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '9e57472d991ef17726931163fb943277e372421e',
+  'catapult_revision': '43e5bb872890d0b7038c81744e169c9e0edd8013',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -391,7 +391,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': '668292f6e38a78c16e1877c6e9919716bd7da04d',
+  'devtools_frontend_revision': '576cf523f65f423424a2991c4c7983bf87d05348',
   # 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.
@@ -475,7 +475,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling nearby
   # and whatever else without interference from each other.
-  'nearby_revision': 'e96ebef1d3b0e109109f1c108e5d9f4c773bd281',
+  'nearby_revision': 'fff5c22e3178a633f57e4ad1fb5ad96a6116240a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling securemessage
   # and whatever else without interference from each other.
@@ -515,11 +515,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling webpagereplay
   # and whatever else without interference from each other.
-  'webpagereplay_revision': '18172a359f6dab8e3f70b6c5c8c7c55d3e97537a',
+  'webpagereplay_revision': 'e463cb47fd355a21463d0f567ee78c0316e198d6',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling llvm-libc
   # and whatever else without interference from each other.
-  'llvm_libc_revision':    'a2f7b489cd4fecf856eb3739cc5a341545022896',
+  'llvm_libc_revision':    'ced017335267492f948279508b4c60681eddf1b8',
   # 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.
@@ -1521,7 +1521,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '36c23c84ecbd0d6f2633e7aae5f64cf4245061c4',
+    '1dace63d589c82eb30da99b3579c15199e4d0c69',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1986,7 +1986,7 @@
   # Tools used when building Chrome for Chrome OS. This affects both the Simple
   # Chrome workflow, as well as the chromeos-chrome ebuild.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'be7db7a8cb09acf9cb9467be836b9569777baba6',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'd6db0868fc4ae3f19fd9d9ee4a4dfd6f0c88b078',
       'condition': 'checkout_chromeos',
   },
 
@@ -2296,7 +2296,7 @@
     Var('chromium_git') + '/external/libaddressinput.git' + '@' + '2610f7b1043d6784ada41392fc9392d1ea09ea07',
 
   'src/third_party/libaom/source/libaom':
-    Var('aomedia_git') + '/aom.git' + '@' +  '3304ee478e7e8e41da2d9f96e5c5fc9b1e5bb043',
+    Var('aomedia_git') + '/aom.git' + '@' +  '6c4010bde34318fd6c1f0d10196f27ac9908eeb8',
 
   'src/third_party/crabbyavif/src':
     Var('chromium_git') + '/external/github.com/webmproject/CrabbyAvif.git' + '@' + Var('crabbyavif_revision'),
@@ -2559,7 +2559,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '167e1f0dab2691a4b2a911e001317353405d83d9',
+    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '891351c7233523c01dc0e58ac8650df47fad9ab5',
 
   'src/base/tracing/test/data': {
     'bucket': 'perfetto',
@@ -2878,16 +2878,16 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@3395378f6990e79066b5f1647f6f8ac5de07e26d',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@8d1a39bd39e47a078f784e038d4561d2cfdc5f21',
   'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@05cfcc1613c28c1274036f53616d66324f7cd383',
   'src/third_party/spirv-cross/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3',
   'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@50daff941d88609b4d2ad076eae558e727f8e5cd',
   'src/third_party/spirv-tools/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Tools@dec28643ed15f68a2bc95650de25e0a7486b564c',
   'src/third_party/vulkan-headers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Headers@b39ab380a44b6c8df462c34e976ea9ce2d2c336b',
-  'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@22c0f133e6675f9313c12fb5e58337f8fa9b9195',
+  'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@7ef1581a996ba3ac58ae739fd7bfcf24d3bf2a57',
   'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@d671923090e4dc74c0ebdb10c6e09fa0826e1fe9',
   'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@54c9baf20802a13279e23fa4cb0528dd5cf16064',
-  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@3fa19fccc75171a6b607f95510c37739c606b809',
+  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@1c9f8202b87119b23c81dad7f44cba2b8bc79180',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '56300b29fbfcc693ee6609ddad3fdd5b7a449a21',
@@ -2932,7 +2932,7 @@
     Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'),
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '2f61be11629916ec0d3f083ef16b85113ee1db54',
+    Var('webrtc_git') + '/src.git' + '@' + 'b98efd4b57d927b119a0c5fd70181c423d179339',
 
   # 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.
@@ -3065,7 +3065,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'EAAQA9qexggZC8JxHnUvbFSiC_sWL9RtxzE90Twyxp4C',
+        'version': 'rMCcVF38pkHQkbSgVUADZbrTE_WJStYC4Um_RFCMtsMC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3076,7 +3076,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': '7UcYt7Be4ZKo4woY47ZC5J9Mwmc7qVMnADv2RryFiusC',
+        'version': '_dc11gpBziW1a28ibIkLThLi3baWtOKprilMoMAwCc0C',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -4718,7 +4718,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        'b254cb46f918229d29978dcd9685439f27798668',
+        '6f934023958e0f948212f4743697f175669da13b',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
index 951e32f..8146abc5 100644
--- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
+++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -1063,6 +1063,9 @@
                 AwFeatures.WEBVIEW_CONNECT_TO_COMPONENT_PROVIDER_IN_BACKGROUND,
                 "Connect to the non-embedded components provider from a background thread."),
         Flag.baseFeature("PrefetchUseContentRefactor"),
+        Flag.baseFeature(
+                VizFeatures.NO_LATE_BEGIN_FRAMES,
+                "Enables not sending BeginFrameArgs late when a client begins observing them."),
         // Add new commandline switches and features above. The final entry should have a
         // trailing comma for cleaner diffs.
     };
diff --git a/base/i18n/rtl.cc b/base/i18n/rtl.cc
index b37edc0..a8eacf3f 100644
--- a/base/i18n/rtl.cc
+++ b/base/i18n/rtl.cc
@@ -31,6 +31,8 @@
 #include "base/ios/ios_util.h"
 #endif
 
+namespace base::i18n {
+
 namespace {
 
 // Extract language, country and variant, but ignore keywords.  For example,
@@ -64,19 +66,19 @@
 // Returns LEFT_TO_RIGHT or RIGHT_TO_LEFT if |character| has strong
 // directionality, returns UNKNOWN_DIRECTION if it doesn't. Please refer to
 // http://unicode.org/reports/tr9/ for more information.
-base::i18n::TextDirection GetCharacterDirection(UChar32 character) {
-  static bool has_switch = base::CommandLine::ForCurrentProcess()->HasSwitch(
+TextDirection GetCharacterDirection(UChar32 character) {
+  static bool has_switch = CommandLine::ForCurrentProcess()->HasSwitch(
       switches::kForceTextDirection);
   if (has_switch) {
-    base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+    CommandLine* command_line = CommandLine::ForCurrentProcess();
     std::string force_flag =
         command_line->GetSwitchValueASCII(switches::kForceTextDirection);
 
     if (force_flag == switches::kForceDirectionRTL) {
-      return base::i18n::RIGHT_TO_LEFT;
+      return RIGHT_TO_LEFT;
     }
     if (force_flag == switches::kForceDirectionLTR) {
-      return base::i18n::LEFT_TO_RIGHT;
+      return LEFT_TO_RIGHT;
     }
   }
   // Now that we have the character, we use ICU in order to query for the
@@ -87,37 +89,20 @@
     case U_RIGHT_TO_LEFT_ARABIC:
     case U_RIGHT_TO_LEFT_EMBEDDING:
     case U_RIGHT_TO_LEFT_OVERRIDE:
-      return base::i18n::RIGHT_TO_LEFT;
+      return RIGHT_TO_LEFT;
     case U_LEFT_TO_RIGHT:
     case U_LEFT_TO_RIGHT_EMBEDDING:
     case U_LEFT_TO_RIGHT_OVERRIDE:
-      return base::i18n::LEFT_TO_RIGHT;
+      return LEFT_TO_RIGHT;
   }
-  return base::i18n::UNKNOWN_DIRECTION;
-}
-
-}  // namespace
-
-namespace base::i18n {
-
-// Represents the locale-specific ICU text direction.
-static TextDirection g_icu_text_direction = UNKNOWN_DIRECTION;
-
-// Convert the ICU default locale to a string.
-std::string GetConfiguredLocale() {
-  return GetLocaleString(icu::Locale::getDefault());
-}
-
-// Convert the ICU canonicalized locale to a string.
-std::string GetCanonicalLocale(const std::string& locale) {
-  return GetLocaleString(icu::Locale::createCanonical(locale.c_str()));
+  return UNKNOWN_DIRECTION;
 }
 
 // Convert Chrome locale name to ICU locale name
-std::string ICULocaleName(const std::string& locale_string) {
+std::string ICULocaleName(std::string_view locale_string) {
   // If not Spanish, just return it.
   if (locale_string.substr(0, 2) != "es") {
-    return locale_string;
+    return std::string(locale_string);
   }
   // Expand es to es-ES.
   if (EqualsCaseInsensitiveASCII(locale_string, "es")) {
@@ -140,10 +125,25 @@
   }
   // Currently, Chrome has only "es" and "es-419", but later we may have
   // more specific "es-RR".
-  return locale_string;
+  return std::string(locale_string);
 }
 
-void SetICUDefaultLocale(const std::string& locale_string) {
+}  // namespace
+
+// Represents the locale-specific ICU text direction.
+static TextDirection g_icu_text_direction = UNKNOWN_DIRECTION;
+
+// Convert the ICU default locale to a string.
+std::string GetConfiguredLocale() {
+  return GetLocaleString(icu::Locale::getDefault());
+}
+
+// Convert the ICU canonicalized locale to a string.
+std::string GetCanonicalLocale(const std::string& locale) {
+  return GetLocaleString(icu::Locale::createCanonical(locale.c_str()));
+}
+
+void SetICUDefaultLocale(std::string_view locale_string) {
 #if BUILDFLAG(IS_IOS)
   static base::debug::CrashKeyString* crash_key_locale =
       base::debug::AllocateCrashKeyString("icu_locale_input",
diff --git a/base/i18n/rtl.h b/base/i18n/rtl.h
index 545c58f..0ccac05 100644
--- a/base/i18n/rtl.h
+++ b/base/i18n/rtl.h
@@ -48,7 +48,7 @@
 // This is handy in that we don't have to call GetApplicationLocale()
 // everytime we call locale-dependent ICU APIs as long as we make sure
 // that this is called before any locale-dependent API is called.
-BASE_I18N_EXPORT void SetICUDefaultLocale(const std::string& locale_string);
+BASE_I18N_EXPORT void SetICUDefaultLocale(std::string_view locale_string);
 
 // Returns true if the application text direction is right-to-left.
 BASE_I18N_EXPORT bool IsRTL();
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn
index 24cd8c3..15fdad3 100644
--- a/base/test/BUILD.gn
+++ b/base/test/BUILD.gn
@@ -720,6 +720,7 @@
       "android/javatests/src/org/chromium/base/test/transit/Transition.java",
       "android/javatests/src/org/chromium/base/test/transit/TravelException.java",
       "android/javatests/src/org/chromium/base/test/transit/Triggers.java",
+      "android/javatests/src/org/chromium/base/test/transit/Trip.java",
       "android/javatests/src/org/chromium/base/test/transit/TripBuilder.java",
       "android/javatests/src/org/chromium/base/test/transit/UiThreadCondition.java",
       "android/javatests/src/org/chromium/base/test/transit/ViewConditions.java",
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionWaiter.java b/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionWaiter.java
index d47a5d97..659b9bd 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionWaiter.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionWaiter.java
@@ -261,7 +261,7 @@
 
         // If the preCheck already saw all Conditions fulfilled and there is no trigger which might
         // cause state changes, avoid checking Conditions a second time.
-        if (mTransition.mTrigger == null && !anyCriteriaMissing) {
+        if (!mTransition.hasTrigger() && !anyCriteriaMissing) {
             mPreCheckFulfilledConditions = true;
 
             Log.i(
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionalState.java b/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionalState.java
index 2c804e72..eae5dc0c 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionalState.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionalState.java
@@ -330,9 +330,23 @@
     }
 
     /**
+     * Do nothing to trigger a Transition.
+     *
+     * <p>This is useful to wait ConditionalStates/Conditions to be reached without performing any
+     * action.
+     *
+     * <p>Adds this ConditionalState as context.
+     *
+     * @return a {@link TripBuilder} to perform the Transition.
+     */
+    public TripBuilder noopTo() {
+        return Triggers.noopTo().withContext(this);
+    }
+
+    /**
      * Run an arbitrary function on the instrumentation thread to trigger a Transition.
      *
-     * <p>Adds this Station as context.
+     * <p>Adds this ConditionalState as context.
      *
      * @return a {@link TripBuilder} to perform the Transition.
      */
@@ -343,7 +357,7 @@
     /**
      * Run an arbitrary function on the UI thread to trigger a Transition.
      *
-     * <p>Adds this Station as context.
+     * <p>Adds this ConditionalState as context.
      *
      * @return a {@link TripBuilder} to perform the Transition.
      */
@@ -354,7 +368,7 @@
     /**
      * Press back to trigger a Transition.
      *
-     * <p>Adds this Station as context.
+     * <p>Adds this ConditionalState as context.
      *
      * @return a {@link TripBuilder} to perform the Transition.
      */
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/Transition.java b/base/test/android/javatests/src/org/chromium/base/test/transit/Transition.java
index 356671a..a2998e2 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/transit/Transition.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/Transition.java
@@ -6,6 +6,7 @@
 
 import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.EnsuresNonNullIf;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 
@@ -25,6 +26,11 @@
         void triggerTransition();
     }
 
+    // NOOP_TRIGGER is a trigger that does nothing when triggered and is special-cased in
+    // Transition to be handled like a null Trigger. This causes the Transition to not fail if
+    // all Conditions are already fulfilled in preCheck().
+    public static final Trigger NOOP_TRIGGER = () -> {};
+
     private static final String TAG = "Transit";
     private static int sLastTripId;
 
@@ -67,11 +73,12 @@
     private boolean shouldFailOnAlreadyFulfilled() {
         // At least one Condition should be not fulfilled, or this is likely an incorrectly
         // designed Transition. Exceptions to this rule:
-        //     1. null Trigger, for example when focusing on secondary elements of a screen that
-        //        aren't declared in the Station's constructor or in its declareExtraElements().
+        //     1. null or NOOP_TRIGGER Trigger, for example when focusing on secondary elements of a
+        //        screen that aren't declared in the Station's constructor or in its
+        //        declareExtraElements().
         //     2. A explicit exception is made with TransitionOptions.mPossiblyAlreadyFulfilled.
         //        E.g. when not possible to determine whether the trigger needs to be run.
-        return !mOptions.getPossiblyAlreadyFulfilled() && mTrigger != null;
+        return !mOptions.getPossiblyAlreadyFulfilled() && hasTrigger();
     }
 
     protected void onBeforeTransition() {
@@ -123,12 +130,13 @@
     }
 
     protected void triggerTransition() {
-        if (mTrigger != null) {
-            Log.i(TAG, "%s: will run trigger", toDebugString());
+        if (hasTrigger()) {
             try {
                 if (mOptions.getRunTriggerOnUiThread()) {
+                    Log.i(TAG, "%s: will run trigger on UI thread", toDebugString());
                     ThreadUtils.runOnUiThread(mTrigger::triggerTransition);
                 } else {
+                    Log.i(TAG, "%s: will run trigger on Instrumentation thread", toDebugString());
                     mTrigger.triggerTransition();
                 }
                 Log.i(TAG, "%s: finished running trigger", toDebugString());
@@ -267,7 +275,7 @@
          * <p>Returns a new TransitionOptions instance.
          */
         static TransitionOptions merge(TransitionOptions primary, TransitionOptions secondary) {
-            TransitionOptions.Builder builder = secondary.new Builder();
+            TransitionOptions.Builder builder = newOptions();
 
             // Merge Transition Conditions
             if (secondary.mTransitionConditions != null) {
@@ -394,4 +402,9 @@
             return states.toString();
         }
     }
+
+    @EnsuresNonNullIf("mTrigger")
+    boolean hasTrigger() {
+        return mTrigger != null && mTrigger != NOOP_TRIGGER;
+    }
 }
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/Triggers.java b/base/test/android/javatests/src/org/chromium/base/test/transit/Triggers.java
index 89b31ac..e7e6ec3 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/transit/Triggers.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/Triggers.java
@@ -9,6 +9,16 @@
 /** Common Triggers to start Transitions. */
 public class Triggers {
     /**
+     * Do nothing to trigger a Transition.
+     *
+     * <p>This is useful to wait ConditionalStates/Conditions to be reached without performing any
+     * action.
+     */
+    public static TripBuilder noopTo() {
+        return new TripBuilder().withTrigger(Transition.NOOP_TRIGGER);
+    }
+
+    /**
      * Run an arbitrary function on the instrumentation thread to trigger a Transition.
      *
      * @return a {@link TripBuilder} to perform the Transition.
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/Trip.java b/base/test/android/javatests/src/org/chromium/base/test/transit/Trip.java
new file mode 100644
index 0000000..bbf8f9e
--- /dev/null
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/Trip.java
@@ -0,0 +1,140 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.test.transit;
+
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * A generic {@link Transition} out of one or more {@link Facility}s into another {@link Facility}.
+ */
+@NullMarked
+public class Trip extends Transition {
+    private final @Nullable Station<?> mOriginStation;
+    private final @Nullable Station<?> mDestinationStation;
+    private final List<Facility<?>> mFacilitiesToExit;
+    private final List<Facility<?>> mFacilitiesToEnter;
+    private final List<CarryOn> mCarryOnsToDrop;
+    private final List<CarryOn> mCarryOnsToPickUp;
+    private final String mTransitionName;
+
+    /** Use {@link TripBuilder} to create a Trip. */
+    Trip(
+            @Nullable Station<?> originStation,
+            @Nullable Station<?> destinationStation,
+            List<Facility<?>> facilitiesToExit,
+            List<Facility<?>> facilitiesToEnter,
+            List<CarryOn> carryOnsToDrop,
+            List<CarryOn> carryOnsToPickUp,
+            TransitionOptions options,
+            @Nullable Trigger trigger) {
+        super(
+                options,
+                aggregateStates(originStation, facilitiesToExit, carryOnsToDrop),
+                aggregateStates(destinationStation, facilitiesToEnter, carryOnsToPickUp),
+                trigger);
+        mOriginStation = originStation;
+        mDestinationStation = destinationStation;
+        mFacilitiesToExit = facilitiesToExit;
+        mFacilitiesToEnter = facilitiesToEnter;
+        mCarryOnsToDrop = carryOnsToDrop;
+        mCarryOnsToPickUp = carryOnsToPickUp;
+
+        String transitionTypeName = determineTransitionTypeName();
+        mTransitionName = determineTransitionName(transitionTypeName);
+    }
+
+    @Override
+    protected void onAfterTransition() {
+        super.onAfterTransition();
+
+        if (mOriginStation != null || mDestinationStation != null) {
+            TrafficControl.notifyActiveStationsChanged(
+                    mOriginStation != null ? List.of(mOriginStation) : Collections.emptyList(),
+                    mDestinationStation != null
+                            ? List.of(mDestinationStation)
+                            : Collections.emptyList());
+        }
+    }
+
+    @Override
+    public String toDebugString() {
+        return mTransitionName;
+    }
+
+    private static List<? extends ConditionalState> aggregateStates(
+            @Nullable Station<?> station, List<Facility<?>> facilities, List<CarryOn> carryOns) {
+        List<ConditionalState> states = new ArrayList<>();
+        if (station != null) {
+            states.add(station);
+        }
+        states.addAll(facilities);
+        states.addAll(carryOns);
+        return states;
+    }
+
+    private String determineTransitionTypeName() {
+        if (mDestinationStation != null) {
+            if (mOriginStation != null) {
+                return "StationToStationTrip";
+            } else {
+                return "StationSpawn";
+            }
+        } else {
+            if (mOriginStation != null) {
+                return "LastStation";
+            }
+        }
+
+        if (!mFacilitiesToEnter.isEmpty()) {
+            if (!mFacilitiesToExit.isEmpty()) {
+                return "FacilitySwap";
+            } else {
+                return "FacilityCheckIn";
+            }
+        } else if (!mFacilitiesToExit.isEmpty()) {
+            return "FacilityCheckOut";
+        }
+
+        if (!mCarryOnsToPickUp.isEmpty()) {
+            if (!mCarryOnsToDrop.isEmpty()) {
+                return "CarryOnSwap";
+            } else {
+                return "CarryOnPickUp";
+            }
+        } else if (!mCarryOnsToDrop.isEmpty()) {
+            return "CarryOnDrop";
+        }
+
+        return "GenericTrip";
+    }
+
+    private String determineTransitionName(String transitionTypeName) {
+        if (!mEnteredStates.isEmpty()) {
+            String facilitiesToEnterString = getStateListString(mEnteredStates);
+            if (!mExitedStates.isEmpty()) {
+                String facilitiesToExitString = getStateListString(mExitedStates);
+                return String.format(
+                        "%s %d (from %s to %s)",
+                        transitionTypeName, mId, facilitiesToExitString, facilitiesToEnterString);
+            } else {
+                return String.format(
+                        "%s %d (enter %s)", transitionTypeName, mId, facilitiesToEnterString);
+            }
+        } else {
+            if (!mExitedStates.isEmpty()) {
+                String facilitiesToExitString = getStateListString(mExitedStates);
+                return String.format(
+                        "%s %d (exit %s)", transitionTypeName, mId, facilitiesToExitString);
+            } else {
+                return String.format("%s %d", transitionTypeName, mId);
+            }
+        }
+    }
+}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/TripBuilder.java b/base/test/android/javatests/src/org/chromium/base/test/transit/TripBuilder.java
index 41ea309..630f5a1 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/transit/TripBuilder.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/TripBuilder.java
@@ -24,12 +24,16 @@
 public class TripBuilder {
     private final List<Facility<?>> mFacilitiesToEnter = new ArrayList<>();
     private final List<Facility<?>> mFacilitiesToExit = new ArrayList<>();
+    private final List<CarryOn> mCarryOnsToPickUp = new ArrayList<>();
+    private final List<CarryOn> mCarryOnsToDrop = new ArrayList<>();
     private final List<Condition> mConditions = new ArrayList<>();
     private @Nullable Trigger mTrigger;
-    private @Nullable TransitionOptions mOptions;
+    private TransitionOptions mOptions = TransitionOptions.DEFAULT;
     private @Nullable Station<?> mDestinationStation;
+    private @Nullable Station<?> mOriginStation;
     private @Nullable Station<?> mContextStation;
     private @Nullable Facility<?> mContextFacility;
+    private @Nullable CarryOn mContextCarryOn;
 
     public TripBuilder() {}
 
@@ -63,6 +67,8 @@
         } else if (conditionalState instanceof Facility<?> facility) {
             mContextFacility = facility;
             mContextStation = facility.getHostStation();
+        } else if (conditionalState instanceof CarryOn carryOn) {
+            mContextCarryOn = carryOn;
         }
         return this;
     }
@@ -83,11 +89,7 @@
      */
     @CheckReturnValue
     public TripBuilder withOptions(TransitionOptions options) {
-        if (mOptions == null) {
-            mOptions = options;
-        } else {
-            mOptions = TransitionOptions.merge(/* primary= */ options, /* secondary= */ mOptions);
-        }
+        mOptions = TransitionOptions.merge(/* primary= */ options, /* secondary= */ mOptions);
         return this;
     }
 
@@ -98,6 +100,26 @@
         return this;
     }
 
+    @CheckReturnValue
+    public TripBuilder pickUpCarryOnAnd(CarryOn carryOn) {
+        mCarryOnsToPickUp.add(carryOn);
+        return this;
+    }
+
+    @CheckReturnValue
+    public TripBuilder dropCarryOnAnd() {
+        assert mContextCarryOn != null
+                : "Context CarryOn not set, pass the not to drop as a parameter";
+        mCarryOnsToDrop.add(mContextCarryOn);
+        return this;
+    }
+
+    @CheckReturnValue
+    public TripBuilder dropCarryOnAnd(CarryOn carryOn) {
+        mCarryOnsToDrop.add(carryOn);
+        return this;
+    }
+
     /** Add a |facility| to enter as part of the Transition. */
     @CheckReturnValue
     public TripBuilder enterFacilityAnd(Facility<?> facility) {
@@ -153,6 +175,19 @@
         waitForConditionsAnd(conditions).complete();
     }
 
+    public <CarryOnT extends CarryOn> CarryOnT pickUpCarryOn(CarryOnT carryOn) {
+        pickUpCarryOnAnd(carryOn).complete();
+        return carryOn;
+    }
+
+    public void dropCarryOn() {
+        dropCarryOnAnd().complete();
+    }
+
+    public void dropCarryOn(CarryOn carryOn) {
+        dropCarryOnAnd(carryOn).complete();
+    }
+
     /** Execute the transition synchronously, entering |facility| and returning it. */
     public <FacilityT extends Facility<?>> FacilityT enterFacility(FacilityT facility) {
         enterFacilityAnd(facility).complete();
@@ -193,70 +228,62 @@
     public void complete() {
         assert mTrigger != null : "Trigger not set";
 
-        // TODO(crbug.com/406325581): Support Station#spawnSync().
-        if (mContextStation == null) {
+        // If a context Station is required, infer it from the active Stations.
+        // A context Station is required to travel to a Station or to enter Facilities.
+        if (mContextStation == null
+                && (mDestinationStation != null || !mFacilitiesToEnter.isEmpty())) {
             List<Station<?>> activeStations = TrafficControl.getActiveStations();
             if (activeStations.size() == 1) {
                 mContextStation = activeStations.get(0);
             } else {
                 assert false
-                        : "Context Station not set, cannot infer because there isn't exactly one"
-                                + " active Station.";
+                        : String.format(
+                                "Context Station not set with withContext(), cannot infer because"
+                                        + " there isn't exactly one active Station. Had %d active"
+                                        + " Stations.",
+                                activeStations.size());
             }
         }
 
-        Transition trip = buildTrip();
-        trip.transitionSync();
-    }
+        // If entering a station, assume to be exiting an active Station too.
+        //
+        // TODO(crbug.com/406325581): Stop assuming this if the TransitionBuilder is set to spawn a
+        // Station. This is needed to support Station#spawnSync().
+        if (mDestinationStation != null) {
+            mOriginStation = mContextStation;
+        }
 
-    // TODO(crbug.com/406325581): Create a generic Trip class to replace these.
-    private Transition buildTrip() {
         if (mDestinationStation != null) {
             for (Facility<?> facility : mFacilitiesToEnter) {
                 mDestinationStation.addInitialFacility(facility);
             }
-
             // TODO(crbug.com/406325581): Support Station#spawnSync().
-            mDestinationStation.requireToBeInSameTask(mContextStation);
-            return new StationToStationTrip(
-                    List.of(mContextStation), List.of(mDestinationStation), getOptions(), mTrigger);
+            mDestinationStation.requireToBeInSameTask(mOriginStation);
         } else {
-            if (!mFacilitiesToEnter.isEmpty()) {
-                // TODO(crbug.com/406325581): Support entering Facilities from multiple Stations in
-                // multi-window.
-                for (Facility<?> facility : mFacilitiesToEnter) {
-                    mContextStation.registerFacility(facility);
-                }
-
-                if (!mFacilitiesToExit.isEmpty()) {
-                    return new FacilitySwap(
-                            mFacilitiesToExit, mFacilitiesToEnter, getOptions(), mTrigger);
-                } else {
-                    return new FacilityCheckIn(mFacilitiesToEnter, getOptions(), mTrigger);
-                }
-            } else {
-                if (!mFacilitiesToExit.isEmpty()) {
-                    return new FacilityCheckOut(mFacilitiesToExit, getOptions(), mTrigger);
-                } else {
-                    // TODO(crbug.com/406325581): Support Transitions to/from CarryOns and
-                    // Conditions-only.
-                    throw new UnsupportedOperationException(
-                            "TripBuilder only supports transitions with Stations and Facilities for"
-                                    + " now.");
-                }
+            // TODO(crbug.com/406325581): Support entering Facilities from multiple Stations in
+            // multi-window.
+            for (Facility<?> facility : mFacilitiesToEnter) {
+                mContextStation.registerFacility(facility);
             }
         }
-    }
-
-    private TransitionOptions getOptions() {
-        TransitionOptions options = mOptions == null ? TransitionOptions.DEFAULT : mOptions;
 
         if (!mConditions.isEmpty()) {
-            options =
+            mOptions =
                     TransitionOptions.merge(
                             Transition.conditionOption(mConditions.toArray(new Condition[0])),
                             mOptions);
         }
-        return options;
+
+        Transition trip =
+                new Trip(
+                        mOriginStation,
+                        mDestinationStation,
+                        mFacilitiesToExit,
+                        mFacilitiesToEnter,
+                        mCarryOnsToDrop,
+                        mCarryOnsToPickUp,
+                        mOptions,
+                        mTrigger);
+        trip.transitionSync();
     }
 }
diff --git a/base/win/shortcut.cc b/base/win/shortcut.cc
index 967e130..8b79d7e 100644
--- a/base/win/shortcut.cc
+++ b/base/win/shortcut.cc
@@ -317,7 +317,8 @@
           break;
         }
         default: {
-          NOTREACHED() << "Unexpected variant type: " << pv_app_id.get().vt;
+          LOG(WARNING) << "Unexpected variant type: " << pv_app_id.get().vt;
+          break;
         }
       }
     }
@@ -336,7 +337,8 @@
           properties->set_dual_mode(pv_dual_mode.get().boolVal == VARIANT_TRUE);
           break;
         default:
-          NOTREACHED() << "Unexpected variant type: " << pv_dual_mode.get().vt;
+          LOG(WARNING) << "Unexpected variant type: " << pv_dual_mode.get().vt;
+          break;
       }
     }
 
@@ -356,8 +358,9 @@
               *(pv_toast_activator_clsid.get().puuid));
           break;
         default:
-          NOTREACHED() << "Unexpected variant type: "
+          LOG(WARNING) << "Unexpected variant type: "
                        << pv_toast_activator_clsid.get().vt;
+          break;
       }
     }
   }
diff --git a/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestInstrumentationTestRunner.java b/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestInstrumentationTestRunner.java
index 7c97251..70c5357 100644
--- a/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestInstrumentationTestRunner.java
+++ b/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestInstrumentationTestRunner.java
@@ -42,8 +42,12 @@
             "org.chromium.native_test.NativeTestInstrumentationTestRunner.TestList";
     private static final String EXTRA_TEST =
             "org.chromium.native_test.NativeTestInstrumentationTestRunner.Test";
+    // An extra to indicate if user data dir should be kept when running the
+    // given test list. no-op if given a single test.
+    private static final String EXTRA_KEEP_USER_DATA_DIR =
+            "org.chromium.native_test.NativeTestInstrumentationTestRunner.KeepUserDataDir";
 
-    private static final String TAG = "NativeTest";
+    private static final String TAG = "NativeTestRunner";
 
     private static final long DEFAULT_SHARD_NANO_TIMEOUT = 60 * 1000000000L;
     // Default to no size limit.
@@ -54,11 +58,12 @@
     private final SparseArray<ShardMonitor> mMonitors = new SparseArray<ShardMonitor>();
     private String mNativeTestActivity;
     private TestStatusReceiver mReceiver;
-    private final Queue<String> mShards = new ArrayDeque<String>();
+    private final Queue<ShardMetadata> mShards = new ArrayDeque<ShardMetadata>();
     private long mShardNanoTimeout = DEFAULT_SHARD_NANO_TIMEOUT;
     private int mShardSizeLimit = DEFAULT_SHARD_SIZE_LIMIT;
     private File mStdoutFile;
     private Bundle mTransparentArguments;
+    private boolean mKeepUserDataDir;
 
     @Override
     public void onCreate(Bundle arguments) {
@@ -101,14 +106,22 @@
 
         mTransparentArguments.remove(EXTRA_STDOUT_FILE);
 
+        mKeepUserDataDir = arguments.containsKey(EXTRA_KEEP_USER_DATA_DIR);
+        if (mKeepUserDataDir) {
+            Log.i(TAG, "user data dir will be kept between the given tests.");
+        }
+        mTransparentArguments.remove(EXTRA_KEEP_USER_DATA_DIR);
+
         String singleTest = arguments.getString(EXTRA_TEST);
         if (singleTest != null) {
-            mShards.add(singleTest);
+            mShards.add(new ShardMetadata(singleTest, false));
         }
 
         String testListFilePath = arguments.getString(EXTRA_TEST_LIST_FILE);
         if (testListFilePath != null) {
             File testListFile = new File(testListFilePath);
+
+            boolean isFirstTest = true;
             try {
                 BufferedReader testListFileReader =
                         new BufferedReader(new FileReader(testListFile));
@@ -116,15 +129,26 @@
                 String test;
                 ArrayList<String> workingShard = new ArrayList<String>();
                 while ((test = testListFileReader.readLine()) != null) {
+                    // For multiple tests passed via a test list file, data
+                    // in user data dir should:
+                    //  - Be cleaned before the 1st test, and
+                    //  - Kept in the followed tests.
+                    boolean keepUserDataDirForTest = mKeepUserDataDir && !isFirstTest;
+                    isFirstTest = false;
                     workingShard.add(test);
                     if (workingShard.size() == mShardSizeLimit) {
-                        mShards.add(TextUtils.join(":", workingShard));
+                        mShards.add(
+                                new ShardMetadata(
+                                        TextUtils.join(":", workingShard), keepUserDataDirForTest));
                         workingShard = new ArrayList<String>();
                     }
                 }
 
                 if (!workingShard.isEmpty()) {
-                    mShards.add(TextUtils.join(":", workingShard));
+                    boolean keepUserDataDirForTest = mKeepUserDataDir && !isFirstTest;
+                    mShards.add(
+                            new ShardMetadata(
+                                    TextUtils.join(":", workingShard), keepUserDataDirForTest));
                 }
 
                 testListFileReader.close();
@@ -180,6 +204,25 @@
         mHandler.post(new ShardStarter());
     }
 
+    /** Stores the metadata for a test shard. */
+    private static class ShardMetadata {
+        private final String mGtestFilter;
+        private final boolean mKeepUserDataDir;
+
+        public ShardMetadata(String gtestFilter, boolean keepUserDataDir) {
+            mGtestFilter = gtestFilter;
+            mKeepUserDataDir = keepUserDataDir;
+        }
+
+        public String getGtestFilter() {
+            return mGtestFilter;
+        }
+
+        public boolean shouldKeepUserDataDir() {
+            return mKeepUserDataDir;
+        }
+    }
+
     /** Monitors a test shard's execution. */
     private class ShardMonitor implements Runnable {
         private static final int MONITOR_FREQUENCY_MS = 1000;
@@ -236,8 +279,11 @@
         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         i.putExtras(mTransparentArguments);
         if (mShards != null && !mShards.isEmpty()) {
-            String gtestFilter = mShards.remove();
-            i.putExtra(NativeTestIntent.EXTRA_GTEST_FILTER, gtestFilter);
+            ShardMetadata shardMetadata = mShards.remove();
+            i.putExtra(NativeTestIntent.EXTRA_GTEST_FILTER, shardMetadata.getGtestFilter());
+            i.putExtra(
+                    NativeTestIntent.EXTRA_KEEP_USER_DATA_DIR,
+                    shardMetadata.shouldKeepUserDataDir());
         }
         i.putExtra(NativeTestIntent.EXTRA_STDOUT_FILE, mStdoutFile.getAbsolutePath());
         return i;
diff --git a/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestIntent.java b/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestIntent.java
index 88fd88c..e16477e 100644
--- a/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestIntent.java
+++ b/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestIntent.java
@@ -17,4 +17,9 @@
     public static final String EXTRA_STDOUT_FILE = "org.chromium.native_test.NativeTest.StdoutFile";
     public static final String EXTRA_COVERAGE_DEVICE_FILE =
             "org.chromium.native_test.NativeTest.CoverageDeviceFile";
+    // An extra to indicate if the user data dir should be kept before running
+    // the given native test shard.
+    // This is different from the one in NativeTestInstrumentationTestRunner.java
+    public static final String EXTRA_KEEP_USER_DATA_DIR =
+            "org.chromium.native_test.NativeTest.KeepUserDataDir";
 }
diff --git a/build/android/pylib/local/device/local_device_gtest_run.py b/build/android/pylib/local/device/local_device_gtest_run.py
index 88d57e6..1e85197 100644
--- a/build/android/pylib/local/device/local_device_gtest_run.py
+++ b/build/android/pylib/local/device/local_device_gtest_run.py
@@ -47,12 +47,19 @@
 import tombstones
 
 _MAX_INLINE_FLAGS_LENGTH = 50  # Arbitrarily chosen.
+
+# Extras from NativeTestIntent.java
 _EXTRA_COMMAND_LINE_FILE = (
     'org.chromium.native_test.NativeTest.CommandLineFile')
 _EXTRA_COMMAND_LINE_FLAGS = (
     'org.chromium.native_test.NativeTest.CommandLineFlags')
 _EXTRA_COVERAGE_DEVICE_FILE = (
     'org.chromium.native_test.NativeTest.CoverageDeviceFile')
+
+# Extras from NativeTestInstrumentationTestRunner.java
+_EXTRA_KEEP_USER_DATA_DIR = (
+    'org.chromium.native_test.NativeTestInstrumentationTestRunner'
+        '.KeepUserDataDir')
 _EXTRA_STDOUT_FILE = (
     'org.chromium.native_test.NativeTestInstrumentationTestRunner'
         '.StdoutFile')
@@ -205,6 +212,17 @@
   return pre_tests, other_tests
 
 
+def _IsPreTestGroup(test_group):
+  """Check if a test group has one and only one PRE test group."""
+  test_set = set()
+  has_pre_test = False
+  for test in test_group:
+    if not has_pre_test and gtest_test_instance.IsPreTest(test):
+      has_pre_test = True
+    test_set.add(gtest_test_instance.TestNameWithoutPrefixes(test))
+  return has_pre_test and len(test_set) == 1
+
+
 class _ApkDelegate:
   def __init__(self, test_instance, env):
     self._activity = test_instance.activity
@@ -288,6 +306,9 @@
       else:
         extras[_EXTRA_TEST] = test[0]
 
+      if _IsPreTestGroup(test):
+        extras[_EXTRA_KEEP_USER_DATA_DIR] = 1
+
     # We need to use GetAppWritablePath here instead of GetExternalStoragePath
     # since we will not have yet applied legacy storage permission workarounds
     # on R+.
@@ -650,7 +671,7 @@
       for test in tests_on_device:
         if isinstance(test, list):
           # Any existing list from "tests" shall be a PRE test group.
-          assert self._IsPreTestGroup(test), (
+          assert _IsPreTestGroup(test), (
               f'Expecting a PRE test group, got {test}')
           # A test subgroup will run together even if it has a crashed test
           shards.append(test)
@@ -836,22 +857,11 @@
       test = test[-1]
     return gtest_test_instance.TestNameWithoutDisabledPrefix(test)
 
-  def _IsPreTestGroup(self, test_group):
-    """Check if a test group has one and only one PRE test group."""
-    # pylint: disable=no-self-use
-    test_set = set()
-    has_pre_test = False
-    for test in test_group:
-      if not has_pre_test and gtest_test_instance.IsPreTest(test):
-        has_pre_test = True
-      test_set.add(gtest_test_instance.TestNameWithoutPrefixes(test))
-    return has_pre_test and len(test_set) == 1
-
   #override
   def _ShouldRetryFullGroup(self, test_group):
     """A group in gtest shall be a PRE test group and retry in full."""
     # Ensure the given test group is a PRE test group
-    assert self._IsPreTestGroup(test_group), (
+    assert _IsPreTestGroup(test_group), (
         f'Expecting a PRE test group, got {test_group}')
     return True
 
diff --git a/build/android/pylib/local/device/local_device_gtest_run_test.py b/build/android/pylib/local/device/local_device_gtest_run_test.py
index 5d514993..33fae87e 100755
--- a/build/android/pylib/local/device/local_device_gtest_run_test.py
+++ b/build/android/pylib/local/device/local_device_gtest_run_test.py
@@ -99,6 +99,21 @@
     self.assertIn(pre_test_group3, pre_tests)
     self.assertIn(pre_test_group4, pre_tests)
 
+  def test_IsPreTestGroup(self):
+    self.assertTrue(local_device_gtest_run._IsPreTestGroup([
+        'TestSuite1.TestName1',
+        'TestSuite1.PRE_TestName1',
+        'TestSuite1.PRE_PRE_TestName1',
+    ]))
+    self.assertFalse(local_device_gtest_run._IsPreTestGroup([
+        'TestSuite1.TestName2',
+    ]))
+    self.assertFalse(local_device_gtest_run._IsPreTestGroup([
+        'TestSuite1.TestName1',
+        'TestSuite1.PRE_TestName1',
+        'TestSuite1.TestName2',
+    ]))
+
   def test_ApplyExternalSharding(self):
     tests = [
         'TestSuite1.TestName1',
@@ -156,21 +171,6 @@
     actual_shards = self._obj._CreateShardsForDevices(tests)
     self.assertListEqual(actual_shards, expected_shards)
 
-  def test_IsPreTestGroup(self):
-    self.assertTrue(self._obj._IsPreTestGroup([
-        'TestSuite1.TestName1',
-        'TestSuite1.PRE_TestName1',
-        'TestSuite1.PRE_PRE_TestName1',
-    ]))
-    self.assertFalse(self._obj._IsPreTestGroup([
-        'TestSuite1.TestName2',
-    ]))
-    self.assertFalse(self._obj._IsPreTestGroup([
-        'TestSuite1.TestName1',
-        'TestSuite1.PRE_TestName1',
-        'TestSuite1.TestName2',
-    ]))
-
   def test_GetTestsToRetry(self):
     test_data = [
         ('TestSuite1.TestName1', base_test_result.ResultType.PASS),
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 7889ccf..af40f4a 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -1944,6 +1944,7 @@
       "//build/android:build_java",
       "//chrome/browser/autofill/test:test_support_java",
       "//chrome/browser/download/android:java",
+      "//chrome/browser/picture_in_picture/test:test_support_java",
       "//chrome/browser/prefetch/android:java",
       "//chrome/browser/profiles/android:java",
       "//chrome/browser/renderer_host/android:test_support_java",
@@ -1977,6 +1978,7 @@
       "//chrome/browser",
       "//chrome/browser:browser_process",
       "//chrome/browser/autofill/test:test_support",
+      "//chrome/browser/picture_in_picture/test:test_support",
       "//chrome/browser/renderer_host/android:test_support",
       "//chrome/browser/sync",
       "//chrome/browser/thumbnail:test_support",
@@ -2364,6 +2366,7 @@
       "//chrome/browser/password_manager/android:javatests",
       "//chrome/browser/password_manager/android/access_loss:javatests",
       "//chrome/browser/password_manager/android/bottom_sheet:javatests",
+      "//chrome/browser/picture_in_picture/test:javatests",
       "//chrome/browser/recent_tabs/internal:recent_tabs_javatests",
       "//chrome/browser/subresource_filter:subresource_filter_javatests",
       "//chrome/browser/touch_to_fill/autofill/android/internal:javatests",
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni
index d8bd753..e468aed 100644
--- a/chrome/android/chrome_java_resources.gni
+++ b/chrome/android/chrome_java_resources.gni
@@ -485,6 +485,7 @@
   "java/res/layout/context_menu_header.xml",
   "java/res/layout/context_menu_row.xml",
   "java/res/layout/context_menu_share_row.xml",
+  "java/res/layout/contextual_search_callout_view.xml",
   "java/res/layout/contextual_search_caption_view.xml",
   "java/res/layout/contextual_search_card_icon_view.xml",
   "java/res/layout/contextual_search_context_view.xml",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 677f210..6ac2cf57 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -284,6 +284,7 @@
   "java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelStateProvider.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelTextViewInflater.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java",
+  "java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCalloutControl.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCaptionControl.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCardIconControl.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchContextControl.java",
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinator.java
index da61484..ce27bd8 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinator.java
@@ -126,11 +126,19 @@
                 public void restoreAllArchivedTabs() {
                     List<Tab> tabs = TabModelUtils.convertTabListToListOfTabs(mArchivedTabModel);
                     int tabCount = tabs.size();
+                    List<String> archivedTabGroupSyncIds = getArchivedTabGroupSyncIds();
+                    int tabGroupTabCount = getSyncedTabGroupTabsCount(archivedTabGroupSyncIds);
                     ArchivedTabsDialogCoordinator.this.restoreArchivedTabs(
-                            tabs, getArchivedTabGroupSyncIds());
+                            tabs, archivedTabGroupSyncIds);
                     RecordHistogram.recordCount1000Histogram(
                             "Tabs.RestoreAllArchivedTabsMenuItem.TabCount", tabCount);
                     RecordUserAction.record("Tabs.RestoreAllArchivedTabsMenuItem");
+                    RecordHistogram.recordCount1000Histogram(
+                            "TabGroups.RestoreAllArchivedTabsMenuItem.TabGroupCount",
+                            archivedTabGroupSyncIds.size());
+                    RecordHistogram.recordCount1000Histogram(
+                            "TabGroups.RestoreAllArchivedTabsMenuItem.TabGroupTabCount",
+                            tabGroupTabCount);
                 }
 
                 @Override
@@ -154,6 +162,12 @@
                     RecordHistogram.recordCount1000Histogram(
                             "Tabs.RestoreArchivedTabsMenuItem.TabCount", tabCount);
                     RecordUserAction.record("Tabs.RestoreArchivedTabsMenuItem");
+                    RecordHistogram.recordCount1000Histogram(
+                            "TabGroups.RestoreArchivedTabsMenuItem.TabGroupCount",
+                            tabGroupSyncIds.size());
+                    RecordHistogram.recordCount1000Histogram(
+                            "TabGroups.RestoreArchivedTabsMenuItem.TabGroupTabCount",
+                            getSyncedTabGroupTabsCount(tabGroupSyncIds));
                 }
 
                 @Override
@@ -167,6 +181,12 @@
                     RecordHistogram.recordCount1000Histogram(
                             "Tabs.CloseArchivedTabsMenuItem.TabCount", tabs.size());
                     RecordUserAction.record("Tabs.CloseArchivedTabsMenuItem");
+                    RecordHistogram.recordCount1000Histogram(
+                            "TabGroups.CloseArchivedTabsMenuItem.TabGroupCount",
+                            tabGroupSyncIds.size());
+                    RecordHistogram.recordCount1000Histogram(
+                            "TabGroups.CloseArchivedTabsMenuItem.TabGroupTabCount",
+                            getSyncedTabGroupTabsCount(tabGroupSyncIds));
                 }
             };
 
@@ -250,6 +270,10 @@
                                     mTabGroupUiActionHandlerSupplier.get(),
                                     mCurrentTabGroupModelFilterSupplier.get(),
                                     requestOpenTabGroupDialog);
+                            RecordUserAction.record("TabGroups.RestoreSingleTabGroup");
+                            RecordHistogram.recordCount1000Histogram(
+                                    "TabGroups.RestoreSingleTabGroup.TabGroupTabCount",
+                                    savedTabGroup.savedTabs.size());
                         }
                     };
                 }
@@ -763,6 +787,12 @@
                     RecordHistogram.recordCount1000Histogram(
                             "Tabs.CloseAllArchivedTabs.TabCount", tabCount);
                     RecordUserAction.record("Tabs.CloseAllArchivedTabsMenuItem");
+                    RecordHistogram.recordCount1000Histogram(
+                            "TabGroups.CloseAllArchivedTabGroups.TabGroupCount",
+                            archivedTabGroupSyncIds.size());
+                    RecordHistogram.recordCount1000Histogram(
+                            "TabGroups.CloseAllArchivedTabGroups.TabGroupTabCount",
+                            tabGroupTabsCount);
                 });
     }
 
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerItemViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerItemViewBinder.java
index fe3b1a7..f8e6c3f 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerItemViewBinder.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerItemViewBinder.java
@@ -20,7 +20,6 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewOverlay;
-import android.widget.Button;
 import android.widget.ImageView;
 
 import androidx.annotation.ColorInt;
@@ -82,8 +81,11 @@
 
         // Update the color icon with the indicated color id.
         if (isAndroidThemeModuleEnabled()) {
-            Button colorIcon = view.findViewById(R.id.color_picker_icon);
+            MaterialButton colorIcon = view.findViewById(R.id.color_picker_icon);
             colorIcon.setBackgroundTintList(ColorStateList.valueOf(color));
+            colorIcon.setRippleColor(
+                    TabGroupColorPickerUtils.buildTabGroupColorPickerRippleColorStateList(
+                            context, isIncognito));
         } else {
             final @ColorInt int selectionBackgroundColor =
                     getColorPickerDialogBackgroundColor(context, isIncognito);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediator.java
index 0a5b9274..ef4ee25 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediator.java
@@ -230,7 +230,14 @@
             }
         } else if (state == GroupWindowState.HIDDEN) {
             String syncId = savedTabGroup.syncId;
+            boolean isTabGroupArchived = savedTabGroup.archivalTimeMs != null;
             mTabGroupUiActionHandler.openTabGroup(syncId);
+            if (isTabGroupArchived) {
+                RecordUserAction.record("TabGroups.RestoreFromTabGroupPane");
+                RecordHistogram.recordCount1000Histogram(
+                        "TabGroups.RestoreFromTabGroupPane.TabCount",
+                        savedTabGroup.savedTabs.size());
+            }
             savedTabGroup = mTabGroupSyncService.getGroup(syncId);
         }
 
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediatorUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediatorUnitTest.java
index 457592b..b047883 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediatorUnitTest.java
@@ -51,6 +51,8 @@
 import org.chromium.base.Token;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.Features.EnableFeatures;
+import org.chromium.base.test.util.HistogramWatcher;
+import org.chromium.base.test.util.UserActionTester;
 import org.chromium.chrome.browser.data_sharing.DataSharingTabManager;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.hub.PaneId;
@@ -326,12 +328,24 @@
                 .openTabGroup(SYNC_GROUP_ID1);
         when(mFetchGroupState.get()).thenReturn(GroupWindowState.HIDDEN);
         PropertyModel propertyModel = buildTestModel(/* isShared= */ true, mUrl1);
+        UserActionTester userActionTester = new UserActionTester();
+        HistogramWatcher histograms =
+                HistogramWatcher.newBuilder()
+                        .expectIntRecord(
+                                "TabGroups.RestoreFromTabGroupPane.TabCount",
+                                mSyncGroup.savedTabs.size())
+                        .build();
+
         mSyncGroup.localId = null;
+        mSyncGroup.archivalTimeMs = 1L;
 
         propertyModel.get(OPEN_RUNNABLE).run();
         verify(mTabGroupUiActionHandler).openTabGroup(SYNC_GROUP_ID1);
         verify(mPaneManager).focusPane(PaneId.TAB_SWITCHER);
         verify(mTabSwitcherPaneBase).requestOpenTabGroupDialog(mRootId);
+        assertEquals(1, userActionTester.getActionCount("TabGroups.RestoreFromTabGroupPane"));
+        histograms.assertExpected();
+        userActionTester.tearDown();
     }
 
     @Test
@@ -339,12 +353,21 @@
         when(mFetchGroupState.get()).thenReturn(GroupWindowState.HIDDEN);
         when(mTabGroupSyncService.getGroup(SYNC_GROUP_ID1)).thenReturn(null);
         PropertyModel propertyModel = buildTestModel(/* isShared= */ true, mUrl1);
+        UserActionTester userActionTester = new UserActionTester();
+        HistogramWatcher histograms =
+                HistogramWatcher.newBuilder()
+                        .expectNoRecords("TabGroups.RestoreFromTabGroupPane.TabCount")
+                        .build();
+
         mSyncGroup.localId = null;
 
         propertyModel.get(OPEN_RUNNABLE).run();
         verify(mTabGroupUiActionHandler).openTabGroup(SYNC_GROUP_ID1);
         verifyNoInteractions(mPaneManager);
         verifyNoInteractions(mTabSwitcherPaneBase);
+        assertEquals(0, userActionTester.getActionCount("TabGroups.RestoreFromTabGroupPane"));
+        histograms.assertExpected();
+        userActionTester.tearDown();
     }
 
     @Test
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorShareAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorShareAction.java
index d7a364b..cd39e1e 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorShareAction.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorShareAction.java
@@ -168,7 +168,7 @@
                         : TabListEditorActionMetricGroups.SHARE_TABS;
 
         ShareParams shareParams =
-                new ShareParams.Builder(tab.getWindowAndroid(), tabTitle, tabUrl)
+                new ShareParams.Builder(assumeNonNull(tab.getWindowAndroid()), tabTitle, tabUrl)
                         .setText(tabText)
                         .build();
 
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighter.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighter.java
new file mode 100644
index 0000000..d2612de
--- /dev/null
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighter.java
@@ -0,0 +1,69 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.tasks.tab_management;
+
+import static org.chromium.chrome.browser.tasks.tab_management.TabProperties.IS_HIGHLIGHTED;
+import static org.chromium.chrome.browser.tasks.tab_management.TabProperties.TAB_ID;
+
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.chrome.browser.tab.TabId;
+import org.chromium.ui.modelutil.MVCListAdapter.ListItem;
+import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
+import org.chromium.ui.modelutil.PropertyModel;
+
+import java.util.Set;
+
+/** Used to highlight tabs in the tab list. */
+@NullMarked
+public class TabListHighlighter {
+    private final ModelList mModelList;
+
+    /**
+     * @param modelList The {@link ModelList} containing the tabs to be highlighted.
+     */
+    public TabListHighlighter(ModelList modelList) {
+        mModelList = modelList;
+    }
+
+    /**
+     * Highlights all tabs in the model list whose IDs are present in the given set. This method
+     * sets their {@link TabProperties#IS_HIGHLIGHTED} property to true.
+     *
+     * <p>Does nothing if the tab is already highlighted. Highlighting a set of tabs does not remove
+     * the highlights from previously highlighted tabs.
+     *
+     * @param tabIds A set of tab IDs to highlight.
+     */
+    public void highlightTabs(Set<@TabId Integer> tabIds) {
+        for (ListItem listItem : mModelList) {
+            PropertyModel model = listItem.model;
+            if (model.containsKey(TAB_ID) && model.containsKey(IS_HIGHLIGHTED)) {
+                @TabId int tabId = model.get(TAB_ID);
+                if (tabIds.contains(tabId)) {
+                    model.set(IS_HIGHLIGHTED, true);
+                }
+            }
+        }
+    }
+
+    /**
+     * Removes the highlights for all tabs in the model list. This method sets their {@link
+     * TabProperties#IS_HIGHLIGHTED} property to false.
+     */
+    public void unhighlightTabs() {
+        for (ListItem listItem : mModelList) {
+            PropertyModel model = listItem.model;
+            if (isHighLighted(model)) {
+                model.set(IS_HIGHLIGHTED, false);
+            }
+        }
+    }
+
+    private boolean isHighLighted(PropertyModel model) {
+        return model.containsKey(TAB_ID)
+                && model.containsKey(IS_HIGHLIGHTED)
+                && model.get(IS_HIGHLIGHTED);
+    }
+}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighterUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighterUnitTest.java
new file mode 100644
index 0000000..7fa08699
--- /dev/null
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighterUnitTest.java
@@ -0,0 +1,121 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.tasks.tab_management;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import static org.chromium.chrome.browser.tasks.tab_management.TabProperties.ALL_KEYS_TAB_GRID;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.ui.modelutil.MVCListAdapter;
+import org.chromium.ui.modelutil.MVCListAdapter.ListItem;
+import org.chromium.ui.modelutil.PropertyModel;
+
+import java.util.Collections;
+import java.util.Set;
+
+/** Unit tests for {@link TabListHighlighter}. */
+@RunWith(BaseRobolectricTestRunner.class)
+public class TabListHighlighterUnitTest {
+    @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
+
+    private MVCListAdapter.ModelList mModelList;
+    private TabListHighlighter mHighlightDelegate;
+
+    private PropertyModel mModel1;
+    private PropertyModel mModel2;
+    private PropertyModel mModel3;
+    private PropertyModel mNonTabModel;
+
+    @Before
+    public void setUp() {
+        mModelList = new MVCListAdapter.ModelList();
+        mHighlightDelegate = new TabListHighlighter(mModelList);
+
+        mModel1 =
+                new PropertyModel.Builder(ALL_KEYS_TAB_GRID).with(TabProperties.TAB_ID, 10).build();
+        mModel2 =
+                new PropertyModel.Builder(ALL_KEYS_TAB_GRID).with(TabProperties.TAB_ID, 20).build();
+        mModel3 =
+                new PropertyModel.Builder(ALL_KEYS_TAB_GRID).with(TabProperties.TAB_ID, 30).build();
+        mNonTabModel = new PropertyModel.Builder(ALL_KEYS_TAB_GRID).build();
+
+        mModelList.add(new ListItem(0, mModel1));
+        mModelList.add(new ListItem(0, mModel2));
+        mModelList.add(new ListItem(0, mNonTabModel));
+        mModelList.add(new ListItem(0, mModel3));
+    }
+
+    @Test
+    public void testHighlightTabs() {
+        mModel1.set(TabProperties.IS_HIGHLIGHTED, false);
+        mModel2.set(TabProperties.IS_HIGHLIGHTED, false);
+        mModel3.set(TabProperties.IS_HIGHLIGHTED, false);
+        mNonTabModel.set(TabProperties.IS_HIGHLIGHTED, false);
+
+        Set<Integer> tabIdsToHighlight = Set.of(10, 30);
+        mHighlightDelegate.highlightTabs(tabIdsToHighlight);
+
+        assertTrue(mModel1.get(TabProperties.IS_HIGHLIGHTED));
+        assertFalse(mModel2.get(TabProperties.IS_HIGHLIGHTED));
+        assertTrue(mModel3.get(TabProperties.IS_HIGHLIGHTED));
+        assertFalse(mNonTabModel.get(TabProperties.IS_HIGHLIGHTED));
+    }
+
+    @Test
+    public void testHighlightTabs_emptyList() {
+        mModel1.set(TabProperties.IS_HIGHLIGHTED, false);
+        mModel2.set(TabProperties.IS_HIGHLIGHTED, false);
+        mModel3.set(TabProperties.IS_HIGHLIGHTED, false);
+
+        Set<Integer> tabIdsToHighlight = Collections.emptySet();
+        mHighlightDelegate.highlightTabs(tabIdsToHighlight);
+
+        assertFalse(mModel1.get(TabProperties.IS_HIGHLIGHTED));
+        assertFalse(mModel2.get(TabProperties.IS_HIGHLIGHTED));
+        assertFalse(mModel3.get(TabProperties.IS_HIGHLIGHTED));
+    }
+
+    @Test
+    public void testHighlightTabs_noMatchingIds() {
+        mModel1.set(TabProperties.IS_HIGHLIGHTED, false);
+        mModel2.set(TabProperties.IS_HIGHLIGHTED, false);
+        mModel3.set(TabProperties.IS_HIGHLIGHTED, false);
+
+        Set<Integer> tabIdsToHighlight = Set.of(99, 101);
+        mHighlightDelegate.highlightTabs(tabIdsToHighlight);
+
+        assertFalse(mModel1.get(TabProperties.IS_HIGHLIGHTED));
+        assertFalse(mModel2.get(TabProperties.IS_HIGHLIGHTED));
+        assertFalse(mModel3.get(TabProperties.IS_HIGHLIGHTED));
+    }
+
+    @Test
+    public void testUnhighlightTabs() {
+        mModel1.set(TabProperties.IS_HIGHLIGHTED, true);
+        mModel2.set(TabProperties.IS_HIGHLIGHTED, false);
+        mModel3.set(TabProperties.IS_HIGHLIGHTED, true);
+
+        mHighlightDelegate.unhighlightTabs();
+
+        assertFalse(mModel1.get(TabProperties.IS_HIGHLIGHTED));
+        assertFalse(mModel2.get(TabProperties.IS_HIGHLIGHTED));
+        assertFalse(mModel3.get(TabProperties.IS_HIGHLIGHTED));
+    }
+
+    @Test
+    public void testUnhighlightTabs_emptyModelList() {
+        mModelList.clear();
+        mHighlightDelegate.unhighlightTabs();
+    }
+}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
index d792e54..d979636 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -1227,8 +1227,8 @@
 
                         @Nullable PropertyModel model = mModelList.getModelFromSyncId(syncId);
                         if (model != null) {
-                            Long archivalTimeMs =
-                                    mTabGroupSyncService.getGroup(syncId).archivalTimeMs;
+                            SavedTabGroup tabGroup = mTabGroupSyncService.getGroup(syncId);
+                            Long archivalTimeMs = tabGroup.archivalTimeMs;
 
                             // If the tab group is archived, run archival reset logic and remove the
                             // tab group from the model list.
@@ -1236,6 +1236,11 @@
                                 model.set(TabProperties.USE_SHRINK_CLOSE_ANIMATION, true);
                                 mModelList.removeAt(index);
                                 mTabGroupSyncService.updateArchivalStatus(syncId, false);
+                                RecordUserAction.record(
+                                        "TabGroups.ArchivedTabGroupManualCloseOnInactiveSurface");
+                                RecordHistogram.recordCount1000Histogram(
+                                        "TabGroups.ArchivedTabGroupManualCloseOnInactiveSurface.TabGroupTabCount",
+                                        tabGroup.savedTabs.size());
                             }
                         }
                     }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorTest.java
index f5e44d9c9..29dbb4b 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorTest.java
@@ -86,6 +86,7 @@
 import org.chromium.chrome.test.transit.page.WebPageStation;
 import org.chromium.chrome.test.util.ActivityTestUtils;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
+import org.chromium.components.tab_group_sync.LocalTabGroupId;
 import org.chromium.components.tab_group_sync.SavedTabGroup;
 import org.chromium.components.tab_group_sync.SavedTabGroupTab;
 import org.chromium.components.tab_group_sync.TabGroupSyncService;
@@ -409,8 +410,13 @@
         mRobot.resultRobot.verifyTabListEditorIsHidden();
         assertEquals(1, mUserActionTester.getActionCount("Tabs.OpenArchivedTabsSettingsMenuItem"));
 
+        HistogramWatcher histogramExpectation =
+                HistogramWatcher.newSingleRecordWatcher(
+                        "Tabs.ArchiveSettings.TimeDeltaPreference", 0);
+
         mArchivedTabModelOrchestrator.resetRescueArchivedTabsForTesting();
         onView(withText("Never")).perform(click());
+        histogramExpectation.assertExpected();
 
         CriteriaHelper.pollUiThread(() -> mRegularTabModel.getCount() == 3);
         assertEquals(0, mArchivedTabModel.getCount());
@@ -852,7 +858,11 @@
         tabSwitcherStation.expectArchiveMessageCard().openArchivedTabsDialog();
 
         HistogramWatcher histogramExpectation =
-                HistogramWatcher.newSingleRecordWatcher("Tabs.CloseAllArchivedTabs.TabCount", 1);
+                HistogramWatcher.newBuilder()
+                        .expectIntRecords("Tabs.CloseAllArchivedTabs.TabCount", 1)
+                        .expectIntRecords("TabGroups.CloseAllArchivedTabGroups.TabGroupCount", 1)
+                        .expectIntRecords("TabGroups.CloseAllArchivedTabGroups.TabGroupTabCount", 1)
+                        .build();
 
         onView(withText("2 inactive tabs")).check(matches(isDisplayed()));
         onView(withText("Close all inactive tabs")).perform(click());
@@ -891,8 +901,11 @@
         mRobot.actionRobot.clickToolbarMenuButton().clickToolbarMenuItem("Select tabs");
 
         HistogramWatcher histogramExpectation =
-                HistogramWatcher.newSingleRecordWatcher(
-                        "Tabs.CloseArchivedTabsMenuItem.TabCount", 2);
+                HistogramWatcher.newBuilder()
+                        .expectIntRecords("Tabs.CloseArchivedTabsMenuItem.TabCount", 2)
+                        .expectIntRecords("TabGroups.CloseArchivedTabsMenuItem.TabGroupCount", 1)
+                        .expectIntRecords("TabGroups.CloseArchivedTabsMenuItem.TabGroupTabCount", 1)
+                        .build();
         mRobot.actionRobot.clickItemAtAdapterPosition(0);
         mRobot.actionRobot.clickItemAtAdapterPosition(1);
         mRobot.actionRobot.clickItemAtAdapterPosition(2);
@@ -933,8 +946,11 @@
         mRobot.actionRobot.clickToolbarMenuButton().clickToolbarMenuItem("Select tabs");
 
         HistogramWatcher histogramExpectation =
-                HistogramWatcher.newSingleRecordWatcher(
-                        "Tabs.CloseArchivedTabsMenuItem.TabCount", 2);
+                HistogramWatcher.newBuilder()
+                        .expectIntRecords("Tabs.CloseArchivedTabsMenuItem.TabCount", 2)
+                        .expectIntRecords("TabGroups.CloseArchivedTabsMenuItem.TabGroupCount", 1)
+                        .expectIntRecords("TabGroups.CloseArchivedTabsMenuItem.TabGroupTabCount", 1)
+                        .build();
         mRobot.actionRobot.clickItemAtAdapterPosition(0);
         mRobot.actionRobot.clickItemAtAdapterPosition(1);
         mRobot.actionRobot.clickItemAtAdapterPosition(2);
@@ -970,8 +986,13 @@
         onView(withText("2 inactive tabs")).check(matches(isDisplayed()));
 
         HistogramWatcher histogramExpectation =
-                HistogramWatcher.newSingleRecordWatcher(
-                        "Tabs.RestoreAllArchivedTabsMenuItem.TabCount", 1);
+                HistogramWatcher.newBuilder()
+                        .expectIntRecords("Tabs.RestoreAllArchivedTabsMenuItem.TabCount", 1)
+                        .expectIntRecords(
+                                "TabGroups.RestoreAllArchivedTabsMenuItem.TabGroupCount", 1)
+                        .expectIntRecords(
+                                "TabGroups.RestoreAllArchivedTabsMenuItem.TabGroupTabCount", 1)
+                        .build();
         assertEquals(1, mRegularTabModel.getCount());
 
         // Mock the sync backend being initialized so the tab group is restored via
@@ -1013,8 +1034,12 @@
         mRobot.actionRobot.clickToolbarMenuButton().clickToolbarMenuItem("Select tabs");
 
         HistogramWatcher histogramExpectation =
-                HistogramWatcher.newSingleRecordWatcher(
-                        "Tabs.RestoreArchivedTabsMenuItem.TabCount", 1);
+                HistogramWatcher.newBuilder()
+                        .expectIntRecords("Tabs.RestoreArchivedTabsMenuItem.TabCount", 1)
+                        .expectIntRecords("TabGroups.RestoreArchivedTabsMenuItem.TabGroupCount", 1)
+                        .expectIntRecords(
+                                "TabGroups.RestoreArchivedTabsMenuItem.TabGroupTabCount", 1)
+                        .build();
         mRobot.actionRobot.clickItemAtAdapterPosition(0);
         mRobot.actionRobot.clickItemAtAdapterPosition(1);
         mRobot.resultRobot.verifyToolbarSelectionText("2 tabs");
@@ -1039,6 +1064,91 @@
         assertEquals(1, mUserActionTester.getActionCount("Tabs.RestoreArchivedTabsMenuItem"));
     }
 
+    @Test
+    @MediumTest
+    @EnableFeatures({ChromeFeatureList.ANDROID_TAB_DECLUTTER_ARCHIVE_TAB_GROUPS})
+    public void testCloseArchivedTabGroup_PressCloseButton() throws Exception {
+        when(mTabGroupSyncService.getAllGroupIds()).thenReturn(new String[] {SYNC_GROUP_ID1});
+        SavedTabGroup savedTabGroup =
+                createSavedTabGroup(SYNC_GROUP_ID1, GROUP_TITLE1, SYNC_GROUP_COLOR1, 1, true);
+        addArchivedTab(new GURL("https://google.com"), "test 1");
+        addArchivedTab(new GURL("https://google.com"), "test 2");
+
+        RegularTabSwitcherStation tabSwitcherStation = mInitialPage.openRegularTabSwitcher();
+        tabSwitcherStation.expectArchiveMessageCard().openArchivedTabsDialog();
+        ThreadUtils.runOnUiThreadBlocking(() -> notifyTabGroupSyncObserversWithInitialization());
+
+        assertEquals(1, mRegularTabModel.getCount());
+        assertEquals(2, mArchivedTabModel.getCount());
+
+        HistogramWatcher histogramExpectation =
+                HistogramWatcher.newSingleRecordWatcher(
+                        "TabGroups.ArchivedTabGroupManualCloseOnInactiveSurface.TabGroupTabCount",
+                        1);
+
+        mRobot.actionRobot.clickViewIdAtAdapterPosition(0, R.id.action_button);
+
+        verify(mTabGroupSyncService).updateArchivalStatus(SYNC_GROUP_ID1, false);
+        savedTabGroup.archivalTimeMs = null;
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> notifyTabGroupSyncObserversWithChangedGroup(savedTabGroup));
+        mRobot.resultRobot.verifyAdapterHasItemCount(2);
+
+        assertEquals(1, mRegularTabModel.getCount());
+        assertEquals(2, mArchivedTabModel.getCount());
+        histogramExpectation.assertExpected();
+        assertEquals(
+                1,
+                mUserActionTester.getActionCount(
+                        "TabGroups.ArchivedTabGroupManualCloseOnInactiveSurface"));
+    }
+
+    @Test
+    @MediumTest
+    @EnableFeatures({ChromeFeatureList.ANDROID_TAB_DECLUTTER_ARCHIVE_TAB_GROUPS})
+    public void testRestoreArchivedTabGroup_ClickIntoTabGroup() {
+        when(mTabGroupSyncService.getAllGroupIds()).thenReturn(new String[] {SYNC_GROUP_ID1});
+        SavedTabGroup savedTabGroupInitial =
+                createSavedTabGroup(SYNC_GROUP_ID1, GROUP_TITLE1, SYNC_GROUP_COLOR1, 1, true);
+        SavedTabGroup savedTabGroupLocalIdSet =
+                createSavedTabGroup(SYNC_GROUP_ID1, GROUP_TITLE1, SYNC_GROUP_COLOR1, 1, true);
+        savedTabGroupLocalIdSet.localId = new LocalTabGroupId(new Token(123L, 123L));
+
+        addArchivedTab(new GURL("https://google.com"), "test 1");
+        addArchivedTab(new GURL("https://google.com"), "test 2");
+
+        RegularTabSwitcherStation tabSwitcherStation = mInitialPage.openRegularTabSwitcher();
+        tabSwitcherStation.expectArchiveMessageCard().openArchivedTabsDialog();
+        ThreadUtils.runOnUiThreadBlocking(() -> notifyTabGroupSyncObserversWithInitialization());
+        // Override getGroup mock defined in createSavedTabGroup to support changing state.
+        when(mTabGroupSyncService.getGroup(SYNC_GROUP_ID1))
+                .thenReturn(
+                        savedTabGroupInitial,
+                        savedTabGroupInitial,
+                        savedTabGroupInitial,
+                        savedTabGroupLocalIdSet,
+                        savedTabGroupLocalIdSet);
+
+        assertEquals(1, mRegularTabModel.getCount());
+        assertEquals(2, mArchivedTabModel.getCount());
+
+        HistogramWatcher histogramExpectation =
+                HistogramWatcher.newSingleRecordWatcher(
+                        "TabGroups.RestoreSingleTabGroup.TabGroupTabCount", 1);
+
+        mRobot.actionRobot.clickItemAtAdapterPosition(0);
+
+        verify(mTabGroupSyncService).updateArchivalStatus(SYNC_GROUP_ID1, false);
+        savedTabGroupLocalIdSet.archivalTimeMs = null;
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> notifyTabGroupSyncObserversWithChangedGroup(savedTabGroupLocalIdSet));
+
+        assertEquals(2, mRegularTabModel.getCount());
+        assertEquals(2, mArchivedTabModel.getCount());
+        histogramExpectation.assertExpected();
+        assertEquals(1, mUserActionTester.getActionCount("TabGroups.RestoreSingleTabGroup"));
+    }
+
     private Tab addArchivedTab(GURL url, String title) {
         return ThreadUtils.runOnUiThreadBlocking(
                 () ->
diff --git a/chrome/android/features/tab_ui/tab_management_java_sources.gni b/chrome/android/features/tab_ui/tab_management_java_sources.gni
index 117cec2d..c5939572 100644
--- a/chrome/android/features/tab_ui/tab_management_java_sources.gni
+++ b/chrome/android/features/tab_ui/tab_management_java_sources.gni
@@ -173,6 +173,7 @@
   "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java",
   "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyIllustrationAnimationManager.java",
   "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListGroupMenuCoordinator.java",
+  "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighter.java",
   "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListItemAnimator.java",
   "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java",
   "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListModel.java",
diff --git a/chrome/android/java/res/drawable-hdpi/location_bar_incognito_badge.png b/chrome/android/java/res/drawable-hdpi/location_bar_incognito_badge.png
index 7524390..724037bd 100644
--- a/chrome/android/java/res/drawable-hdpi/location_bar_incognito_badge.png
+++ b/chrome/android/java/res/drawable-hdpi/location_bar_incognito_badge.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/location_bar_incognito_badge.png b/chrome/android/java/res/drawable-mdpi/location_bar_incognito_badge.png
index 5f3c5fe..77e03f1 100644
--- a/chrome/android/java/res/drawable-mdpi/location_bar_incognito_badge.png
+++ b/chrome/android/java/res/drawable-mdpi/location_bar_incognito_badge.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/location_bar_incognito_badge.png b/chrome/android/java/res/drawable-xhdpi/location_bar_incognito_badge.png
index 4d2682a1..6974f6e 100644
--- a/chrome/android/java/res/drawable-xhdpi/location_bar_incognito_badge.png
+++ b/chrome/android/java/res/drawable-xhdpi/location_bar_incognito_badge.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/location_bar_incognito_badge.png b/chrome/android/java/res/drawable-xxhdpi/location_bar_incognito_badge.png
index a1cd7a7..37800fb 100644
--- a/chrome/android/java/res/drawable-xxhdpi/location_bar_incognito_badge.png
+++ b/chrome/android/java/res/drawable-xxhdpi/location_bar_incognito_badge.png
Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/location_bar_incognito_badge.png b/chrome/android/java/res/drawable-xxxhdpi/location_bar_incognito_badge.png
index 1c5c303..987dc23a 100644
--- a/chrome/android/java/res/drawable-xxxhdpi/location_bar_incognito_badge.png
+++ b/chrome/android/java/res/drawable-xxxhdpi/location_bar_incognito_badge.png
Binary files differ
diff --git a/chrome/android/java/res/layout/contextual_search_callout_view.xml b/chrome/android/java/res/layout/contextual_search_callout_view.xml
new file mode 100644
index 0000000..729f7077
--- /dev/null
+++ b/chrome/android/java/res/layout/contextual_search_callout_view.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2025 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/contextual_search_callout"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:orientation="horizontal"
+    android:gravity="end|center_vertical"
+    android:visibility="invisible">
+    <ImageView
+        android:id="@+id/contextual_search_callout_image"
+        android:layout_width="@dimen/contextual_search_callout_icon_size"
+        android:layout_height="@dimen/contextual_search_callout_icon_size"
+        android:scaleType="fitCenter"
+        android:src="@drawable/ic_logo_googleg_20dp"
+        android:importantForAccessibility="no"/>
+    <TextView
+        android:id="@+id/contextual_search_callout_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/contextual_search_callout_margin_start"
+        android:layout_marginEnd="@dimen/contextual_search_callout_margin_end"
+        android:textAppearance="@style/TextAppearance.TextMedium.Accent1"
+        android:maxLines="1"
+        android:ellipsize="end"
+        android:includeFontPadding="false" />
+</LinearLayout>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
index eb05972..05951a6f 100644
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -41,6 +41,9 @@
     <dimen name="contextual_search_term_caption_spacing">
         @dimen/overlay_panel_caption_spacing
     </dimen>
+    <dimen name="contextual_search_callout_icon_size">18dp</dimen>
+    <dimen name="contextual_search_callout_margin_start">9dp</dimen>
+    <dimen name="contextual_search_callout_margin_end">24dp</dimen>
     <dimen name="contextual_search_padded_button_width">
       @dimen/overlay_panel_padded_button_width
     </dimen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ZoomController.java b/chrome/android/java/src/org/chromium/chrome/browser/ZoomController.java
index 0e54760..141e8e0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ZoomController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ZoomController.java
@@ -8,6 +8,7 @@
 import android.os.SystemClock;
 
 import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.zoom.ZoomConstants;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.base.EventForwarder;
@@ -21,24 +22,24 @@
 @NullMarked
 public class ZoomController {
     /**
-     * Zooms in the WebContents by 25% (or less if that would result in
-     * zooming in more than possible).
+     * Zooms in the WebContents by 25% (or less if that would result in zooming in more than
+     * possible).
      *
      * @param webContents {@link WebContents} to zoom in.
      * @return True if there was a zoom change, false otherwise.
      */
-    public static boolean zoomIn(WebContents webContents) {
+    public static boolean zoomIn(@Nullable WebContents webContents) {
         return pinchByDelta(webContents, ZoomConstants.ZOOM_IN_DELTA);
     }
 
     /**
-     * Zooms out the WebContents by 20% (or less if that would result in
-     * zooming out more than possible).
+     * Zooms out the WebContents by 20% (or less if that would result in zooming out more than
+     * possible).
      *
      * @param webContents {@link WebContents} to zoom out.
      * @return True if there was a zoom change, false otherwise.
      */
-    public static boolean zoomOut(WebContents webContents) {
+    public static boolean zoomOut(@Nullable WebContents webContents) {
         return pinchByDelta(webContents, ZoomConstants.ZOOM_OUT_DELTA);
     }
 
@@ -48,12 +49,12 @@
      * @param webContents {@link WebContents} to reset the zoom of.
      * @return True if there was a zoom change, false otherwise.
      */
-    public static boolean zoomReset(WebContents webContents) {
+    public static boolean zoomReset(@Nullable WebContents webContents) {
         // Negative value to reset zoom level.
         return pinchByDelta(webContents, ZoomConstants.ZOOM_RESET_DELTA);
     }
 
-    private static boolean pinchByDelta(WebContents webContents, float delta) {
+    private static boolean pinchByDelta(@Nullable WebContents webContents, float delta) {
         if (webContents == null) return false;
         EventForwarder eventForwarder = webContents.getEventForwarder();
         long timeMs = SystemClock.uptimeMillis();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
index 050e69f0..397ae66 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -1101,12 +1101,13 @@
      */
     @Nullable
     protected ListItem maybeBuildRequestDesktopSiteListItem(
-            Tab currentTab, boolean isNativePage, boolean showIcon) {
+            @Nullable Tab currentTab, boolean isNativePage, boolean showIcon) {
         // Hide request desktop site on all native pages. Also hide it for desktop Android, which
         // always requests desktop sites.
         boolean itemVisible =
                 !isNativePage
                         && !shouldShowReaderModePrefs(currentTab)
+                        && currentTab != null
                         && currentTab.getWebContents() != null
                         && !BuildConfig.IS_DESKTOP_ANDROID;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java
index d05c11ed..21db046b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java
@@ -499,7 +499,7 @@
     private void rescueArchivedTabGroups() {
         if (mTabGroupSyncService == null) return;
 
-        if (mRescueTabGroupsCalled) return;
+        if (mRescueTabGroupsCalled) return; // prevents calling when already called once
         mRescueTabGroupsCalled = true;
 
         // Clear all {@link SavedTabGroup}s of possible archived status as the rescue operation.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/HeadlessTabDelegateFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/HeadlessTabDelegateFactory.java
index b9528aa2..4443a4d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/HeadlessTabDelegateFactory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/HeadlessTabDelegateFactory.java
@@ -43,7 +43,7 @@
 
     @Override
     public @Nullable NativePage createNativePage(
-            String url, NativePage candidatePage, Tab tab, PdfInfo pdfInfo) {
+            String url, @Nullable NativePage candidatePage, Tab tab, @Nullable PdfInfo pdfInfo) {
         return null;
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/complex_tasks/TaskTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/complex_tasks/TaskTabHelper.java
index fc316833..eb7f5c1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/complex_tasks/TaskTabHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/complex_tasks/TaskTabHelper.java
@@ -25,10 +25,11 @@
 
     /**
      * Creates the {@link TaskTabHelper} for the given {@link Tab}.
+     *
      * @param tab the Tab to attach the helper to.
      * @param parentTab corresponding parent Tab for the Tab
      */
-    public static void createForTab(Tab tab, Tab parentTab) {
+    public static void createForTab(Tab tab, @Nullable Tab parentTab) {
         if (parentTab == null) return;
         TabAttributes.from(tab)
                 .set(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelRepaddingTextView.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelRepaddingTextView.java
index 828ec0c..cafeda5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelRepaddingTextView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelRepaddingTextView.java
@@ -18,7 +18,7 @@
 public abstract class OverlayPanelRepaddingTextView extends OverlayPanelInflater {
     private static final float REPADDING_THRESHOLD = 0.5f;
 
-    private final float mPeekedEndButtonsWidth;
+    private float mPeekedEndButtonsWidth;
     private final float mExpandedEndButtonsWidth;
 
     private int mPaddingStart;
@@ -55,9 +55,20 @@
     }
 
     /**
+     * Sets the end padding to use when the overlay is peeking.
+     *
+     * @param paddingPx The padding in pixels.
+     */
+    public void setPeekedEndPadding(int paddingPx) {
+        mPeekedEndButtonsWidth = paddingPx;
+        invalidate();
+    }
+
+    /**
      * Updates the text view during the transition of the Overlay from Peeked to Expanded states.
-     * @param percentage A value from 0 to 1 that indicates the degree to which the panel has
-     *        been expanded.
+     *
+     * @param percentage A value from 0 to 1 that indicates the degree to which the panel has been
+     *     expanded.
      */
     public void onUpdateFromPeekToExpand(float percentage) {
         mIsPanelExpandedBeyondHalf = percentage > REPADDING_THRESHOLD;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java
index c609424..bbedb009 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java
@@ -16,15 +16,16 @@
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelAnimation;
+import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchCalloutControl.CalloutListener;
 import org.chromium.chrome.browser.contextualsearch.QuickActionCategory;
 import org.chromium.chrome.browser.layouts.animation.CompositorAnimator;
 import org.chromium.ui.base.LocalizationUtils;
 import org.chromium.ui.resources.dynamics.DynamicResourceLoader;
 
 /**
- * Controls the Search Bar in the Contextual Search Panel.
- * This class holds instances of its subcomponents such as the main text, caption, icon
- * and interaction controls such as the close box.
+ * Controls the Search Bar in the Contextual Search Panel. This class holds instances of its
+ * subcomponents such as the main text, caption, icon and interaction controls such as the close
+ * box.
  */
 public class ContextualSearchBarControl {
     /** Full opacity -- fully visible. */
@@ -57,9 +58,12 @@
     /** The {@link ContextualSearchImageControl} for the panel. */
     private final ContextualSearchImageControl mImageControl;
 
+    /** The {@link ContextualSearchCalloutControl} for the panel. */
+    private final ContextualSearchCalloutControl mCalloutControl;
+
     /**
-     * The opacity of the Bar's Search Context.
-     * This text control may not be initialized until the opacity is set beyond 0.
+     * The opacity of the Bar's Search Context. This text control may not be initialized until the
+     * opacity is set beyond 0.
      */
     private float mSearchBarContextOpacity;
 
@@ -151,6 +155,10 @@
         mQuickActionControl = new ContextualSearchQuickActionControl(context, loader);
         mCardIconControl = new ContextualSearchCardIconControl(context, loader);
 
+        mCalloutControl =
+                new ContextualSearchCalloutControl(
+                        panel, context, container, loader, getCalloutListener());
+
         mTextLayerMinHeight =
                 context.getResources()
                         .getDimension(R.dimen.contextual_search_text_layer_min_height);
@@ -166,6 +174,13 @@
     }
 
     /**
+     * @return The {@link ContextualSearchCalloutControl} for the panel.
+     */
+    public ContextualSearchCalloutControl getCalloutControl() {
+        return mCalloutControl;
+    }
+
+    /**
      * Returns the minimum height that the text layer (containing the Search Context, Term and
      * Caption) should be.
      */
@@ -190,6 +205,7 @@
         mCaptionControl.destroy();
         mQuickActionControl.destroy();
         mCardIconControl.destroy();
+        mCalloutControl.destroy();
     }
 
     /**
@@ -221,6 +237,7 @@
         mCaptionControl.onUpdateFromPeekToExpand(percentage);
         mSearchTermControl.onUpdateFromPeekToExpand(percentage);
         mContextControl.onUpdateFromPeekToExpand(percentage);
+        mCalloutControl.onUpdateFromPeekToExpand(percentage);
     }
 
     /**
@@ -644,4 +661,16 @@
         assert mInBarAnimationTestNotifier == null;
         mInBarAnimationTestNotifier = runnable;
     }
+
+    /** Resizes the contextual search bar text when the callout is present. */
+    private CalloutListener getCalloutListener() {
+        return new CalloutListener() {
+            @Override
+            public void onCapture(int widthPx) {
+                mSearchTermControl.setPeekedEndPadding(widthPx);
+                mCaptionControl.setPeekedEndPadding(widthPx);
+                mContextControl.setPeekedEndPadding(widthPx);
+            }
+        };
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCalloutControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCalloutControl.java
new file mode 100644
index 0000000..ca78237
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCalloutControl.java
@@ -0,0 +1,137 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.compositor.bottombar.contextualsearch;
+
+import static org.chromium.build.NullUtil.assumeNonNull;
+
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelInflater;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.ui.resources.dynamics.DynamicResourceLoader;
+
+/** Controls the callout (e.g. "Latest results") shown in the {@link ContextualSearchBarControl}. */
+@NullMarked
+public class ContextualSearchCalloutControl extends OverlayPanelInflater {
+
+    interface CalloutListener {
+        /** Called when the callout is rendered. */
+        void onCapture(int widthPx);
+    }
+
+    /** Listener for updates to the callout. */
+    private final CalloutListener mListener;
+
+    /** Whether this control is enabled or not. */
+    private final boolean mIsEnabled;
+
+    /** Whether the alternate text variant is enabled or not. */
+    private final boolean mIsTextVariantEnabled;
+
+    @Nullable private TextView mTextView;
+
+    @Nullable private ImageView mImageView;
+
+    private int mCalloutWidthPx;
+
+    private float mOpacity;
+
+    /**
+     * @param panel The panel.
+     * @param context The Android Context used to inflate the View.
+     * @param container The container View used to inflate the View.
+     * @param resourceLoader The resource loader that will handle the snapshot capturing.
+     * @param listener The listener for capturing callout resize events.
+     */
+    public ContextualSearchCalloutControl(
+            ContextualSearchPanel panel,
+            Context context,
+            ViewGroup container,
+            DynamicResourceLoader resourceLoader,
+            CalloutListener listener) {
+        super(
+                panel,
+                R.layout.contextual_search_callout_view,
+                R.id.contextual_search_callout,
+                context,
+                container,
+                resourceLoader);
+        mListener = listener;
+        mIsEnabled = ChromeFeatureList.isEnabled(ChromeFeatureList.TOUCH_TO_SEARCH_CALLOUT);
+        mIsTextVariantEnabled = ChromeFeatureList.sTouchToSearchCalloutTextVariant.getValue();
+
+        // Pre-inflate so that the contextual search text padding is adjusted to the callout width.
+        if (mIsEnabled) {
+            inflate();
+            invalidate();
+        }
+    }
+
+    /**
+     * Updates the opacity of the callout based on the panel expansion.
+     *
+     * @param percentage The percentage of the panel that is expanded.
+     */
+    public void onUpdateFromPeekToExpand(float percentage) {
+        // The callout animation completes during the first 50% of the peek to expand transition.
+        float animationProgressPercent = Math.min(percentage, .5f) / .5f;
+        // The callout starts off at 100% opacity and finishes at 0% opacity.
+        mOpacity = 1.f - animationProgressPercent;
+    }
+
+    /**
+     * @return The opacity of the callout.
+     */
+    public float getOpacity() {
+        return mOpacity;
+    }
+
+    // ========================================================================================
+    // OverlayPanelInflater overrides
+    // ========================================================================================
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+
+        View view = assumeNonNull(getView());
+
+        mTextView = view.findViewById(R.id.contextual_search_callout_text);
+        mTextView.setText(
+                mIsTextVariantEnabled
+                        ? view.getResources()
+                                .getString(R.string.contextual_search_callout_text_variant)
+                        : view.getResources().getString(R.string.contextual_search_callout_text));
+
+        mImageView = view.findViewById(R.id.contextual_search_callout_image);
+    }
+
+    @Override
+    protected void onCaptureEnd() {
+        super.onCaptureEnd();
+
+        Context context = assumeNonNull(getContext());
+        mCalloutWidthPx =
+                (int)
+                        (assumeNonNull(mTextView).getWidth()
+                                + assumeNonNull(mImageView).getWidth()
+                                + context.getResources()
+                                        .getDimension(
+                                                R.dimen.contextual_search_callout_margin_start)
+                                + context.getResources()
+                                        .getDimension(
+                                                R.dimen.contextual_search_callout_margin_end));
+
+        mListener.onCapture(mCalloutWidthPx);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelper.java
index ed7464c..55b49b94 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelper.java
@@ -160,7 +160,8 @@
                         }
 
                         @Override
-                        public void onFaviconUpdated(Tab tab, Bitmap icon, GURL iconUrl) {
+                        public void onFaviconUpdated(
+                                Tab tab, @Nullable Bitmap icon, @Nullable GURL iconUrl) {
                             if (icon == null) return;
                             updateFavicon(icon);
                         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTabObserver.java
index 116e351..ddc1be9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTabObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTabObserver.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.customtabs.features.partialcustomtab;
 
+
 import org.chromium.base.Callback;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
@@ -36,7 +37,9 @@
         if (mImmWrapper == null) {
             mImmWrapper =
                     new PartialCustomTabInputMethodWrapper(
-                            tab.getContext(), tab.getWindowAndroid(), mShowSoftInputCallback);
+                            tab.getContext(),
+                            tab.getWindowAndroidChecked(),
+                            mShowSoftInputCallback);
         }
         if (mCurrentTab != tab) {
             updateImmWrapper(tab);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/ButtonVisibilityRule.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/ButtonVisibilityRule.java
index 8b666c3..a0d0eb09 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/ButtonVisibilityRule.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/ButtonVisibilityRule.java
@@ -186,6 +186,16 @@
         }
     }
 
+    /**
+     * Return {@code true} if the given button was suppressed (hidden) by this rule checker.
+     *
+     * @param index Index of the button.
+     */
+    public boolean isSuppressed(int index) {
+        Button button = mButtons.get(index);
+        return button != null && !button.mVisible && button.mSuppressed;
+    }
+
     /** Refresh visibility of buttons with the state updated so far. */
     public void refresh() {
         if (!mActivated) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
index 4f66433..100cac0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
@@ -1505,12 +1505,12 @@
         }
 
         private void updateOptionalButton(ButtonData buttonData) {
-            if (mOptionalButtonCoordinator == null && !initializeOptionalButton()) {
+            if ((mOptionalButtonCoordinator == null && !initializeOptionalButton())
+                    || mButtonVisibilityRule.isSuppressed(ButtonId.MTB)) {
                 // See if we should show an indicator if optional button cannot be shown. This check
                 // needs to be invoked _after_ optional button initialization is attempted, in order
                 // to determine its visibility in case it gets hidden due to toolbar width/button
-                // count
-                // constraints.
+                // count constraints.
                 maybeShowActionMenuIndicator(buttonData.getButtonSpec().getButtonVariant());
                 return;
             }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
index 4db086b..3deee18 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
@@ -624,13 +624,17 @@
         // button for this site on other tabs.
         removeUrlFromMutedSites(mDistillerUrl);
 
-        if (!SysUtils.isLowEndDevice()) {
+        if (!SysUtils.isLowEndDevice() && !shouldUseRegularTabsForDistillation()) {
             distillInCustomTab();
         } else {
             navigateToReaderMode();
         }
     }
 
+    private boolean shouldUseRegularTabsForDistillation() {
+        return DomDistillerFeatures.sReaderModeDistillInApp.isEnabled();
+    }
+
     /** Navigate the current tab to a Reader Mode URL. */
     private void navigateToReaderMode() {
         WebContents webContents = mTab.getWebContents();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java
index d3a55b6..915909f299 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java
@@ -748,7 +748,7 @@
             mResultBar =
                     new FindResultBar(
                             getContext(),
-                            mCurrentTab.getContentView(),
+                            assumeNonNull(mCurrentTab.getContentView()),
                             mWindowAndroid,
                             mFindInPageBridge);
         } else if (!visibility) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationUtils.java
index 2714cbf..0481072 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationUtils.java
@@ -8,6 +8,7 @@
 
 import android.os.Build.VERSION;
 import android.os.Build.VERSION_CODES;
+import android.view.Window;
 
 import org.chromium.base.SysUtils;
 import org.chromium.build.annotations.NullMarked;
@@ -35,9 +36,10 @@
         if (tab == null) return false;
         if (!areBackForwardTransitionsEnabled()) return false;
         // If in gesture mode, only U and above support transition.
-        if (tab.getWindowAndroid().getWindow() == null) return false;
+        Window window = tab.getWindowAndroidChecked().getWindow();
+        if (window == null) return false;
         if (VERSION.SDK_INT < VERSION_CODES.UPSIDE_DOWN_CAKE
-                && UiUtils.isGestureNavigationMode(tab.getWindowAndroid().getWindow())) {
+                && UiUtils.isGestureNavigationMode(window)) {
             return false;
         }
         if (!allowTransitionFromNativePages() && tab.isNativePage()) return false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java
index 04e66e7d..f0e7c58 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java
@@ -22,6 +22,7 @@
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.Window;
 
 import androidx.annotation.IntDef;
 import androidx.annotation.VisibleForTesting;
@@ -320,7 +321,7 @@
                 BackPressMetrics.recordNavStatusOnGestureStart(
                         assumeNonNull(mTab.getWebContents())
                                 .hasUncommittedNavigationInPrimaryMainFrame(),
-                        assumeNonNull(mTab.getWindowAndroid().getActivity().get()).getWindow());
+                        getWindow(mTab));
                 mStartNavDuringOngoingGesture = false;
                 mBackGestureForTabHistoryInProgress = true;
             }
@@ -425,8 +426,7 @@
         if (mBackGestureForTabHistoryInProgress) {
             assumeNonNull(mTab);
             BackPressMetrics.recordNavStatusDuringGesture(
-                    mStartNavDuringOngoingGesture,
-                    assumeNonNull(mTab.getWindowAndroid().getActivity().get()).getWindow());
+                    mStartNavDuringOngoingGesture, getWindow(mTab));
         }
         mBackGestureForTabHistoryInProgress = false;
         mStartNavDuringOngoingGesture = false;
@@ -494,7 +494,7 @@
      */
     private float getProgress() {
         assert mTab != null;
-        Activity activity = mTab.getWindowAndroid().getActivity().get();
+        Activity activity = mTab.getWindowAndroidChecked().getActivity().get();
         assert activity != null;
         int width;
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
@@ -537,4 +537,8 @@
         }
         return forward;
     }
+
+    private static final Window getWindow(Tab tab) {
+        return assumeNonNull(tab.getWindowAndroidChecked().getActivity().get()).getWindow();
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/RtlGestureNavIphController.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/RtlGestureNavIphController.java
index 86771bd..b4a58db 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/RtlGestureNavIphController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/RtlGestureNavIphController.java
@@ -24,6 +24,7 @@
 import org.chromium.components.feature_engagement.FeatureConstants;
 import org.chromium.components.feature_engagement.Tracker;
 import org.chromium.content_public.browser.NavigationHandle;
+import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.modaldialog.ModalDialogManager;
 
 /**
@@ -118,7 +119,8 @@
     private void show() {
         Tab tab = mActivityTabProvider.get();
         assumeNonNull(tab);
-        ModalDialogManager modalDialogManager = tab.getWindowAndroid().getModalDialogManager();
+        WindowAndroid windowAndroid = tab.getWindowAndroidChecked();
+        ModalDialogManager modalDialogManager = windowAndroid.getModalDialogManager();
         assumeNonNull(modalDialogManager);
         RtlGestureNavIphDialog dialog =
                 new RtlGestureNavIphDialog(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/pdf/PdfPageIphController.java b/chrome/android/java/src/org/chromium/chrome/browser/pdf/PdfPageIphController.java
index 3f75426..dae6ae65 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/pdf/PdfPageIphController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/pdf/PdfPageIphController.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.pdf;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.app.Activity;
 import android.content.Context;
 import android.os.Handler;
@@ -103,7 +105,9 @@
                 new ActivityTabTabObserver(mActivityTabProvider) {
                     @Override
                     public void onPageLoadFinished(Tab tab, GURL url) {
-                        if (tab == null || !tab.isNativePage() || !tab.getNativePage().isPdf()) {
+                        if (tab == null
+                                || !tab.isNativePage()
+                                || !assumeNonNull(tab.getNativePage()).isPdf()) {
                             return;
                         }
                         showDownloadIph(profile);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator.java
index 761e43d..5880d01 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.stylus_handwriting;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.app.Activity;
 
 import org.chromium.base.supplier.ObservableSupplier;
@@ -49,7 +51,7 @@
                             public void onContentChanged(Tab tab) {
                                 if (tab.getWebContents() == null) return;
                                 mStylusWritingController.onWebContentsChanged(tab.getWebContents());
-                                tab.getContentView()
+                                assumeNonNull(tab.getContentView())
                                         .setStylusWritingIconSupplier(
                                                 mStylusWritingController::resolvePointerIcon);
                             }
@@ -58,7 +60,7 @@
                         tab -> {
                             if (tab == null || tab.getWebContents() == null) return;
                             mStylusWritingController.onWebContentsChanged(tab.getWebContents());
-                            tab.getContentView()
+                            assumeNonNull(tab.getContentView())
                                     .setStylusWritingIconSupplier(
                                             mStylusWritingController::resolvePointerIcon);
                         });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java
index 6143a4f..33f8527e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.tab;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.app.Activity;
 import android.content.Intent;
 
@@ -76,13 +78,15 @@
     }
 
     @Override
-    public WebContents getWebContents() {
+    public @Nullable WebContents getWebContents() {
         return mTab.getWebContents();
     }
 
     @Override
     public @Nullable ExternalNavigationHandler createExternalNavigationHandler() {
-        return mTab.getDelegateFactory().createExternalNavigationHandler(mTab);
+        TabDelegateFactory delegateFactory = mTab.getDelegateFactory();
+        if (delegateFactory == null) return null;
+        return delegateFactory.createExternalNavigationHandler(mTab);
     }
 
     @Override
@@ -96,7 +100,7 @@
     }
 
     @Override
-    public Activity getActivity() {
+    public @Nullable Activity getActivity() {
         return mTab.getActivity();
     }
 
@@ -113,7 +117,7 @@
     @Override
     public void closeTab() {
         if (mTab.isClosing()) return;
-        mTab.getActivity()
+        assumeNonNull(mTab.getActivity())
                 .getTabModelSelector()
                 .tryCloseTab(
                         TabClosureParams.closeTab(mTab).allowUndo(false).build(),
@@ -184,10 +188,11 @@
                 PostTask.postTask(
                         TaskTraits.UI_DEFAULT,
                         () -> {
+                            Activity activity = assumeNonNull(getActivity());
                             if (!isChromeTabbedActivityRunning) {
-                                getActivity().finishAndRemoveTask();
+                                activity.finishAndRemoveTask();
                             } else {
-                                getActivity().moveTaskToBack(false);
+                                activity.moveTaskToBack(false);
                             }
                             closeTab();
                         });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
index f00e3b8..67d50c05 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
@@ -388,7 +388,7 @@
      * Determine whether RDS window setting should be applied. When returning 'true' the mobile user
      * agent should be used for the current window size.
      */
-    static boolean shouldApplyWindowSetting(Profile profile, GURL url, Context context) {
+    static boolean shouldApplyWindowSetting(Profile profile, @Nullable GURL url, Context context) {
         // Skip window setting on Automotive and revisit if / when they add split screen.
         if (BuildInfo.getInstance().isAutomotive) {
             return false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiverImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiverImpl.java
index f3e4730..a1646b8b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiverImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiverImpl.java
@@ -253,14 +253,21 @@
 
         if (ChromeFeatureList.sAndroidTabDeclutterArchiveTabGroups.isEnabled()
                 && mTabGroupSyncService != null) {
+            int archivedTabGroups = 0;
             for (Token tabGroupId : archivedTabGroupIds) {
                 LocalTabGroupId localTabGroupId = new LocalTabGroupId(tabGroupId);
                 SavedTabGroup savedTabGroup = mTabGroupSyncService.getGroup(localTabGroupId);
                 if (savedTabGroup != null && savedTabGroup.syncId != null) {
                     mTabGroupSyncService.updateArchivalStatus(
                             savedTabGroup.syncId, /* archivalStatus= */ true);
+                    archivedTabGroups++;
+                    RecordHistogram.recordCount1000Histogram(
+                            "TabGroups.TabGroupDeclutter.ArchivedTabGroupTabCount",
+                            savedTabGroup.savedTabs.size());
                 }
             }
+            RecordHistogram.recordCount1000Histogram(
+                    "TabGroups.TabGroupDeclutter.ArchivedTabGroups", archivedTabGroups);
         }
 
         int tabCount = tabs.size();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java
index d573d55..90713e7f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.tab;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.Callback;
@@ -115,7 +117,7 @@
         mTab.addObserver(
                 new EmptyTabObserver() {
                     @Override
-                    public void onInitialized(Tab tab, String appId) {
+                    public void onInitialized(Tab tab, @Nullable String appId) {
                         updateVisibilityDelegate();
                     }
 
@@ -198,7 +200,8 @@
             mVisibilityDelegate.removeObserver(mConstraintsChangedCallback);
         }
         mVisibilityDelegate =
-                mTab.getDelegateFactory().createBrowserControlsVisibilityDelegate(mTab);
+                assumeNonNull(mTab.getDelegateFactory())
+                        .createBrowserControlsVisibilityDelegate(mTab);
         if (mVisibilityDelegate != null) {
             mVisibilityDelegate.addObserver(mConstraintsChangedCallback);
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBuilder.java
index 81c7cbc9e..89e3765 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBuilder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBuilder.java
@@ -190,6 +190,7 @@
 
         // Initializes Tab. Its user data objects are also initialized through the event
         // |onInitialized| of TabObserver they register.
+        assert mDelegateFactory != null;
         tab.initialize(
                 parent,
                 mCreationType,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java
index fc09184..df7a7d2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.tab;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
@@ -13,7 +15,6 @@
 import android.provider.ContactsContract;
 import android.text.TextUtils;
 
-import androidx.annotation.Nullable;
 import androidx.browser.customtabs.CustomTabsIntent;
 
 import org.chromium.base.ContextUtils;
@@ -21,6 +22,8 @@
 import org.chromium.base.PackageManagerUtils;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.DefaultBrowserInfo;
 import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpenerImpl;
@@ -61,6 +64,7 @@
 /**
  * A default {@link ContextMenuItemDelegate} that supports the context menu functionality in Tab.
  */
+@NullMarked
 public class TabContextMenuItemDelegate implements ContextMenuItemDelegate {
     private final Activity mActivity;
     private final TabImpl mTab;
@@ -98,7 +102,7 @@
 
     @Override
     public WebContents getWebContents() {
-        return mTab.getWebContents();
+        return assumeNonNull(mTab.getWebContents());
     }
 
     @Override
@@ -166,7 +170,7 @@
     public boolean supportsCall() {
         Intent intent = new Intent(Intent.ACTION_VIEW);
         intent.setData(Uri.parse("tel:"));
-        return mTab.getWindowAndroid().canResolveActivity(intent);
+        return mTab.getWindowAndroidChecked().canResolveActivity(intent);
     }
 
     @Override
@@ -181,7 +185,7 @@
     public boolean supportsSendEmailMessage() {
         Intent intent = new Intent(Intent.ACTION_VIEW);
         intent.setData(Uri.parse("mailto:test@example.com"));
-        return mTab.getWindowAndroid().canResolveActivity(intent);
+        return mTab.getWindowAndroidChecked().canResolveActivity(intent);
     }
 
     @Override
@@ -196,7 +200,7 @@
     public boolean supportsSendTextMessage() {
         Intent intent = new Intent(Intent.ACTION_VIEW);
         intent.setData(Uri.parse("sms:"));
-        return mTab.getWindowAndroid().canResolveActivity(intent);
+        return mTab.getWindowAndroidChecked().canResolveActivity(intent);
     }
 
     @Override
@@ -210,7 +214,7 @@
     public boolean supportsAddToContacts() {
         Intent intent = new Intent(Intent.ACTION_INSERT);
         intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
-        return mTab.getWindowAndroid().canResolveActivity(intent);
+        return mTab.getWindowAndroidChecked().canResolveActivity(intent);
     }
 
     @Override
@@ -275,7 +279,7 @@
         Activity activity = TabUtils.getActivity(mTab);
         chromeAsyncTabLauncher.launchTabInOtherWindow(
                 loadUrlParams,
-                activity,
+                assumeNonNull(activity),
                 mTab.getParentId(),
                 MultiWindowUtils.getAdjacentWindowActivity(activity));
     }
@@ -412,7 +416,7 @@
                             .notifyEvent(EventConstants.READ_LATER_CONTEXT_MENU_TAPPED);
 
                     // Add to offline pages.
-                    RequestCoordinatorBridge.getForProfile(profile)
+                    assumeNonNull(RequestCoordinatorBridge.getForProfile(profile))
                             .savePageLater(
                                     url.getSpec(),
                                     OfflinePageBridge.BOOKMARK_NAMESPACE,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabHelpers.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabHelpers.java
index 6cc7b84..8893e9e8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabHelpers.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabHelpers.java
@@ -6,6 +6,8 @@
 
 import android.app.Activity;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.SwipeRefreshHandler;
 import org.chromium.chrome.browser.accessibility.AccessibilityTabHelper;
 import org.chromium.chrome.browser.complex_tasks.TaskTabHelper;
@@ -21,15 +23,17 @@
 import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeUtils;
 
 /** Helper class that initializes various tab UserData objects. */
+@NullMarked
 public final class TabHelpers {
     private TabHelpers() {}
 
     /**
      * Creates Tab helper objects upon Tab creation.
+     *
      * @param tab {@link Tab} to create helpers for.
      * @param parentTab {@link Tab} parent tab
      */
-    static void initTabHelpers(Tab tab, Tab parentTab) {
+    static void initTabHelpers(Tab tab, @Nullable Tab parentTab) {
         TabUma.createForTab(tab);
         TabStateAttributes.createForTab(tab, ((TabImpl) tab).getCreationState());
         TabDistillabilityProvider.createForTab(tab);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
index 650e3e9..d0d89bb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.tab;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.ComponentName;
@@ -22,8 +24,6 @@
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.jni_zero.CalledByNative;
@@ -45,6 +45,10 @@
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.Supplier;
 import org.chromium.base.version_info.VersionInfo;
+import org.chromium.build.annotations.EnsuresNonNullIf;
+import org.chromium.build.annotations.Initializer;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ActivityUtils;
 import org.chromium.chrome.browser.WarmupManager;
@@ -113,6 +117,7 @@
  * Implementation of the interface {@link Tab}. Contains and manages a {@link ContentView}. This
  * class is not intended to be extended.
  */
+@NullMarked
 class TabImpl implements Tab {
     /** Used for logging. */
     private static final String TAG = "Tab";
@@ -143,7 +148,7 @@
     private final Profile mProfile;
 
     /** The tab model this tab is currently attached to. */
-    private @Nullable ObservableSupplier<Tab> mCurrentTabSupplier;
+    private @Nullable ObservableSupplier<@Nullable Tab> mCurrentTabSupplier;
 
     /**
      * An Application {@link Context}. Unlike {@link #mActivity}, this is the only one that is
@@ -152,10 +157,10 @@
     private final Context mThemedApplicationContext;
 
     /** Gives {@link Tab} a way to interact with the Android window. */
-    private WindowAndroid mWindowAndroid;
+    private @Nullable WindowAndroid mWindowAndroid;
 
     /** The current native page (e.g. chrome-native://newtab), or {@code null} if there is none. */
-    private NativePage mNativePage;
+    private @Nullable NativePage mNativePage;
 
     /**
      * True after a native page has been hidden, before a new background color has been explicitly
@@ -165,17 +170,17 @@
     private boolean mWaitingOnBgColorAfterHidingNativePage;
 
     /** {@link WebContents} showing the current page, or {@code null} if the tab is frozen. */
-    private WebContents mWebContents;
+    private @Nullable WebContents mWebContents;
 
     /** The parent view of the ContentView and the InfoBarContainer. */
-    private ContentView mContentView;
+    private @Nullable ContentView mContentView;
 
     /** The view provided by {@link TabViewManager} to be shown on top of Content view. */
-    private View mCustomView;
+    private @Nullable View mCustomView;
 
-    private @ColorInt Integer mCustomViewBackgroundColor;
+    private @Nullable @ColorInt Integer mCustomViewBackgroundColor;
 
-    AutofillProvider mAutofillProvider;
+    @Nullable AutofillProvider mAutofillProvider;
 
     /**
      * The {@link TabViewManager} associated with this Tab that is responsible for managing custom
@@ -188,7 +193,7 @@
     protected final ObserverList<TabObserver> mObservers = new ObserverList<>();
 
     // Content layer Delegates
-    private TabWebContentsDelegateAndroidImpl mWebContentsDelegate;
+    private @Nullable TabWebContentsDelegateAndroidImpl mWebContentsDelegate;
 
     private boolean mIsClosing;
     private boolean mDidCloseWhileDetached;
@@ -206,7 +211,7 @@
     private @Nullable @TabCreationState Integer mCreationState;
 
     /** URL load to be performed lazily when the Tab is next shown. */
-    private LoadUrlParams mPendingLoadParams;
+    private @Nullable LoadUrlParams mPendingLoadParams;
 
     /** True while a page load is in progress. */
     private boolean mIsLoading;
@@ -276,13 +281,13 @@
      * WebContents around. Upon tab switch WebContents will be unfrozen and the variable will be set
      * to null.
      */
-    private WebContentsState mWebContentsState;
+    private @Nullable WebContentsState mWebContentsState;
 
     /** Title of the ContentViews webpage. */
-    private String mTitle;
+    private String mTitle = "";
 
     /** URL of the page currently loading. Used as a fall-back in case tab restore fails. */
-    private GURL mUrl;
+    private @Nullable GURL mUrl;
 
     private long mLastNavigationCommittedTimestampMillis = INVALID_TIMESTAMP;
 
@@ -300,15 +305,17 @@
      */
     private boolean mIsAlreadyCreatingNativePage;
 
-    private String mPendingNativePageHost;
+    private @Nullable String mPendingNativePageHost;
 
-    private SmoothTransitionDelegate mNativePageSmoothTransitionDelegate;
+    private @Nullable SmoothTransitionDelegate mNativePageSmoothTransitionDelegate;
 
     /**
      * Notified when the content sensitivity changes, and sets the content sensitivity property on
      * the {@link TabState}.
+     *
+     * <p>Can be non-null once V is the minimum SDK.
      */
-    private SensitiveContentClient.Observer mSensitiveContentClientObserver;
+    private SensitiveContentClient.@Nullable Observer mSensitiveContentClientObserver;
 
     /** Tracks the origin of a background color change. */
     @IntDef({
@@ -335,7 +342,7 @@
      * @param launchType Type indicating how this tab was launched.
      */
     @SuppressLint("HandlerLeak")
-    TabImpl(int id, @NonNull Profile profile, @TabLaunchType int launchType) {
+    TabImpl(int id, Profile profile, @TabLaunchType int launchType) {
         mId = TabIdManager.getInstance().generateValidId(id);
         mProfile = profile;
         assert mProfile != null;
@@ -365,13 +372,13 @@
 
                     @Override
                     public void onViewDetachedFromWindow(View view) {
-                        if (isNativePage() && getNativePage().getView() == view) {
+                        if (isNativePage() && assumeNonNull(getNativePage()).getView() == view) {
                             if (mNativePageSmoothTransitionDelegate != null) {
                                 mNativePageSmoothTransitionDelegate.cancel();
                                 mNativePageSmoothTransitionDelegate = null;
                             } else {
                                 // reset ntp view state.
-                                getView().setAlpha(1f);
+                                assumeNonNull(getView()).setAlpha(1f);
                             }
                         }
                         mIsViewAttachedToWindow = false;
@@ -409,7 +416,7 @@
     }
 
     @Override
-    public WebContents getWebContents() {
+    public @Nullable WebContents getWebContents() {
         return mWebContents;
     }
 
@@ -417,11 +424,12 @@
     public Context getContext() {
         if (getWindowAndroid() == null) return mThemedApplicationContext;
         Context context = getWindowAndroid().getContext().get();
+        assumeNonNull(context);
         return context == context.getApplicationContext() ? mThemedApplicationContext : context;
     }
 
     @Override
-    public WindowAndroid getWindowAndroid() {
+    public @Nullable WindowAndroid getWindowAndroid() {
         return mWindowAndroid;
     }
 
@@ -480,12 +488,12 @@
     }
 
     @Override
-    public ContentView getContentView() {
+    public @Nullable ContentView getContentView() {
         return mContentView;
     }
 
     @Override
-    public View getView() {
+    public @Nullable View getView() {
         if (mCustomView != null) return mCustomView;
 
         if (mNativePage != null && !mNativePage.isFrozen()) return mNativePage.getView();
@@ -537,12 +545,13 @@
     }
 
     @Override
-    public NativePage getNativePage() {
+    public @Nullable NativePage getNativePage() {
         return mNativePage;
     }
 
     @Override
     @CalledByNative
+    @EnsuresNonNullIf("mNativePage")
     public boolean isNativePage() {
         return mNativePage != null;
     }
@@ -556,7 +565,7 @@
     public void freezeNativePage() {
         if (mNativePage == null
                 || mNativePage.isFrozen()
-                || mNativePage.getView().getParent() != null) {
+                || assumeNonNull(mNativePage.getView()).getParent() != null) {
             return;
         }
         mNativePage = FrozenNativePage.freeze(mNativePage);
@@ -642,7 +651,7 @@
         return mIsDetached;
     }
 
-    private void updateIsDetached(WindowAndroid window) {
+    private void updateIsDetached(@Nullable WindowAndroid window) {
         // HiddenTabHolder relies on isDetached() being true to determine whether the tab is
         // a background tab during initWebContents() before invoking ReparentingTask#detach().
         // In this scenario, the tab owns its own WindowAndroid and has no activity attachment.
@@ -693,7 +702,7 @@
             // parent tab.
             if (mDelegateFactory == null) {
                 mDelegateFactory = ((TabImpl) parent).getDelegateFactory();
-                setDelegateFactory(mDelegateFactory);
+                setDelegateFactory(assumeNonNull(mDelegateFactory));
             }
         }
     }
@@ -793,7 +802,7 @@
         mIsLoading = false;
         // In case extracting the WebContentsState fails make sure we reload to the same URL.
         if (mWebContentsState == null) {
-            mPendingLoadParams = new LoadUrlParams(mUrl);
+            mPendingLoadParams = new LoadUrlParams(mUrl == null ? GURL.emptyGURL() : mUrl);
         } else {
             // getWebContentsState should already have consumed the pending load params if one
             // existed. Only one of mPendingLoadParams and mWebContentsState should be populated at
@@ -818,7 +827,7 @@
         Referrer referrer = params.getReferrer();
         mWebContentsState =
                 WebContentsStateBridge.appendPendingNavigation(
-                        mWebContentsState,
+                        assumeNonNull(mWebContentsState),
                         title,
                         params.getUrl(),
                         referrer != null ? referrer.getUrl() : null,
@@ -835,7 +844,7 @@
         if (success) {
             // The pending load params were consumed to make the WebContentsState. Invalidate them.
             mPendingLoadParams = null;
-            mUrl = new GURL(mWebContentsState.getVirtualUrlFromState());
+            mUrl = new GURL(assumeNonNull(mWebContentsState).getVirtualUrlFromState());
         } else {
             // Since we are not allowed to auto-navigate the only remaining fallback is to clobber
             // all navigation state and treat the tab as if it is in a pending load state. All the
@@ -849,7 +858,7 @@
         }
         observers.rewind();
         notifyFaviconChanged();
-        updateTitle(title);
+        updateTitle(title == null ? "" : title);
 
         while (observers.hasNext()) {
             observers.next().onNavigationEntriesAppended(this);
@@ -886,7 +895,9 @@
         // physical backing size set, which means it will never produce any frames. In this case,
         // set the physical backing size to an estimate of what it would be if it were shown.
         if (caller == TabLoadIfNeededCaller.MEDIA_CAPTURE_PICKER && !hasBacking()) {
+            assumeNonNull(mWindowAndroid);
             var display = mWindowAndroid.getDisplay();
+            assumeNonNull(mWebContents);
             int width = (int) (mWebContents.getWidth() * display.getDipScale());
             int height = (int) (mWebContents.getHeight() * display.getDipScale());
             TabImplJni.get()
@@ -956,7 +967,7 @@
 
     @Override
     public float getProgress() {
-        return !isLoading() ? 1 : (int) mWebContents.getLoadProgress();
+        return !isLoading() ? 1 : (int) assumeNonNull(mWebContents).getLoadProgress();
     }
 
     @Override
@@ -997,7 +1008,7 @@
         if (webContents == null) return;
         if (mIsHidden) {
             webContents.updateWebContentsVisibility(Visibility.HIDDEN);
-        } else if (!mIsDetached && mWindowAndroid.getOcclusionSupplier().get()) {
+        } else if (!mIsDetached && assumeNonNull(mWindowAndroid).getOcclusionSupplier().get()) {
             // If we are not attached to a window, occlusion does not make sense.
             webContents.updateWebContentsVisibility(Visibility.OCCLUDED);
         } else {
@@ -1146,7 +1157,7 @@
      *     TabModel}.
      */
     @Deprecated
-    ChromeActivity getActivity() {
+    @Nullable ChromeActivity getActivity() {
         if (getWindowAndroid() == null) return null;
         Activity activity = ContextUtils.activityFromContext(getWindowAndroid().getContext().get());
         if (activity instanceof ChromeActivity) return (ChromeActivity) activity;
@@ -1195,6 +1206,7 @@
      * @param initializeRenderer Determines whether or not we initialize renderer with {@link
      *     WebContents} creation.
      */
+    @Initializer
     @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
     void initialize(
             @Nullable Tab parent,
@@ -1267,6 +1279,7 @@
                 }
             }
 
+            assumeNonNull(webContents);
             initWebContents(webContents);
             // Avoid an empty title by updating the title here. This could happen if restoring from
             // a WebContents that has no renderer and didn't force a reload. This happens on
@@ -1313,8 +1326,9 @@
         mWebContentsState = state.contentsState;
         setTimestampMillis(state.timestampMillis);
         setLastNavigationCommittedTimestampMillis(state.lastNavigationCommittedTimestampMillis);
+        assumeNonNull(state.contentsState);
         mUrl = new GURL(state.contentsState.getVirtualUrlFromState());
-        setTitle(state.contentsState.getDisplayTitleFromState());
+        setTitle(assumeNonNull(state.contentsState.getDisplayTitleFromState()));
         mTabLaunchTypeAtCreation = state.tabLaunchTypeAtCreation;
         setRootId(state.rootId == Tab.INVALID_TAB_ID ? mId : state.rootId);
         setTabGroupId(state.tabGroupId);
@@ -1339,7 +1353,7 @@
     }
 
     private static void updateImportance(
-            WebContents webContents, @ChildProcessImportance int importance) {
+            @Nullable WebContents webContents, @ChildProcessImportance int importance) {
         if (webContents == null
                 || ChromeFeatureList.isEnabled(ChromeFeatureList.PROCESS_RANK_POLICY_ANDROID)) {
             // When ProcessRankPolicyAndroid of performance manager is enabled, the policy updates
@@ -1378,12 +1392,12 @@
         updateIsDetached(windowAndroid);
     }
 
-    TabDelegateFactory getDelegateFactory() {
+    @Nullable TabDelegateFactory getDelegateFactory() {
         return mDelegateFactory;
     }
 
     @VisibleForTesting
-    TabWebContentsDelegateAndroidImpl getTabWebContentsDelegateAndroid() {
+    @Nullable TabWebContentsDelegateAndroidImpl getTabWebContentsDelegateAndroid() {
         return mWebContentsDelegate;
     }
 
@@ -1469,7 +1483,11 @@
         }
 
         // Start the cross-fade animation after the invoking animation is done.
-        switch (getWebContents().getCurrentBackForwardTransitionStage()) {
+        WebContents webContents = getWebContents();
+        assumeNonNull(webContents);
+        View view = getView();
+        assumeNonNull(view);
+        switch (webContents.getCurrentBackForwardTransitionStage()) {
             case AnimationStage.NONE:
                 // Native animator is destroy before animation is done.
                 // Non-null nativePageSmoothTransitionDelegate means the page is transiting to
@@ -1480,7 +1498,7 @@
                     mNativePageSmoothTransitionDelegate = null;
                 } else if (isNativePage()) {
                     // May reach this if a navigation is committed in the mid of gesture.
-                    getView().setAlpha(1f);
+                    view.setAlpha(1f);
                 }
                 return;
             case AnimationStage.OTHER:
@@ -1488,8 +1506,8 @@
                     // A transition is starting. Hide the Java view to present that.
                     // Wait until the content/ draws the transition.
                     CompositorViewHolder viewHolder =
-                            getActivity().getCompositorViewHolderSupplier().get();
-                    viewHolder.requestRender(() -> getView().setAlpha(0f));
+                            assumeNonNull(getActivity()).getCompositorViewHolderSupplier().get();
+                    viewHolder.requestRender(() -> assumeNonNull(getView()).setAlpha(0f));
                 }
                 return;
             case AnimationStage.WAITING_FOR_EMBEDDER_CONTENT_FOR_COMMITTED_ENTRY:
@@ -1498,15 +1516,15 @@
                     mNativePageSmoothTransitionDelegate.start(
                             () -> {
                                 if (isDestroyed()) return;
-                                getWebContents().onContentForNavigationEntryShown();
+                                assumeNonNull(getWebContents()).onContentForNavigationEntryShown();
                                 notifyContentChanged();
                             });
                     mNativePageSmoothTransitionDelegate = null;
                 } else if (isNativePage()) { // Navigation from native page was cancelled.
-                    if (getView().getAlpha() != 1f) {
+                    if (view.getAlpha() != 1f) {
                         // This means the content/ is waiting for the NTP to be fully visible.
-                        getView().setAlpha(1f);
-                        getView().post(getWebContents()::onContentForNavigationEntryShown);
+                        view.setAlpha(1f);
+                        view.post(webContents::onContentForNavigationEntryShown);
                     }
                 }
         }
@@ -1643,7 +1661,7 @@
      * @param pdfInfo Information of the pdf, or null if there is no associated pdf download.
      * @return True, if a native page was displayed for url.
      */
-    boolean maybeShowNativePage(String url, boolean forceReload, PdfInfo pdfInfo) {
+    boolean maybeShowNativePage(String url, boolean forceReload, @Nullable PdfInfo pdfInfo) {
         // While detached for reparenting we don't have an owning Activity, or TabModelSelector,
         // so we can't create the native page. The native page will be created once reparenting is
         // completed.
@@ -1667,6 +1685,7 @@
         mPendingNativePageHost = nativePageHost;
         mIsAlreadyCreatingNativePage = true;
         NativePage candidateForReuse = forceReload ? null : getNativePage();
+        assumeNonNull(mDelegateFactory);
         NativePage nativePage =
                 mDelegateFactory.createNativePage(url, candidateForReuse, this, pdfInfo);
         mIsAlreadyCreatingNativePage = false;
@@ -1727,7 +1746,7 @@
     }
 
     @Override
-    public LoadUrlParams getPendingLoadParams() {
+    public @Nullable LoadUrlParams getPendingLoadParams() {
         return mPendingLoadParams;
     }
 
@@ -1800,17 +1819,24 @@
     @CalledByNative
     void swapWebContents(WebContents webContents, boolean didStartLoad, boolean didFinishLoad) {
         boolean hasWebContents = mContentView != null && mWebContents != null;
+        assumeNonNull(mContentView);
         Rect original =
                 hasWebContents
                         ? new Rect(0, 0, mContentView.getWidth(), mContentView.getHeight())
                         : new Rect();
         for (TabObserver observer : mObservers) observer.webContentsWillSwap(this);
-        if (hasWebContents) mWebContents.updateWebContentsVisibility(Visibility.HIDDEN);
+        if (hasWebContents) {
+            assumeNonNull(mWebContents);
+            mWebContents.updateWebContentsVisibility(Visibility.HIDDEN);
+        }
         Context appContext = ContextUtils.getApplicationContext();
         Rect bounds = original.isEmpty() ? TabUtils.estimateContentSize(appContext) : null;
         if (bounds != null) original.set(bounds);
 
-        mWebContents.setFocus(false);
+        if (hasWebContents) {
+            assumeNonNull(mWebContents);
+            mWebContents.setFocus(false);
+        }
         destroyWebContents(false /* do not delete native web contents */);
         hideNativePage(
                 false,
@@ -1882,7 +1908,7 @@
     }
 
     @CalledByNative
-    private static long[] getAllNativePtrs(Tab[] tabsArray) {
+    private static long @Nullable [] getAllNativePtrs(Tab @Nullable [] tabsArray) {
         if (tabsArray == null) return null;
 
         long[] tabsPtrArray = new long[tabsArray.length];
@@ -1920,7 +1946,7 @@
      *
      * @param webContents The WebContents object that will initialize all the browser components.
      */
-    private void initWebContents(@NonNull WebContents webContents) {
+    private void initWebContents(WebContents webContents) {
         try {
             TraceEvent.begin("ChromeTab.initWebContents");
             WebContents oldWebContents = mWebContents;
@@ -1940,7 +1966,8 @@
 
             if (oldWebContents != null) {
                 updateImportance(oldWebContents, ChildProcessImportance.NORMAL);
-                getWebContentsAccessibility(oldWebContents).setObscuredByAnotherView(false);
+                assumeNonNull(getWebContentsAccessibility(oldWebContents))
+                        .setObscuredByAnotherView(false);
             }
 
             updateImportance(mWebContents, mImportance);
@@ -1960,6 +1987,11 @@
             boolean isBackgroundTab = isDetached();
 
             assert mNativeTabAndroid != 0;
+            assumeNonNull(mDelegateFactory);
+            ContextMenuPopulatorFactory contextMenuPopulatorFactory =
+                    mDelegateFactory.createContextMenuPopulatorFactory(this);
+            assumeNonNull(contextMenuPopulatorFactory);
+            assumeNonNull(mWebContentsDelegate);
             TabImplJni.get()
                     .initWebContents(
                             mNativeTabAndroid,
@@ -1967,9 +1999,7 @@
                             isBackgroundTab,
                             webContents,
                             mWebContentsDelegate,
-                            new TabContextMenuPopulatorFactory(
-                                    mDelegateFactory.createContextMenuPopulatorFactory(this),
-                                    this));
+                            new TabContextMenuPopulatorFactory(contextMenuPopulatorFactory, this));
 
             mWebContents.notifyRendererPreferenceUpdate();
             mContentView.setImportantForAutofill(
@@ -2001,6 +2031,7 @@
         if (mWebContentsDelegate != null) {
             mWebContentsDelegate.destroy();
         }
+        assumeNonNull(mDelegateFactory);
         TabWebContentsDelegateAndroid delegate = mDelegateFactory.createWebContentsDelegate(this);
         mWebContentsDelegate = new TabWebContentsDelegateAndroidImpl(this, delegate);
     }
@@ -2017,15 +2048,16 @@
                 () -> {
                     mNativePage = nativePage;
                     if (!mNativePage.isFrozen()) {
-                        mNativePage
-                                .getView()
-                                .addOnAttachStateChangeListener(mAttachStateChangeListener);
+                        View view = mNativePage.getView();
+                        assumeNonNull(view);
+                        view.addOnAttachStateChangeListener(mAttachStateChangeListener);
                     }
                     if (isDisplayingBackForwardAnimation()) {
                         assert GestureNavigationUtils.areBackForwardTransitionsEnabled()
                                 : "Must not draw bf screenshot if back forward transition is"
                                         + " disabled";
                         mNativePageSmoothTransitionDelegate = mNativePage.enableSmoothTransition();
+                        assumeNonNull(mNativePageSmoothTransitionDelegate);
                         mNativePageSmoothTransitionDelegate.prepare();
                     }
                     pushNativePageStateToNavigationEntry();
@@ -2044,7 +2076,7 @@
      * @param postHideTask {@link Runnable} task to run before actually destroying the native page.
      *     This is necessary to keep the tasks to perform in order.
      */
-    private void hideNativePage(boolean notify, Runnable postHideTask) {
+    private void hideNativePage(boolean notify, @Nullable Runnable postHideTask) {
         if (mNativePageSmoothTransitionDelegate != null) {
             mNativePageSmoothTransitionDelegate.cancel();
             mNativePageSmoothTransitionDelegate = null;
@@ -2054,7 +2086,9 @@
         NativePage previousNativePage = mNativePage;
         if (mNativePage != null) {
             if (!mNativePage.isFrozen()) {
-                mNativePage.getView().removeOnAttachStateChangeListener(mAttachStateChangeListener);
+                View view = mNativePage.getView();
+                assumeNonNull(view);
+                view.removeOnAttachStateChangeListener(mAttachStateChangeListener);
             }
             mNativePage = null;
             mWaitingOnBgColorAfterHidingNativePage = true;
@@ -2076,13 +2110,15 @@
 
         WebContents webContents = getWebContents();
         if (webContents != null) {
+            ContextMenuPopulatorFactory contextMenuPopulatorFactory =
+                    mDelegateFactory.createContextMenuPopulatorFactory(this);
+            assumeNonNull(contextMenuPopulatorFactory);
+            assumeNonNull(mWebContentsDelegate);
             TabImplJni.get()
                     .updateDelegates(
                             mNativeTabAndroid,
                             mWebContentsDelegate,
-                            new TabContextMenuPopulatorFactory(
-                                    mDelegateFactory.createContextMenuPopulatorFactory(this),
-                                    this));
+                            new TabContextMenuPopulatorFactory(contextMenuPopulatorFactory, this));
             webContents.notifyRendererPreferenceUpdate();
         }
     }
@@ -2174,6 +2210,7 @@
                 for (TabObserver observer : mObservers) observer.onRestoreFailed(this);
                 restored = false;
 
+                assumeNonNull(mUrl);
                 if (!mUrl.getSpec().isEmpty()) {
                     failedRestoreUrl = mUrl.getSpec();
                 } else if (!TextUtils.isEmpty(
@@ -2182,7 +2219,7 @@
                 }
             }
             Supplier<CompositorViewHolder> compositorViewHolderSupplier =
-                    getActivity().getCompositorViewHolderSupplier();
+                    assumeNonNull(getActivity()).getCompositorViewHolderSupplier();
             View compositorView = compositorViewHolderSupplier.get();
             webContents.setSize(compositorView.getWidth(), compositorView.getHeight());
 
@@ -2363,7 +2400,7 @@
     }
 
     @Override
-    public WebContentsState getWebContentsState() {
+    public @Nullable WebContentsState getWebContentsState() {
         return mWebContentsState;
     }
 
@@ -2379,6 +2416,7 @@
 
     @VisibleForTesting
     boolean hasBacking() {
+        if (mWebContents == null) return false;
         return !TabImplJni.get().isPhysicalBackingSizeEmpty(mNativeTabAndroid, mWebContents);
     }
 
@@ -2436,11 +2474,12 @@
         }
     }
 
-    private static WebContentsAccessibility getWebContentsAccessibility(WebContents webContents) {
+    private static @Nullable WebContentsAccessibility getWebContentsAccessibility(
+            @Nullable WebContents webContents) {
         return webContents != null ? WebContentsAccessibility.fromWebContents(webContents) : null;
     }
 
-    private void destroyNativePageInternal(NativePage nativePage) {
+    private void destroyNativePageInternal(@Nullable NativePage nativePage) {
         if (nativePage == null) return;
         assert nativePage != mNativePage : "Attempting to destroy active page.";
 
@@ -2460,7 +2499,7 @@
                 && ChromeFeatureList.isEnabled(
                         SensitiveContentFeatures.SENSITIVE_CONTENT_WHILE_SWITCHING_TABS)) {
             SensitiveContentClient.fromWebContents(mWebContents)
-                    .removeObserver(mSensitiveContentClientObserver);
+                    .removeObserver(assumeNonNull(mSensitiveContentClientObserver));
         }
 
         if (mAutofillProvider != null) {
@@ -2468,6 +2507,7 @@
             mAutofillProvider = null;
         }
 
+        assumeNonNull(mContentView);
         mContentView.removeOnAttachStateChangeListener(mAttachStateChangeListener);
         mContentView = null;
         updateInteractableState();
@@ -2597,8 +2637,9 @@
     @CalledByNative
     @Override
     public boolean isTrustedWebActivity() {
-        if (getWebContents() == null) return false;
-        return mWebContentsDelegate.isTrustedWebActivity(getWebContents());
+        WebContents webContents = getWebContents();
+        if (webContents == null || mWebContentsDelegate == null) return false;
+        return mWebContentsDelegate.isTrustedWebActivity(webContents);
     }
 
     @Override
@@ -2645,7 +2686,7 @@
     }
 
     @Override
-    public void onAddedToTabModel(ObservableSupplier<Tab> currentTabSupplier) {
+    public void onAddedToTabModel(ObservableSupplier<@Nullable Tab> currentTabSupplier) {
         // Tabs should not be attached to multiple tab models.
         assert mCurrentTabSupplier == null;
 
@@ -2653,7 +2694,7 @@
     }
 
     @Override
-    public void onRemovedFromTabModel(ObservableSupplier<Tab> currentTabSupplier) {
+    public void onRemovedFromTabModel(ObservableSupplier<@Nullable Tab> currentTabSupplier) {
         // Usually mCurrentTabSupplier should equal currentTabSupplier when it's removed from the
         // TabModel. However, during reparenting it appears there are situations where the tab is
         // not removed from the original TabModel before being added to the new TabModel. In these
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegate.java
index f4c0be9..bdc9903 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegate.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.tab;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.util.SparseArray;
 import android.view.ViewGroup;
 import android.view.ViewStructure;
@@ -57,7 +59,7 @@
             getDragAndDropDelegate().setDragAndDropBrowserDelegate(mDragAndDropBrowserDelegate);
         }
 
-        mCurrentInsetSupplier = tab.getWindowAndroid().getApplicationBottomInsetSupplier();
+        mCurrentInsetSupplier = tab.getWindowAndroidChecked().getApplicationBottomInsetSupplier();
         mCurrentInsetSupplier.addObserver(mInsetObserver);
 
         mTab.addObserver(
@@ -71,7 +73,8 @@
                         }
                         if (window != null) {
                             mCurrentInsetSupplier =
-                                    tab.getWindowAndroid().getApplicationBottomInsetSupplier();
+                                    tab.getWindowAndroidChecked()
+                                            .getApplicationBottomInsetSupplier();
                             mCurrentInsetSupplier.addObserver(mInsetObserver);
                         }
                         updateVisualViewportBottomInset();
@@ -144,8 +147,9 @@
     }
 
     @Override
-    public void updateAnchorViews(ViewGroup oldContainerView) {
+    public void updateAnchorViews(@Nullable ViewGroup oldContainerView) {
         super.updateAnchorViews(oldContainerView);
+        assumeNonNull(oldContainerView);
 
         assert oldContainerView instanceof ContentView
                 : "TabViewAndroidDelegate does not host container views other than ContentView.";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java
index 6779bf4..aebd5826 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java
@@ -29,6 +29,8 @@
 import org.chromium.base.ObserverList.RewindableIterator;
 import org.chromium.base.PackageManagerUtils;
 import org.chromium.base.lifetime.Destroyable;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ZoomController;
 import org.chromium.chrome.browser.app.bluetooth.BluetoothNotificationService;
@@ -56,6 +58,7 @@
 import java.util.List;
 
 /** Implementation class of {@link TabWebContentsDelegateAndroid}. */
+@NullMarked
 final class TabWebContentsDelegateAndroidImpl extends TabWebContentsDelegateAndroid
         implements Destroyable {
     private final TabImpl mTab;
@@ -338,7 +341,7 @@
             // Speculative fix for crbug.com/384566650
             if (webContents != null && !webContents.isDestroyed()) {
                 auditor.notifyCertificateFailure(
-                        PolicyAuditorJni.get().getCertificateFailure(mTab.getWebContents()),
+                        PolicyAuditorJni.get().getCertificateFailure(webContents),
                         ContextUtils.getApplicationContext());
             }
         }
@@ -456,11 +459,11 @@
 
     /**
      * @return the WebAPK manifest scope. This gives frames within the scope increased privileges
-     * such as autoplaying media unmuted.
+     *     such as autoplaying media unmuted.
      */
     @CalledByNative
     @Override
-    protected String getManifestScope() {
+    protected @Nullable String getManifestScope() {
         return mDelegate.getManifestScope();
     }
 
@@ -537,12 +540,12 @@
     }
 
     @Override
-    public boolean maybeCopyContentAreaAsBitmap(Callback<Bitmap> callback) {
+    public boolean maybeCopyContentAreaAsBitmap(Callback<@Nullable Bitmap> callback) {
         return NativePageBitmapCapturer.maybeCaptureNativeView(mTab, callback);
     }
 
     @Override
-    public Bitmap maybeCopyContentAreaAsBitmapSync() {
+    public @Nullable Bitmap maybeCopyContentAreaAsBitmapSync() {
         return NativePageBitmapCapturer.maybeCaptureNativeViewSync(mTab, getTopControlsHeight());
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
index f68d3513..24ce9833 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.tab;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.app.Activity;
 
 import androidx.annotation.VisibleForTesting;
@@ -20,6 +22,8 @@
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
 import org.chromium.blink.mojom.ViewportFit;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.SwipeRefreshHandler;
 import org.chromium.chrome.browser.app.bluetooth.BluetoothNotificationService;
@@ -47,6 +51,7 @@
 import org.chromium.url.GURL;
 
 /** WebContentsObserver used by Tab. */
+@NullMarked
 public class TabWebContentsObserver extends TabWebContentsUserData {
     // URL didFailLoad error code. Should match the value in net_error_list.h.
     public static final int BLOCKED_BY_ADMINISTRATOR = -22;
@@ -58,8 +63,8 @@
 
     private final TabImpl mTab;
     private final ObserverList<Callback<WebContents>> mInitObservers = new ObserverList<>();
-    private Observer mObserver;
-    private GURL mLastUrl;
+    private @Nullable Observer mObserver;
+    private @Nullable GURL mLastUrl;
 
     public static TabWebContentsObserver from(Tab tab) {
         TabWebContentsObserver observer = get(tab);
@@ -71,7 +76,7 @@
     }
 
     @VisibleForTesting
-    public static TabWebContentsObserver get(Tab tab) {
+    public static @Nullable TabWebContentsObserver get(Tab tab) {
         return tab.getUserDataHost().getUserData(USER_DATA_KEY);
     }
 
@@ -129,7 +134,7 @@
         sadTab.show(
                 mTab.getThemedApplicationContext(),
                 /* suggestionAction= */ () -> {
-                    Activity activity = mTab.getWindowAndroid().getActivity().get();
+                    Activity activity = mTab.getWindowAndroidChecked().getActivity().get();
                     assert activity != null;
                     HelpAndFeedbackLauncherImpl.getForProfile(mTab.getProfile())
                             .show(
@@ -140,7 +145,7 @@
 
                 /* buttonAction= */ () -> {
                     if (sadTab.showSendFeedbackView()) {
-                        mTab.getActivity()
+                        assumeNonNull(mTab.getActivity())
                                 .startHelpAndFeedback(
                                         mTab.getUrl().getSpec(),
                                         "MobileSadTabFeedback",
@@ -179,7 +184,7 @@
             // content. The URL check is done in addition to the isNativePage to ensure a navigation
             // off the native page did not result in the crash.
             if (mTab.isNativePage()
-                    && (mTab.getNativePage().getUrl().equals(mTab.getUrl().getSpec())
+                    && (assumeNonNull(mTab.getNativePage()).getUrl().equals(mTab.getUrl().getSpec())
                             || NativePage.isNativePageUrl(
                                     mTab.getUrl(),
                                     mTab.isIncognito(),
@@ -191,7 +196,7 @@
 
             int activityState =
                     ApplicationStatus.getStateForActivity(
-                            mTab.getWindowAndroid().getActivity().get());
+                            mTab.getWindowAndroidChecked().getActivity().get());
             if (mTab.isHidden()
                     || activityState == ActivityState.PAUSED
                     || activityState == ActivityState.STOPPED
@@ -346,13 +351,14 @@
 
         @Override
         public void didChangeThemeColor() {
-            mTab.updateThemeColor(mTab.getWebContents().getThemeColor());
+            mTab.updateThemeColor(assumeNonNull(mTab.getWebContents()).getThemeColor());
         }
 
         @Override
         public void onBackgroundColorChanged() {
             if (ChromeFeatureList.sNavBarColorMatchesTabBackground.isEnabled()) {
-                mTab.changeWebContentBackgroundColor(mTab.getWebContents().getBackgroundColor());
+                mTab.changeWebContentBackgroundColor(
+                        assumeNonNull(mTab.getWebContents()).getBackgroundColor());
             }
         }
 
@@ -391,6 +397,7 @@
         }
 
         void updateNotificationsForTab() {
+            assumeNonNull(mLastUrl);
             MediaCaptureNotificationServiceImpl.updateMediaNotificationForTab(
                     ContextUtils.getApplicationContext(), mTab.getId(), null, mLastUrl);
             BluetoothNotificationManager.updateBluetoothNotificationForTab(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl.java
index 4beb130b..535f041 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl.java
@@ -127,7 +127,9 @@
 
     @Override
     public @Nullable Tab getTabAt(int index) {
-        return null;
+        if (mNativeTabCollectionTabModelImplPtr == 0) return null;
+        return TabCollectionTabModelImplJni.get()
+                .getTabAtIndexRecursive(mNativeTabCollectionTabModelImplPtr, index);
     }
 
     @Override
@@ -588,5 +590,7 @@
         int getTabCountRecursive(long nativeTabCollectionTabModelImpl);
 
         int getIndexOfTabRecursive(long nativeTabCollectionTabModelImpl, Tab tab);
+
+        Tab getTabAtIndexRecursive(long nativeTabCollectionTabModelImpl, int index);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
index 465de42..9bf4082b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
@@ -313,7 +313,11 @@
     protected StatusBarColorController mStatusBarColorController;
     protected final Supplier<SnackbarManager> mSnackbarManagerSupplier;
     protected final ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeControllerSupplier;
-    private final EdgeToEdgeDebuggingInfo mEdgeToEdgeDebuggingInfo = new EdgeToEdgeDebuggingInfo();
+    private final EdgeToEdgeDebuggingInfo mEdgeToEdgeDebuggingInfo =
+            new EdgeToEdgeDebuggingInfo(
+                    (info) ->
+                            ChromePureJavaExceptionReporter.reportJavaExceptionFromMsg(
+                                    info, /* isWarning= */ true));
     protected Destroyable mEdgeToEdgeBottomChin;
     protected final @ActivityType int mActivityType;
     protected final Supplier<Boolean> mIsInOverviewModeSupplier;
@@ -861,7 +865,7 @@
     }
 
     public void onResumeWithNative() {
-        dumpEdgeToEdgeDebuggingInfo("onResumeWithNative");
+        addToEdgeToEdgeDebuggingInfo("onResumeWithNative");
     }
 
     protected boolean showWebSearchInActionMode() {
@@ -1866,7 +1870,8 @@
                             mEdgeToEdgeManager,
                             mBrowserControlsManager,
                             mLayoutManagerSupplier,
-                            mFullscreenManager);
+                            mFullscreenManager,
+                            mEdgeToEdgeDebuggingInfo);
             mEdgeToEdgeControllerSupplier.set(mEdgeToEdgeController);
             mEdgeToEdgeBottomChin = createEdgeToEdgeBottomChin();
 
@@ -1910,7 +1915,7 @@
         mEdgeToEdgeDebuggingInfo.setMissingNavBarInsetsReason(reason);
     }
 
-    private void dumpEdgeToEdgeDebuggingInfo(String callSite) {
+    private void addToEdgeToEdgeDebuggingInfo(String callSite) {
         if (!ChromeFeatureList.sEdgeToEdgeDebugging.isEnabled()
                 || mEdgeToEdgeDebuggingInfo.isUsed()) {
             return;
@@ -1918,15 +1923,12 @@
 
         boolean hasEdgeToEdgeController = mEdgeToEdgeControllerSupplier.get() != null;
         boolean isSupportedConfiguration = EdgeToEdgeUtils.isEdgeToEdgeBottomChinEnabled(mActivity);
-        mEdgeToEdgeDebuggingInfo.buildDebugReport(
-                mActivity.getWindow(),
-                mWindowAndroid,
+        mEdgeToEdgeDebuggingInfo.addToDebugReport(
+                callSite,
                 hasEdgeToEdgeController,
                 isSupportedConfiguration,
-                callSite,
-                (info) ->
-                        ChromePureJavaExceptionReporter.reportJavaExceptionFromMsg(
-                                info, /* isWarning= */ true));
+                mActivity != null ? mActivity.getWindow() : null,
+                mWindowAndroid);
     }
 
     /** Create a bottom chin for Edge-to-Edge. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialog.java
index f46970d6..d65013d5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialog.java
@@ -11,6 +11,9 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.Log;
+import org.chromium.build.annotations.Initializer;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.R;
 import org.chromium.ui.LayoutInflaterUtils;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
@@ -22,6 +25,7 @@
  * The dialog that warns the user that a WebApk is about to be updated, which will result in a short
  * name, long name and/or icon change.
  */
+@NullMarked
 public class WebApkIconNameUpdateDialog implements ModalDialogProperties.Controller {
 
     private static final String TAG = "IconNameUpdateDlg";
@@ -33,10 +37,10 @@
     private ModalDialogManager mModalDialogManager;
 
     // The property model for the dialog.
-    private PropertyModel mDialogModel;
+    private @Nullable PropertyModel mDialogModel;
 
     // The short name of the app before update.
-    private String mOldAppShortName;
+    private @Nullable String mOldAppShortName;
 
     // The package name for this app.
     private String mPackageName;
@@ -65,6 +69,7 @@
      * @param newIconAdaptive Whether the updated icon is adaptive.
      * @param callback The callback to use to communicate the results.
      */
+    @Initializer
     public void show(
             Context activityContext,
             ModalDialogManager manager,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkPostShareTargetNavigator.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkPostShareTargetNavigator.java
index 0d37d7d..bfb0e55 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkPostShareTargetNavigator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkPostShareTargetNavigator.java
@@ -9,10 +9,12 @@
 import org.jni_zero.JniType;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.browserservices.intents.WebApkShareTarget;
 import org.chromium.content_public.browser.WebContents;
 
 /** Perform navigation for share target with POST request. */
+@NullMarked
 public class WebApkPostShareTargetNavigator {
     public static boolean navigateIfPostShareTarget(
             String url, WebApkShareTarget target, ShareData data, WebContents webContents) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java
index 8ce5933..b697f5e3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java
@@ -8,6 +8,8 @@
 import android.content.Context;
 
 import org.chromium.base.ContextUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.browserservices.metrics.WebApkUmaRecorder;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
@@ -20,9 +22,10 @@
  * Displays error dialog on top of splash screen if there is a network error while loading the start
  * URL.
  */
+@NullMarked
 public class WebApkSplashNetworkErrorObserver extends EmptyTabObserver {
     private final Activity mActivity;
-    private WebApkOfflineDialog mOfflineDialog;
+    private @Nullable WebApkOfflineDialog mOfflineDialog;
 
     private boolean mDidShowNetworkErrorDialog;
 
@@ -98,10 +101,10 @@
     }
 
     /**
-     * Generates network error dialog message for the given error code. Returns null if the
-     * dialog should not be shown.
+     * Generates network error dialog message for the given error code. Returns null if the dialog
+     * should not be shown.
      */
-    private String generateNetworkErrorWebApkDialogMessage(@NetError int errorCode) {
+    private @Nullable String generateNetworkErrorWebApkDialogMessage(@NetError int errorCode) {
         Context context = ContextUtils.getApplicationContext();
         switch (errorCode) {
             case NetError.ERR_INTERNET_DISCONNECTED:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateReportAbuseDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateReportAbuseDialog.java
index 86dfe61..04846274 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateReportAbuseDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateReportAbuseDialog.java
@@ -45,7 +45,7 @@
     private final ModalDialogManager mModalDialogManager;
 
     // The short name of the app the user is uninstalling.
-    private final String mAppShortName;
+    private final @Nullable String mAppShortName;
 
     // The package name for the app the user is uninstalling.
     private final String mAppPackageName;
@@ -63,7 +63,7 @@
             Context activityContext,
             ModalDialogManager manager,
             String appPackageName,
-            String appShortName,
+            @Nullable String appShortName,
             boolean showAbuseCheckbox,
             Callback callback) {
         mActivityContext = activityContext;
diff --git a/chrome/android/javatests/BUILD.gn b/chrome/android/javatests/BUILD.gn
index 47c9c51..c382b15b 100644
--- a/chrome/android/javatests/BUILD.gn
+++ b/chrome/android/javatests/BUILD.gn
@@ -629,6 +629,7 @@
   resources_package = "org.chromium.chrome.test"
 
   sources = [
+    "src/org/chromium/chrome/browser/contextualsearch/ContextualSearchCalloutTest.java",
     "src/org/chromium/chrome/browser/contextualsearch/ContextualSearchCriticalTest.java",
     "src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFakeServer.java",
     "src/org/chromium/chrome/browser/contextualsearch/ContextualSearchHistogramTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java
index ed5a311..1e1cafc 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java
@@ -16,7 +16,6 @@
 
 import android.app.Activity;
 
-import androidx.annotation.Nullable;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.filters.SmallTest;
 
@@ -354,14 +353,11 @@
         String secondUrl =
                 mActivityTestRule.getTestServer().getURL("/chrome/test/data/android/test.html");
         checkFreezingAndAppendingPendingNavigation(
-                this::createSecondFrozenTab, firstUrl, secondUrl, null);
+                this::createSecondFrozenTab, firstUrl, secondUrl, "");
     }
 
     private void checkFreezingAndAppendingPendingNavigation(
-            TestTabCreator tabCreator,
-            String firstUrl,
-            String secondUrl,
-            @Nullable String secondTitle) {
+            TestTabCreator tabCreator, String firstUrl, String secondUrl, String secondTitle) {
         TabObserver observer = Mockito.mock(TabObserver.class);
         Tab bgTab = tabCreator.createTab(firstUrl);
         boolean wasFrozen = bgTab.isFrozen();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchCalloutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchCalloutTest.java
new file mode 100644
index 0000000..07f79e0
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchCalloutTest.java
@@ -0,0 +1,53 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.contextualsearch;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.Batch;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.Features.EnableFeatures;
+import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchCalloutControl;
+import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+
+/** Tests the touch to search callout feature of Contextual Search. */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@EnableFeatures(ChromeFeatureList.TOUCH_TO_SEARCH_CALLOUT)
+@Batch(Batch.PER_CLASS)
+public class ContextualSearchCalloutTest extends ContextualSearchInstrumentationBase {
+
+    @Test
+    @SmallTest
+    @Feature({"ContextualSearch"})
+    public void testCalloutControlOpacity() throws Exception {
+        ContextualSearchPanel panel = (ContextualSearchPanel) mManager.getContextualSearchPanel();
+        // The view gets inflated immediately so this needs to run on the UI thread.
+        ThreadUtils.runOnUiThreadBlocking(() -> panel.getSearchBarControl());
+        ContextualSearchCalloutControl calloutControl =
+                panel.getSearchBarControl().getCalloutControl();
+
+        calloutControl.onUpdateFromPeekToExpand(0.f);
+        Assert.assertEquals(1, calloutControl.getOpacity(), 0.01f);
+
+        calloutControl.onUpdateFromPeekToExpand(0.25f);
+        Assert.assertEquals(0.5f, calloutControl.getOpacity(), 0.01f);
+
+        calloutControl.onUpdateFromPeekToExpand(0.5f);
+        Assert.assertEquals(0, calloutControl.getOpacity(), 0.01f);
+
+        calloutControl.onUpdateFromPeekToExpand(1.f);
+        Assert.assertEquals(0, calloutControl.getOpacity(), 0.01f);
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeTest.java
index 2d1ceb9..ab64c9c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeTest.java
@@ -14,6 +14,7 @@
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
+import static org.chromium.base.test.transit.Triggers.noopTo;
 import static org.chromium.chrome.browser.dom_distiller.ReaderModeManager.DOM_DISTILLER_SCHEME;
 
 import android.app.Activity;
@@ -35,12 +36,12 @@
 
 import org.chromium.base.ApplicationStatus;
 import org.chromium.base.ThreadUtils;
-import org.chromium.base.test.transit.Condition;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Criteria;
 import org.chromium.base.test.util.CriteriaHelper;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Features.DisableFeatures;
+import org.chromium.base.test.util.Features.EnableFeatures;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.app.ChromeActivity;
@@ -61,6 +62,7 @@
 import org.chromium.chrome.test.util.ChromeTabUtils;
 import org.chromium.chrome.test.util.MenuUtils;
 import org.chromium.components.dom_distiller.core.DistilledPagePrefs;
+import org.chromium.components.dom_distiller.core.DomDistillerFeatures;
 import org.chromium.components.dom_distiller.core.DomDistillerService;
 import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
 import org.chromium.components.messages.MessageDispatcher;
@@ -148,7 +150,24 @@
 
     @Test
     @MediumTest
-    @DisabledTest(message = "https://crbug.com/423966068")
+    @EnableFeatures(DomDistillerFeatures.READER_MODE_DISTILL_IN_APP)
+    public void testReaderModeInRegularTab() throws TimeoutException {
+        mDownloadTestRule.loadUrl(mURL);
+
+        Tab originalTab = mDownloadTestRule.getActivity().getActivityTab();
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    originalTab
+                            .getUserDataHost()
+                            .getUserData(ReaderModeManager.USER_DATA_KEY)
+                            .activateReaderMode();
+                });
+        waitForDistillation(PAGE_TITLE, originalTab);
+    }
+
+    @Test
+    @MediumTest
+    @DisabledTest(message = "https://crbug.com/423646543")
     public void testReaderModeInCct_Downloaded() throws TimeoutException {
         mDownloadTestRule.loadUrl(mURL);
         Tab originalTab = mDownloadTestRule.getActivity().getActivityTab();
@@ -334,27 +353,35 @@
         DistilledPagePrefs prefs = getDistilledPagePrefs();
         prefs.addObserver(mTestObserver);
 
-        Condition.waitFor(new TabBackgroundColorCondition(tab, "\"rgb(255, 255, 255)\""));
+        noopTo().waitForConditions(new TabBackgroundColorCondition(tab, "\"rgb(255, 255, 255)\""));
 
         ReaderModePreferencesDialog dialog = ReaderModePreferencesDialog.open(activity);
 
         // Test setting background color
-        dialog.pickColorDark(new TabBackgroundColorCondition(tab, "\"rgb(32, 33, 36)\""));
-        dialog.pickColorSepia(new TabBackgroundColorCondition(tab, "\"rgb(254, 247, 224)\""));
-        dialog.pickColorLight(new TabBackgroundColorCondition(tab, "\"rgb(255, 255, 255)\""));
+        dialog.darkButtonElement
+                .clickTo()
+                .waitForConditions(new TabBackgroundColorCondition(tab, "\"rgb(32, 33, 36)\""));
+        dialog.sepiaButtonElement
+                .clickTo()
+                .waitForConditions(new TabBackgroundColorCondition(tab, "\"rgb(254, 247, 224)\""));
+        dialog.lightButtonElement
+                .clickTo()
+                .waitForConditions(new TabBackgroundColorCondition(tab, "\"rgb(255, 255, 255)\""));
         verify(mTestObserver, times(3)).onChangeTheme(anyInt());
 
         // Test setting font size
-        Condition.waitFor(new TabFontSizeCondition(tab, "\"14px\""));
+        noopTo().waitForConditions(new TabFontSizeCondition(tab, "\"14px\""));
         // Max is 200% font size.
-        dialog.setFontSizeSliderToMax(new TabFontSizeCondition(tab, "\"28px\""));
+        dialog.setFontSizeSliderToMaxTo()
+                .waitForConditions(new TabFontSizeCondition(tab, "\"28px\""));
         // Min is 50% font size.
-        dialog.setFontSizeSliderToMin(new TabFontSizeCondition(tab, "\"7px\""));
+        dialog.setFontSizeSliderToMinTo()
+                .waitForConditions(new TabFontSizeCondition(tab, "\"7px\""));
         verify(mTestObserver, times(2)).onChangeFontScaling(anyFloat());
 
         // TODO(crbug.com/40125950): change font family as well.
 
-        dialog.pressBackToClose();
+        dialog.pressBackTo().dropCarryOn();
     }
 
     /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabArchiverTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabArchiverTest.java
index 26e1c0fe..c5c245f4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabArchiverTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabArchiverTest.java
@@ -65,6 +65,7 @@
 import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
 import org.chromium.components.tab_group_sync.LocalTabGroupId;
 import org.chromium.components.tab_group_sync.SavedTabGroup;
+import org.chromium.components.tab_group_sync.SavedTabGroupTab;
 import org.chromium.components.tab_group_sync.TabGroupSyncService;
 
 import java.util.Arrays;
@@ -312,6 +313,9 @@
         String syncId = "sync_id";
         SavedTabGroup savedTabGroup = new SavedTabGroup();
         savedTabGroup.syncId = syncId;
+        SavedTabGroupTab savedTabGroupTab1 = new SavedTabGroupTab();
+        SavedTabGroupTab savedTabGroupTab2 = new SavedTabGroupTab();
+        savedTabGroup.savedTabs = Arrays.asList(savedTabGroupTab1, savedTabGroupTab2);
         when(mTabGroupSyncService.getGroup(any(LocalTabGroupId.class))).thenReturn(savedTabGroup);
 
         Tab tab =
@@ -335,6 +339,8 @@
         HistogramWatcher watcher =
                 HistogramWatcher.newBuilder()
                         .expectIntRecords("Tabs.TabArchived.TabCount", 1)
+                        .expectIntRecords("TabGroups.TabGroupDeclutter.ArchivedTabGroups", 1)
+                        .expectIntRecords("TabGroups.TabGroupDeclutter.ArchivedTabGroupTabCount", 2)
                         .build();
         runOnUiThreadBlocking(
                 () ->
@@ -389,6 +395,8 @@
         HistogramWatcher watcher =
                 HistogramWatcher.newBuilder()
                         .expectIntRecords("Tabs.TabArchived.TabCount", 1)
+                        .expectNoRecords("TabGroups.TabGroupDeclutter.ArchivedTabGroups")
+                        .expectNoRecords("TabGroups.TabGroupDeclutter.ArchivedTabGroupTabCount")
                         .build();
         // The grouped tab should be skipped.
         runOnUiThreadBlocking(
@@ -407,6 +415,14 @@
     @MediumTest
     @EnableFeatures(ChromeFeatureList.ANDROID_TAB_DECLUTTER_ARCHIVE_TAB_GROUPS)
     public void testGroupedTabsAreArchived() {
+        String syncId = "sync_id";
+        SavedTabGroup savedTabGroup = new SavedTabGroup();
+        savedTabGroup.syncId = syncId;
+        SavedTabGroupTab savedTabGroupTab1 = new SavedTabGroupTab();
+        SavedTabGroupTab savedTabGroupTab2 = new SavedTabGroupTab();
+        savedTabGroup.savedTabs = Arrays.asList(savedTabGroupTab1, savedTabGroupTab2);
+        when(mTabGroupSyncService.getGroup(any(LocalTabGroupId.class))).thenReturn(savedTabGroup);
+
         sActivityTestRule.loadUrlInNewTab(
                 sActivityTestRule.getTestServer().getURL(TEST_PATH), /* incognito= */ false);
 
@@ -440,6 +456,8 @@
         HistogramWatcher watcher =
                 HistogramWatcher.newBuilder()
                         .expectIntRecords("Tabs.TabArchived.TabCount", 1)
+                        .expectIntRecords("TabGroups.TabGroupDeclutter.ArchivedTabGroups", 1)
+                        .expectIntRecords("TabGroups.TabGroupDeclutter.ArchivedTabGroupTabCount", 2)
                         .build();
         // The grouped tab should not be added to the archived tab model and have been closed from
         // the regular tab model.
diff --git a/chrome/android/junit/BUILD.gn b/chrome/android/junit/BUILD.gn
index b584d4cf..6127b3c 100644
--- a/chrome/android/junit/BUILD.gn
+++ b/chrome/android/junit/BUILD.gn
@@ -1112,6 +1112,7 @@
       "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorLayoutUnitTest.java",
       "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMediatorUnitTest.java",
       "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListGroupMenuCoordinatorUnitTest.java",
+      "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighterUnitTest.java",
       "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListItemAnimatorUnitTest.java",
       "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListModelUnitTest.java",
       "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListOnScrollListenerUnitTest.java",
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/OWNERS b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/OWNERS
index db55bc9..147d604 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/OWNERS
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/OWNERS
@@ -1 +1,5 @@
 file://chrome/android/java/src/org/chromium/chrome/browser/autofill/OWNERS
+
+# Payments-relevant files
+per-file AutofillImageFetcher*Test.java=file://components/autofill/core/browser/payments/ANDROID_OWNERS
+per-file AutofillUiUtilsTest.java=file://components/autofill/core/browser/payments/ANDROID_OWNERS
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java
index 95d1355..abcf438 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java
@@ -700,6 +700,20 @@
         assertEquals(View.GONE, mToolbar.findViewById(R.id.menu_dot).getVisibility());
     }
 
+    @Test
+    @EnableFeatures(ChromeFeatureList.CCT_ADAPTIVE_BUTTON)
+    public void testOptionalButton_notEnabledForWidthConstraint() {
+        mToolbar.setToolbarWidthForTesting(48 + 68);
+        mToolbar.updateOptionalButton(getDataForPriceInsightsIconButton());
+
+        // For MTB hidden due to width constraint, |OptionButtonCoordinator| is instantiated
+        // since the button visibility rule needs to be applied after the MTB is added to
+        // the toolbar. If toolbar width changes dynamically later, it lets the optional button
+        // start showing.
+        assertNotNull(mToolbar.getOptionalButtonCoordinatorForTesting());
+        assertEquals(View.VISIBLE, mToolbar.findViewById(R.id.menu_dot).getVisibility());
+    }
+
     private void assertUrlAndTitleVisible(boolean titleVisible, boolean urlVisible) {
         int expectedTitleVisibility = titleVisible ? View.VISIBLE : View.GONE;
         int expectedUrlVisibility = urlVisible ? View.VISIBLE : View.GONE;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java
index 191f059..7db2338 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java
@@ -75,7 +75,7 @@
 
         when(mWindowAndroid.getApplicationBottomInsetSupplier())
                 .thenReturn(mApplicationInsetSupplier);
-        when(mTab.getWindowAndroid()).thenReturn(mWindowAndroid);
+        when(mTab.getWindowAndroidChecked()).thenReturn(mWindowAndroid);
         when(mTab.getWebContents()).thenReturn(mWebContents);
 
         mViewAndroidDelegate = new TabViewAndroidDelegate(mTab, mContentView);
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 70e00c7..ee6313e 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -8820,6 +8820,10 @@
        <message name="IDS_OPENS_MANAGEMENT_PAGE" desc="ARIA (accessibility) role description for a link in the New Tab footer which opens the chrome://management page in the current tab.">
         Learn about how your browser is managed
       </message>
+      <message name="IDS_HIDE_NEW_TAB_FOOTER" desc="Label for option to hide New Tab Footer feature, a UI that may show at the bottom of the New Tab Page.">
+        Hide footer on New Tab page
+      </message>
+
       <!-- Star View menu -->
       <if expr="use_titlecase">
         <message name="IDS_STAR_VIEW_MENU_ADD_BOOKMARK" desc="The item label of the menu triggered from the star icon in the location bar for adding a bookmark.">
diff --git a/chrome/app/generated_resources_grd/IDS_HIDE_NEW_TAB_FOOTER.png.sha1 b/chrome/app/generated_resources_grd/IDS_HIDE_NEW_TAB_FOOTER.png.sha1
new file mode 100644
index 0000000..b210b0af
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_HIDE_NEW_TAB_FOOTER.png.sha1
@@ -0,0 +1 @@
+fe1b15d676a452fbb6bb9ae0e719d64ba546cf63
\ No newline at end of file
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 91acf3f..71c95a6 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -761,11 +761,15 @@
 const FeatureEntry::FeatureParam kReaderModeImprovementsCustomCPATimeout[] = {
     {"custom_cpa_timeout_enabled", "true"},
     {"custom_cpa_timeout", "300"}};
+const FeatureEntry::FeatureParam
+    kReaderModeImprovementsShowReadingModeInRegularTab[] = {
+        {"show_in_regular_tab", "true"}};
 const FeatureEntry::FeatureParam kReaderModeImprovementsAllOn[] = {
     {"trigger_on_mobile_friendly_pages", "true"},
     {"always_on_entry_point", "true"},
     {"custom_cpa_timeout_enabled", "true"},
-    {"custom_cpa_timeout", "300"}};
+    {"custom_cpa_timeout", "300"},
+    {"show_in_regular_tab", "true"}};
 
 const FeatureEntry::FeatureVariation kReaderModeImprovementsChoices[] = {
     {"trigger on mobile-friendly pages",
@@ -775,6 +779,10 @@
      std::size(kReaderModeImprovementsAlwaysOnEntryPoint), nullptr},
     {"increased cpa timeout", kReaderModeImprovementsCustomCPATimeout,
      std::size(kReaderModeImprovementsCustomCPATimeout), nullptr},
+    {"reading mode in regular tab",
+     kReaderModeImprovementsShowReadingModeInRegularTab,
+     std::size(kReaderModeImprovementsShowReadingModeInRegularTab), nullptr},
+
     {"all", kReaderModeImprovementsAllOn,
      std::size(kReaderModeImprovementsAllOn), nullptr}};
 
@@ -5513,6 +5521,10 @@
     {"reader-mode-auto-distill", flag_descriptions::kReaderModeAutoDistillName,
      flag_descriptions::kReaderModeAutoDistillDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(dom_distiller::kReaderModeAutoDistill)},
+    {"reader-mode-distill-in-app",
+     flag_descriptions::kReaderModeDistillInAppName,
+     flag_descriptions::kReaderModeDistillInAppDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(dom_distiller::kReaderModeDistillInApp)},
     {"reader-mode-heuristics", flag_descriptions::kReaderModeHeuristicsName,
      flag_descriptions::kReaderModeHeuristicsDescription, kOsAndroid,
      MULTI_VALUE_TYPE(kReaderModeHeuristicsChoices)},
diff --git a/chrome/browser/actor/BUILD.gn b/chrome/browser/actor/BUILD.gn
index 4be6b795..a1c6ceb 100644
--- a/chrome/browser/actor/BUILD.gn
+++ b/chrome/browser/actor/BUILD.gn
@@ -61,6 +61,8 @@
     "tools/observation_delay_controller.cc",
     "tools/page_tool.cc",
     "tools/page_tool.h",
+    "tools/tab_management_tool.cc",
+    "tools/tab_management_tool.h",
     "tools/tool.cc",
     "tools/tool.h",
     "tools/tool_callbacks.cc",
@@ -79,6 +81,7 @@
     "//chrome/browser/profiles:profile",
     "//chrome/browser/safe_browsing",
     "//chrome/browser/ui:browser_navigator_params_headers",
+    "//chrome/browser/ui/browser_window:browser_window",
     "//chrome/browser/ui/tabs:tabs_public",
     "//chrome/common",
     "//components/safe_browsing:buildflags",
diff --git a/chrome/browser/actor/aggregated_journal_serializer.cc b/chrome/browser/actor/aggregated_journal_serializer.cc
index deeddf3..2e06dbb4 100644
--- a/chrome/browser/actor/aggregated_journal_serializer.cc
+++ b/chrome/browser/actor/aggregated_journal_serializer.cc
@@ -87,7 +87,8 @@
     const AggregatedJournal::Entry& entry) {
   protozero::HeapBuffered<perfetto::protos::pbzero::TracePacket> msg;
   msg->set_trusted_packet_sequence_id(sequence_id_++);
-  msg->set_timestamp(NowInNanoseconds());
+  msg->set_timestamp(
+      (entry.data->timestamp - base::Time::UnixEpoch()).InNanoseconds());
   msg->set_timestamp_clock_id(perfetto::protos::pbzero::BUILTIN_CLOCK_REALTIME);
   auto* track_event = msg->set_track_event();
   perfetto::protos::pbzero::TrackEvent_Type pb_type =
diff --git a/chrome/browser/actor/tools/tab_management_tool.cc b/chrome/browser/actor/tools/tab_management_tool.cc
new file mode 100644
index 0000000..c0ae0ef9
--- /dev/null
+++ b/chrome/browser/actor/tools/tab_management_tool.cc
@@ -0,0 +1,69 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/actor/tools/tab_management_tool.h"
+
+#include "chrome/browser/actor/tools/tool_callbacks.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
+#include "chrome/common/actor.mojom.h"
+#include "chrome/common/actor/action_result.h"
+#include "components/sessions/core/session_id.h"
+#include "content/public/browser/web_contents.h"
+#include "third_party/abseil-cpp/absl/strings/str_format.h"
+#include "ui/base/window_open_disposition.h"
+#include "url/gurl.h"
+#include "url/url_constants.h"
+
+namespace actor {
+
+TabManagementTool::TabManagementTool(
+    int32_t window_id,
+    const optimization_guide::proto::CreateTabAction& action)
+    : window_id_(window_id), action_(action) {}
+
+TabManagementTool::~TabManagementTool() = default;
+
+void TabManagementTool::Validate(ValidateCallback callback) {
+  PostResponseTask(std::move(callback), MakeOkResult());
+}
+
+void TabManagementTool::Invoke(InvokeCallback callback) {
+  BrowserWindowInterface* browser_window_interface =
+      BrowserWindowInterface::FromSessionID(
+          SessionID::FromSerializedValue(window_id_));
+  if (!browser_window_interface) {
+    PostResponseTask(std::move(callback),
+                     MakeResult(mojom::ActionResultCode::kWindowWentAway));
+    return;
+  }
+
+  // TODO(bokan): Is the foreground bit always set? If not, should this return
+  // an error or default to what? For now we default to foreground.
+  WindowOpenDisposition disposition =
+      (!action_.has_foreground() || action_.foreground())
+          ? WindowOpenDisposition::NEW_FOREGROUND_TAB
+          : WindowOpenDisposition::NEW_BACKGROUND_TAB;
+
+  // Open a blank tab.
+  browser_window_interface->OpenGURL(GURL(url::kAboutBlankURL), disposition);
+
+  PostResponseTask(std::move(callback), MakeOkResult());
+}
+
+std::string TabManagementTool::DebugString() const {
+  return absl::StrFormat("TabManagementTool:%s", JournalEvent().c_str());
+}
+
+std::string TabManagementTool::JournalEvent() const {
+  return "CreateTab";
+}
+
+bool TabManagementTool::RequiresFrame() const {
+  // This is to avoid the kFrameWentAway check in
+  // ToolController::ValidationComplete.
+  return false;
+}
+
+}  // namespace actor
diff --git a/chrome/browser/actor/tools/tab_management_tool.h b/chrome/browser/actor/tools/tab_management_tool.h
new file mode 100644
index 0000000..a0c0bd5
--- /dev/null
+++ b/chrome/browser/actor/tools/tab_management_tool.h
@@ -0,0 +1,39 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ACTOR_TOOLS_TAB_MANAGEMENT_TOOL_H_
+#define CHROME_BROWSER_ACTOR_TOOLS_TAB_MANAGEMENT_TOOL_H_
+
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/actor/tools/tool.h"
+#include "components/optimization_guide/proto/features/actions_data.pb.h"
+
+namespace actor {
+
+// A tool to manage the tabs in a browser window, e.g. create, close,
+// activate, etc.
+// TODO(crbug.com/411462297): Implement actions other than create.
+class TabManagementTool : public Tool {
+ public:
+  TabManagementTool(int32_t window_id,
+                    const optimization_guide::proto::CreateTabAction& action);
+  ~TabManagementTool() override;
+
+  // actor::Tool:
+  void Validate(ValidateCallback callback) override;
+  void Invoke(InvokeCallback callback) override;
+  std::string DebugString() const override;
+  std::string JournalEvent() const override;
+  bool RequiresFrame() const override;
+
+ private:
+  int32_t window_id_;
+  const optimization_guide::proto::CreateTabAction action_;
+
+  base::WeakPtrFactory<TabManagementTool> weak_ptr_factory_{this};
+};
+
+}  // namespace actor
+
+#endif  // CHROME_BROWSER_ACTOR_TOOLS_TAB_MANAGEMENT_TOOL_H_
diff --git a/chrome/browser/actor/tools/tool.cc b/chrome/browser/actor/tools/tool.cc
index 78cd62c..75c24c7 100644
--- a/chrome/browser/actor/tools/tool.cc
+++ b/chrome/browser/actor/tools/tool.cc
@@ -15,4 +15,8 @@
   return std::make_unique<ObservationDelayController>(target_frame);
 }
 
+bool Tool::RequiresFrame() const {
+  return true;
+}
+
 }  // namespace actor
diff --git a/chrome/browser/actor/tools/tool.h b/chrome/browser/actor/tools/tool.h
index 6e7f920..57fab05 100644
--- a/chrome/browser/actor/tools/tool.h
+++ b/chrome/browser/actor/tools/tool.h
@@ -54,6 +54,13 @@
   // completed and a new frame presented.
   virtual std::unique_ptr<ObservationDelayController> GetObservationDelayer(
       content::RenderFrameHost& target_frame) const;
+
+  // Whether or not the tool requires a frame to operate on. Note, this also
+  // includes "tab-scoped" tools which are considered to operate on the "main
+  // frame" in the tab.
+  // TODO(crbug.com/411462297): Temporary until we have a better mechanism for
+  // non-frame-scoped tools.
+  virtual bool RequiresFrame() const;
 };
 
 }  // namespace actor
diff --git a/chrome/browser/actor/tools/tool_controller.cc b/chrome/browser/actor/tools/tool_controller.cc
index 49bac126..97933b0 100644
--- a/chrome/browser/actor/tools/tool_controller.cc
+++ b/chrome/browser/actor/tools/tool_controller.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/actor/tools/history_tool.h"
 #include "chrome/browser/actor/tools/navigate_tool.h"
 #include "chrome/browser/actor/tools/page_tool.h"
+#include "chrome/browser/actor/tools/tab_management_tool.h"
 #include "chrome/browser/actor/tools/tool.h"
 #include "chrome/browser/actor/tools/tool_callbacks.h"
 #include "chrome/browser/actor/tools/wait_tool.h"
@@ -84,7 +85,12 @@
     case Action::kWait: {
       return std::make_unique<WaitTool>();
     }
-    case Action::kCreateTab:
+    case Action::kCreateTab: {
+      // Extract the window ID from the action.
+      int32_t window_id = action.create_tab().window_id();
+      return std::make_unique<TabManagementTool>(window_id,
+                                                 action.create_tab());
+    }
     case Action::kCloseTab:
     case Action::kActivateTab:
     case Action::kCreateWindow:
@@ -145,17 +151,17 @@
 
   // TODO(crbug.com/389739308): Ensure the acting tab remains valid (i.e. alive
   // and focused), return error otherwise.
-
-  RenderFrameHost* target_frame =
-      active_state_->weak_document_ptr.AsRenderFrameHostIfValid();
-  if (!target_frame) {
-    CompleteToolRequest(MakeResult(mojom::ActionResultCode::kFrameWentAway));
-    return;
+  if (active_state_->tool->RequiresFrame()) {
+    RenderFrameHost* target_frame =
+        active_state_->weak_document_ptr.AsRenderFrameHostIfValid();
+    if (!target_frame) {
+      CompleteToolRequest(MakeResult(mojom::ActionResultCode::kFrameWentAway));
+      return;
+    }
+    observation_delayer_ =
+        active_state_->tool->GetObservationDelayer(*target_frame);
   }
 
-  observation_delayer_ =
-      active_state_->tool->GetObservationDelayer(*target_frame);
-
   active_state_->tool->Invoke(base::BindOnce(
       &ToolController::DidFinishToolInvoke, weak_ptr_factory_.GetWeakPtr()));
 }
diff --git a/chrome/browser/actor/tools/tools_browsertest.cc b/chrome/browser/actor/tools/tools_browsertest.cc
index 2582f0f..3769064 100644
--- a/chrome/browser/actor/tools/tools_browsertest.cc
+++ b/chrome/browser/actor/tools/tools_browsertest.cc
@@ -71,8 +71,12 @@
 using content::WeakDocumentPtr;
 using content::WebContents;
 using content::WebContentsObserver;
+using optimization_guide::proto::Action;
+using optimization_guide::proto::Actions;
+using optimization_guide::proto::ActionsResult;
 using optimization_guide::proto::BrowserAction;
 using optimization_guide::proto::ClickAction;
+using optimization_guide::proto::CreateTabAction;
 using optimization_guide::proto::NavigateAction;
 using tabs::TabInterface;
 
@@ -142,9 +146,15 @@
     host_resolver()->AddRule("*", "127.0.0.1");
     ASSERT_TRUE(embedded_test_server()->Start());
     ASSERT_TRUE(embedded_https_test_server().Start());
-    auto execution_engine = std::make_unique<ExecutionEngine>(
-        browser()->profile(), browser()->GetActiveTabInterface());
+    auto execution_engine = InitializeExecutionEngine();
+    ExecutionEngine* raw_execution_engine = execution_engine.get();
     actor_task_ = std::make_unique<ActorTask>(std::move(execution_engine));
+    raw_execution_engine->SetOwner(actor_task_.get());
+  }
+
+  virtual std::unique_ptr<ExecutionEngine> InitializeExecutionEngine() {
+    return std::make_unique<ExecutionEngine>(
+        browser()->profile(), browser()->GetActiveTabInterface());
   }
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
@@ -189,11 +199,32 @@
         .ExtractString();
   }
 
+  ActorTask& actor_task() const {
+    CHECK(actor_task_);
+    return *actor_task_.get();
+  }
+
  private:
   ScopedFeatureList scoped_feature_list_;
   std::unique_ptr<ActorTask> actor_task_;
 };
 
+// ActorToolsTest but using the V2 ExecutionEngine API.
+// TODO(crbug.com/411462297): All tests should eventually use the V2 API and the
+// original test harness should be migrated to the new API. New tests should use
+// this harness.
+class ActorToolsTestV2 : public ActorToolsTest {
+ public:
+  ActorToolsTestV2() = default;
+  ~ActorToolsTestV2() override = default;
+  explicit ActorToolsTestV2(const ActorToolsTest&) = delete;
+  ActorToolsTestV2& operator=(const ActorToolsTestV2&) = delete;
+
+  std::unique_ptr<ExecutionEngine> InitializeExecutionEngine() override {
+    return std::make_unique<ExecutionEngine>(browser()->profile());
+  }
+};
+
 // ===============================================
 // Please keep the tests in this file grouped by tool.
 // ===============================================
@@ -1311,7 +1342,7 @@
 class ActorToolsTestDSF2 : public ActorToolsTest {
  public:
   ActorToolsTestDSF2() = default;
-  explicit ActorToolsTestDSF2(const ActorToolsTest&) = delete;
+  explicit ActorToolsTestDSF2(const ActorToolsTestDSF2&) = delete;
   ActorToolsTestDSF2& operator=(const ActorToolsTestDSF2&) = delete;
 
   ~ActorToolsTestDSF2() override = default;
@@ -2180,6 +2211,60 @@
 }
 
 // ===============================================
+// Tab Management Tool
+// ===============================================
+
+IN_PROC_BROWSER_TEST_F(ActorToolsTestV2,
+                       TabManagementTool_CreateForegroundTab) {
+  // Navigate the starting tab so it can be differentiated from the new tab.
+  const GURL start_tab_url =
+      embedded_test_server()->GetURL("/actor/blank.html");
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_tab_url));
+
+  const int initial_tab_count = browser()->tab_strip_model()->GetTabCount();
+
+  Actions actions;
+  actions.set_task_id(actor_task().id().GetUnsafeValue());
+  CreateTabAction* create_tab = actions.add_actions()->mutable_create_tab();
+  create_tab->set_foreground(true);
+  create_tab->set_window_id(browser()->session_id().id());
+
+  TestFuture<ActionsResult> result;
+  execution_engine().Act(actions, result.GetCallback());
+  EXPECT_EQ(result.Get().action_result(),
+            static_cast<int>(mojom::ActionResultCode::kOk));
+
+  EXPECT_EQ(initial_tab_count + 1, browser()->tab_strip_model()->GetTabCount());
+  EXPECT_EQ(GURL("about:blank"),
+            browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
+}
+
+IN_PROC_BROWSER_TEST_F(ActorToolsTestV2,
+                       TabManagementTool_CreateBackgroundTab) {
+  // Navigate the starting tab so it can be differentiated from the new tab.
+  const GURL start_tab_url =
+      embedded_test_server()->GetURL("/actor/blank.html");
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_tab_url));
+
+  const int initial_tab_count = browser()->tab_strip_model()->GetTabCount();
+
+  Actions actions;
+  actions.set_task_id(actor_task().id().GetUnsafeValue());
+  CreateTabAction* create_tab = actions.add_actions()->mutable_create_tab();
+  create_tab->set_foreground(false);
+  create_tab->set_window_id(browser()->session_id().id());
+
+  TestFuture<ActionsResult> result;
+  execution_engine().Act(actions, result.GetCallback());
+  EXPECT_EQ(result.Get().action_result(),
+            static_cast<int>(mojom::ActionResultCode::kOk));
+
+  EXPECT_EQ(initial_tab_count + 1, browser()->tab_strip_model()->GetTabCount());
+  EXPECT_EQ(start_tab_url,
+            browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
+}
+
+// ===============================================
 // Tool-Agnostic Tests
 // ===============================================
 
diff --git a/chrome/browser/autofill/android/OWNERS b/chrome/browser/autofill/android/OWNERS
index 731670ee..682b910 100644
--- a/chrome/browser/autofill/android/OWNERS
+++ b/chrome/browser/autofill/android/OWNERS
@@ -1 +1,5 @@
- file://components/autofill/android/OWNERS
+file://components/autofill/android/OWNERS
+
+# Payments-relevant files
+per-file autofill_image_fetcher_impl.*=file://components/autofill/core/browser/payments/ANDROID_OWNERS
+per-file personal_data_manager_android.*=file://components/autofill/core/browser/payments/ANDROID_OWNERS
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/OWNERS b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/OWNERS
new file mode 100644
index 0000000..1982797
--- /dev/null
+++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/OWNERS
@@ -0,0 +1,4 @@
+# Payments-relevant files
+per-file AutofillImageFetcher*.java=file://components/autofill/core/browser/payments/ANDROID_OWNERS
+per-file AutofillUiUtils.java=file://components/autofill/core/browser/payments/ANDROID_OWNERS
+per-file PersonalDataManager*.java=file://components/autofill/core/browser/payments/ANDROID_OWNERS
diff --git a/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/OWNERS b/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/OWNERS
new file mode 100644
index 0000000..7b25154
--- /dev/null
+++ b/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/OWNERS
@@ -0,0 +1,2 @@
+# Payments-relevant files
+per-file PersonalDataManagerTest.java=file://components/autofill/core/browser/payments/ANDROID_OWNERS
diff --git a/chrome/browser/chromeos/app_mode/kiosk_browser_session.cc b/chrome/browser/chromeos/app_mode/kiosk_browser_session.cc
index 6828ff11..4ff9e6c 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_browser_session.cc
+++ b/chrome/browser/chromeos/app_mode/kiosk_browser_session.cc
@@ -232,6 +232,8 @@
                              PrefRegistrySimple::NO_REGISTRATION_FLAGS);
   registry->RegisterBooleanPref(prefs::kKioskWebAppOfflineEnabled, true);
   registry->RegisterBooleanPref(prefs::kKioskChromeAppsForceAllowed, false);
+  registry->RegisterBooleanPref(prefs::kKioskApplicationLogCollectionEnabled,
+                                false);
 }
 
 void KioskBrowserSession::InitForChromeAppKiosk(const std::string& app_id) {
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/interstitial/NewDownloadTab.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/interstitial/NewDownloadTab.java
index 4d9fbcc..2a60029a 100644
--- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/interstitial/NewDownloadTab.java
+++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/interstitial/NewDownloadTab.java
@@ -150,7 +150,7 @@
         mTab = tab;
         mActivity = activity;
         mCoordinator = coordinator;
-        NewDownloadTabProvider.attach(tab.getWindowAndroid(), this);
+        NewDownloadTabProvider.attach(tab.getWindowAndroidChecked(), this);
     }
 
     private boolean isViewAttached() {
diff --git a/chrome/browser/enterprise/data_controls/reporting_service.cc b/chrome/browser/enterprise/data_controls/reporting_service.cc
index ba0e313..4c45731b 100644
--- a/chrome/browser/enterprise/data_controls/reporting_service.cc
+++ b/chrome/browser/enterprise/data_controls/reporting_service.cc
@@ -86,9 +86,18 @@
 
   using SourceType = enterprise_connectors::ContentMetaData::CopiedTextSource;
 
-  enterprise_connectors::ContentMetaData::CopiedTextSource copied_text_source;
+  SourceType copied_text_source;
   if (!source.browser_context()) {
-    copied_text_source.set_context(SourceType::CLIPBOARD);
+    // This off the record check will also include guest profile sources, but
+    // since there is no way to disambiguate them with a null BrowserContext
+    // INCOGNITO is selected instead of CLIPBOARD to not share the source URL in
+    // such cases.
+    if (source.data_transfer_endpoint() &&
+        source.data_transfer_endpoint()->off_the_record()) {
+      copied_text_source.set_context(SourceType::INCOGNITO);
+    } else {
+      copied_text_source.set_context(SourceType::CLIPBOARD);
+    }
   } else if (Profile::FromBrowserContext(source.browser_context())
                  ->IsIncognitoProfile()) {
     copied_text_source.set_context(SourceType::INCOGNITO);
@@ -101,8 +110,18 @@
   switch (copied_text_source.context()) {
     case SourceType::UNSPECIFIED:
     case SourceType::INCOGNITO:
-    case SourceType::CLIPBOARD:
       break;
+    case SourceType::CLIPBOARD:
+      // If the user does something like closing the browser between the time
+      // they copy and then paste, the DTE might have a URL even though the lack
+      // of browser context will make it impossible to know if the `SourceType`
+      // is `SAME_PROFILE` or `OTHER_PROFILE`.
+      //
+      // In that case, we can be conservative and perform the same check as
+      // `OTHER_PROFILE`. Note that this code path is unreachable in the case of
+      // an incognito source URL as that is handled in the `set_context`
+      // conditions above.
+      [[fallthrough]];
     case SourceType::OTHER_PROFILE:
       // Only add a source URL if the other profile is getting the policy
       // applied at the machine scope, not the user scope.
diff --git a/chrome/browser/enterprise/data_controls/reporting_service_unittest.cc b/chrome/browser/enterprise/data_controls/reporting_service_unittest.cc
index 95c8d0a..415929b7 100644
--- a/chrome/browser/enterprise/data_controls/reporting_service_unittest.cc
+++ b/chrome/browser/enterprise/data_controls/reporting_service_unittest.cc
@@ -19,6 +19,7 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
 
 namespace data_controls {
 
@@ -43,6 +44,11 @@
         managed_profile_);
   }
 
+  void TearDown() override {
+    managed_profile_->GetPrefs()->ClearPref(kDataControlsRulesScopePref);
+    helper_.reset();
+  }
+
   Profile* incognito_managed_profile() {
     return managed_profile_->GetPrimaryOTRProfile(/*create_if_needed=*/true);
   }
@@ -125,6 +131,14 @@
         *guest_contents()->GetPrimaryMainFrame());
   }
 
+  content::ClipboardEndpoint os_clipboard_endpoint(GURL url,
+                                                   bool off_the_record) {
+    return content::ClipboardEndpoint(
+        ui::DataTransferEndpoint(url, ui::DataTransferEndpointOptions{
+                                          .off_the_record = off_the_record,
+                                      }));
+  }
+
  protected:
   content::BrowserTaskEnvironment task_environment_;
   std::unique_ptr<TestingProfileManager> profile_manager_;
@@ -252,6 +266,76 @@
 }
 
 TEST_F(DataControlsReportingServiceTest,
+       PasteInManagedProfile_OSClipboardSource) {
+  Verdict::TriggeredRules triggered_rules = {{0, {"1", "rule_1_name"}}};
+  auto validator = helper_->CreateValidator();
+  validator.ExpectDataControlsSensitiveDataEvent(
+      /*expected_url=*/
+      kChromiumUrl,
+      /*expected_tab_url=*/kChromiumUrl,
+      /*expected_source=*/"CLIPBOARD",
+      /*expected_destination=*/kChromiumUrl,
+      /*expected_mimetypes=*/
+      []() {
+        static std::set<std::string> set = {"text/plain"};
+        return &set;
+      }(),
+      /*expected_trigger=*/"WEB_CONTENT_UPLOAD",
+      /*triggered_rules=*/triggered_rules,
+      /*expected_result=*/"EVENT_RESULT_WARNED",
+      /*expected_profile_username=*/kUserName,
+      /*expected_profile_identifier=*/
+      managed_profile_->GetPath().AsUTF8Unsafe(),
+      /*expected_content_size=*/1234);
+
+  auto* service = ReportingServiceFactory::GetInstance()->GetForBrowserContext(
+      managed_profile_);
+  service->ReportPaste(
+      os_clipboard_endpoint(GURL(kGoogleUrl), /*off_the_record=*/false),
+      managed_endpoint(GURL(kChromiumUrl)),
+      {
+          .size = 1234,
+          .format_type = ui::ClipboardFormatType::PlainTextType(),
+      },
+      Verdict::Warn(triggered_rules));
+}
+
+TEST_F(DataControlsReportingServiceTest,
+       PasteInManagedProfile_IncognitoOSClipboardSource) {
+  Verdict::TriggeredRules triggered_rules = {{0, {"1", "rule_1_name"}}};
+  auto validator = helper_->CreateValidator();
+  validator.ExpectDataControlsSensitiveDataEvent(
+      /*expected_url=*/
+      kChromiumUrl,
+      /*expected_tab_url=*/kChromiumUrl,
+      /*expected_source=*/"INCOGNITO",
+      /*expected_destination=*/kChromiumUrl,
+      /*expected_mimetypes=*/
+      []() {
+        static std::set<std::string> set = {"text/plain"};
+        return &set;
+      }(),
+      /*expected_trigger=*/"WEB_CONTENT_UPLOAD",
+      /*triggered_rules=*/triggered_rules,
+      /*expected_result=*/"EVENT_RESULT_WARNED",
+      /*expected_profile_username=*/kUserName,
+      /*expected_profile_identifier=*/
+      managed_profile_->GetPath().AsUTF8Unsafe(),
+      /*expected_content_size=*/1234);
+
+  auto* service = ReportingServiceFactory::GetInstance()->GetForBrowserContext(
+      managed_profile_);
+  service->ReportPaste(
+      os_clipboard_endpoint(GURL(kGoogleUrl), /*off_the_record=*/true),
+      managed_endpoint(GURL(kChromiumUrl)),
+      {
+          .size = 1234,
+          .format_type = ui::ClipboardFormatType::PlainTextType(),
+      },
+      Verdict::Warn(triggered_rules));
+}
+
+TEST_F(DataControlsReportingServiceTest,
        PasteInManagedProfile_ManagedSourceProfile) {
   Verdict::TriggeredRules triggered_rules = {{0, {"1", "rule_1_name"}}};
   auto validator = helper_->CreateValidator();
@@ -545,6 +629,52 @@
 }
 
 TEST_F(DataControlsReportingServiceTest,
+       GetClipboardSource_OSClipboardOnManagedBrowser) {
+  managed_profile_->GetPrefs()->SetInteger(kDataControlsRulesScopePref,
+                                           policy::POLICY_SCOPE_MACHINE);
+  auto os_clipboard_copy_source = ReportingService::GetClipboardSource(
+      /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl),
+                                       /*off_the_record=*/false),
+      /*destination=*/managed_endpoint(GURL(kChromiumUrl)),
+      kDataControlsRulesScopePref);
+  ASSERT_EQ(
+      os_clipboard_copy_source.context(),
+      enterprise_connectors::ContentMetaData::CopiedTextSource::CLIPBOARD);
+  ASSERT_EQ(
+      ReportingService::GetClipboardSourceString(os_clipboard_copy_source),
+      "https://google.com/");
+  ASSERT_EQ(ReportingService::GetClipboardSourceString(
+                /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl),
+                                                 /*off_the_record=*/false),
+                /*destination=*/managed_endpoint(GURL(kChromiumUrl)),
+                kDataControlsRulesScopePref),
+            "https://google.com/");
+}
+
+TEST_F(DataControlsReportingServiceTest,
+       GetClipboardSource_IncognitoOSClipboardOnManagedBrowser) {
+  managed_profile_->GetPrefs()->SetInteger(kDataControlsRulesScopePref,
+                                           policy::POLICY_SCOPE_MACHINE);
+  auto os_clipboard_copy_source = ReportingService::GetClipboardSource(
+      /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl),
+                                       /*off_the_record=*/true),
+      /*destination=*/managed_endpoint(GURL(kChromiumUrl)),
+      kDataControlsRulesScopePref);
+  ASSERT_EQ(
+      os_clipboard_copy_source.context(),
+      enterprise_connectors::ContentMetaData::CopiedTextSource::INCOGNITO);
+  ASSERT_EQ(
+      ReportingService::GetClipboardSourceString(os_clipboard_copy_source),
+      "INCOGNITO");
+  ASSERT_EQ(ReportingService::GetClipboardSourceString(
+                /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl),
+                                                 /*off_the_record=*/true),
+                /*destination=*/managed_endpoint(GURL(kChromiumUrl)),
+                kDataControlsRulesScopePref),
+            "INCOGNITO");
+}
+
+TEST_F(DataControlsReportingServiceTest,
        GetClipboardSource_UnmanagedProfileOnManagedBrowser) {
   managed_profile_->GetPrefs()->SetInteger(kDataControlsRulesScopePref,
                                            policy::POLICY_SCOPE_MACHINE);
@@ -585,6 +715,52 @@
 }
 
 TEST_F(DataControlsReportingServiceTest,
+       GetClipboardSource_OSClipboardOnUnmanagedBrowser) {
+  managed_profile_->GetPrefs()->SetInteger(kDataControlsRulesScopePref,
+                                           policy::POLICY_SCOPE_USER);
+  auto os_clipboard_copy_source = ReportingService::GetClipboardSource(
+      /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl),
+                                       /*off_the_record=*/false),
+      /*destination=*/managed_endpoint(GURL(kChromiumUrl)),
+      kDataControlsRulesScopePref);
+  ASSERT_EQ(
+      os_clipboard_copy_source.context(),
+      enterprise_connectors::ContentMetaData::CopiedTextSource::CLIPBOARD);
+  ASSERT_EQ(
+      ReportingService::GetClipboardSourceString(os_clipboard_copy_source),
+      "CLIPBOARD");
+  ASSERT_EQ(ReportingService::GetClipboardSourceString(
+                /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl),
+                                                 /*off_the_record=*/false),
+                /*destination=*/managed_endpoint(GURL(kChromiumUrl)),
+                kDataControlsRulesScopePref),
+            "CLIPBOARD");
+}
+
+TEST_F(DataControlsReportingServiceTest,
+       GetClipboardSource_IncognitoOSClipboardOnUnmanagedBrowser) {
+  managed_profile_->GetPrefs()->SetInteger(kDataControlsRulesScopePref,
+                                           policy::POLICY_SCOPE_USER);
+  auto os_clipboard_copy_source = ReportingService::GetClipboardSource(
+      /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl),
+                                       /*off_the_record=*/true),
+      /*destination=*/managed_endpoint(GURL(kChromiumUrl)),
+      kDataControlsRulesScopePref);
+  ASSERT_EQ(
+      os_clipboard_copy_source.context(),
+      enterprise_connectors::ContentMetaData::CopiedTextSource::INCOGNITO);
+  ASSERT_EQ(
+      ReportingService::GetClipboardSourceString(os_clipboard_copy_source),
+      "INCOGNITO");
+  ASSERT_EQ(ReportingService::GetClipboardSourceString(
+                /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl),
+                                                 /*off_the_record=*/true),
+                /*destination=*/managed_endpoint(GURL(kChromiumUrl)),
+                kDataControlsRulesScopePref),
+            "INCOGNITO");
+}
+
+TEST_F(DataControlsReportingServiceTest,
        GetClipboardSource_UnmanagedProfileOnUnmanagedBrowser) {
   managed_profile_->GetPrefs()->SetInteger(kDataControlsRulesScopePref,
                                            policy::POLICY_SCOPE_USER);
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
index 871d242d..82d7af36 100644
--- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
+++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
@@ -1166,21 +1166,27 @@
       async function asyncAssertions() {
         chrome.enterprise.reportingPrivate.onDataMaskingRulesTriggered.addListener(
           rules => {
-            if (rules.length === 0) {
+            if (rules.triggeredRuleInfo.length === 0) {
               chrome.test.fail(
                   'There should not be an event when no rules are triggered');
             } else {
-              chrome.test.assertEq(rules, [
-                {
-                  level:'mask_type',
-                  regex_pattern:'pattern',
-                  triggeredRuleInfo:{
-                    matchedDetectors:[],
-                    ruleId:'rule_id',
-                    ruleName:'rule_name'
-                  },
+              chrome.test.assertEq(rules, {
+                  triggeredRuleInfo: [
+                    {
+                      matchedDetectors:[
+                        {
+                          detectorId: "12345",
+                          displayName: "display_name",
+                          maskType:'mask_type',
+                          pattern:'pattern'
+                        }
+                      ],
+                      ruleId:'rule_id',
+                      ruleName:'rule_name'
+                    }
+                  ],
                   url:'https://foo.bar/'
-                }]);
+                });
               chrome.test.succeed();
             }
           }
@@ -1217,6 +1223,7 @@
   data_masking->set_display_name("display_name");
   data_masking->set_mask_type("mask_type");
   data_masking->set_pattern("pattern");
+  data_masking->set_detector_id("12345");
 
   router->OnUrlFilteringVerdict(GURL(kTestUrl), response);
 
@@ -1229,37 +1236,41 @@
       async function asyncAssertions() {
         chrome.enterprise.reportingPrivate.onDataMaskingRulesTriggered.addListener(
           rules => {
-            chrome.test.assertEq(rules, [
-              {
-                level:'mask_type_1',
-                regex_pattern:'pattern_1',
-                triggeredRuleInfo:{
-                  matchedDetectors:[],
+            chrome.test.assertEq(rules, {
+              triggeredRuleInfo: [
+                {
                   ruleId:'rule_id_1',
-                  ruleName:'rule_name_1'
+                  ruleName:'rule_name_1',
+                  matchedDetectors:[
+                    {
+                      displayName: "display_name_1",
+                      detectorId: "id_1",
+                      maskType:'mask_type_1',
+                      pattern:'pattern_1'
+                    },
+                    {
+                      displayName: "display_name_2",
+                      detectorId: "id_2",
+                      maskType:'mask_type_2',
+                      pattern:'pattern_2'
+                    }
+                  ],
                 },
-                url:'https://foo.bar/'
-              },
-              {
-                level:'mask_type_2',
-                regex_pattern:'pattern_2',
-                triggeredRuleInfo:{
-                  matchedDetectors:[],
-                  ruleId:'rule_id_1',
-                  ruleName:'rule_name_1'
-                },
-                url:'https://foo.bar/'
-              },
-              {
-                level:'mask_type_3',
-                regex_pattern:'pattern_3',
-                triggeredRuleInfo:{
-                  matchedDetectors:[],
+                {
                   ruleId:'rule_id_2',
-                  ruleName:'rule_name_2'
-                },
-                url:'https://foo.bar/'
-              }]);
+                  ruleName:'rule_name_2',
+                  matchedDetectors:[
+                    {
+                      displayName: "display_name_3",
+                      detectorId: "id_3",
+                      maskType:'mask_type_3',
+                      pattern:'pattern_3'
+                    }
+                  ]
+                }
+              ],
+              url:'https://foo.bar/'
+            });
             chrome.test.succeed();
           }
         );
@@ -1286,11 +1297,13 @@
   data_masking_1->set_display_name("display_name_1");
   data_masking_1->set_mask_type("mask_type_1");
   data_masking_1->set_pattern("pattern_1");
+  data_masking_1->set_detector_id("id_1");
 
   auto* data_masking_2 = rule_1->add_data_masking_actions();
   data_masking_2->set_display_name("display_name_2");
   data_masking_2->set_mask_type("mask_type_2");
   data_masking_2->set_pattern("pattern_2");
+  data_masking_2->set_detector_id("id_2");
 
   auto* rule_2 =
       response.add_threat_info()->mutable_matched_url_navigation_rule();
@@ -1301,6 +1314,7 @@
   data_masking_3->set_display_name("display_name_3");
   data_masking_3->set_mask_type("mask_type_3");
   data_masking_3->set_pattern("pattern_3");
+  data_masking_3->set_detector_id("id_3");
 
   EnterpriseReportingPrivateEventRouterFactory::GetInstance()
       ->GetForProfile(profile())
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_event_router.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_event_router.cc
index 0f51ffda..9435fd4 100644
--- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_event_router.cc
+++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_event_router.cc
@@ -14,19 +14,6 @@
 
 namespace extensions {
 
-namespace {
-
-api::enterprise_reporting_private::TriggeredRuleInfo GetTriggeredRuleInfo(
-    const safe_browsing::MatchedUrlNavigationRule& rule) {
-  api::enterprise_reporting_private::TriggeredRuleInfo rule_info;
-  rule_info.rule_id = rule.rule_id();
-  rule_info.rule_name = rule.rule_name();
-
-  return rule_info;
-}
-
-}  // namespace
-
 EnterpriseReportingPrivateEventRouter::EnterpriseReportingPrivateEventRouter(
     content::BrowserContext* context)
     : event_router_(EventRouter::Get(context)) {}
@@ -42,24 +29,35 @@
     return;
   }
 
-  std::vector<api::enterprise_reporting_private::DataMaskingRule> rules_list;
+  api::enterprise_reporting_private::DataMaskingRules data_masking_rules;
+  data_masking_rules.url = url.spec();
+
   for (const auto& threat_info : response.threat_info()) {
     const auto& data_masking_actions =
         threat_info.matched_url_navigation_rule().data_masking_actions();
+    if (data_masking_actions.empty()) {
+      continue;
+    }
+
+    api::enterprise_reporting_private::TriggeredRuleInfo rule_info;
+    rule_info.rule_id = threat_info.matched_url_navigation_rule().rule_id();
+    rule_info.rule_name = threat_info.matched_url_navigation_rule().rule_name();
 
     for (const auto& data_masking_action : data_masking_actions) {
-      api::enterprise_reporting_private::DataMaskingRule rule;
-      rule.level = data_masking_action.mask_type();
-      rule.regex_pattern = data_masking_action.pattern();
-      rule.triggered_rule_info =
-          GetTriggeredRuleInfo(threat_info.matched_url_navigation_rule());
-      rule.url = url.spec();
+      api::enterprise_reporting_private::MatchedDetector detector;
 
-      rules_list.push_back(std::move(rule));
+      detector.detector_id = data_masking_action.detector_id();
+      detector.display_name = data_masking_action.display_name();
+      detector.mask_type = data_masking_action.mask_type();
+      detector.pattern = data_masking_action.pattern();
+
+      rule_info.matched_detectors.push_back(std::move(detector));
     }
+
+    data_masking_rules.triggered_rule_info.push_back(std::move(rule_info));
   }
 
-  if (rules_list.empty()) {
+  if (data_masking_rules.triggered_rule_info.empty()) {
     return;
   }
 
@@ -68,7 +66,7 @@
       api::enterprise_reporting_private::OnDataMaskingRulesTriggered::
           kEventName,
       api::enterprise_reporting_private::OnDataMaskingRulesTriggered::Create(
-          std::move(rules_list))));
+          std::move(data_masking_rules))));
 }
 
 // static
diff --git a/chrome/browser/extensions/component_extension_browsertest.cc b/chrome/browser/extensions/component_extension_browsertest.cc
deleted file mode 100644
index ef284da..0000000
--- a/chrome/browser/extensions/component_extension_browsertest.cc
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/extensions/extension_browsertest.h"
-#include "content/public/test/browser_test.h"
-#include "extensions/test/result_catcher.h"
-
-namespace extensions {
-
-using ComponentExtensionBrowserTest = ExtensionBrowserTest;
-
-// Tests that MojoJS is enabled for component extensions that need it.
-// Note the test currently only runs for ChromeOS because the test extension
-// uses `mojoPrivate` to test and `mojoPrivate` is ChromeOS only.
-IN_PROC_BROWSER_TEST_F(ComponentExtensionBrowserTest, MojoJS) {
-  ResultCatcher result_catcher;
-
-  auto* extension =
-      LoadExtension(test_data_dir_.AppendASCII("service_worker/mojo"),
-                    {.load_as_component = true});
-  ASSERT_TRUE(extension);
-
-  ASSERT_TRUE(result_catcher.GetNextResult());
-}
-
-}  // namespace extensions
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 366b9de..1040e73 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -8357,6 +8357,11 @@
     "expiry_milestone": 145
   },
   {
+    "name": "reader-mode-distill-in-app",
+    "owners": ["wylieb@google.com", "chrome-reader-mode-team@google.com"],
+    "expiry_milestone": 150
+  },
+  {
     "name": "reader-mode-enabled",
     "owners": ["fernandex@google.com", "qpubert@google.com", "bling-flags@google.com"],
     "expiry_milestone": 145
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index bee3758..afcb020 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -5300,6 +5300,9 @@
 const char kReaderModeAutoDistillName[] = "Reader Mode auto distillation";
 const char kReaderModeAutoDistillDescription[] =
     "Automatically distills web contents on every page.";
+const char kReaderModeDistillInAppName[] = "Reader Mode distillation in app";
+const char kReaderModeDistillInAppDescription[] =
+    "Distills the web page in brapp instead of a custom tab.";
 const char kReaderModeHeuristicsName[] = "Reader Mode triggering";
 const char kReaderModeHeuristicsDescription[] =
     "Determines what pages the Reader Mode infobar is shown on.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 6824092..dfef232b 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -3101,6 +3101,8 @@
 extern const char kReadAloudTapToSeekDescription[];
 extern const char kReaderModeAutoDistillName[];
 extern const char kReaderModeAutoDistillDescription[];
+extern const char kReaderModeDistillInAppName[];
+extern const char kReaderModeDistillInAppDescription[];
 extern const char kReaderModeHeuristicsName[];
 extern const char kReaderModeHeuristicsDescription[];
 extern const char kReaderModeHeuristicsMarkup[];
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index 432f1f1..6a9dce6c 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -169,11 +169,11 @@
     public static final String ANDROID_APP_INTEGRATION_MULTI_DATA_SOURCE =
             "AndroidAppIntegrationMultiDataSource";
     public static final String ANDROID_APP_INTEGRATION_V2 = "AndroidAppIntegrationV2";
-    public static final String ANDROID_COMPOSEPLATE = "AndroidComposeplate";
     public static final String ANDROID_APP_INTEGRATION_WITH_FAVICON =
             "AndroidAppIntegrationWithFavicon";
     public static final String ANDROID_BOOKMARK_BAR = "AndroidBookmarkBar";
     public static final String ANDROID_BOTTOM_TOOLBAR = "AndroidBottomToolbar";
+    public static final String ANDROID_COMPOSEPLATE = "AndroidComposeplate";
     public static final String ANDROID_DUMP_ON_SCROLL_WITHOUT_RESOURCE =
             "AndroidDumpOnScrollWithoutResource";
     public static final String ANDROID_ELEGANT_TEXT_HEIGHT = "AndroidElegantTextHeight";
@@ -191,8 +191,6 @@
     public static final String ANDROID_PINNED_TABS = "AndroidPinnedTabs";
     public static final String ANDROID_PROGRESS_BAR_VISUAL_UPDATE =
             "AndroidProgressBarVisualUpdate";
-    public static final String ANDROID_TAB_GROUPS_COLOR_UPDATE_GM3 =
-            "AndroidTabGroupsColorUpdateGM3";
     public static final String ANDROID_SHOW_RESTORE_TABS_PROMO_ON_FRE_BYPASSED_KILL_SWITCH =
             "AndroidShowRestoreTabsPromoOnFREBypassedKillSwitch";
     public static final String ANDROID_SURFACE_COLOR_UPDATE = "AndroidSurfaceColorUpdate";
@@ -211,6 +209,8 @@
             "AndroidTabDeclutterPerformanceImprovements";
     public static final String ANDROID_TAB_DECLUTTER_RESCUE_KILLSWITCH =
             "AndroidTabDeclutterRescueKillswitch";
+    public static final String ANDROID_TAB_GROUPS_COLOR_UPDATE_GM3 =
+            "AndroidTabGroupsColorUpdateGM3";
     public static final String ANDROID_TAB_SKIP_SAVE_TABS_TASK_KILLSWITCH =
             "AndroidTabSkipSaveTabsTaskKillswitch";
     public static final String ANDROID_THEME_MODULE = "AndroidThemeModule";
@@ -366,17 +366,17 @@
     public static final String DEVICE_AUTHENTICATOR_ANDROIDX = "DeviceAuthenticatorAndroidx";
     public static final String DISABLE_INSTANCE_LIMIT = "DisableInstanceLimit";
     public static final String DISCO_FEED_ENDPOINT = "DiscoFeedEndpoint";
+    public static final String DISPLAY_EDGE_TO_EDGE_FULLSCREEN = "DisplayEdgeToEdgeFullscreen";
     public static final String DISPLAY_WILDCARD_CONTENT_SETTINGS =
             "DisplayWildcardInContentSettings";
-    public static final String DISPLAY_EDGE_TO_EDGE_FULLSCREEN = "DisplayEdgeToEdgeFullscreen";
     public static final String DRAW_CUTOUT_EDGE_TO_EDGE = "DrawCutoutEdgeToEdge";
     public static final String DRAW_KEY_NATIVE_EDGE_TO_EDGE = "DrawKeyNativeEdgeToEdge";
     public static final String DYNAMIC_SAFE_AREA_INSETS = "DynamicSafeAreaInsets";
     public static final String EDGE_TO_EDGE_BOTTOM_CHIN = "EdgeToEdgeBottomChin";
     public static final String EDGE_TO_EDGE_DEBUGGING = "EdgeToEdgeDebugging";
+    public static final String EDGE_TO_EDGE_EVERYWHERE = "EdgeToEdgeEverywhere";
     public static final String EDGE_TO_EDGE_MONITOR_CONFIGURATIONS =
             "EdgeToEdgeMonitorConfigurations";
-    public static final String EDGE_TO_EDGE_EVERYWHERE = "EdgeToEdgeEverywhere";
     public static final String EDGE_TO_EDGE_SAFE_AREA_CONSTRAINT = "EdgeToEdgeSafeAreaConstraint";
     public static final String EDGE_TO_EDGE_TABLET = "EdgeToEdgeTablet";
     public static final String EDGE_TO_EDGE_WEB_OPT_IN = "EdgeToEdgeWebOptIn";
@@ -385,12 +385,12 @@
     public static final String EDUCATIONAL_TIP_MODULE = "EducationalTipModule";
     public static final String EMPTY_TAB_LIST_ANIMATION_KILL_SWITCH =
             "EmptyTabListAnimationKillSwitch";
-    public static final String ENABLE_SAVE_PACKAGE_FOR_OFF_THE_RECORD =
-            "EnableSavePackageForOffTheRecord";
     public static final String ENABLE_CLIPBOARD_DATA_CONTROLS_ANDROID =
             "EnableClipboardDataControlsAndroid";
     public static final String ENABLE_DISCOUNT_INFO_API = "EnableDiscountInfoApi";
     public static final String ENABLE_EXCLUSIVE_ACCESS_MANAGER = "EnableExclusiveAccessManager";
+    public static final String ENABLE_SAVE_PACKAGE_FOR_OFF_THE_RECORD =
+            "EnableSavePackageForOffTheRecord";
     public static final String ENABLE_X_AXIS_ACTIVITY_TRANSITION = "EnableXAxisActivityTransition";
     public static final String FEED_CONTAINMENT = "FeedContainment";
     public static final String FEED_FOLLOW_UI_UPDATE = "FeedFollowUiUpdate";
@@ -412,9 +412,9 @@
     public static final String FULLSCREEN_INSETS_API_MIGRATION = "FullscreenInsetsApiMigration";
     public static final String FULLSCREEN_INSETS_API_MIGRATION_ON_AUTOMOTIVE =
             "FullscreenInsetsApiMigrationOnAutomotive";
-    public static final String GRID_TAB_SWITCHER_UPDATE = "GridTabSwitcherUpdate";
     public static final String GRID_TAB_SWITCHER_SURFACE_COLOR_UPDATE =
             "GridTabSwitcherSurfaceColorUpdate";
+    public static final String GRID_TAB_SWITCHER_UPDATE = "GridTabSwitcherUpdate";
     public static final String GROUP_NEW_TAB_WITH_PARENT = "GroupNewTabWithParent";
     public static final String GROUP_SUGGESTION_SERVICE = "GroupSuggestionService";
     public static final String HASH_PREFIX_REAL_TIME_LOOKUPS =
@@ -458,10 +458,10 @@
     public static final String NEW_TAB_PAGE_ANDROID_TRIGGER_FOR_PRERENDER2 =
             "NewTabPageAndroidTriggerForPrerender2";
     public static final String NEW_TAB_PAGE_CUSTOMIZATION = "NewTabPageCustomization";
-    public static final String NEW_TAB_PAGE_CUSTOMIZATION_V2 = "NewTabPageCustomizationV2";
+    public static final String NEW_TAB_PAGE_CUSTOMIZATION_FOR_MVT = "NewTabPageCustomizationForMvt";
     public static final String NEW_TAB_PAGE_CUSTOMIZATION_TOOLBAR_BUTTON =
             "NewTabPageCustomizationToolbarButton";
-    public static final String NEW_TAB_PAGE_CUSTOMIZATION_FOR_MVT = "NewTabPageCustomizationForMvt";
+    public static final String NEW_TAB_PAGE_CUSTOMIZATION_V2 = "NewTabPageCustomizationV2";
     public static final String NOTIFICATION_ONE_TAP_UNSUBSCRIBE = "NotificationOneTapUnsubscribe";
     public static final String NOTIFICATION_PERMISSION_BOTTOM_SHEET =
             "NotificationPermissionBottomSheet";
@@ -591,13 +591,15 @@
             "SwapNewTabAndNewTabInGroupAndroid";
     public static final String SYNC_ENABLE_PASSWORDS_SYNC_ERROR_MESSAGE_ALTERNATIVE =
             "SyncEnablePasswordsSyncErrorMessageAlternative";
+    public static final String TABLET_TAB_STRIP_ANIMATION = "TabletTabStripAnimation";
+    public static final String TAB_ARCHIVAL_DRAG_DROP_ANDROID = "TabArchivalDragDropAndroid";
     public static final String TAB_CLOSURE_METHOD_REFACTOR = "TabClosureMethodRefactor";
+    public static final String TAB_COLLECTION_ANDROID = "TabCollectionAndroid";
+    public static final String TAB_FREEZE_ON_UNDOABLE_CLOSURE_KILL_SWITCH =
+            "TabFreezeOnUndoableClosureKillSwitch";
     public static final String TAB_GROUP_ENTRY_POINTS_ANDROID = "TabGroupEntryPointsAndroid";
     public static final String TAB_GROUP_PARITY_BOTTOM_SHEET_ANDROID =
             "TabGroupParityBottomSheetAndroid";
-    public static final String TABLET_TAB_STRIP_ANIMATION = "TabletTabStripAnimation";
-    public static final String TAB_FREEZE_ON_UNDOABLE_CLOSURE_KILL_SWITCH =
-            "TabFreezeOnUndoableClosureKillSwitch";
     public static final String TAB_STATE_FLAT_BUFFER = "TabStateFlatBuffer";
     public static final String TAB_STRIP_CONTEXT_MENU = "TabStripContextMenuAndroid";
     public static final String TAB_STRIP_DENSITY_CHANGE_ANDROID = "TabStripDensityChangeAndroid";
@@ -607,10 +609,8 @@
     public static final String TAB_STRIP_LAYOUT_OPTIMIZATION = "TabStripLayoutOptimization";
     public static final String TAB_STRIP_TRANSITION_IN_DESKTOP_WINDOW =
             "TabStripTransitionInDesktopWindow";
-    public static final String TAB_ARCHIVAL_DRAG_DROP_ANDROID = "TabArchivalDragDropAndroid";
-    public static final String TAB_COLLECTION_ANDROID = "TabCollectionAndroid";
-    public static final String TAB_SWITCHER_DRAG_DROP_ANDROID = "TabSwitcherDragDropAndroid";
     public static final String TAB_SWITCHER_COLOR_BLEND_ANIMATE = "TabSwitcherColorBlendAnimate";
+    public static final String TAB_SWITCHER_DRAG_DROP_ANDROID = "TabSwitcherDragDropAndroid";
     public static final String TAB_SWITCHER_FOREIGN_FAVICON_SUPPORT =
             "TabSwitcherForeignFaviconSupport";
     public static final String TAB_WINDOW_MANAGER_REPORT_INDICES_MISMATCH =
@@ -633,11 +633,11 @@
     public static final String UNO_PHASE_2_FOLLOW_UP = "UnoPhase2FollowUp";
     public static final String UPDATE_COMPOSTIROR_FOR_SURFACE_CONTROL =
             "UpdateCompositorForSurfaceControl";
+    public static final String USE_ACTIVITY_MANAGER_FOR_TAB_ACTIVATION =
+            "UseActivityManagerForTabActivation";
     public static final String USE_ALTERNATE_HISTORY_SYNC_ILLUSTRATION =
             "UseAlternateHistorySyncIllustration";
     public static final String USE_CHIME_ANDROID_SDK = "UseChimeAndroidSdk";
-    public static final String USE_ACTIVITY_MANAGER_FOR_TAB_ACTIVATION =
-            "UseActivityManagerForTabActivation";
     public static final String USE_INITIAL_NETWORK_STATE_AT_STARTUP =
             "UseInitialNetworkStateAtStartup";
     public static final String USE_LIBUNWINDSTACK_NATIVE_UNWINDER_ANDROID =
@@ -669,13 +669,12 @@
             newCachedFlag(ANDROID_APP_INTEGRATION_MULTI_DATA_SOURCE, false, true);
     public static final CachedFlag sAndroidAppIntegrationV2 =
             newCachedFlag(ANDROID_APP_INTEGRATION_V2, true);
-
-    public static final CachedFlag sAndroidComposeplate =
-            newCachedFlag(ANDROID_COMPOSEPLATE, false, true);
     public static final CachedFlag sAndroidAppIntegrationWithFavicon =
             newCachedFlag(ANDROID_APP_INTEGRATION_WITH_FAVICON, true);
     public static final CachedFlag sAndroidBottomToolbar =
             newCachedFlag(ANDROID_BOTTOM_TOOLBAR, false, true);
+    public static final CachedFlag sAndroidComposeplate =
+            newCachedFlag(ANDROID_COMPOSEPLATE, false, true);
     public static final CachedFlag sAndroidElegantTextHeight =
             newCachedFlag(ANDROID_ELEGANT_TEXT_HEIGHT, true);
     public static final CachedFlag sAndroidMinimalUiLargeScreen =
@@ -697,8 +696,6 @@
             newCachedFlag(ANDROID_WEB_APP_LAUNCH_HANDLER, false, true);
     public static final CachedFlag sAndroidWindowPopupLargeScreen =
             newCachedFlag(ANDROID_WINDOW_POPUP_LARGE_SCREEN, false);
-    public static final CachedFlag sEnableExclusiveAccessManager =
-            newCachedFlag(ENABLE_EXCLUSIVE_ACCESS_MANAGER, false);
     public static final CachedFlag sAppSpecificHistory = newCachedFlag(APP_SPECIFIC_HISTORY, true);
     public static final CachedFlag sAsyncNotificationManager =
             newCachedFlag(ASYNC_NOTIFICATION_MANAGER, false, true);
@@ -733,8 +730,8 @@
                     /* defaultValueInTests= */ true);
     public static final CachedFlag sCctEphemeralMode = newCachedFlag(CCT_EPHEMERAL_MODE, true);
     public static final CachedFlag sCctFixWarmup =
-            newCachedFlag(CCT_FIX_WARMUP, /* defaultValue= */ false,
-                    /* defaultValueInTests= */ true);
+            newCachedFlag(
+                    CCT_FIX_WARMUP, /* defaultValue= */ false, /* defaultValueInTests= */ true);
     public static final CachedFlag sCctFreInSameTask = newCachedFlag(CCT_FRE_IN_SAME_TASK, true);
     public static final CachedFlag sCctGoogleBottomBar =
             newCachedFlag(
@@ -755,6 +752,10 @@
                     /* defaultValueInTests= */ true);
     public static final CachedFlag sCctNestedSecurityIcon =
             newCachedFlag(CCT_NESTED_SECURITY_ICON, true);
+    public static final CachedFlag sCctOpenInBrowserButtonIfAllowedByEmbedder =
+            newCachedFlag(CCT_OPEN_IN_BROWSER_BUTTON_IF_ALLOWED_BY_EMBEDDER, false);
+    public static final CachedFlag sCctOpenInBrowserButtonIfEnabledByEmbedder =
+            newCachedFlag(CCT_OPEN_IN_BROWSER_BUTTON_IF_ENABLED_BY_EMBEDDER, true);
     public static final CachedFlag sCctPredictiveBackGesture =
             newCachedFlag(
                     CCT_PREDICTIVE_BACK_GESTURE,
@@ -765,10 +766,6 @@
                     CCT_REALTIME_ENGAGEMENT_EVENTS_IN_BACKGROUND,
                     /* defaultValue= */ false,
                     /* defaultValueInTests= */ true);
-    public static final CachedFlag sCctOpenInBrowserButtonIfAllowedByEmbedder =
-            newCachedFlag(CCT_OPEN_IN_BROWSER_BUTTON_IF_ALLOWED_BY_EMBEDDER, false);
-    public static final CachedFlag sCctOpenInBrowserButtonIfEnabledByEmbedder =
-            newCachedFlag(CCT_OPEN_IN_BROWSER_BUTTON_IF_ENABLED_BY_EMBEDDER, true);
     public static final CachedFlag sCctResizableForThirdParties =
             newCachedFlag(CCT_RESIZABLE_FOR_THIRD_PARTIES, true);
     public static final CachedFlag sCctRevampedBranding =
@@ -803,13 +800,13 @@
                     EDGE_TO_EDGE_DEBUGGING,
                     /* defaultValue= */ false,
                     /* defaultValueInTests= */ true);
-    public static final CachedFlag sEdgeToEdgeMonitorConfigurations =
-            newCachedFlag(EDGE_TO_EDGE_MONITOR_CONFIGURATIONS, /* defaultValue= */ true);
     public static final CachedFlag sEdgeToEdgeEverywhere =
             newCachedFlag(
                     EDGE_TO_EDGE_EVERYWHERE,
                     /* defaultValue= */ false,
                     /* defaultValueInTests= */ true);
+    public static final CachedFlag sEdgeToEdgeMonitorConfigurations =
+            newCachedFlag(EDGE_TO_EDGE_MONITOR_CONFIGURATIONS, /* defaultValue= */ true);
     public static final CachedFlag sEdgeToEdgeTablet = newCachedFlag(EDGE_TO_EDGE_TABLET, false);
     public static final CachedFlag sEdgeToEdgeWebOptIn =
             newCachedFlag(EDGE_TO_EDGE_WEB_OPT_IN, true);
@@ -819,6 +816,8 @@
             newCachedFlag(EDUCATIONAL_TIP_MODULE, false, true);
     public static final CachedFlag sEnableDiscountInfoApi =
             newCachedFlag(ENABLE_DISCOUNT_INFO_API, false, true);
+    public static final CachedFlag sEnableExclusiveAccessManager =
+            newCachedFlag(ENABLE_EXCLUSIVE_ACCESS_MANAGER, false);
     public static final CachedFlag sEnableXAxisActivityTransition =
             newCachedFlag(ENABLE_X_AXIS_ACTIVITY_TRANSITION, false);
     public static final CachedFlag sFloatingSnackbar = newCachedFlag(FLOATING_SNACKBAR, true);
@@ -878,13 +877,12 @@
             newCachedFlag(NEW_TAB_PAGE_ANDROID_TRIGGER_FOR_PRERENDER2, true);
     public static final CachedFlag sNewTabPageCustomization =
             newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION, false, true);
-    public static final CachedFlag sNewTabPageCustomizationV2 =
-            newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION_V2, false);
-    public static final CachedFlag sNewTabPageCustomizationToolbarButton =
-            newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION_TOOLBAR_BUTTON, false);
-
     public static final CachedFlag sNewTabPageCustomizationForMvt =
             newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION_FOR_MVT, false);
+    public static final CachedFlag sNewTabPageCustomizationToolbarButton =
+            newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION_TOOLBAR_BUTTON, false);
+    public static final CachedFlag sNewTabPageCustomizationV2 =
+            newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION_V2, false);
     public static final CachedFlag sNotificationTrampoline =
             newCachedFlag(NOTIFICATION_TRAMPOLINE, false);
     public static final CachedFlag sOptimizationGuidePushNotifications =
@@ -928,8 +926,6 @@
             newCachedFlag(START_SURFACE_RETURN_TIME, true);
     public static final CachedFlag sTabClosureMethodRefactor =
             newCachedFlag(TAB_CLOSURE_METHOD_REFACTOR, false);
-    public static final CachedFlag sTabletTabStripAnimation =
-            newCachedFlag(TABLET_TAB_STRIP_ANIMATION, false);
     public static final CachedFlag sTabStateFlatBuffer =
             newCachedFlag(
                     TAB_STATE_FLAT_BUFFER,
@@ -949,6 +945,8 @@
                     /* defaultValueInTests= */ true);
     public static final CachedFlag sTabWindowManagerReportIndicesMismatch =
             newCachedFlag(TAB_WINDOW_MANAGER_REPORT_INDICES_MISMATCH, true);
+    public static final CachedFlag sTabletTabStripAnimation =
+            newCachedFlag(TABLET_TAB_STRIP_ANIMATION, false);
     public static final CachedFlag sTestDefaultDisabled =
             newCachedFlag(TEST_DEFAULT_DISABLED, false);
     public static final CachedFlag sTestDefaultEnabled = newCachedFlag(TEST_DEFAULT_ENABLED, true);
@@ -963,10 +961,10 @@
                     /* defaultValue= */ false,
                     /* defaultValueInTests= */ true);
     public static final CachedFlag sTraceBinderIpc = newCachedFlag(TRACE_BINDER_IPC, false);
-    public static final CachedFlag sUseChimeAndroidSdk =
-            newCachedFlag(USE_CHIME_ANDROID_SDK, false);
     public static final CachedFlag sUseActivityManagerForTabActivation =
             newCachedFlag(USE_ACTIVITY_MANAGER_FOR_TAB_ACTIVATION, true);
+    public static final CachedFlag sUseChimeAndroidSdk =
+            newCachedFlag(USE_CHIME_ANDROID_SDK, false);
     public static final CachedFlag sUseInitialNetworkStateAtStartup =
             newCachedFlag(
                     USE_INITIAL_NETWORK_STATE_AT_STARTUP,
@@ -986,8 +984,8 @@
                     sAndroidAppIntegrationMultiDataSource,
                     sAndroidAppIntegrationV2,
                     sAndroidAppIntegrationWithFavicon,
-                    sAndroidComposeplate,
                     sAndroidBottomToolbar,
+                    sAndroidComposeplate,
                     sAndroidElegantTextHeight,
                     sAndroidMinimalUiLargeScreen,
                     sAndroidProgressBarVisualUpdate,
@@ -999,6 +997,7 @@
                     sAndroidWindowPopupLargeScreen,
                     sAppSpecificHistory,
                     sAsyncNotificationManager,
+                    sBackgroundThreadPoolFieldTrial,
                     sBatchTabRestore,
                     sBlockIntentsWhileLocked,
                     sBookmarkPaneAndroid,
@@ -1021,10 +1020,10 @@
                     sCctMinimized,
                     sCctNavigationalPrefetch,
                     sCctNestedSecurityIcon,
-                    sCctPredictiveBackGesture,
-                    sCctRealtimeEngagementEventsInBackground,
                     sCctOpenInBrowserButtonIfAllowedByEmbedder,
                     sCctOpenInBrowserButtonIfEnabledByEmbedder,
+                    sCctPredictiveBackGesture,
+                    sCctRealtimeEngagementEventsInBackground,
                     sCctResizableForThirdParties,
                     sCctRevampedBranding,
                     sCctTabModalDialog,
@@ -1071,9 +1070,9 @@
                     sNavBarColorMatchesTabBackground,
                     sNewTabPageAndroidTriggerForPrerender2,
                     sNewTabPageCustomization,
-                    sNewTabPageCustomizationV2,
-                    sNewTabPageCustomizationToolbarButton,
                     sNewTabPageCustomizationForMvt,
+                    sNewTabPageCustomizationToolbarButton,
+                    sNewTabPageCustomizationV2,
                     sNotificationTrampoline,
                     sOptimizationGuidePushNotifications,
                     sPaintPreviewDemo,
@@ -1093,20 +1092,19 @@
                     sSmallerTabStripTitleLimit,
                     sStartSurfaceReturnTime,
                     sTabClosureMethodRefactor,
-                    sTabletTabStripAnimation,
                     sTabStateFlatBuffer,
                     sTabStripDensityChangeAndroid,
                     sTabStripIncognitoMigration,
                     sTabStripLayoutOptimization,
                     sTabWindowManagerReportIndicesMismatch,
+                    sTabletTabStripAnimation,
                     sTopControlsRefactor,
                     sTouchToSearchCallout,
                     sTraceBinderIpc,
-                    sUseChimeAndroidSdk,
                     sUseActivityManagerForTabActivation,
+                    sUseChimeAndroidSdk,
                     sUseInitialNetworkStateAtStartup,
                     sUseLibunwindstackNativeUnwinderAndroid,
-                    sBackgroundThreadPoolFieldTrial,
                     sWebApkMinShellApkVersion);
 
     public static final List<CachedFlag> sFlagsCachedInMinimalBrowser =
@@ -1124,6 +1122,8 @@
 
     // MutableFlagWithSafeDefault instances.
     /* Alphabetical: */
+    public static final MutableFlagWithSafeDefault sAdaptiveButtonInTopToolbarCustomizationV2 =
+            newMutableFlagWithSafeDefault(ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_V2, false);
     public static final MutableFlagWithSafeDefault sAndroidAppearanceSettings =
             newMutableFlagWithSafeDefault(ANDROID_APPEARANCE_SETTINGS, false);
     public static final MutableFlagWithSafeDefault sAndroidBookmarkBar =
@@ -1204,10 +1204,10 @@
             newMutableFlagWithSafeDefault(SUPPRESS_TOOLBAR_CAPTURES_AT_GESTURE_END, false);
     public static final MutableFlagWithSafeDefault sSwapNewTabAndNewTabInGroupAndroid =
             newMutableFlagWithSafeDefault(SWAP_NEW_TAB_AND_NEW_TAB_IN_GROUP_ANDROID, false);
-    public static final MutableFlagWithSafeDefault sTabCollectionAndroid =
-            newMutableFlagWithSafeDefault(TAB_COLLECTION_ANDROID, false);
     public static final MutableFlagWithSafeDefault sTabArchivalDragDropAndroid =
             newMutableFlagWithSafeDefault(TAB_ARCHIVAL_DRAG_DROP_ANDROID, false);
+    public static final MutableFlagWithSafeDefault sTabCollectionAndroid =
+            newMutableFlagWithSafeDefault(TAB_COLLECTION_ANDROID, false);
     // Default value will only ever be reached in tests.
     public static final MutableFlagWithSafeDefault sTabFreezeOnUndoableClosureKillSwitch =
             newMutableFlagWithSafeDefault(TAB_FREEZE_ON_UNDOABLE_CLOSURE_KILL_SWITCH, true);
@@ -1221,8 +1221,6 @@
             newMutableFlagWithSafeDefault(TAB_SWITCHER_FOREIGN_FAVICON_SUPPORT, true);
     public static final MutableFlagWithSafeDefault sToolbarScrollAblation =
             newMutableFlagWithSafeDefault(TOOLBAR_SCROLL_ABLATION, false);
-    public static final MutableFlagWithSafeDefault sAdaptiveButtonInTopToolbarCustomizationV2 =
-            newMutableFlagWithSafeDefault(ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_V2, false);
 
     // CachedFeatureParam instances.
     /* Alphabetical order by feature name, arbitrary order by param name: */
@@ -1607,9 +1605,8 @@
                     sAndroidAppIntegrationModuleForceCardShow,
                     sAndroidAppIntegrationModuleShowThirdPartyCard,
                     sAndroidAppIntegrationMultiDataSourceHistoryContentTtlHours,
-                    sAndroidAppIntegrationMultiDataSourceSkipSchemaCheck,
                     sAndroidAppIntegrationMultiDataSourceSkipDeviceCheck,
-                    sAndroidComposeplateSkipLocaleCheck,
+                    sAndroidAppIntegrationMultiDataSourceSkipSchemaCheck,
                     sAndroidAppIntegrationV2ContentTtlHours,
                     sAndroidAppIntegrationWithFaviconScheduleDelayTimeMs,
                     sAndroidAppIntegrationWithFaviconSkipDeviceCheck,
@@ -1617,15 +1614,15 @@
                     sAndroidAppIntegrationWithFaviconUseLargeFavicon,
                     sAndroidAppIntegrationWithFaviconZeroStateFaviconNumber,
                     sAndroidBottomToolbarDefaultToTop,
+                    sAndroidComposeplateSkipLocaleCheck,
                     sAndroidThemeModuleForceDependencies,
                     sBackgroundThreadPoolFieldTrialConfig,
                     sBatchTabRestoreBatchSize,
                     sCctAdaptiveButtonContextualOnly,
+                    sCctAdaptiveButtonDefaultVariant,
                     sCctAdaptiveButtonEnableOpenInBrowser,
                     sCctAdaptiveButtonEnableVoice,
-                    sCctAdaptiveButtonDefaultVariant,
                     sCctAuthTabEnableHttpsRedirectsVerificationTimeoutMs,
-                    sClampAutomotiveScalingMaxScalingPercentage,
                     sCctAutoTranslateAllowAllFirstParties,
                     sCctAutoTranslatePackageNamesAllowlist,
                     sCctGoogleBottomBarButtonList,
@@ -1638,6 +1635,7 @@
                     sCctResizableForThirdPartiesAllowlistEntries,
                     sCctResizableForThirdPartiesDefaultPolicy,
                     sCctResizableForThirdPartiesDenylistEntries,
+                    sClampAutomotiveScalingMaxScalingPercentage,
                     sClankStartupLatencyInjectionAmountMs,
                     sCollectAndroidFrameTimelineMetricsJankTrackerDelayedStartMs,
                     sDeleteLegacyTabStateFilesBatchSize,
@@ -1656,8 +1654,8 @@
                     sMagicStackAndroidShowAllModules,
                     sMaliciousApkDownloadCheckTelemetryOnly,
                     sMaxLegacyTabStateFilesDeletedPerSession,
-                    sMostVisitedTilesReselectLaxQuery,
                     sMostVisitedTilesReselectLaxPath,
+                    sMostVisitedTilesReselectLaxQuery,
                     sMostVisitedTilesReselectLaxRef,
                     sMostVisitedTilesReselectLaxSchemeHost,
                     sNavBarColorAnimationDisableBottomChinColorAnimation,
@@ -1680,9 +1678,9 @@
                     sTabStripLayoutOptimizationOnExternalDisplay,
                     sTabStripLayoutOptimizationOnExternalDisplayOemDenylist,
                     sTabWindowManagerReportIndicesMismatchTimeDiffThresholdMs,
+                    sTouchToSearchCalloutTextVariant,
                     sUseChimeAndroidSdkAlwaysRegister,
-                    sWebApkMinShellApkVersionValue,
-                    sTouchToSearchCalloutTextVariant);
+                    sWebApkMinShellApkVersionValue);
 
     // Mutable*ParamWithSafeDefault instances.
     /* Alphabetical: */
@@ -1702,14 +1700,14 @@
             sAndroidNativePagesInNewTabRecentTabsEnabled =
                     sAndroidNativePagesInNewTab.newBooleanParam(
                             "android_native_pages_in_new_tab_recent_tabs_enabled", true);
-    public static final MutableIntParamWithSafeDefault
-            sAndroidTabDeclutterAutoDeleteTimeDeltaHours =
-                    sAndroidTabDeclutterAutoDelete.newIntParam(
-                            "android_tab_declutter_auto_delete_time_delta_hours", 90 * 24);
     public static final MutableBooleanParamWithSafeDefault
             sDisableBottomControlsStackerYOffsetDispatching =
                     sBottomBrowserControlsRefactor.newBooleanParam(
                             "disable_bottom_controls_stacker_y_offset", false);
+    public static final MutableIntParamWithSafeDefault
+            sAndroidTabDeclutterAutoDeleteTimeDeltaHours =
+                    sAndroidTabDeclutterAutoDelete.newIntParam(
+                            "android_tab_declutter_auto_delete_time_delta_hours", 90 * 24);
     public static final MutableIntParamWithSafeDefault sTabSwitcherColorBlendAnimateDurationMs =
             sTabSwitcherColorBlendAnimate.newIntParam("animation_duration_ms", 240);
     public static final MutableIntParamWithSafeDefault sTabSwitcherColorBlendAnimateInterpolator =
diff --git a/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/NativePageBitmapCapturer.java b/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/NativePageBitmapCapturer.java
index dd33b4db..eaa0467 100644
--- a/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/NativePageBitmapCapturer.java
+++ b/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/NativePageBitmapCapturer.java
@@ -66,7 +66,7 @@
             return true;
         }
 
-        UnownedUserDataHost host = tab.getWindowAndroid().getUnownedUserDataHost();
+        UnownedUserDataHost host = tab.getWindowAndroidChecked().getUnownedUserDataHost();
         if (CAPTURER_KEY.retrieveDataFromHost(host) == null) {
             CAPTURER_KEY.attachToHost(host, new NativePageBitmapCapturer());
         }
@@ -87,6 +87,7 @@
                     new CaptureObserver() {
                         @Override
                         public void onCaptureStart(Canvas canvas, @Nullable Rect dirtyRect) {
+                            assumeNonNull(tab.getNativePage());
                             canvas.drawColor(tab.getNativePage().getBackgroundColor());
                             canvas.translate(
                                     0, -tab.getNativePage().getHeightOverlappedWithTopControls());
@@ -138,7 +139,7 @@
             return CaptureNativeViewResult.NULL_WINDOW_ANDROID;
         }
 
-        View view = tab.getView();
+        View view = assumeNonNull(tab.getView());
         // The view is not laid out yet.
         if (view.getWidth() == 0 || view.getHeight() == 0) {
             return CaptureNativeViewResult.VIEW_NOT_LAID_OUT;
@@ -168,7 +169,7 @@
 
     private static Bitmap capture(Tab tab, boolean fullscreen, int topControlsHeight) {
         try (TraceEvent e = TraceEvent.scoped("NativePageBitmapCapturer::capture")) {
-            View view = tab.getView();
+            View view = assumeNonNull(tab.getView());
             // The size of the webpage might be different from that of native pages.
             // The former may also capture the area underneath the navigation bar while
             // the latter sometimes does not. If their sizes don't match, a fallback screenshot will
@@ -184,7 +185,7 @@
                                     .getContainerView()
                                     .getHeight());
 
-            bitmap.eraseColor(tab.getNativePage().getBackgroundColor());
+            bitmap.eraseColor(assumeNonNull(tab.getNativePage()).getBackgroundColor());
 
             Canvas canvas = new Canvas(bitmap);
             float scale = getScale();
diff --git a/chrome/browser/headless/headless_mode_protocol_browsertest.cc b/chrome/browser/headless/headless_mode_protocol_browsertest.cc
index 4e71414..b53ee45e 100644
--- a/chrome/browser/headless/headless_mode_protocol_browsertest.cc
+++ b/chrome/browser/headless/headless_mode_protocol_browsertest.cc
@@ -409,4 +409,30 @@
     " workAreaLeft=10 workAreaRight=90"
     " workAreaTop=20 workAreaBottom=80}")
 
+// TODO(crbug.com/424797525): Fails Mac 13.
+#if BUILDFLAG(IS_MAC)
+#define MAYBE_StartFullscreenSwitch DISABLED_StartFullscreenSwitch
+#else
+#define MAYBE_StartFullscreenSwitch StartFullscreenSwitch
+#endif
+
+HEADLESS_MODE_PROTOCOL_TEST_WITH_COMMAND_LINE_EXTRAS(
+    MAYBE_StartFullscreenSwitch,
+    "sanity/start-fullscreen-switch.js",
+    "--screen-info={1600x1200}"
+    "--start-fullscreen")
+
+// TODO(crbug.com/423951863): Fails on Linux and Mac.
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#define MAYBE_StartFullscreenSwitchScaled DISABLED_StartFullscreenSwitchScaled
+#else
+#define MAYBE_StartFullscreenSwitchScaled StartFullscreenSwitchScaled
+#endif
+
+HEADLESS_MODE_PROTOCOL_TEST_WITH_COMMAND_LINE_EXTRAS(
+    MAYBE_StartFullscreenSwitchScaled,
+    "sanity/start-fullscreen-switch-scaled.js",
+    "--screen-info={3000x2000 devicePixelRatio=2.0}"
+    "--start-fullscreen")
+
 }  // namespace headless
diff --git a/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-expected.txt b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-expected.txt
new file mode 100644
index 0000000..a876202
--- /dev/null
+++ b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-expected.txt
@@ -0,0 +1,2 @@
+Tests --start-fullscreen switch.
+Screen: 1600x1200, Outer: 1600x1200
\ No newline at end of file
diff --git a/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-scaled-expected.txt b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-scaled-expected.txt
new file mode 100644
index 0000000..a4569947
--- /dev/null
+++ b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-scaled-expected.txt
@@ -0,0 +1,2 @@
+Tests --start-fullscreen switch with pixel scaling.
+Screen: 1500x1000, Outer: 1500x1000
\ No newline at end of file
diff --git a/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-scaled.js b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-scaled.js
new file mode 100644
index 0000000..5c040c16
--- /dev/null
+++ b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-scaled.js
@@ -0,0 +1,21 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(async function(testRunner) {
+  const {session} = await testRunner.startBlank(
+      'Tests --start-fullscreen switch with pixel scaling.');
+
+  const expression = `
+      let lines = [];
+      lines.push('Screen: ' + screen.width + 'x' + screen.height);
+      lines.push('Outer: ' + outerWidth + 'x' + outerHeight);
+      lines.join(', ');
+    `;
+
+  const result = await session.evaluate(expression);
+
+  testRunner.log(result);
+
+  testRunner.completeTest();
+})
diff --git a/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch.js b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch.js
new file mode 100644
index 0000000..ee9d18f
--- /dev/null
+++ b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch.js
@@ -0,0 +1,21 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(async function(testRunner) {
+  const {session} =
+      await testRunner.startBlank('Tests --start-fullscreen switch.');
+
+  const expression = `
+      let lines = [];
+      lines.push('Screen: ' + screen.width + 'x' + screen.height);
+      lines.push('Outer: ' + outerWidth + 'x' + outerHeight);
+      lines.join(', ');
+    `;
+
+  const result = await session.evaluate(expression);
+
+  testRunner.log(result);
+
+  testRunner.completeTest();
+})
diff --git a/chrome/browser/optimization_guide/hints_fetcher_browsertest.cc b/chrome/browser/optimization_guide/hints_fetcher_browsertest.cc
index 0ef93ea..ae5e283 100644
--- a/chrome/browser/optimization_guide/hints_fetcher_browsertest.cc
+++ b/chrome/browser/optimization_guide/hints_fetcher_browsertest.cc
@@ -1865,6 +1865,8 @@
       identity_test_env_adaptor_;
 };
 
+// Verify access token is attached during navigation fetching if a
+// personalizable optimization type is requested.
 IN_PROC_BROWSER_TEST_F(ProactivePersonalizationHintsFetcherBrowserTest,
                        OnNavigationFetchesWithAccessToken) {
   SetNetworkConnectionOnline();
@@ -1885,7 +1887,25 @@
   EXPECT_EQ(1u, count_hints_requests_received());
 }
 
-class ProactivePersonalizationHintsWrongOptimizationTypeFetcherBrowserTest
+// Verify access token is attached during active tab fetching if a
+// personalizable optimization type is requested.
+IN_PROC_BROWSER_TEST_F(ProactivePersonalizationHintsFetcherBrowserTest,
+                       ActiveTabFetchesWithAccessToken) {
+  const base::HistogramTester* histogram_tester = GetHistogramTester();
+  EnableSignin();
+  SetExpectedBearerAccessToken("Bearer access_token");
+
+  SetUpComponentUpdateHints(https_url());
+
+  EXPECT_GE(optimization_guide::RetryForHistogramUntilCountReached(
+                histogram_tester,
+                "OptimizationGuide.HintsFetcher.GetHintsRequest.RequestStatus."
+                "BatchUpdateActiveTabs",
+                1),
+            1);
+}
+
+class ProactivePersonalizationNoAllowedTypesHintsFetcherBrowserTest
     : public ProactivePersonalizationHintsFetcherBrowserTest {
  public:
   base::FieldTrialParams GetFieldTrialParams() override {
@@ -1895,8 +1915,10 @@
   }
 };
 
+// Verify access token is not attached during navigation fetching if no
+// personalizable optimization type is requested.
 IN_PROC_BROWSER_TEST_F(
-    ProactivePersonalizationHintsWrongOptimizationTypeFetcherBrowserTest,
+    ProactivePersonalizationNoAllowedTypesHintsFetcherBrowserTest,
     OnNavigationDoesNotFetchAccessToken) {
   SetNetworkConnectionOnline();
   SetResponseType(
@@ -1915,3 +1937,22 @@
   SetExpectedHintsRequestForHostsAndUrls(expected_request);
   EXPECT_EQ(1u, count_hints_requests_received());
 }
+
+// Verify access token is not attached during active tab fetching if no
+// personalizable optimization type is requested.
+IN_PROC_BROWSER_TEST_F(
+    ProactivePersonalizationNoAllowedTypesHintsFetcherBrowserTest,
+    ActiveTabDoesNotFetchWithAccessToken) {
+  const base::HistogramTester* histogram_tester = GetHistogramTester();
+  EnableSignin();
+  SetExpectedBearerAccessToken(std::string());
+
+  SetUpComponentUpdateHints(https_url());
+
+  EXPECT_GE(optimization_guide::RetryForHistogramUntilCountReached(
+                histogram_tester,
+                "OptimizationGuide.HintsFetcher.GetHintsRequest.RequestStatus."
+                "BatchUpdateActiveTabs",
+                1),
+            1);
+}
diff --git a/chrome/browser/os_crypt/app_bound_encryption_provider_win.cc b/chrome/browser/os_crypt/app_bound_encryption_provider_win.cc
index 78acb195..cfe1e8a 100644
--- a/chrome/browser/os_crypt/app_bound_encryption_provider_win.cc
+++ b/chrome/browser/os_crypt/app_bound_encryption_provider_win.cc
@@ -15,6 +15,7 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
@@ -214,10 +215,24 @@
     return;
   }
 
-  // There is no key, so generate a new one, but only on a fully supported
-  // system. In unsupported systems the provider will support decrypt of
-  // existing data (if App-Bound validation still passes) but not encrypt of any
-  // new data.
+  // Clean up bad keys.
+  switch (encrypted_key_data.error()) {
+    case KeyRetrievalStatus::kSuccess:
+      NOTREACHED();
+    case KeyRetrievalStatus::kKeyNotFound:
+      // Not found means nothing to do.
+      break;
+    case KeyRetrievalStatus::kKeyDecodeFailure:
+    case KeyRetrievalStatus::kInvalidKeyHeader:
+    case KeyRetrievalStatus::kKeyTooShort:
+      local_state_->ClearPref(kEncryptedKeyPrefName);
+      break;
+  }
+
+  // There is no key or the key was invalid, so generate a new one, but only on
+  // a fully supported system. In unsupported systems the provider will support
+  // decrypt of existing data (if App-Bound validation still passes) but not
+  // encrypt of any new data.
   if (support_level_ != os_crypt::SupportLevel::kSupported) {
     std::move(callback).Run(
         kAppBoundDataPrefix,
@@ -278,9 +293,19 @@
   }
 
   // Trim off the key prefix.
-  return ReadWriteKeyData(
+  const auto key = ReadWriteKeyData(
       encrypted_key_with_header->cbegin() + sizeof(kCryptAppBoundKeyPrefix),
       encrypted_key_with_header->cend());
+
+  // This is an encrypted random key and encrypting N uniformly random bits
+  // requires >= N bits of ciphertext - follows from Shannon entropy theory and
+  // invertibility constraints. However the exact length is
+  // determined by the elevated service and might vary.
+  if (key.size() < os_crypt_async::Encryptor::Key::kAES256GCMKeySize) {
+    return base::unexpected(KeyRetrievalStatus::kKeyTooShort);
+  }
+
+  return key;
 }
 
 void AppBoundEncryptionProviderWin::StoreKey(
diff --git a/chrome/browser/os_crypt/app_bound_encryption_provider_win.h b/chrome/browser/os_crypt/app_bound_encryption_provider_win.h
index 85eb4e6..216c4609 100644
--- a/chrome/browser/os_crypt/app_bound_encryption_provider_win.h
+++ b/chrome/browser/os_crypt/app_bound_encryption_provider_win.h
@@ -25,8 +25,8 @@
 class PrefRegistrySimple;
 
 namespace os_crypt {
+class AppBoundEncryptionProviderTest;
 FORWARD_DECLARE_TEST(AppBoundEncryptionWinReencryptTest, KeyProviderTest);
-FORWARD_DECLARE_TEST(AppBoundEncryptionProvider, Basic);
 }  // namespace os_crypt
 
 namespace os_crypt_async {
@@ -58,7 +58,7 @@
  private:
   FRIEND_TEST_ALL_PREFIXES(os_crypt::AppBoundEncryptionWinReencryptTest,
                            KeyProviderTest);
-  FRIEND_TEST_ALL_PREFIXES(os_crypt::AppBoundEncryptionProvider, Basic);
+  friend class os_crypt::AppBoundEncryptionProviderTest;
 
   using ReadOnlyKeyData = const std::vector<uint8_t>;
   using ReadWriteKeyData = std::vector<uint8_t>;
@@ -72,7 +72,8 @@
     kKeyNotFound = 1,
     kKeyDecodeFailure = 2,
     kInvalidKeyHeader = 3,
-    kMaxValue = kInvalidKeyHeader,
+    kKeyTooShort = 4,
+    kMaxValue = kKeyTooShort,
   };
 
   // os_crypt_async::KeyProvider interface.
diff --git a/chrome/browser/os_crypt/app_bound_encryption_provider_win_unittest.cc b/chrome/browser/os_crypt/app_bound_encryption_provider_win_unittest.cc
index 1b62b10..74224c1 100644
--- a/chrome/browser/os_crypt/app_bound_encryption_provider_win_unittest.cc
+++ b/chrome/browser/os_crypt/app_bound_encryption_provider_win_unittest.cc
@@ -7,6 +7,7 @@
 #include <string>
 
 #include "base/strings/strcat.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
@@ -91,9 +92,34 @@
   return elevation_service::Elevator::kErrorCouldNotDecryptWithUserContext;
 }
 
+// Chance of a false positive for a 256 bit random key at run_length 10
+// is 2.97e-15
+bool HasRepeatedCharacters(std::string_view data, size_t run_length = 10) {
+  size_t count = 1;
+  for (size_t i = 1; i < data.size(); ++i) {
+    if (data[i] == data[i - 1]) {
+      if (++count >= run_length) {
+        return true;
+      }
+    } else {
+      count = 1;
+    }
+  }
+  return false;
+}
+
 }  // namespace
 
-TEST(AppBoundEncryptionProvider, TestEncryptDecrypt) {
+class AppBoundEncryptionProviderTest : public ::testing::Test {
+ protected:
+  // Access the `GetKey` method via the class so it can be more easily friended.
+  void GetKey(os_crypt_async::KeyProvider& provider,
+              os_crypt_async::KeyProvider::KeyCallback callback) {
+    provider.GetKey(std::move(callback));
+  }
+};
+
+TEST_F(AppBoundEncryptionProviderTest, TestEncryptDecrypt) {
   std::string ciphertext;
   {
     DWORD last_error;
@@ -112,7 +138,66 @@
   }
 }
 
-TEST(AppBoundEncryptionProvider, Basic) {
+TEST_F(AppBoundEncryptionProviderTest, InvalidKeyRegenerated) {
+  base::test::TaskEnvironment env;
+  ::testing::StrictMock<MockAppBoundEncryptionOverrides> mock_app_bound;
+
+  SetOverridesForTesting(&mock_app_bound);
+
+  ON_CALL(mock_app_bound, EncryptAppBoundString)
+      .WillByDefault(::testing::Invoke(DefaultEncrypt));
+  ON_CALL(mock_app_bound, DecryptAppBoundString)
+      .WillByDefault(::testing::Invoke(DefaultDecrypt));
+  ON_CALL(mock_app_bound, GetAppBoundEncryptionSupportLevel)
+      .WillByDefault(::testing::Return(SupportLevel::kSupported));
+
+  const char* kPrefName = "os_crypt.app_bound_encrypted_key";
+
+  TestingPrefServiceSimple prefs;
+  MockPrefChangeCallback pref_observer(&prefs);
+  PrefChangeRegistrar registrar;
+  base::HistogramTester histograms;
+  registrar.Init(&prefs);
+  registrar.Add(kPrefName, pref_observer.GetCallback());
+  os_crypt_async::AppBoundEncryptionProviderWin::RegisterLocalPrefs(
+      prefs.registry());
+
+  // Pref is changed three times. Firstly by the test itself, then secondly to
+  // clear it and finally, to write the new encrypted value.
+  EXPECT_CALL(pref_observer, OnPreferenceChanged(_)).Times(3);
+  // Invalid key means decrypt is never called.
+  EXPECT_CALL(mock_app_bound, DecryptAppBoundString).Times(0);
+  // The new random key will be encrypted.
+  EXPECT_CALL(mock_app_bound, EncryptAppBoundString).Times(1);
+  EXPECT_CALL(mock_app_bound, GetAppBoundEncryptionSupportLevel).Times(1);
+
+  // base64 encoded "APPB" with a zero length key. This simulates the state
+  // users are in for https://crbug.com/415979068.
+  prefs.SetString(kPrefName, "QVBQQg==");
+  {
+    os_crypt_async::AppBoundEncryptionProviderWin provider(&prefs);
+    base::test::TestFuture<
+        const std::string&,
+        base::expected<os_crypt_async::Encryptor::Key,
+                       os_crypt_async::KeyProvider::KeyError>>
+        future;
+    GetKey(provider, future.GetCallback());
+    auto [tag, key] = future.Take();
+    EXPECT_EQ(tag, "v20");
+    EXPECT_TRUE(key.has_value());
+  }
+
+  const auto& pref = prefs.GetString(kPrefName);
+  // Very basic extra tests: Check key length and that it's not a sequence of
+  // nulls or poisoned memory.
+  EXPECT_GT(pref.size(), os_crypt_async::Encryptor::Key::kAES256GCMKeySize);
+  EXPECT_FALSE(HasRepeatedCharacters(pref));
+
+  histograms.ExpectUniqueSample("OSCrypt.AppBoundProvider.KeyRetrieval.Status",
+                                /*KeyRetrievalStatus::kKeyTooShort*/ 4, 1);
+}
+
+TEST_F(AppBoundEncryptionProviderTest, Basic) {
   base::test::ScopedFeatureList feature(
       os_crypt_async::features::kRegenerateKeyForCatastrophicFailures);
 
@@ -156,7 +241,7 @@
         base::expected<os_crypt_async::Encryptor::Key,
                        os_crypt_async::KeyProvider::KeyError>>
         future;
-    provider.GetKey(future.GetCallback());
+    GetKey(provider, future.GetCallback());
     auto [tag, key] = future.Take();
     EXPECT_EQ(tag, "v20");
     ASSERT_TRUE(key.has_value());
@@ -181,7 +266,7 @@
         base::expected<os_crypt_async::Encryptor::Key,
                        os_crypt_async::KeyProvider::KeyError>>
         future;
-    provider.GetKey(future.GetCallback());
+    GetKey(provider, future.GetCallback());
     const auto& [_, key] = future.Get();
     ASSERT_TRUE(key.has_value());
     // The key returned should be the same as before.
@@ -208,7 +293,7 @@
         base::expected<os_crypt_async::Encryptor::Key,
                        os_crypt_async::KeyProvider::KeyError>>
         future;
-    provider.GetKey(future.GetCallback());
+    GetKey(provider, future.GetCallback());
     const auto& [_, key] = future.Get();
 
     // A failure like E_FAIL is temporary, the key is not available but hasn't
@@ -242,7 +327,7 @@
         base::expected<os_crypt_async::Encryptor::Key,
                        os_crypt_async::KeyProvider::KeyError>>
         future;
-    provider.GetKey(future.GetCallback());
+    GetKey(provider, future.GetCallback());
     auto [_, key] = future.Take();
 
     ASSERT_TRUE(key.has_value());
@@ -272,7 +357,7 @@
         base::expected<os_crypt_async::Encryptor::Key,
                        os_crypt_async::KeyProvider::KeyError>>
         future;
-    provider.GetKey(future.GetCallback());
+    GetKey(provider, future.GetCallback());
     const auto& [_, key] = future.Get();
 
     ASSERT_TRUE(key.has_value());
@@ -301,7 +386,7 @@
           base::expected<os_crypt_async::Encryptor::Key,
                          os_crypt_async::KeyProvider::KeyError>>
           future;
-      provider.GetKey(future.GetCallback());
+      GetKey(provider, future.GetCallback());
       const auto& [_, key] = future.Get();
 
       // The failure is now temporary, the key is not available but hasn't been
@@ -331,7 +416,7 @@
         base::expected<os_crypt_async::Encryptor::Key,
                        os_crypt_async::KeyProvider::KeyError>>
         future;
-    provider.GetKey(future.GetCallback());
+    GetKey(provider, future.GetCallback());
     const auto& [_, key] = future.Get();
 
     ASSERT_TRUE(key.has_value());
diff --git a/chrome/browser/password_manager/password_change_browsertest.cc b/chrome/browser/password_manager/password_change_browsertest.cc
index 5656f4a5..bacc08d37 100644
--- a/chrome/browser/password_manager/password_change_browsertest.cc
+++ b/chrome/browser/password_manager/password_change_browsertest.cc
@@ -869,3 +869,31 @@
   EXPECT_EQ(url::Origin::Create(GURL("chrome://password-manager/")),
             url::Origin::Create(tab_strip->GetActiveWebContents()->GetURL()));
 }
+
+IN_PROC_BROWSER_TEST_F(PasswordChangeBrowserTest,
+                       ToastHiddenWhenDialogDisplayed) {
+  SetPrivacyNoticeAcceptedPref();
+  const GURL main_url = WebContents()->GetLastCommittedURL();
+  EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(main_url))
+      .WillOnce(testing::Return(embedded_test_server()->GetURL(
+          "/password/update_form_empty_fields.html")));
+
+  password_change_service()->OfferPasswordChangeUi(main_url, u"test",
+                                                   u"pa$$word", WebContents());
+  PasswordChangeDelegate* delegate =
+      password_change_service()->GetPasswordChangeDelegate(WebContents());
+  delegate->StartPasswordChangeFlow();
+  MockPasswordChangeOutcome(
+      PasswordChangeOutcome::
+          PasswordChangeSubmissionData_PasswordChangeOutcome_UNSUCCESSFUL_OUTCOME);
+
+  ASSERT_TRUE(base::test::RunUntil([delegate]() {
+    return delegate->GetCurrentState() ==
+           PasswordChangeDelegate::State::kPasswordChangeFailed;
+  }));
+
+  PasswordChangeUIController* ui_controller =
+      static_cast<PasswordChangeDelegateImpl*>(delegate)->ui_controller();
+  EXPECT_TRUE(ui_controller->dialog_widget()->IsVisible());
+  EXPECT_FALSE(ui_controller->toast_view());
+}
diff --git a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.cc b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.cc
index 4ec0dc8e..0f1bd76 100644
--- a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.cc
+++ b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.cc
@@ -60,6 +60,11 @@
   // TODO(crbug.com/421608904): add implementation
 }
 
+void AutoPictureInPictureTabModelObserverHelper::WillCloseTab(TabAndroid* tab) {
+  NOTIMPLEMENTED();
+  // TODO(crbug.com/421608904): add implementation
+}
+
 void AutoPictureInPictureTabModelObserverHelper::OnTabModelAdded(
     TabModel* model) {
   NOTIMPLEMENTED();
diff --git a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.h b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.h
index 23a5864..733bfd5 100644
--- a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.h
+++ b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.h
@@ -49,9 +49,11 @@
   // callback if it changed.
   void UpdateIsTabActivated();
 
-  raw_ptr<TabModel> observed_tab_model_ = nullptr;
-  bool is_tab_activated_ = false;
-  bool is_observing_ = false;
+  // TODO(crbug.com/421608904): remove [[maybe_unused]] once implementation is
+  // added.
+  [[maybe_unused]] raw_ptr<TabModel> observed_tab_model_ = nullptr;
+  [[maybe_unused]] bool is_tab_activated_ = false;
+  [[maybe_unused]] bool is_observing_ = false;
 };
 
 #endif  // CHROME_BROWSER_PICTURE_IN_PICTURE_AUTO_PICTURE_IN_PICTURE_TAB_MODEL_OBSERVER_HELPER_H_
diff --git a/chrome/browser/picture_in_picture/test/BUILD.gn b/chrome/browser/picture_in_picture/test/BUILD.gn
new file mode 100644
index 0000000..cc83911
--- /dev/null
+++ b/chrome/browser/picture_in_picture/test/BUILD.gn
@@ -0,0 +1,63 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+import("//third_party/jni_zero/jni_zero.gni")
+
+android_library("javatests") {
+  testonly = true
+  resources_package = "org.chromium.chrome.browser.picture_in_picture"
+
+  sources = [ "android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTest.java" ]
+
+  deps = [
+    ":test_support_java",
+    "//base:base_java_test_support",
+    "//base:callback_java",
+    "//base/test:public_transit_java",
+    "//chrome/android:chrome_java",
+    "//chrome/browser/flags:java",
+    "//chrome/browser/tab:java",
+    "//chrome/browser/tabmodel:java",
+    "//chrome/test/android:chrome_java_integration_test_support",
+    "//chrome/test/android:chrome_java_transit",
+    "//content/public/android:content_java",
+    "//content/public/test/android:content_java_test_support",
+    "//third_party/androidx:androidx_test_monitor_java",
+    "//third_party/androidx:androidx_test_runner_java",
+    "//third_party/junit:junit",
+  ]
+}
+
+android_library("test_support_java") {
+  testonly = true
+  resources_package = "org.chromium.chrome.browser.picture_in_picture"
+
+  sources = [ "android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTestUtils.java" ]
+
+  deps = [
+    "//base:base_java",
+    "//content/public/android:content_java",
+    "//third_party/jni_zero:jni_zero_java",
+  ]
+
+  srcjar_deps = [ ":jni_headers" ]
+}
+
+generate_jni("jni_headers") {
+  testonly = true
+  visibility = [ ":*" ]
+  sources = [ "android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTestUtils.java" ]
+}
+
+static_library("test_support") {
+  testonly = true
+  sources = [ "android/auto_pip_tab_model_observer_test_utils.cc" ]
+  deps = [
+    ":jni_headers",
+    "//base",
+    "//chrome/browser/picture_in_picture:picture_in_picture",
+    "//content/public/browser",
+  ]
+}
diff --git a/chrome/browser/picture_in_picture/test/android/auto_pip_tab_model_observer_test_utils.cc b/chrome/browser/picture_in_picture/test/android/auto_pip_tab_model_observer_test_utils.cc
new file mode 100644
index 0000000..8f82edf5
--- /dev/null
+++ b/chrome/browser/picture_in_picture/test/android/auto_pip_tab_model_observer_test_utils.cc
@@ -0,0 +1,80 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/callback_android.h"
+#include "base/android/jni_android.h"
+#include "base/no_destructor.h"
+#include "chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.h"
+#include "chrome/browser/picture_in_picture/test/jni_headers/AutoPiPTabModelObserverHelperTestUtils_jni.h"
+#include "content/public/browser/web_contents.h"
+
+namespace {
+
+struct TestState {
+  std::unique_ptr<AutoPictureInPictureTabModelObserverHelper> helper;
+  base::android::ScopedJavaGlobalRef<jobject> on_activated_changed_callback;
+};
+
+TestState* g_test_state = nullptr;
+
+void RunActivationChangedCallback(bool is_activated) {
+  if (g_test_state) {
+    base::android::RunBooleanCallbackAndroid(
+        g_test_state->on_activated_changed_callback, is_activated);
+  }
+}
+
+}  // namespace
+
+// ----------------------------------------------------------------------------
+// Native JNI methods
+// ----------------------------------------------------------------------------
+
+namespace picture_in_picture {
+
+// static
+void JNI_AutoPiPTabModelObserverHelperTestUtils_Initialize(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& j_web_contents,
+    const base::android::JavaParamRef<jobject>& j_callback) {
+  // Ensure no previous test state is leaking.
+  CHECK(!g_test_state);
+
+  g_test_state = new TestState();
+  g_test_state->on_activated_changed_callback.Reset(j_callback);
+
+  content::WebContents* web_contents =
+      content::WebContents::FromJavaWebContents(j_web_contents);
+  g_test_state->helper =
+      std::make_unique<AutoPictureInPictureTabModelObserverHelper>(
+          web_contents, base::BindRepeating(&RunActivationChangedCallback));
+}
+
+// static
+void JNI_AutoPiPTabModelObserverHelperTestUtils_StartObserving(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& j_web_contents) {
+  CHECK(g_test_state);
+  g_test_state->helper->StartObserving();
+}
+
+// static
+void JNI_AutoPiPTabModelObserverHelperTestUtils_StopObserving(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& j_web_contents) {
+  CHECK(g_test_state);
+  g_test_state->helper->StopObserving();
+}
+
+// static
+void JNI_AutoPiPTabModelObserverHelperTestUtils_Destroy(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& j_web_contents) {
+  if (g_test_state) {
+    delete g_test_state;
+    g_test_state = nullptr;
+  }
+}
+
+}  // namespace picture_in_picture
diff --git a/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTest.java b/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTest.java
new file mode 100644
index 0000000..3ab9c3eb
--- /dev/null
+++ b/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTest.java
@@ -0,0 +1,116 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.picture_in_picture;
+
+import static org.junit.Assert.assertEquals;
+
+import androidx.test.filters.MediumTest;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.Batch;
+import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.DisabledTest;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.transit.AutoResetCtaTransitTestRule;
+import org.chromium.chrome.test.transit.ChromeTransitTestRules;
+import org.chromium.chrome.test.transit.page.PageStation;
+import org.chromium.chrome.test.transit.page.WebPageStation;
+import org.chromium.content_public.browser.WebContents;
+
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Instrumentation test for the C++ AutoPictureInPictureTabModelObserverHelper logic. This test uses
+ * a JNI bridge to verify the behavior of the C++ class.
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@Batch(Batch.PER_CLASS)
+public class AutoPiPTabModelObserverHelperTest {
+    @Rule
+    public final AutoResetCtaTransitTestRule mActivityTestRule =
+            ChromeTransitTestRules.fastAutoResetCtaActivityRule();
+
+    private WebPageStation mPage;
+    private WebContents mObservedWebContents;
+    private final CallbackHelper mOnActivationChangedCallbackHelper = new CallbackHelper();
+
+    @Before
+    public void setUp() {
+        mPage = mActivityTestRule.startOnBlankPage();
+        mObservedWebContents = mPage.webContentsElement.get();
+
+        // Initialize the C++ test utilities for the WebContents under observation,
+        // passing it the callback to be invoked from C++.
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    AutoPiPTabModelObserverHelperTestUtils.initialize(
+                            mObservedWebContents,
+                            (isActivated) -> {
+                                mOnActivationChangedCallbackHelper.notifyCalled();
+                            });
+                });
+    }
+
+    @After
+    public void tearDown() {
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> AutoPiPTabModelObserverHelperTestUtils.destroy(mObservedWebContents));
+    }
+
+    @Test
+    @MediumTest
+    @DisabledTest(message = "Implementation not yet landed. See crbug.com/421608904")
+    public void testTriggersOnTabActivationChanged() throws TimeoutException {
+        int callCount = mOnActivationChangedCallbackHelper.getCallCount();
+
+        // Start observing.
+        AutoPiPTabModelObserverHelperTestUtils.startObserving(mObservedWebContents);
+
+        // Open and switch to a new tab. This should deactivate our observed tab.
+        PageStation page = mPage.openNewTabFast();
+        mOnActivationChangedCallbackHelper.waitForCallback(callCount++);
+
+        // Switch back to the original tab. This should activate it.
+        page.openRegularTabSwitcher().selectTabAtIndex(0, WebPageStation.newBuilder());
+        mOnActivationChangedCallbackHelper.waitForCallback(callCount++);
+    }
+
+    @Test
+    @MediumTest
+    @DisabledTest(message = "Implementation not yet landed. See crbug.com/421608904")
+    public void testStopAndStartObserving() throws TimeoutException {
+        int callCount = mOnActivationChangedCallbackHelper.getCallCount();
+
+        // Start observing, then immediately stop.
+        AutoPiPTabModelObserverHelperTestUtils.startObserving(mObservedWebContents);
+        AutoPiPTabModelObserverHelperTestUtils.stopObserving(mObservedWebContents);
+
+        // Open a new tab. Since we are not observing, no additional callback
+        // should fire.
+        PageStation page = mPage.openNewTabFast();
+        assertEquals(
+                "Callback should not have fired.",
+                callCount,
+                mOnActivationChangedCallbackHelper.getCallCount());
+
+        // Start observing again.
+        AutoPiPTabModelObserverHelperTestUtils.startObserving(mObservedWebContents);
+
+        // Switch back to the original tab. It should now trigger the callback.
+        page.openRegularTabSwitcher().selectTabAtIndex(0, WebPageStation.newBuilder());
+        mOnActivationChangedCallbackHelper.waitForCallback(callCount++);
+    }
+
+    // TODO(crbug.com/421608904): add additional multi window tests.
+}
diff --git a/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTestUtils.java b/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTestUtils.java
new file mode 100644
index 0000000..b90e1be
--- /dev/null
+++ b/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTestUtils.java
@@ -0,0 +1,51 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.picture_in_picture;
+
+import org.jni_zero.JNINamespace;
+import org.jni_zero.NativeMethods;
+
+import org.chromium.base.Callback;
+import org.chromium.base.ThreadUtils;
+import org.chromium.content_public.browser.WebContents;
+
+/** Utility class for testing AutoPictureInPictureTabModelObserverHelper C++ logic via JNI. */
+@JNINamespace("picture_in_picture")
+public class AutoPiPTabModelObserverHelperTestUtils {
+    private AutoPiPTabModelObserverHelperTestUtils() {}
+
+    public static void initialize(WebContents webContents, Callback<Boolean> callback) {
+        ThreadUtils.runOnUiThreadBlocking(
+                () ->
+                        AutoPiPTabModelObserverHelperTestUtilsJni.get()
+                                .initialize(webContents, callback));
+    }
+
+    public static void startObserving(WebContents webContents) {
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> AutoPiPTabModelObserverHelperTestUtilsJni.get().startObserving(webContents));
+    }
+
+    public static void stopObserving(WebContents webContents) {
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> AutoPiPTabModelObserverHelperTestUtilsJni.get().stopObserving(webContents));
+    }
+
+    public static void destroy(WebContents webContents) {
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> AutoPiPTabModelObserverHelperTestUtilsJni.get().destroy(webContents));
+    }
+
+    @NativeMethods
+    interface Natives {
+        void initialize(WebContents webContents, Callback<Boolean> onActivationChanged);
+
+        void startObserving(WebContents webContents);
+
+        void stopObserving(WebContents webContents);
+
+        void destroy(WebContents webContents);
+    }
+}
diff --git a/chrome/browser/platform_experience/BUILD.gn b/chrome/browser/platform_experience/BUILD.gn
new file mode 100644
index 0000000..1ed2743b
--- /dev/null
+++ b/chrome/browser/platform_experience/BUILD.gn
@@ -0,0 +1,11 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/chrome_build.gni")
+
+source_set("features") {
+  public = [ "features.h" ]
+  sources = [ "features.cc" ]
+  public_deps = [ "//base" ]
+}
diff --git a/chrome/browser/platform_experience/features.cc b/chrome/browser/platform_experience/features.cc
new file mode 100644
index 0000000..ebd842d
--- /dev/null
+++ b/chrome/browser/platform_experience/features.cc
@@ -0,0 +1,19 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/platform_experience/features.h"
+
+#include "base/feature_list.h"
+
+namespace platform_experience::features {
+
+BASE_FEATURE(kDisablePEHNotifications,
+             "DisablePEHNotifications",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
+BASE_FEATURE(kShouldUseSpecificPEHNotificationText,
+             "ShouldUseSpecificPEHNotificationText",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
+}  // namespace platform_experience::features
diff --git a/chrome/browser/platform_experience/features.h b/chrome/browser/platform_experience/features.h
new file mode 100644
index 0000000..e15010b98
--- /dev/null
+++ b/chrome/browser/platform_experience/features.h
@@ -0,0 +1,29 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_PLATFORM_EXPERIENCE_FEATURES_H_
+#define CHROME_BROWSER_PLATFORM_EXPERIENCE_FEATURES_H_
+
+#include "base/feature_list.h"
+#include "base/metrics/field_trial_params.h"
+
+namespace platform_experience::features {
+
+// Forces the PEH to never show notifications.
+BASE_DECLARE_FEATURE(kDisablePEHNotifications);
+
+// By default, a random notification text is chosen when a notification shows.
+// This feature allows for a specific notification text to be used.
+// kUseNotificationTextIndex specifies which text will be used if a notification
+// will show.
+BASE_DECLARE_FEATURE(kShouldUseSpecificPEHNotificationText);
+
+// Defines which notification text will be used if
+// kShouldUseSpecificNotificationText is enabled.
+inline constexpr base::FeatureParam<int> kUseNotificationTextIndex{
+    &kShouldUseSpecificPEHNotificationText, "UseNotificationTextIndex", 0};
+
+}  // namespace platform_experience::features
+
+#endif  // CHROME_BROWSER_PLATFORM_EXPERIENCE_FEATURES_H_
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 39dd668..2d98d69 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -2091,6 +2091,9 @@
   { key::kDeviceAttributesAllowedForOrigins,
     prefs::kDeviceAttributesAllowedForOrigins,
     base::Value::Type::LIST },
+  { key::kKioskApplicationLogCollectionEnabled,
+    prefs::kKioskApplicationLogCollectionEnabled,
+    base::Value::Type::BOOLEAN},
   { key::kKioskBrowserPermissionsAllowedForOrigins,
     prefs::kKioskBrowserPermissionsAllowedForOrigins,
     base::Value::Type::LIST },
diff --git a/chrome/browser/preloading/prerender/prerender_manager.cc b/chrome/browser/preloading/prerender/prerender_manager.cc
index e220c2ca..444b55a 100644
--- a/chrome/browser/preloading/prerender/prerender_manager.cc
+++ b/chrome/browser/preloading/prerender/prerender_manager.cc
@@ -311,9 +311,14 @@
   return nullptr;
 }
 
-bool PrerenderManager::StartPrewarmSearchResult() {
-  CHECK(base::FeatureList::IsEnabled(features::kPrewarm));
-  const GURL prewarm_url(features::kPrewarmUrl.Get());
+bool PrerenderManager::MaybeStartPrewarmSearchResult() {
+  if (search_prewarm_handle_ ||
+      !base::FeatureList::IsEnabled(features::kPrewarm)) {
+    return false;
+  }
+
+  const GURL prewarm_url =
+      prewarm_url_for_testing_.value_or(GURL(features::kPrewarmUrl.Get()));
   CHECK(prewarm_url.is_valid());
 
   auto* preloading_data =
@@ -353,6 +358,14 @@
   return search_prewarm_handle_ != nullptr;
 }
 
+void PrerenderManager::StopPrewarmSearchResultForTesting() {
+  search_prewarm_handle_.reset();
+}
+
+void PrerenderManager::SetPrewarmUrlForTesting(const GURL& url) {
+  prewarm_url_for_testing_ = url;
+}
+
 void PrerenderManager::StartPrerenderSearchResult(
     const GURL& canonical_search_url,
     const GURL& prerendering_url,
diff --git a/chrome/browser/preloading/prerender/prerender_manager.h b/chrome/browser/preloading/prerender/prerender_manager.h
index a92e371..37d327c 100644
--- a/chrome/browser/preloading/prerender/prerender_manager.h
+++ b/chrome/browser/preloading/prerender/prerender_manager.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_PRELOADING_PRERENDER_PRERENDER_MANAGER_H_
 #define CHROME_BROWSER_PRELOADING_PRERENDER_PRERENDER_MANAGER_H_
 
+#include <optional>
 #include <string>
 
 #include "chrome/browser/preloading/preloading_features.h"
@@ -62,11 +63,17 @@
   void DidFinishNavigation(
       content::NavigationHandle* navigation_handle) override;
 
-  // Calling this method will start prerendering a prewarm page. Prerendered
-  // page will close at the next call. Returns true if a new prerender is
-  // started.
+  // Maybe start prerendering a prewarm page if we haven't prewarm it yet for
+  // the underlying WebContents. Returns true if a new prerender is started.
   // TODO(https://crbug.com/423465927): Decide a better timing to close.
-  bool StartPrewarmSearchResult();
+  bool MaybeStartPrewarmSearchResult();
+
+  // Deletes the existing prewarm page to start another one for testing.
+  void StopPrewarmSearchResultForTesting();
+
+  // Sets the prewarm page URL for testing as it's difficult to set the testing
+  // server's URL as a Finch parameter in the tests.
+  void SetPrewarmUrlForTesting(const GURL& url);
 
   // Calling this method will lead to the cancellation of the previous prerender
   // if the given `canonical_search_url` differs from the ongoing one's.
@@ -133,6 +140,7 @@
       base::WeakPtr<content::PreloadingAttempt> attempt);
 
   std::unique_ptr<content::PrerenderHandle> search_prewarm_handle_;
+  std::optional<GURL> prewarm_url_for_testing_;
 
   // Stores the prerender which serves for search results. It is responsible for
   // tracking a started search prerender, and informing `SearchPrefetchService`
diff --git a/chrome/browser/preloading/prerender/prerender_manager_unittest.cc b/chrome/browser/preloading/prerender/prerender_manager_unittest.cc
index 96615012..f0646a9 100644
--- a/chrome/browser/preloading/prerender/prerender_manager_unittest.cc
+++ b/chrome/browser/preloading/prerender/prerender_manager_unittest.cc
@@ -341,7 +341,7 @@
   // Prerender the prewarm page.
   content::test::PrerenderHostRegistryObserver registry_observer(
       *GetActiveWebContents());
-  ASSERT_TRUE(prerender_manager()->StartPrewarmSearchResult());
+  ASSERT_TRUE(prerender_manager()->MaybeStartPrewarmSearchResult());
   registry_observer.WaitForTrigger(prewarm_url);
 
   // Prewarm page should not be found here as it's matcher was set as not
diff --git a/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc b/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc
index 02654d9..026da75 100644
--- a/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc
+++ b/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc
@@ -198,11 +198,11 @@
     predictor_observer.WaitForInitialization();
   }
 
- private:
   OmniboxView* omnibox() {
     return browser()->window()->GetLocationBar()->GetOmniboxView();
   }
 
+ private:
   void FocusOmnibox() {
     // If the omnibox already has focus, just notify OmniboxTabHelper.
     if (omnibox()->model()->has_focus()) {
@@ -1010,4 +1010,69 @@
   EXPECT_FALSE(nav_event->initiator_outermost_main_frame_id);
 }
 
+class PrewarmOmniboxUIBrowserTest : public PrerenderOmniboxUIBrowserTest {
+ public:
+  PrewarmOmniboxUIBrowserTest() {
+    scoped_feature_list_.InitAndEnableFeatureWithParameters(
+        features::kPrewarm,
+        {{"url", "https://search.example.com/prewarm.html"}});
+  }
+  ~PrewarmOmniboxUIBrowserTest() override = default;
+
+  void StopPrewarm() {
+    auto* manager = PrerenderManager::FromWebContents(GetActiveWebContents());
+    if (manager) {
+      manager->StopPrewarmSearchResultForTesting();
+    }
+  }
+
+  void InitiatePrewarm() {
+    OmniboxController* omnibox_controller = omnibox()->controller();
+    ASSERT_TRUE(omnibox_controller);
+    omnibox_controller->StartZeroSuggestPrefetch();
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+// Basic scenario for the interactive_ui_tests to trigger the prewarm feature
+// from the omnibox.
+IN_PROC_BROWSER_TEST_F(PrewarmOmniboxUIBrowserTest,
+                       StartPrewarmOnZeroSuggestPrefetch) {
+  // Add a new tab to make it possible to close the tab to flush metrics.
+  ASSERT_EQ(0, browser()->tab_strip_model()->active_index());
+  ASSERT_TRUE(AddTabAtIndex(0, embedded_test_server()->GetURL("/empty.html"),
+                            ui::PAGE_TRANSITION_TYPED));
+
+  // Prewarm might be triggered before the test starts. Stop it to avoid
+  // affecting the test.
+  StopPrewarm();
+
+  // Start monitoring the histogram here.
+  base::HistogramTester histogram_tester;
+
+  // Override the prewarm URL here as we cannot provide this valid URL when
+  // we initialize the ScopedFeatureList.
+  const GURL prewarm_url(embedded_test_server()->GetURL("/prewarm.html"));
+  PrerenderManager::GetOrCreateForWebContents(GetActiveWebContents())
+      ->SetPrewarmUrlForTesting(prewarm_url);
+
+  // Trigger prewarm from the Omnibox.
+  content::test::PrerenderHostRegistryObserver registry_observer(
+      *GetActiveWebContents());
+  InitiatePrewarm();
+  registry_observer.WaitForTrigger(prewarm_url);
+
+  // Close the WebContents that hosted the prewarm page to flush metrics.
+  browser()->tab_strip_model()->CloseWebContentsAt(0,
+                                                   TabCloseTypes::CLOSE_NONE);
+
+  // Check metrics that should be recorded for the prewarmed page.
+  histogram_tester.ExpectUniqueSample(
+      "Prerender.Experimental.PrerenderHostFinalStatus.Embedder_"
+      "PrewarmDefaultSearchEngine",
+      /*kPrimaryMainFrameRendererProcessKilled*/ 57, 1);
+}
+
 }  // namespace
diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc
index 27da743..d7fb57e 100644
--- a/chrome/browser/printing/print_view_manager.cc
+++ b/chrome/browser/printing/print_view_manager.cc
@@ -11,7 +11,6 @@
 
 #include "base/check.h"
 #include "base/containers/contains.h"
-#include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/no_destructor.h"
 #include "base/observer_list.h"
@@ -333,8 +332,7 @@
     return;
   }
 
-  if (base::FeatureList::IsEnabled(kCheckPrintRfhIsActive) &&
-      !rfh->IsActive()) {
+  if (!rfh->IsActive()) {
     // Only active RFHs should show UI elements.
     std::move(callback).Run();
     return;
diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc
index 891607e..57d0990 100644
--- a/chrome/browser/printing/print_view_manager_base.cc
+++ b/chrome/browser/printing/print_view_manager_base.cc
@@ -171,10 +171,6 @@
 
 }  // namespace
 
-BASE_FEATURE(kCheckPrintRfhIsActive,
-             "CheckPrintRfhIsActive",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 PrintViewManagerBase::PrintViewManagerBase(content::WebContents* web_contents)
     : PrintManager(web_contents),
       queue_(g_browser_process->print_job_manager()->queue()) {
@@ -636,8 +632,7 @@
   }
 
   content::RenderFrameHost* render_frame_host = GetCurrentTargetFrame();
-  if (base::FeatureList::IsEnabled(kCheckPrintRfhIsActive) &&
-      !render_frame_host->IsActive()) {
+  if (!render_frame_host->IsActive()) {
     // Only active RFHs should show UI elements.
     GetDefaultPrintSettingsReply(std::move(callback), nullptr);
     return;
diff --git a/chrome/browser/printing/print_view_manager_base.h b/chrome/browser/printing/print_view_manager_base.h
index 6a2631de..824d6d8a 100644
--- a/chrome/browser/printing/print_view_manager_base.h
+++ b/chrome/browser/printing/print_view_manager_base.h
@@ -8,7 +8,6 @@
 #include <memory>
 #include <string>
 
-#include "base/feature_list.h"
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/read_only_shared_memory_region.h"
@@ -47,10 +46,6 @@
 class PrintQueriesQueue;
 class PrinterQuery;
 
-// TODO(crbug.com/41487419): Remove this emergency off switch after a safe
-// rollout.
-BASE_DECLARE_FEATURE(kCheckPrintRfhIsActive);
-
 // Base class for managing the print commands for a WebContents.
 class PrintViewManagerBase : public PrintManager, public PrintJob::Observer {
  public:
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudController.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudController.java
index 0b47b8d9..0e5984fa 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudController.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudController.java
@@ -925,7 +925,7 @@
                 || DeviceConditions.getCurrentNetConnectionType(mActivity.getApplicationContext())
                         == ConnectionType.CONNECTION_NONE
                 // TODO(crbug.com/363326024): Remove once feature is supported for PDF.
-                || (tab.isNativePage() && tab.getNativePage().isPdf())) {
+                || (tab.isNativePage() && assumeNonNull(tab.getNativePage()).isPdf())) {
             return false;
         }
 
diff --git a/chrome/browser/resources/ash/settings/common/load_time_booleans.ts b/chrome/browser/resources/ash/settings/common/load_time_booleans.ts
index 79cd511..7a068ed 100644
--- a/chrome/browser/resources/ash/settings/common/load_time_booleans.ts
+++ b/chrome/browser/resources/ash/settings/common/load_time_booleans.ts
@@ -119,3 +119,8 @@
 export function shouldShowStartup(): boolean {
   return loadTimeData.getBoolean('shouldShowStartup');
 }
+
+// Power page
+export function isBatteryChargeLimitAvailable(): boolean {
+  return loadTimeData.getBoolean('isBatteryChargeLimitAvailable');
+}
diff --git a/chrome/browser/resources/ash/settings/device_page/power.html b/chrome/browser/resources/ash/settings/device_page/power.html
index f046734..5aa4094 100644
--- a/chrome/browser/resources/ash/settings/device_page/power.html
+++ b/chrome/browser/resources/ash/settings/device_page/power.html
@@ -50,6 +50,8 @@
     deep-link-focus-id$="[[Setting.kBatterySaver]]">
 </settings-toggle-button>
 
+<template is="dom-if" if="[[batteryChargeLimitAvailable_]]" restamp></template>
+
 <settings-toggle-button id="adaptiveChargingToggle"
     class$="[[getClassForRow_(batteryStatus_.present, 'adaptiveCharging')]]"
     hidden$="[[!adaptiveChargingEnabled_]]"
diff --git a/chrome/browser/resources/ash/settings/device_page/power.ts b/chrome/browser/resources/ash/settings/device_page/power.ts
index 1bc121f5..9fdd1c7 100644
--- a/chrome/browser/resources/ash/settings/device_page/power.ts
+++ b/chrome/browser/resources/ash/settings/device_page/power.ts
@@ -22,6 +22,7 @@
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {DeepLinkingMixin} from '../common/deep_linking_mixin.js';
+import {isBatteryChargeLimitAvailable} from '../common/load_time_booleans.js';
 import {RouteObserverMixin} from '../common/route_observer_mixin.js';
 import type {SettingsToggleButtonElement} from '../controls/settings_toggle_button.js';
 import {recordSettingChange} from '../metrics_recorder.js';
@@ -172,6 +173,13 @@
         },
       },
 
+      batteryChargeLimitAvailable_: {
+        type: Boolean,
+        value() {
+          return isBatteryChargeLimitAvailable();
+        },
+      },
+
       batterySaverFeatureEnabled_: Boolean,
 
       batterySaverHidden_: {
@@ -197,6 +205,7 @@
   private adaptiveChargingEnabled_: boolean;
   private adaptiveChargingManaged_: boolean;
   private adaptiveChargingPref_: chrome.settingsPrivate.PrefObject<boolean>;
+  private readonly batteryChargeLimitAvailable_: boolean;
   private batteryIdleManaged_: boolean;
   private batteryIdleOptions_: IdleOption[];
   private batterySaverHidden_: boolean;
diff --git a/chrome/browser/resources/bookmarks/app.css b/chrome/browser/resources/bookmarks/app.css
index 6ffa6537..840afc2 100644
--- a/chrome/browser/resources/bookmarks/app.css
+++ b/chrome/browser/resources/bookmarks/app.css
@@ -79,7 +79,7 @@
 
 bookmarks-list {
   flex: 1;
-  overflow-x: hidden;
+  overflow-x: auto;
 }
 
 #drop-shadow {
diff --git a/chrome/browser/resources/bookmarks/list.css b/chrome/browser/resources/bookmarks/list.css
index 2b02a6d..5865e14 100644
--- a/chrome/browser/resources/bookmarks/list.css
+++ b/chrome/browser/resources/bookmarks/list.css
@@ -11,7 +11,6 @@
 
 :host {
   color: var(--cr-secondary-text-color);
-  min-width: 300px;
   overflow-y: auto;
   padding-bottom: 24px;
   padding-inline-end: var(--card-padding-side);
@@ -25,6 +24,7 @@
   border-radius: var(--cr-card-border-radius);
   box-shadow: var(--cr-card-shadow);
   margin: 0 auto;
+  min-width: 300px;
   max-width: var(--card-max-width);
   padding: 8px 0;
 }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/background_test.js
index 7c70bbf..c0704aeb 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/background_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/background_test.js
@@ -1733,7 +1733,7 @@
       await mockFeedback.replay();
     });
 
-AX_TEST_F('ChromeVoxMV3BackgroundTest', 'MathMLContent', async function() {
+AX_TEST_F('ChromeVoxBackgroundTest', 'MathMLContent', async function() {
   const mockFeedback = this.createMockFeedback();
   const site = `
     <math>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/input/command_handler.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/input/command_handler.ts
index 2f9220f4..93d6bd02 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/input/command_handler.ts
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/input/command_handler.ts
@@ -1476,8 +1476,8 @@
 
   private showLearnModePage_(): void {
     const explorerPage = {
-      url: 'chromevox/mv2/learn_mode/learn_mode.html',
-      type: 'panel' as CreateType,
+      url: 'chromevox/mv3/learn_mode/learn_mode.html',
+      type: 'popup' as CreateType,
     };
     // Use chrome.windows API to ensure page is opened in Ash-chrome.
     chrome.windows.create(explorerPage);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/internal_key_event.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/internal_key_event.ts
index 8987a073..f97335f 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/internal_key_event.ts
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/internal_key_event.ts
@@ -9,6 +9,7 @@
 export class InternalKeyEvent {
   type: string;
   keyCode: number;
+  key: string;
 
   altKey?: boolean;
   ctrlKey?: boolean;
@@ -21,11 +22,12 @@
   // Match key_sequence.ts EventLikeObject type
   keyPrefix?: boolean;
   prefixKey?: boolean;
-  [key: string]: string|number|boolean|undefined;
+  [k: string]: string|number|boolean|undefined;
 
   constructor(evt: any) {
     this.type = evt.type;
     this.keyCode = evt.keyCode;
+    this.key = evt.key;
     this.altKey = evt.altKey;
     this.ctrlKey = evt.ctrlKey;
     this.metaKey = evt.metaKey;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/offscreen_command_type.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/offscreen_command_type.ts
index 34a4e41..0c4fca68 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/offscreen_command_type.ts
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/offscreen_command_type.ts
@@ -13,6 +13,11 @@
   EARCON_RESET_PAN = 'EarconSesetPan',
   EARCON_SET_POSITION_FOR_RECT = 'EarconSetPositionForRect',
   IMAGE_DATA_FROM_URL = 'ImageDataFromUrl',
+  LEARN_MODE_ON_KEY_DOWN = 'LearnModeOnKeyDown',
+  LEARN_MODE_ON_KEY_PRESS = 'LearnModeOnKeyDown',
+  LEARN_MODE_ON_KEY_UP = 'LearnModeOnKeyUp',
+  LEARN_MODE_REGISTER_LISTENERS = 'LearnModeRegisterListeners',
+  LEARN_MODE_REMOVE_LISTENERS = 'LearnModeRemoveListeners',
   LIBLOUIS_START_WORKER = 'LibLouisStartWorker',
   LIBLOUIS_RPC = 'LibLouisRPC',
   LIBLOUIS_MESSAGE = 'LibLouisMessage',
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/panel_command.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/panel_command.ts
index 337cb56..a6895ae 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/panel_command.ts
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/panel_command.ts
@@ -30,7 +30,7 @@
 
   waitForPanel(resolve: () => void) {
     chrome.runtime.sendMessage(
-        undefined, {type: PanelCommandType.IS_PANEL_INITIALIZED}, undefined,
+        undefined, {command: PanelCommandType.IS_PANEL_INITIALIZED}, undefined,
         (initialized: any) => {
           // Panel is not yet initialized
           if (chrome.runtime.lastError) {
@@ -70,9 +70,23 @@
   OPEN_MENUS_MOST_RECENT = 'open_menus_most_recent',
   SEARCH = 'search',
   TUTORIAL = 'tutorial',
-  ENABLE_TEST_HOOKS = 'enable_test_hooks',
   IS_PANEL_INITIALIZED = 'IsPanelInitialized',
 }
 
+/**
+ * The types of commands that can be sent between the panel popup and the
+ * ChromeVox service worker for testing purposes.
+ */
+export enum TestPanelCommandType {
+  BRAILLE_PAN_RIGHT = 'braille_pan_right',
+  BRAILLE_PAN_LEFT = 'braille_pan_left',
+  DISABLE_ERROR_MSG = 'disable_error_msg',
+  FIRE_MOCK_EVENT = 'fire_mock_event',
+  FIRE_MOCK_QUERY = 'fire_mock_query',
+  GET_ACTIVE_MENU_DATA = 'get_active_menu_data',
+  GET_ACTIVE_SEARCH_MENU_DATA = 'get_active_search_menu_data'
+}
+
 TestImportManager.exportForTesting(
-    PanelCommand, ['PanelCommandType', PanelCommandType]);
+    PanelCommand, ['PanelCommandType', PanelCommandType],
+    ['TestPanelCommandType', TestPanelCommandType]);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.html b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.html
index 19837144..f49b0d9e 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.html
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.html
@@ -13,7 +13,6 @@
 }
 </style>
 
-<script type="text/javascript" src="../chromeVoxKbExplorerScript.js"></script>
 <script type="module" src="learn_mode.js"></script>
 </head>
 <body>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.ts
index ea0c971..26bb4528 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.ts
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.ts
@@ -19,8 +19,11 @@
 import {KeyUtil} from '../common/key_util.js';
 import {ChromeVoxKbHandler} from '../common/keyboard_handler.js';
 import {Msgs} from '../common/msgs.js';
+import {OffscreenCommandType} from '../common/offscreen_command_type.js';
 import {QueueMode, TtsSpeechProperties} from '../common/tts_types.js';
 
+type SendResponse = (value: any) => void;
+
 import Gesture = chrome.accessibilityPrivate.Gesture;
 type Tab = chrome.tabs.Tab;
 
@@ -43,14 +46,16 @@
 
   /** Initialize keyboard explorer. */
   static init(): void {
-    // Export global objects from the background page context into this one.
-    window.backgroundWindow = chrome.extension.getBackgroundPage() as Window;
+    // Listen to all key events on the offscreen document.
+    const message = {
+      command: OffscreenCommandType.LEARN_MODE_REGISTER_LISTENERS
+    };
+    chrome.runtime.sendMessage(undefined, message);
+    chrome.runtime.onMessage.addListener(
+        (message: any|undefined, _sender: chrome.runtime.MessageSender,
+         sendResponse: (value: any) => void) =>
+            this.handleMessageFromOffscreen_(message, sendResponse));
 
-    window.backgroundWindow.addEventListener(
-        'keydown', LearnMode.onKeyDown, true);
-    window.backgroundWindow.addEventListener('keyup', LearnMode.onKeyUp, true);
-    window.backgroundWindow.addEventListener(
-        'keypress', LearnMode.onKeyPress, true);
     chrome.brailleDisplayPrivate.onKeyEvent.addListener(
         LearnMode.onBrailleKeyEvent);
     chrome.accessibilityPrivate.onAccessibilityGesture.addListener(
@@ -68,6 +73,7 @@
     // duplicate assignment errors.
     BridgeHelper.clearAllHandlersForTarget(TARGET);
 
+    // The following BridgeHelper handlers are only used for testing.
     BridgeHelper.registerHandler(
         TARGET, Action.CLEAR_TOUCH_EXPLORE_OUTPUT_TIME,
         () => MIN_TOUCH_EXPLORE_OUTPUT_TIME_MS = 0);
@@ -80,21 +86,46 @@
           LearnMode.onBrailleKeyEvent(event));
     BridgeHelper.registerHandler(
         TARGET, Action.ON_KEY_DOWN,
-        (event: KeyboardEvent) => LearnMode.onKeyDown(event));
+        (event: InternalKeyEvent) =>
+            LearnMode.onKeyDown(event, (_stopProp: boolean) => {}));
     BridgeHelper.registerHandler(
         TARGET, Action.ON_KEY_UP,
-        (event: KeyboardEvent) => LearnMode.onKeyUp(event));
+        (_event: InternalKeyEvent) => LearnMode.onKeyUp());
     BridgeHelper.registerHandler(TARGET, Action.READY, () => readyPromise);
 
     readyCallback();
   }
 
+  private static handleMessageFromOffscreen_(
+      message: any|undefined, sendResponse: SendResponse): boolean {
+    switch (message.command) {
+      case OffscreenCommandType.LEARN_MODE_ON_KEY_DOWN:
+        const internalEvent = message.internalEvent as InternalKeyEvent;
+        LearnMode.onKeyDown(internalEvent, sendResponse);
+        break;
+      case OffscreenCommandType.LEARN_MODE_ON_KEY_UP:
+        LearnMode.onKeyUp();
+        break;
+      case OffscreenCommandType.LEARN_MODE_ON_KEY_PRESS:
+        LearnMode.onKeyPress();
+        break;
+    }
+
+    // Returns false as the response is not asynchronous and the callback does
+    // not need to be kept alive.
+    return false;
+  }
+
+
   /**
    * Handles keydown events by speaking the human understandable name of the
    * key.
-   * @return True if the default action should be performed.
+   * @param evt Serialized key event sent from offscreen document.
+   * @param stopPropogationCallback Callback function that takes a boolean: true
+   *          to prevent propogation, false to allow propogation.
    */
-  static onKeyDown(evt: KeyboardEvent): boolean {
+  static onKeyDown(
+      evt: InternalKeyEvent, stopPropogationCallback: SendResponse): void {
     // Process this event only once; it isn't a repeat (i.e. a user is holding a
     // key down).
     if (!evt.repeat) {
@@ -103,13 +134,15 @@
       // Allow Ctrl+W or escape to be handled.
       if ((evt.key === 'w' && evt.ctrlKey)) {
         LearnMode.close_();
-        return true;
+        stopPropogationCallback(false);
+        return;
       }
       if (evt.key === 'Escape') {
         // Escape must be pressed twice in a row to exit.
         if (LearnMode.prevKey === 'Escape') {
           LearnMode.close_();
-          return true;
+          stopPropogationCallback(false);
+          return;
         } else {
           // Append a message about pressing escape a second time.
           LearnMode.output(Msgs.getMsg('learn_mode_escape_to_exit'));
@@ -127,23 +160,17 @@
           });
     }
 
-    evt.preventDefault();
-    evt.stopPropagation();
-    return false;
+    stopPropogationCallback(true);
   }
 
-  static onKeyUp(evt: KeyboardEvent): void {
+  static onKeyUp(): void {
     LearnMode.shouldFlushSpeech_ = true;
     LearnMode.maybeClose_();
     LearnMode.clearRange();
-    evt.preventDefault();
-    evt.stopPropagation();
   }
 
-  static onKeyPress(evt: KeyboardEvent): void {
+  static onKeyPress(): void {
     LearnMode.clearRange();
-    evt.preventDefault();
-    evt.stopPropagation();
   }
 
   static onBrailleKeyEvent(evt: chrome.brailleDisplayPrivate.KeyEvent): void {
@@ -315,12 +342,9 @@
   }
 
   private static resetListeners_(): void {
-    window.backgroundWindow.removeEventListener(
-        'keydown', LearnMode.onKeyDown, true);
-    window.backgroundWindow.removeEventListener(
-        'keyup', LearnMode.onKeyUp, true);
-    window.backgroundWindow.removeEventListener(
-        'keypress', LearnMode.onKeyPress, true);
+    const message = {command: OffscreenCommandType.LEARN_MODE_REMOVE_LISTENERS};
+    chrome.runtime.sendMessage(undefined, message);
+
     chrome.brailleDisplayPrivate.onKeyEvent.removeListener(
         LearnMode.onBrailleKeyEvent);
     chrome.accessibilityPrivate.onAccessibilityGesture.removeListener(
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode_test.js
index 4ac09e0..6eed48b 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode_test.js
@@ -45,10 +45,6 @@
   }
 
   makeMockKeyEvent(params) {
-    // Fake out these functions.
-    params.preventDefault = () => {};
-    params.stopPropagation = () => {};
-
     // Set defaults if not defined.
     params.repeat = params.repeat || false;
 
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/offscreen/offscreen.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/offscreen/offscreen.ts
index b1bd2ba..6e277df 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/offscreen/offscreen.ts
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/offscreen/offscreen.ts
@@ -66,6 +66,89 @@
 }
 
 /**
+ * Handles keydown and keyup events when Learn Mode is initiated.
+ */
+class OffscreenLearnModeKeyboardHandler {
+  static instance?: OffscreenLearnModeKeyboardHandler;
+
+  constructor() {
+    // Add listeners to chrome.runtime
+    chrome.runtime.onMessage.addListener(
+        (message: any|undefined, _sender: chrome.runtime.MessageSender,
+         _sendResponse: SendResponse) =>
+            this.handleMessageFromLearnMode_(message));
+  }
+
+  private handleMessageFromLearnMode_(message: any|undefined): boolean {
+    switch (message.command) {
+      case OffscreenCommandType.LEARN_MODE_REGISTER_LISTENERS:
+        this.registerListeners_();
+        break;
+      case OffscreenCommandType.LEARN_MODE_REMOVE_LISTENERS:
+        this.removeListeners_();
+        break;
+    }
+    // Returns false as the response is not asynchronous and the callback does
+    // not need to be kept alive.
+    return false;
+  }
+
+  static init(): void {
+    if (OffscreenLearnModeKeyboardHandler.instance) {
+      throw 'Error: trying to create two instances of singleton ' +
+          'OffscreenLearnModeKeyboardHandler.';
+    }
+    OffscreenLearnModeKeyboardHandler.instance =
+        new OffscreenLearnModeKeyboardHandler();
+  }
+
+  private registerListeners_(): void {
+    window.addEventListener('keydown', this.onKeyDown_, true);
+    window.addEventListener('keyup', this.onKeyUp_, true);
+    window.addEventListener('keypress', this.onKeyPress_, true);
+  }
+
+  private removeListeners_(): void {
+    window.removeEventListener('keydown', this.onKeyDown_, true);
+    window.removeEventListener('keyup', this.onKeyUp_, true);
+    window.removeEventListener('keypress', this.onKeyPress_, true);
+  }
+
+  private onKeyDown_(evt: KeyboardEvent): void {
+    const extensionId = undefined;
+    const message = {
+      command: OffscreenCommandType.LEARN_MODE_ON_KEY_DOWN,
+      internalEvent: new InternalKeyEvent(evt)
+    };
+    const options = undefined;
+    const callback = (value: any) => {
+      if (value as boolean) {
+        evt.preventDefault();
+        evt.stopPropagation();
+      }
+    };
+    chrome.runtime.sendMessage(extensionId, message, options, callback);
+  }
+
+  private onKeyUp_(evt: KeyboardEvent): void {
+    evt.preventDefault();
+    evt.stopPropagation();
+
+    const message = {command: OffscreenCommandType.LEARN_MODE_ON_KEY_UP};
+    chrome.runtime.sendMessage(undefined, message)
+  }
+
+  private onKeyPress_(evt: KeyboardEvent): void {
+    evt.preventDefault();
+    evt.stopPropagation();
+
+    const message = {command: OffscreenCommandType.LEARN_MODE_ON_KEY_PRESS};
+    chrome.runtime.sendMessage(undefined, message)
+  }
+}
+
+
+/**
  * Handles DOM interactions when accessing and tracking access to the clipboard,
  * used by ClipboardHandler instance within the service worker.
  */
@@ -252,6 +335,7 @@
 
 
 OffscreenBackgroundKeyboardHandler.init();
+OffscreenLearnModeKeyboardHandler.init();
 OffscreenClipboardHandler.init();
 OffscreenSpeechSynthesis.init();
 OffscreenBrailleDisplayManager.init();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel.ts
index 09a4982f..189325f 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel.ts
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel.ts
@@ -15,7 +15,7 @@
 import {Command} from '../common/command.js';
 import {Msgs} from '../common/msgs.js';
 import type {PanelCommand} from '../common/panel_command.js';
-import {PanelCommandType} from '../common/panel_command.js';
+import {PanelCommandType, TestPanelCommandType} from '../common/panel_command.js';
 import type {PanelNodeMenuItemData} from '../common/panel_menu_data.js';
 import {SettingsManager} from '../common/settings_manager.js';
 
@@ -171,14 +171,75 @@
 
   private handleMessageFromServiceWorker_(
       message: any|undefined, sendResponse: SendResponse): boolean {
-    if (message.type == PanelCommandType.IS_PANEL_INITIALIZED) {
-      sendResponse(true);
-    } else {
-      this.exec_({type: message.type, data: message.data} as PanelCommand)
+    switch (message.command) {
+      // Messages for testing purposes.
+      case TestPanelCommandType.BRAILLE_PAN_LEFT:
+        this.onPanLeft_();
+        break;
+      case TestPanelCommandType.BRAILLE_PAN_RIGHT:
+        this.onPanRight_();
+        break;
+      case TestPanelCommandType.DISABLE_ERROR_MSG:
+        this.disableErrorMsgForTest_();
+        break;
+      case TestPanelCommandType.FIRE_MOCK_EVENT:
+        this.fireMockEventForTest_(message['key']);
+        break;
+      case TestPanelCommandType.FIRE_MOCK_QUERY:
+        this.fireMockQueryForTest_(message['query']);
+        break;
+      case TestPanelCommandType.GET_ACTIVE_MENU_DATA:
+        this.getActiveMenuDataForTest_(sendResponse);
+        break;
+      case TestPanelCommandType.GET_ACTIVE_SEARCH_MENU_DATA:
+        this.getActiveSearchMenuDataForTest_(sendResponse);
+        break;
+
+      // Messages from PanelCommand.
+      case PanelCommandType.IS_PANEL_INITIALIZED:
+        sendResponse(true);
+        break;
+      default:
+        this.exec_({type: message.type, data: message.data} as PanelCommand)
+        break;
     }
     return false;
   }
 
+  private disableErrorMsgForTest_() {
+    MenuManager.disableMissingMsgsErrorsForTesting = true;
+  }
+
+  private fireMockEventForTest_(key: string): void {
+    // @ts-ignore: Mocked KeyboardEvent.
+    const obj: KeyboardEvent = {key};
+    obj.preventDefault = function() {};
+    obj.stopPropagation = function() {};
+    this.onKeyDown_(obj);
+  }
+
+  private fireMockQueryForTest_(query: string): void {
+    // @ts-ignore: Mocked InputEvent.
+    const evt: InputEvent = {target: {value: query}};
+    this.menuManager_.onSearchBarQuery(evt);
+  }
+
+  private getActiveMenuDataForTest_(sendResponse: SendResponse) {
+    const activeMenu = this.menuManager_.activeMenu;
+    if (activeMenu) {
+      sendResponse(activeMenu.getMenuDataForTest());
+    }
+    sendResponse({});
+  }
+
+  private getActiveSearchMenuDataForTest_(sendResponse: SendResponse) {
+    const searchMenu = this.menuManager_.searchMenu;
+    if (searchMenu) {
+      sendResponse(searchMenu.getMenuDataForTest());
+    }
+    sendResponse({});
+  }
+
   /**
    * Execute a command to update the panel.
    * TODO(b/314203187): Not nulls asserted, check that this is correct.
@@ -236,14 +297,6 @@
       case PanelCommandType.CLOSE_CHROMEVOX:
         this.onClose();
         break;
-      case PanelCommandType.ENABLE_TEST_HOOKS:
-        // @ts-ignore: Exports for testing.
-        window['MenuManager'] = MenuManager;
-        // @ts-ignore: Exports for testing.
-        window['Msgs'] = Msgs;
-        // @ts-ignore: Exports for testing.
-        window['Panel'] = Panel;
-        break;
     }
   }
 
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_menu.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_menu.ts
index 19ed710..1896ab3 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_menu.ts
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_menu.ts
@@ -14,6 +14,12 @@
 
 type MenuCallback = () => Promise<any>;
 
+type MenuDataForTest = {
+  menuMsg?: string,
+  menuItemTitle?: string,
+  menuItemShortcut?: string
+};
+
 export class PanelMenu {
   menuBarItemElement: HTMLElement;
   menuContainerElement: HTMLElement;
@@ -277,6 +283,15 @@
     }
     return -1;
   }
+
+  getMenuDataForTest(): MenuDataForTest {
+    const menuItem = this.items_[this.activeIndex_];
+    return {
+      menuMsg: this.menuMsg,
+          menuItemTitle: menuItem ? menuItem.menuItemTitle : undefined,
+          menuItemShortcut: menuItem ? menuItem.menuItemShortcut : undefined
+    }
+  }
 }
 
 
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test.js
index 1fe8440c..6c22f90 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test.js
@@ -21,75 +21,80 @@
 
     globalThis.Gesture = chrome.accessibilityPrivate.Gesture;
     globalThis.RoleType = chrome.automation.RoleType;
-
-    // TODO(crbug.com/388867840): Replace with chrome.runtime.sendMessage to
-    // panel.html
-    const panel = this.getPanel().instance;
-    const original = panel.exec_.bind(panel);
-    panel.exec_ = (command) => {
-      original(command);
-      this.onPanelCommandCalled();
-    };
-  }
-
-  onPanelCommandCalled() {
-    if (this.resolvePanelCommandPromise) {
-      this.resolvePanelCommandPromise();
-    }
-  }
-
-  prepareForPanelCommand() {
-    this.panelCommandPromise =
-        new Promise(resolve => this.resolvePanelCommandPromise = resolve);
-  }
-
-  waitForPanelCommand() {
-    return this.panelCommandPromise;
   }
 
   fireMockEvent(key) {
-    return function() {
-      const obj = {};
-      obj.preventDefault = function() {};
-      obj.stopPropagation = function() {};
-      obj.key = key;
-      this.getPanel().instance.onKeyDown_(obj);
-    }.bind(this);
+    chrome.runtime.sendMessage(
+        undefined, {command: TestPanelCommandType.FIRE_MOCK_EVENT, key});
   }
 
   fireMockQuery(query) {
-    return function() {
-      const evt = {};
-      evt.target = {};
-      evt.target.value = query;
-      this.getPanel().instance.menuManager_.onSearchBarQuery(evt);
-    }.bind(this);
+    chrome.runtime.sendMessage(
+        undefined, {command: TestPanelCommandType.FIRE_MOCK_QUERY, query});
   }
 
   assertActiveMenuItem(menuMsg, menuItemTitle, opt_menuItemShortcut) {
-    const menu = this.getPanel().instance.menuManager_.activeMenu_;
-    const menuItem = menu.items_[menu.activeIndex_];
-    assertEquals(menuMsg, menu.menuMsg);
-    assertEquals(menuItemTitle, menuItem.menuItemTitle);
-    if (opt_menuItemShortcut) {
-      assertEquals(opt_menuItemShortcut, menuItem.menuItemShortcut);
-    }
+    const callback = (response) => {
+      assertEquals(menuMsg, response.menuMsg);
+      assertEquals(menuItemTitle, response.menuItemTitle);
+      if (opt_menuItemShortcut) {
+        assertEquals(opt_menuItemShortcut, response.menuItemShortcut);
+      }
+    };
+
+    chrome.runtime.sendMessage(
+        undefined, {command: TestPanelCommandType.GET_ACTIVE_MENU_DATA},
+        undefined, callback);
   }
 
   assertActiveSearchMenuItem(menuItemTitle) {
-    const searchMenu = this.getPanel().instance.menuManager_.searchMenu;
-    const activeIndex = searchMenu.activeIndex_;
-    const activeItem = searchMenu.items_[activeIndex];
-    assertEquals(menuItemTitle, activeItem.menuItemTitle);
+    const callback = (response) => {
+      assertEquals(menuItemTitle, response.menuItemTitle);
+    };
+
+    chrome.runtime.sendMessage(
+        undefined, {command: TestPanelCommandType.GET_ACTIVE_SEARCH_MENU_DATA},
+        undefined, callback);
   }
 
   enableTouchMode() {
     EventSource.set(EventSourceType.TOUCH_GESTURE);
   }
 
-  isMenuTitleMessage(menuTitleMessage) {
-    const menu = this.getPanel().instance.menuManager_.activeMenu_;
-    return menuTitleMessage === menu.menuMsg;
+  async isMenuTitleMessage(menuTitleMessage) {
+    return new Promise(resolve => {
+      const callback = (response) => {
+        resolve(menuTitleMessage === response.menuMsg);
+      };
+
+      chrome.runtime.sendMessage(
+          undefined, {command: TestPanelCommandType.GET_ACTIVE_MENU_DATA},
+          undefined, callback);
+    });
+  }
+
+  async waitForMenu(menuTitleMessage) {
+    // TODO(crbug.com/424764877): Replace polling.
+    let pollForMenu = async (resolve) => {
+      if (await this.isMenuTitleMessage(menuTitleMessage)) {
+        resolve();
+      } else {
+        setTimeout(() => pollForMenu(resolve), 500)
+      }
+    };
+    return new Promise(resolve => {
+      pollForMenu(resolve);
+    });
+  }
+
+  braillePanRight() {
+    chrome.runtime.sendMessage(
+        undefined, {command: TestPanelCommandType.BRAILLE_PAN_RIGHT});
+  }
+
+  braillePanLeft() {
+    chrome.runtime.sendMessage(
+        undefined, {command: TestPanelCommandType.BRAILLE_PAN_LEFT});
   }
 
   get linksDoc() {
@@ -113,23 +118,22 @@
   await this.runWithLoadedTree(this.linksDoc);
   new PanelCommand(PanelCommandType.OPEN_MENUS).send();
   await this.waitForMenu('panel_search_menu');
-  this.fireMockEvent('ArrowRight')();
+  this.fireMockEvent('ArrowRight');
   this.assertActiveMenuItem('panel_menu_jump', 'Go To Beginning Of Table');
-  this.fireMockEvent('ArrowRight')();
+  this.fireMockEvent('ArrowRight');
   this.assertActiveMenuItem(
       'panel_menu_speech', 'Announce Current Battery Status');
 });
 
-// TODO(https://crbug.com/1299765): Re-enable once flaky timeouts are fixed.
-AX_TEST_F('ChromeVoxPanelTest', 'DISABLED_LinkMenu', async function() {
+AX_TEST_F('ChromeVoxPanelTest', 'LinkMenu', async function() {
   await this.runWithLoadedTree(this.linksDoc);
   CommandHandlerInterface.instance.onCommand('showLinksList');
   await this.waitForMenu('role_link');
-  this.fireMockEvent('ArrowLeft')();
+  this.fireMockEvent('ArrowLeft');
   this.assertActiveMenuItem('role_landmark', 'No items');
-  this.fireMockEvent('ArrowRight')();
+  this.fireMockEvent('ArrowRight');
   this.assertActiveMenuItem('role_link', 'apple Internal link');
-  this.fireMockEvent('ArrowUp')();
+  this.fireMockEvent('ArrowUp');
   this.assertActiveMenuItem('role_link', 'banana Internal link');
 });
 
@@ -137,9 +141,9 @@
   await this.runWithLoadedTree(`<button>Cancel</button><button>OK</button>`);
   CommandHandlerInterface.instance.onCommand('showFormsList');
   await this.waitForMenu('panel_menu_form_controls');
-  this.fireMockEvent('ArrowDown')();
+  this.fireMockEvent('ArrowDown');
   this.assertActiveMenuItem('panel_menu_form_controls', 'OK Button');
-  this.fireMockEvent('ArrowUp')();
+  this.fireMockEvent('ArrowUp');
   this.assertActiveMenuItem('panel_menu_form_controls', 'Cancel Button');
 });
 
@@ -149,25 +153,26 @@
   await this.runWithLoadedTree(this.linksDoc);
   new PanelCommand(PanelCommandType.OPEN_MENUS).send();
   await this.waitForMenu('panel_search_menu');
+
   await mockFeedback
       .expectSpeech('Search the menus', /Type to search the menus/)
       .call(() => {
-        this.fireMockQuery('jump')();
+        this.fireMockQuery('jump');
         this.assertActiveSearchMenuItem('Jump To Details');
       })
       .expectSpeech(/Jump/, 'Menu item', /[0-9]+ of [0-9]+/)
       .call(() => {
-        this.fireMockEvent('ArrowDown')();
+        this.fireMockEvent('ArrowDown');
         this.assertActiveSearchMenuItem('Jump To The Bottom Of The Page');
       })
       .expectSpeech(/Jump/, 'Menu item', /[0-9]+ of [0-9]+/)
       .call(() => {
-        this.fireMockEvent('ArrowDown')();
+        this.fireMockEvent('ArrowDown');
         this.assertActiveSearchMenuItem('Jump To The Top Of The Page');
       })
       .expectSpeech(/Jump/, 'Menu item', /[0-9]+ of [0-9]+/)
       .call(() => {
-        this.fireMockEvent('ArrowDown')();
+        this.fireMockEvent('ArrowDown');
         this.assertActiveSearchMenuItem('Jump To Details');
       })
       .expectSpeech(/Jump/, 'Menu item', /[0-9]+ of [0-9]+/)
@@ -182,6 +187,7 @@
   await this.runWithLoadedTree(`<button>Cancel</button><button>OK</button>`);
   doGestureAsync(Gesture.TAP4);
   await this.waitForMenu('panel_search_menu');
+
   // GestureCommandHandler behaves in special ways only with range over
   // the panel. Fake this out by setting range there.
   const desktop = root.parent.root;
@@ -208,10 +214,10 @@
           [{'lang': 'en-US'}, {'lang': 'es-ES'}];
       CommandHandlerInterface.instance.onCommand('showFormsList');
       await this.waitForMenu('panel_menu_form_controls');
-      this.fireMockEvent('ArrowDown')();
+      this.fireMockEvent('ArrowDown');
       this.assertActiveMenuItem(
           'panel_menu_form_controls', 'español: Prueba Button');
-      this.fireMockEvent('ArrowUp')();
+      this.fireMockEvent('ArrowUp');
       this.assertActiveMenuItem('panel_menu_form_controls', 'Test Button');
     });
 
@@ -219,9 +225,9 @@
   await this.runWithLoadedTree(this.linksDoc);
   CommandHandlerInterface.instance.onCommand('showActionsMenu');
   await this.waitForMenu('panel_menu_actions');
-  this.fireMockEvent('ArrowDown')();
+  this.fireMockEvent('ArrowDown');
   this.assertActiveMenuItem('panel_menu_actions', 'Start Or End Selection');
-  this.fireMockEvent('ArrowUp')();
+  this.fireMockEvent('ArrowUp');
   this.assertActiveMenuItem('panel_menu_actions', 'Click On Current Item');
 });
 
@@ -237,9 +243,9 @@
   CommandHandlerInterface.instance.onCommand('showActionsMenu');
   await this.waitForMenu('panel_menu_actions');
   // Go down three times
-  this.fireMockEvent('ArrowUp')();
+  this.fireMockEvent('ArrowUp');
   this.assertActiveMenuItem('panel_menu_actions', 'Long click on current item');
-  this.fireMockEvent('ArrowDown')();
+  this.fireMockEvent('ArrowDown');
   this.assertActiveMenuItem('panel_menu_actions', 'Click On Current Item');
 });
 
@@ -248,15 +254,15 @@
       await this.runWithLoadedTree(this.linksDoc);
       new PanelCommand(PanelCommandType.OPEN_MENUS).send();
       await this.waitForMenu('panel_search_menu');
-      this.fireMockEvent('ArrowRight')();
+      this.fireMockEvent('ArrowRight');
       this.assertActiveMenuItem(
           'panel_menu_jump', 'Go To Beginning Of Table',
           'Search+Alt+Shift+ArrowLeft');
-      this.fireMockEvent('ArrowRight')();
+      this.fireMockEvent('ArrowRight');
       this.assertActiveMenuItem(
           'panel_menu_speech', 'Announce Current Battery Status',
           'Search+O, then B');
-      this.fireMockEvent('ArrowRight')();
+      this.fireMockEvent('ArrowRight');
       this.assertActiveMenuItem(
           'panel_menu_chromevox', 'Enable/Disable Sticky Mode',
           'Search+Search');
@@ -270,9 +276,9 @@
       new PanelCommand(PanelCommandType.OPEN_MENUS).send();
       await this.waitForMenu('panel_search_menu');
       do {
-        this.fireMockEvent('ArrowRight')();
-        assertFalse(this.isMenuTitleMessage('panel_menu_touchgestures'));
-      } while (!this.isMenuTitleMessage('panel_search_menu'));
+        this.fireMockEvent('ArrowRight');
+        assertFalse(await this.isMenuTitleMessage('panel_menu_touchgestures'));
+      } while (!await this.isMenuTitleMessage('panel_search_menu'));
     });
 
 // Ensure 'Touch Gesture' is in the panel menus when touch mode is enabled.
@@ -286,9 +292,9 @@
 
       // Look for Touch Gestures menu, fail if getting back to start.
       do {
-        this.fireMockEvent('ArrowRight')();
-        assertFalse(this.isMenuTitleMessage('panel_search_menu'));
-      } while (!this.isMenuTitleMessage('panel_menu_touchgestures'));
+        this.fireMockEvent('ArrowRight');
+        assertFalse(await this.isMenuTitleMessage('panel_search_menu'));
+      } while (!await this.isMenuTitleMessage('panel_menu_touchgestures'));
 
       this.assertActiveMenuItem(
           'panel_menu_touchgestures', 'Click on current item');
@@ -301,28 +307,19 @@
   await this.waitForEvent(button, chrome.automation.EventType.FOCUS);
   CommandHandlerInterface.instance.onCommand('showActionsMenu');
   await this.waitForMenu('panel_menu_actions');
-  this.fireMockEvent('ArrowDown')();
+  this.fireMockEvent('ArrowDown');
   this.assertActiveMenuItem('panel_menu_actions', 'Start Or End Selection');
-  this.fireMockEvent('ArrowDown')();
-  this.fireMockEvent('ArrowDown')();
+  this.fireMockEvent('ArrowDown');
+  this.fireMockEvent('ArrowDown');
   this.assertActiveMenuItem('panel_menu_actions', 'Perform default action');
-  this.fireMockEvent('Enter')();
+  this.fireMockEvent('Enter');
   await this.waitForEvent(button, chrome.automation.EventType.CLICKED);
 });
 
 AX_TEST_F('ChromeVoxPanelTest', 'PanVirtualBrailleDisplay', async function() {
   await this.runWithLoadedTree(this.linksDoc);
 
-  this.prepareForPanelCommand();
   CommandHandlerInterface.instance.onCommand('toggleBrailleCaptions');
-  this.waitForPanelCommand();
-
-  // Locate the buttons to pan left and pan right in the display.
-  const panelDocument = this.getPanelWindow().document;
-  const panLeftButton = panelDocument.getElementById('braille-pan-left');
-  assertNotNullNorUndefined(panLeftButton);
-  const panRightButton = panelDocument.getElementById('braille-pan-right');
-  assertNotNullNorUndefined(panRightButton);
 
   // Mock out ChromeVox.braille to confirm that the commands are routed from the
   // panel context to the background context.
@@ -332,9 +329,9 @@
   const panRightDone = new Promise(resolve => panRight = resolve);
   ChromeVox.braille = {panLeft, panRight};
 
-  panLeftButton.click();
+  this.braillePanLeft();
   await panLeftDone;
 
-  panRightButton.click();
+  this.braillePanRight();
   await panRightDone;
 });
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test_base.js b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test_base.js
index d316515..f443268 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test_base.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test_base.js
@@ -13,42 +13,8 @@
   async setUpDeferred() {
     await super.setUpDeferred();
 
-    await new PanelCommand(PanelCommandType.ENABLE_TEST_HOOKS).send();
     await this.waitForPendingMethods();
-    this.getPanelWindow().MenuManager.disableMissingMsgsErrorsForTesting = true;
-  }
-
-  getPanelWindow() {
-    let panelWindow = null;
-    while (!panelWindow) {
-      panelWindow = chrome.extension.getViews().find(
-          view => view.location.href.indexOf('chromevox/mv3/panel/panel.html') > 0);
-    }
-    return panelWindow;
-  }
-
-  /**
-   * Gets the Panel object in the panel.html window. Note that the extension
-   * system destroys our reference to this object unpredictably so always ask
-   * chrome.extension.getViews for it.
-   */
-  getPanel() {
-    return this.getPanelWindow().Panel;
-  }
-
-
-  // TODO(crbug.com/388867840): Replace with chrome.runtime.sendMessage to
-  // panel.html
-  async waitForMenu(menuMsg) {
-    const menuManager = this.getPanel().instance.menuManager_;
-
-    // Menu and menu item updates occur in a different js context, so tests need
-    // to wait until an update has been made.
-    return new Promise(
-        resolve =>
-            this.addCallbackPostMethod(menuManager, 'activateMenu', () => {
-              assertEquals(menuMsg, menuManager.activeMenu_.menuMsg);
-              resolve();
-            }, () => true));
+    chrome.runtime.sendMessage(
+        undefined, {command: TestPanelCommandType.DISABLE_ERROR_MSG});
   }
 };
diff --git a/chrome/browser/sharesheet/share_action/example_action.cc b/chrome/browser/sharesheet/share_action/example_action.cc
index 8a125362..168fe98 100644
--- a/chrome/browser/sharesheet/share_action/example_action.cc
+++ b/chrome/browser/sharesheet/share_action/example_action.cc
@@ -12,14 +12,12 @@
 
 namespace sharesheet {
 
-ExampleAction::ExampleAction() {
-  name_ = "example";
-}
+ExampleAction::ExampleAction() = default;
 
 ExampleAction::~ExampleAction() = default;
 
 ShareActionType ExampleAction::GetActionType() const {
-  return ShareActionType::kExample;
+  return type_;
 }
 
 const std::u16string ExampleAction::GetActionName() {
diff --git a/chrome/browser/sharesheet/share_action/example_action.h b/chrome/browser/sharesheet/share_action/example_action.h
index 8355eef..6bc9119 100644
--- a/chrome/browser/sharesheet/share_action/example_action.h
+++ b/chrome/browser/sharesheet/share_action/example_action.h
@@ -13,6 +13,7 @@
 
 class ExampleAction : public ShareAction {
  public:
+  explicit ExampleAction(ShareActionType type) : type_(type) {}
   ExampleAction();
   ~ExampleAction() override;
   ExampleAction(const ExampleAction&) = delete;
@@ -29,6 +30,7 @@
   bool HasActionView() override;
 
  private:
+  ShareActionType type_ = ShareActionType::kExample;
   raw_ptr<SharesheetController> controller_ = nullptr;
   std::string name_;
 };
diff --git a/chrome/browser/sharesheet/share_action/share_action_cache.cc b/chrome/browser/sharesheet/share_action/share_action_cache.cc
index a8b8a61..4acd641 100644
--- a/chrome/browser/sharesheet/share_action/share_action_cache.cc
+++ b/chrome/browser/sharesheet/share_action/share_action_cache.cc
@@ -72,8 +72,8 @@
   return false;
 }
 
-void ShareActionCache::AddShareActionForTesting() {
-  AddShareAction(std::make_unique<ExampleAction>());
+void ShareActionCache::AddShareActionForTest(ShareActionType type) {
+  AddShareAction(std::make_unique<ExampleAction>(type));
 }
 
 void ShareActionCache::AddShareAction(std::unique_ptr<ShareAction> action) {
diff --git a/chrome/browser/sharesheet/share_action/share_action_cache.h b/chrome/browser/sharesheet/share_action/share_action_cache.h
index c656fd52..995b6584 100644
--- a/chrome/browser/sharesheet/share_action/share_action_cache.h
+++ b/chrome/browser/sharesheet/share_action/share_action_cache.h
@@ -42,7 +42,7 @@
   // Returns null if |action_type| is not a valid ShareAction.
   const gfx::VectorIcon* GetVectorIconFromType(ShareActionType action_type);
 
-  void AddShareActionForTesting();
+  void AddShareActionForTest(ShareActionType type = ShareActionType::kExample);
 
  private:
   void AddShareAction(std::unique_ptr<ShareAction> action);
diff --git a/chrome/browser/sharesheet/sharesheet_service.cc b/chrome/browser/sharesheet/sharesheet_service.cc
index b2113a5c..e04b8c1 100644
--- a/chrome/browser/sharesheet/sharesheet_service.cc
+++ b/chrome/browser/sharesheet/sharesheet_service.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/apps/app_service/launch_utils.h"
+#include "chrome/browser/sharesheet/share_action/example_action.h"
 #include "chrome/browser/sharesheet/share_action/share_action.h"
 #include "chrome/browser/sharesheet/share_action/share_action_cache.h"
 #include "chrome/browser/sharesheet/sharesheet_controller.h"
@@ -132,6 +133,10 @@
       std::move(intent), std::move(delivered_callback),
       std::move(close_callback));
 }
+
+void SharesheetService::AddShareActionForTest(ShareActionType type) {
+  share_action_cache_->AddShareActionForTest(type);  // IN-TEST
+}
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
 // Cleanup delegator when bubble closes.
@@ -228,7 +233,7 @@
   CHECK(views::Widget::GetWidgetForNativeWindow(native_window));
   SharesheetMetrics::RecordSharesheetLaunchSource(source);
   for (int i = 0; i < num_actions_to_add; ++i) {
-    share_action_cache_->AddShareActionForTesting();  // IN-TEST
+    share_action_cache_->AddShareActionForTest();  // IN-TEST
   }
   auto targets = GetActionsForIntent(intent);
   OnReadyToShowBubble(native_window, std::move(intent),
diff --git a/chrome/browser/sharesheet/sharesheet_service.h b/chrome/browser/sharesheet/sharesheet_service.h
index 74a160b..17d390d 100644
--- a/chrome/browser/sharesheet/sharesheet_service.h
+++ b/chrome/browser/sharesheet/sharesheet_service.h
@@ -94,6 +94,8 @@
                                    DeliveredCallback delivered_callback,
                                    CloseCallback close_callback,
                                    ActionCleanupCallback cleanup_callback);
+
+  void AddShareActionForTest(ShareActionType type);
 #endif  // BUILDFLAG(IS_CHROMEOS)
   // |share_action_type| is set to null when testing, but should otherwise have
   // a valid value.
@@ -187,13 +189,15 @@
   void RecordShareDataMetrics(const apps::IntentPtr& intent);
 
   raw_ptr<Profile> profile_;
-  std::unique_ptr<ShareActionCache> share_action_cache_;
-  raw_ptr<apps::AppServiceProxyAsh> app_service_proxy_;
 
   // Record of all active SharesheetServiceDelegators. These can be retrieved
   // by ShareActions and used as SharesheetControllers to make bubble changes.
   std::vector<std::unique_ptr<SharesheetServiceDelegator>> active_delegators_;
 
+  // Action may have a reference to the delegator, so define before delegator.
+  std::unique_ptr<ShareActionCache> share_action_cache_;
+  raw_ptr<apps::AppServiceProxyAsh> app_service_proxy_;
+
   base::WeakPtrFactory<SharesheetService> weak_factory_{this};
 };
 
diff --git a/chrome/browser/sync/test/integration/BUILD.gn b/chrome/browser/sync/test/integration/BUILD.gn
index 8b0ecd6a..e3361d4 100644
--- a/chrome/browser/sync/test/integration/BUILD.gn
+++ b/chrome/browser/sync/test/integration/BUILD.gn
@@ -27,6 +27,7 @@
     "//chrome/test:sync_integration_test_support",
     "//chrome/test:test_support",
     "//components/bookmarks/browser",
+    "//components/commerce/core:feature_list",
     "//components/data_sharing/public",
     "//components/password_manager/core/browser/sharing",
     "//components/plus_addresses:test_support",
diff --git a/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc b/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc
index c95aebe7..5c4a281 100644
--- a/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc
@@ -58,38 +58,7 @@
   base::CallbackListSubscription test_signin_client_subscription_;
 };
 
-// The unconsented primary account isn't supported on ChromeOS.
-#if !BUILDFLAG(IS_CHROMEOS)
-IN_PROC_BROWSER_TEST_F(SingleClientSecondaryAccountSyncTest,
-                       StartsSyncTransportOnSignin) {
-  ASSERT_TRUE(SetupClients());
-
-  // Signing in (without granting sync consent or explicitly setting up Sync)
-  // should trigger starting the Sync machinery in standalone transport mode.
-  secondary_account_helper::SignInUnconsentedAccount(
-      profile(), &test_url_loader_factory_, "user@email.com");
-
-  EXPECT_TRUE(GetClient(0)->AwaitSyncTransportActive());
-
-  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
-            GetSyncService(0)->GetTransportState());
-
-  ASSERT_FALSE(GetSyncService(0)
-                   ->GetUserSettings()
-                   ->IsInitialSyncFeatureSetupComplete());
-
-  EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
-  EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureActive());
-
-  // Make sure that only the allowed types got activated. Note that, depending
-  // on some other feature flags, not all of the allowed types are necessarily
-  // active, and that's okay.
-  syncer::DataTypeSet bad_types =
-      base::Difference(GetSyncService(0)->GetActiveDataTypes(),
-                       AllowedTypesInStandaloneTransportMode());
-  EXPECT_TRUE(bad_types.empty()) << syncer::DataTypeSetToDebugString(bad_types);
-}
-#else
+#if BUILDFLAG(IS_CHROMEOS)
 IN_PROC_BROWSER_TEST_F(SingleClientSecondaryAccountSyncTest,
                        DoesNotStartSyncTransportOnSignin) {
   ASSERT_TRUE(SetupClients());
@@ -102,7 +71,7 @@
   EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
             GetSyncService(0)->GetTransportState());
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 
 // ChromeOS doesn't support changes to the primary account after startup, so
 // this test doesn't apply.
diff --git a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
index 13f91cc..9bc9423 100644
--- a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
@@ -10,10 +10,12 @@
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sync/test/integration/encryption_helper.h"
+#include "chrome/browser/sync/test/integration/secondary_account_helper.h"
 #include "chrome/browser/sync/test/integration/single_client_status_change_checker.h"
 #include "chrome/browser/sync/test/integration/sync_service_impl_harness.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/common/chrome_paths.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "components/password_manager/core/browser/features/password_features.h"
 #include "components/signin/public/base/signin_switches.h"
 #include "components/sync/base/data_type.h"
@@ -24,6 +26,8 @@
 #include "components/sync/test/nigori_test_utils.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/test_launcher.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
 
 #if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/ash_features.h"
@@ -31,6 +35,18 @@
 
 namespace {
 
+using testing::ContainerEq;
+
+constexpr syncer::DataTypeSet kTypesGatedBehindHistoryOptIn{
+    syncer::COLLABORATION_GROUP,
+    syncer::HISTORY,
+    syncer::HISTORY_DELETE_DIRECTIVES,
+    syncer::SAVED_TAB_GROUP,
+    syncer::SHARED_TAB_GROUP_DATA,
+    syncer::SHARED_TAB_GROUP_ACCOUNT_DATA,
+    syncer::SESSIONS,
+    syncer::USER_EVENTS};
+
 #if !BUILDFLAG(IS_ANDROID)
 base::FilePath GetTestFilePathForCacheGuid() {
   base::FilePath user_data_path;
@@ -63,14 +79,34 @@
 };
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
-class SingleClientStandaloneTransportSyncTest : public SyncTest {
+class SingleClientStandaloneTransportSyncTest
+    : public SyncTest,
+      public testing::WithParamInterface<bool> {
  public:
-  SingleClientStandaloneTransportSyncTest() : SyncTest(SINGLE_CLIENT) {}
+  SingleClientStandaloneTransportSyncTest() : SyncTest(SINGLE_CLIENT) {
+    if (GetParam()) {
+      override_features_
+          .InitWithFeatures(/*enabled_features=*/
+                            {syncer::
+                                 kSyncEnableContactInfoDataTypeForCustomPassphraseUsers,
+                             syncer::kReplaceSyncPromosWithSignInPromos},
+                            /*disabled_features=*/{});
+    } else {
+      override_features_.InitWithFeatures(
+          /*enabled_features=*/{},
+          /*disabled_features=*/
+          {syncer::kSyncEnableContactInfoDataTypeForCustomPassphraseUsers,
+           syncer::kReplaceSyncPromosWithSignInPromos});
+    }
+  }
+
+ private:
+  base::test::ScopedFeatureList override_features_;
 };
 
 // On Chrome OS sync auto-starts on sign-in.
 #if !BUILDFLAG(IS_CHROMEOS)
-IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest,
+IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest,
                        StartsSyncTransportOnSignin) {
   ASSERT_TRUE(SetupClients());
 
@@ -94,20 +130,16 @@
 
   EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
   EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureActive());
-
-  // Make sure that only the allowed types got activated. Note that, depending
-  // on some other feature flags, not all of the allowed types are necessarily
-  // active, and that's okay.
-  syncer::DataTypeSet bad_types =
-      base::Difference(GetSyncService(0)->GetActiveDataTypes(),
-                       AllowedTypesInStandaloneTransportMode());
-  EXPECT_TRUE(bad_types.empty()) << syncer::DataTypeSetToDebugString(bad_types);
 }
 #endif  // !BUILDFLAG(IS_CHROMEOS)
 
 #if !BUILDFLAG(IS_ANDROID)
-IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest,
+IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest,
                        SwitchesBetweenTransportAndFeature) {
+  const syncer::DataType kDataTypeExcludedInTransportMode = syncer::AUTOFILL;
+  CHECK(!AllowedTypesInStandaloneTransportMode().Has(
+      kDataTypeExcludedInTransportMode));
+
   ASSERT_TRUE(SetupClients());
 
   // Setup a primary account, but don't actually enable Sync-the-feature (so
@@ -119,10 +151,28 @@
             GetSyncService(0)->GetTransportState());
   ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureActive());
 
-  syncer::DataTypeSet bad_types =
-      base::Difference(GetSyncService(0)->GetActiveDataTypes(),
-                       AllowedTypesInStandaloneTransportMode());
-  EXPECT_TRUE(bad_types.empty()) << syncer::DataTypeSetToDebugString(bad_types);
+  syncer::DataTypeSet expected_types = Difference(
+      AllowedTypesInStandaloneTransportMode(), kTypesGatedBehindHistoryOptIn);
+
+  // Bookmarks and reading list require a separate opt in, unless
+  // `syncer::kReplaceSyncPromosWithSignInPromos` is enabled.
+  // TODO(crbug.com/424124636): This shouldn't be necessary if
+  // `kReplaceSyncPromosWithSignInPromos` is enabled.
+  expected_types.Remove(syncer::BOOKMARKS);
+  expected_types.Remove(syncer::READING_LIST);
+
+  // TODO(crbug.com/424124636): The types below should probably be excluded.
+  if (base::FeatureList::IsEnabled(
+          syncer::kReplaceSyncPromosWithSignInPromos)) {
+    expected_types.Put(syncer::AUTOFILL_WALLET_METADATA);
+    expected_types.Put(syncer::AUTOFILL_WALLET_OFFER);
+    if (base::FeatureList::IsEnabled(commerce::kProductSpecifications)) {
+      expected_types.Put(syncer::PRODUCT_COMPARISON);
+    }
+  }
+
+  ASSERT_THAT(GetSyncService(0)->GetActiveDataTypes(),
+              ContainerEq(expected_types));
 
   // Turn Sync-the-feature on.
   ASSERT_TRUE(GetClient(0)->SetupSync());
@@ -132,18 +182,18 @@
   EXPECT_TRUE(GetSyncService(0)->IsSyncFeatureActive());
   // Make sure that some data type which is not allowed in transport-only mode
   // got activated.
-  ASSERT_FALSE(AllowedTypesInStandaloneTransportMode().Has(syncer::AUTOFILL));
   ASSERT_TRUE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has(
       syncer::UserSelectableType::kAutofill));
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::AUTOFILL));
+  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(
+      kDataTypeExcludedInTransportMode));
 }
-#endif  // BUILDFLAG(IS_ANDROID)
+#endif  // !BUILDFLAG(IS_ANDROID)
 
 // Tests the behavior of receiving a "Reset Sync" operation from the dashboard
 // while Sync-the-feature is active: On non-ChromeOS, this signs the user out,
 // so Sync will be fully disabled. On ChromeOS, there is no sign-out, so
 // Sync-the-transport will start.
-IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest,
+IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest,
                        HandlesResetFromDashboardWhenSyncActive) {
   ASSERT_TRUE(SetupClients());
 
@@ -173,6 +223,39 @@
   EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
             GetSyncService(0)->GetTransportState());
   EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
+
+  // There are no immediate plans to launch additional types on ChromeOS, so the
+  // list is hardcoded here.
+  EXPECT_THAT(GetSyncService(0)->GetActiveDataTypes(),
+              ContainerEq(syncer::DataTypeSet{
+                  syncer::AUTOFILL_WALLET_CREDENTIAL,
+                  syncer::AUTOFILL_WALLET_DATA,
+                  syncer::AUTOFILL_WALLET_USAGE,
+                  syncer::DEVICE_INFO,
+                  syncer::NIGORI,
+                  syncer::USER_CONSENTS,
+                  syncer::SEND_TAB_TO_SELF,
+                  syncer::SECURITY_EVENTS,
+                  syncer::SHARING_MESSAGE,
+                  syncer::ARC_PACKAGE,
+                  syncer::OS_PREFERENCES,
+                  syncer::OS_PRIORITY_PREFERENCES,
+                  // TODO(crbug.com/424698545): This seems off: many of the
+                  // datatypes below should not start.
+                  syncer::APP_LIST,
+                  syncer::COLLABORATION_GROUP,
+                  syncer::CONTACT_INFO,
+                  syncer::EXTENSIONS,
+                  syncer::EXTENSION_SETTINGS,
+                  syncer::INCOMING_PASSWORD_SHARING_INVITATION,
+                  syncer::OUTGOING_PASSWORD_SHARING_INVITATION,
+                  syncer::PASSWORDS,
+                  syncer::PRODUCT_COMPARISON,
+                  syncer::SAVED_TAB_GROUP,
+                  syncer::SHARED_TAB_GROUP_DATA,
+                  syncer::SHARED_TAB_GROUP_ACCOUNT_DATA,
+                  syncer::WEBAUTHN_CREDENTIAL,
+              }));
 #else
   // On platforms other than Ash, the "Reset Sync" operation should revoke
   // the Sync consent. On Mobile, "Reset Sync" also clears the primary account.
@@ -189,7 +272,7 @@
 #if !BUILDFLAG(IS_ANDROID)
 // Regression test for crbug.com/955989 that verifies the cache GUID is not
 // reset upon restart of the browser, in standalone transport mode.
-IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest,
+IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest,
                        PRE_ReusesSameCacheGuid) {
   ASSERT_TRUE(SetupClients());
   ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount());
@@ -220,7 +303,7 @@
   ASSERT_TRUE(base::WriteFile(GetTestFilePathForCacheGuid(), cache_guid));
 }
 
-IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest,
+IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest,
                        ReusesSameCacheGuid) {
   ASSERT_TRUE(SetupClients());
   ASSERT_FALSE(GetSyncService(0)->HasDisableReason(
@@ -255,40 +338,8 @@
 }
 #endif  // BUILDFLAG(IS_ANDROID)
 
-class SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest
-    : public SingleClientStandaloneTransportSyncTest {
- public:
-  SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest() {
-    override_features_.InitWithFeatures(
-        /*enabled_features=*/
-        {switches::kEnablePreferencesAccountStorage,
-         syncer::kSeparateLocalAndAccountSearchEngines,
-         syncer::kSyncEnableContactInfoDataTypeForCustomPassphraseUsers,
-         syncer::kReplaceSyncPromosWithSignInPromos,
-         syncer::kSyncAutofillWalletCredentialData},
-        /*disabled_features=*/{});
-  }
-  ~SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest() override =
-      default;
-
-  bool WaitForPassphraseRequired() {
-    return PassphraseRequiredChecker(GetSyncService(0)).Wait();
-  }
-
-  bool WaitForPassphraseAccepted() {
-    return PassphraseAcceptedChecker(GetSyncService(0)).Wait();
-  }
-
- private:
-  base::test::ScopedFeatureList override_features_;
-};
-
-// This test is disabled on CrOS as the signed in, non-syncing state does not
-// exist.
-#if !BUILDFLAG(IS_CHROMEOS)
-IN_PROC_BROWSER_TEST_F(
-    SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest,
-    DataTypesEnabledInTransportModeWithoutHistorySync) {
+IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest,
+                       DataTypesEnabledInTransportModeWithoutAdditionalOptIns) {
   ASSERT_TRUE(SetupClients());
   // Sign in, without turning on Sync-the-feature.
   ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount());
@@ -299,79 +350,118 @@
   ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has(
       syncer::UserSelectableType::kHistory));
 
-  // With `kReplaceSyncPromosWithSignInPromos` and by default (without opting
-  // into history), all the history-related should be disabled in transport
-  // mode.
-  EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::HISTORY));
-  EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::HISTORY_DELETE_DIRECTIVES));
-  EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::SESSIONS));
-  EXPECT_FALSE(
-      GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_EVENTS));
+  // Make sure that only the allowed types got activated.
+  syncer::DataTypeSet expected_types = Difference(
+      AllowedTypesInStandaloneTransportMode(), kTypesGatedBehindHistoryOptIn);
 
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES));
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::PRIORITY_PREFERENCES));
+#if !BUILDFLAG(IS_ANDROID)
+  // Bookmarks and reading list require a separate opt in, unless
+  // `syncer::kReplaceSyncPromosWithSignInPromos` is enabled.
+  // TODO(crbug.com/424124636): This shouldn't be necessary if
+  // `kReplaceSyncPromosWithSignInPromos` is enabled.
+  expected_types.Remove(syncer::BOOKMARKS);
+  expected_types.Remove(syncer::READING_LIST);
+#endif  // !BUILDFLAG(IS_ANDROID)
 
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::AUTOFILL_WALLET_CREDENTIAL));
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::AUTOFILL_WALLET_DATA));
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::AUTOFILL_WALLET_METADATA));
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::AUTOFILL_WALLET_OFFER));
-  EXPECT_TRUE(
-      GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO));
+  EXPECT_THAT(GetSyncService(0)->GetActiveDataTypes(),
+              ContainerEq(expected_types));
 }
 
-IN_PROC_BROWSER_TEST_F(
-    SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest,
-    DataTypesEnabledInTransportModeWithHistorySync) {
+IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest,
+                       DataTypesEnabledInTransportModeWithHistorySync) {
+  // Opting into history is only meaningful if
+  // `kReplaceSyncPromosWithSignInPromos` is enabled.
+  if (!GetParam()) {
+    GTEST_SKIP();
+  }
+
   ASSERT_TRUE(SetupClients());
   // Sign in, without turning on Sync-the-feature.
   ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount());
+  ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            GetSyncService(0)->GetTransportState());
   ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
+  ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has(
+      syncer::UserSelectableType::kHistory));
 
   // Opt in to history and tabs.
   GetSyncService(0)->GetUserSettings()->SetSelectedType(
       syncer::UserSelectableType::kHistory, true);
   GetSyncService(0)->GetUserSettings()->SetSelectedType(
       syncer::UserSelectableType::kTabs, true);
+#if !BUILDFLAG(IS_ANDROID)
+  GetSyncService(0)->GetUserSettings()->SetSelectedType(
+      syncer::UserSelectableType::kSavedTabGroups, true);
+#endif  // !BUILDFLAG(IS_ANDROID)
 
   ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive());
   ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
             GetSyncService(0)->GetTransportState());
 
-  // With `kReplaceSyncPromosWithSignInPromos`, all the history-related types
-  // should be enabled in transport mode.
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::HISTORY));
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::HISTORY_DELETE_DIRECTIVES));
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::SESSIONS));
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_EVENTS));
+  // With the history opt in, all types that can run in transport mode should
+  // be active.
+  syncer::DataTypeSet expected_types = AllowedTypesInStandaloneTransportMode();
 
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES));
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::PRIORITY_PREFERENCES));
+#if !BUILDFLAG(IS_ANDROID)
+  // Bookmarks and reading list require a separate opt in, unless
+  // `syncer::kReplaceSyncPromosWithSignInPromos` is enabled.
+  // TODO(crbug.com/424124636): This shouldn't be necessary if
+  // `kReplaceSyncPromosWithSignInPromos` is enabled.
+  expected_types.Remove(syncer::BOOKMARKS);
+  expected_types.Remove(syncer::READING_LIST);
+#endif  // !BUILDFLAG(IS_ANDROID)
 
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::AUTOFILL_WALLET_CREDENTIAL));
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::AUTOFILL_WALLET_DATA));
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::AUTOFILL_WALLET_METADATA));
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::AUTOFILL_WALLET_OFFER));
-  EXPECT_TRUE(
-      GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO));
+  EXPECT_THAT(GetSyncService(0)->GetActiveDataTypes(),
+              ContainerEq(expected_types));
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS)
+
+#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS)
+IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest,
+                       DataTypesEnabledForImplicitSignIn) {
+  ASSERT_TRUE(SetupClients());
+
+  // Signing in (without granting sync consent or explicitly setting up Sync)
+  // should trigger starting the Sync machinery in standalone transport mode.
+  secondary_account_helper::ImplicitSignInUnconsentedAccount(
+      GetProfile(0), &test_url_loader_factory_, "user@email.com");
+
+  ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            GetSyncService(0)->GetTransportState());
+
+  // There are no immediate plans to launch additional types to implicitly
+  // signed in users, so the list is hardcoded here.
+  syncer::DataTypeSet expected_types{syncer::AUTOFILL_WALLET_CREDENTIAL,
+                                     syncer::AUTOFILL_WALLET_DATA,
+                                     syncer::AUTOFILL_WALLET_USAGE,
+                                     syncer::DEVICE_INFO,
+                                     syncer::NIGORI,
+                                     syncer::PRIORITY_PREFERENCES,
+                                     syncer::USER_CONSENTS,
+                                     syncer::SEND_TAB_TO_SELF,
+                                     syncer::SECURITY_EVENTS,
+                                     syncer::SHARING_MESSAGE};
+
+  // TODO(crbug.com/424124636): The types below should probably be excluded.
+  if (base::FeatureList::IsEnabled(
+          syncer::kReplaceSyncPromosWithSignInPromos)) {
+    expected_types.Put(syncer::AUTOFILL_WALLET_METADATA);
+    expected_types.Put(syncer::AUTOFILL_WALLET_OFFER);
+    if (base::FeatureList::IsEnabled(commerce::kProductSpecifications)) {
+      expected_types.Put(syncer::PRODUCT_COMPARISON);
+    }
+  }
+
+  EXPECT_THAT(GetSyncService(0)->GetActiveDataTypes(),
+              ContainerEq(expected_types));
+}
+#endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS)
 
 // TODO(crbug.com/40200835): Android currently doesn't support PRE_ tests.
 #if !BUILDFLAG(IS_ANDROID)
-IN_PROC_BROWSER_TEST_F(
-    SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest,
+IN_PROC_BROWSER_TEST_P(
+    SingleClientStandaloneTransportSyncTest,
     PRE_DataTypesEnabledInTransportModeWithCustomPassphrase) {
   // There's a custom passphrase on the server.
   const syncer::KeyParamsForTesting kKeyParams =
@@ -382,63 +472,89 @@
   ASSERT_TRUE(SetupClients());
   // Sign in, without turning on Sync-the-feature.
   ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount());
-  ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
-
-  // Opt in to history and tabs.
-  GetSyncService(0)->GetUserSettings()->SetSelectedType(
-      syncer::UserSelectableType::kHistory, true);
-  GetSyncService(0)->GetUserSettings()->SetSelectedType(
-      syncer::UserSelectableType::kTabs, true);
-  // Preferences are opted-into by default.
-  ASSERT_TRUE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has(
-      syncer::UserSelectableType::kPreferences));
-
-  ASSERT_TRUE(WaitForPassphraseRequired());
+  ASSERT_TRUE(PassphraseRequiredChecker(GetSyncService(0)).Wait());
   ASSERT_TRUE(GetSyncService(0)->GetUserSettings()->SetDecryptionPassphrase(
       kKeyParams.password));
-  ASSERT_TRUE(WaitForPassphraseAccepted());
+  ASSERT_TRUE(PassphraseAcceptedChecker(GetSyncService(0)).Wait());
 
   ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive());
   ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
             GetSyncService(0)->GetTransportState());
+  ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
 
-  // With a custom passphrase, the actual HISTORY types are not supported.
-  EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::HISTORY));
-  EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::HISTORY_DELETE_DIRECTIVES));
-  EXPECT_FALSE(
-      GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_EVENTS));
-  // But SESSIONS aka Open Tabs still works.
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::SESSIONS));
-
-  // With `kReplaceSyncPromosWithSignInPromos`, both PREFERENCES and
-  // PRIORITY_PREFERENCES should be enabled in transport mode.
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES));
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::PRIORITY_PREFERENCES));
+  // Make sure that only the allowed types got activated.
+  syncer::DataTypeSet expected_types = Difference(
+      AllowedTypesInStandaloneTransportMode(), kTypesGatedBehindHistoryOptIn);
 
   // CONTACT_INFO should be disabled by default for explicit-passphrase users.
-  EXPECT_FALSE(
-      GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO));
+  expected_types.Remove(syncer::CONTACT_INFO);
 
-  // Enabling kAutofill to enable CONTACT_INFO.
-  GetSyncService(0)->GetUserSettings()->SetSelectedType(
-      syncer::UserSelectableType::kAutofill, true);
+  // Bookmarks and reading list require a separate opt in, unless
+  // `syncer::kReplaceSyncPromosWithSignInPromos` is enabled.
+  // TODO(crbug.com/424124636): This shouldn't be necessary if
+  // `kReplaceSyncPromosWithSignInPromos` is enabled.
+  expected_types.Remove(syncer::BOOKMARKS);
+  expected_types.Remove(syncer::READING_LIST);
 
-  ASSERT_NE(syncer::SyncService::TransportState::ACTIVE,
-            GetSyncService(0)->GetTransportState());
-  ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive());
+  ASSERT_THAT(GetSyncService(0)->GetActiveDataTypes(),
+              ContainerEq(expected_types));
 
-  // CONTACT_INFO should be enabled.
-  EXPECT_TRUE(
-      GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO));
+  // Opting into history is only meaningful if
+  // `kReplaceSyncPromosWithSignInPromos` is enabled.
+  if (GetParam()) {
+    // Opt in to history and tabs.
+    GetSyncService(0)->GetUserSettings()->SetSelectedType(
+        syncer::UserSelectableType::kHistory, true);
+    GetSyncService(0)->GetUserSettings()->SetSelectedType(
+        syncer::UserSelectableType::kTabs, true);
+    GetSyncService(0)->GetUserSettings()->SetSelectedType(
+        syncer::UserSelectableType::kSavedTabGroups, true);
+
+    ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive());
+    ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+              GetSyncService(0)->GetTransportState());
+
+    syncer::DataTypeSet expected_types_after_history_opt_in =
+        AllowedTypesInStandaloneTransportMode();
+
+    // CONTACT_INFO should remain disabled since it's gated by kAutofill.
+    expected_types_after_history_opt_in.Remove(syncer::CONTACT_INFO);
+
+    // With a custom passphrase, the actual HISTORY types are not supported.
+    expected_types_after_history_opt_in.Remove(syncer::HISTORY);
+    expected_types_after_history_opt_in.Remove(
+        syncer::HISTORY_DELETE_DIRECTIVES);
+    expected_types_after_history_opt_in.Remove(syncer::USER_EVENTS);
+
+    // But SESSIONS aka Open Tabs still works.
+    CHECK(expected_types_after_history_opt_in.Has(syncer::SESSIONS));
+
+#if !BUILDFLAG(IS_ANDROID)
+    // On desktop, bookmarks and reading list require a separate opt in.
+    // TODO(crbug.com/424124636): This shouldn't be necessary if
+    // `kReplaceSyncPromosWithSignInPromos` is enabled.
+    expected_types_after_history_opt_in.Remove(syncer::BOOKMARKS);
+    expected_types_after_history_opt_in.Remove(syncer::READING_LIST);
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+    EXPECT_THAT(GetSyncService(0)->GetActiveDataTypes(),
+                ContainerEq(expected_types_after_history_opt_in));
+
+    // Enabling kAutofill to enable CONTACT_INFO.
+    GetSyncService(0)->GetUserSettings()->SetSelectedType(
+        syncer::UserSelectableType::kAutofill, true);
+    ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive());
+
+    // CONTACT_INFO should be enabled.
+    EXPECT_TRUE(
+        GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO));
+  }
 }
 
 // Tests that a custom passphrase user's opt-in to kAutofill (which happened in
 // the PRE_ test) survives a browser restart.
-IN_PROC_BROWSER_TEST_F(
-    SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest,
-    DataTypesEnabledInTransportModeWithCustomPassphrase) {
+IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest,
+                       DataTypesEnabledInTransportModeWithCustomPassphrase) {
   ASSERT_TRUE(SetupClients());
 
   ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
@@ -446,152 +562,30 @@
   ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
             GetSyncService(0)->GetTransportState());
 
-  // CONTACT_INFO should be enabled after restarting.
-  EXPECT_TRUE(
-      GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO));
+  // CONTACT_INFO should be enabled after restarting, if and only if
+  // `kSyncEnableContactInfoDataTypeForCustomPassphraseUsers` is enabled.
+  EXPECT_EQ(GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO),
+            GetParam());
 }
 #endif  // BUILDFLAG(IS_ANDROID)
 
-class SingleClientStandaloneTransportWithoutReplaceSyncWithSigninSyncTest
-    : public SingleClientStandaloneTransportSyncTest {
- public:
-  SingleClientStandaloneTransportWithoutReplaceSyncWithSigninSyncTest() {
-#if BUILDFLAG(IS_ANDROID)
-    // On Android, PREFERENCES is active in transport mode only with
-    // `kReplaceSyncPromosWithSignInPromos` enabled.
-    override_features_.InitWithFeatures(
-        /*enabled_features=*/{switches::kEnablePreferencesAccountStorage},
-        /*disabled_features=*/{syncer::kReplaceSyncPromosWithSignInPromos});
+INSTANTIATE_TEST_SUITE_P(ReplaceSyncWithSignin,
+                         SingleClientStandaloneTransportSyncTest,
+#if BUILDFLAG(IS_CHROMEOS)
+                         // On ChromeOS, the behavior after enabling
+                         // `syncer::kReplaceSyncPromosWithSignInPromos` is
+                         // unspecified, so no need to test it.
+                         ::testing::Values(false));
+#elif BUILDFLAG(IS_ANDROID)
+                         // On Android, the feature has been enabled by
+                         // default for a long time. There is no need to
+                         // test the flag-disabled case.
+                         ::testing::Values(true));
 #else
-    // On Desktop, PREFERENCES, SEARCH_ENGINES and THEMES are active in
-    // transport mode irrespective of `kReplaceSyncPromosWithSignInPromos`.
-    // TODO(crbug.com/330677712): Merge this with the Android branch once
-    // `kReplaceSyncPromosWithSignInPromos` is removed.
-    override_features_.InitWithFeatures(
-        /*enabled_features=*/{switches::kEnablePreferencesAccountStorage,
-                              syncer::kSeparateLocalAndAccountSearchEngines,
-                              syncer::kSeparateLocalAndAccountThemes},
-        /*disabled_features=*/{syncer::kReplaceSyncPromosWithSignInPromos});
-#endif  // BUILDFLAG(IS_ANDROID)
-  }
-  ~SingleClientStandaloneTransportWithoutReplaceSyncWithSigninSyncTest()
-      override = default;
+                         ::testing::Bool());
+#endif
 
- private:
-  base::test::ScopedFeatureList override_features_;
-};
-
-#if BUILDFLAG(IS_ANDROID)
-
-IN_PROC_BROWSER_TEST_F(
-    SingleClientStandaloneTransportWithoutReplaceSyncWithSigninSyncTest,
-    DataTypesNotEnabledInTransportMode) {
-  ASSERT_TRUE(SetupClients());
-  // Sign in, without turning on Sync-the-feature.
-  ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount());
-  ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
-
-  // Without `kReplaceSyncPromosWithSignInPromos`, neither History/Tabs nor
-  // Preferences are supported in transport mode, so they're reported as not
-  // selected even if the user explicitly tries to turn them on.
-  syncer::UserSelectableTypeSet types =
-      GetSyncService(0)->GetUserSettings()->GetRegisteredSelectableTypes();
-  ASSERT_TRUE(types.HasAll({syncer::UserSelectableType::kHistory,
-                            syncer::UserSelectableType::kTabs,
-                            syncer::UserSelectableType::kPreferences}));
-  GetSyncService(0)->GetUserSettings()->SetSelectedTypes(
-      /*sync_everything=*/true, types);
-  ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has(
-      syncer::UserSelectableType::kHistory));
-  ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has(
-      syncer::UserSelectableType::kTabs));
-  ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has(
-      syncer::UserSelectableType::kPreferences));
-
-  ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive());
-  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
-            GetSyncService(0)->GetTransportState());
-
-  // Without `kReplaceSyncPromosWithSignInPromos`, none of the history-related
-  // types should be active in transport mode (even if the user has opted in).
-  EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::HISTORY));
-  EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::HISTORY_DELETE_DIRECTIVES));
-  EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::SESSIONS));
-  EXPECT_FALSE(
-      GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_EVENTS));
-
-  // Without `kReplaceSyncPromosWithSignInPromos`, PREFERENCES should not be
-  // active in transport mode (even if the user has opted in).
-  EXPECT_FALSE(
-      GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES));
-  // TODO(crbug.com/412602018): With
-  // `kSyncSupportAlwaysSyncingPriorityPreferences` enabled,
-  // PRIORITY_PREFERENCES are active in transport mode and decoupled from user
-  // toggle. Update or add new test to cover PRIORITY_PREFERENCES.
-}
-
-#else
-
-IN_PROC_BROWSER_TEST_F(
-    SingleClientStandaloneTransportWithoutReplaceSyncWithSigninSyncTest,
-    DataTypesNotEnabledInTransportMode) {
-  ASSERT_TRUE(SetupClients());
-  // Sign in, without turning on Sync-the-feature.
-  ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount());
-  ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
-
-  // Without `kReplaceSyncPromosWithSignInPromos`, History/Tabs are not are
-  // supported in transport mode, so they're reported as not selected even if
-  // the user explicitly tries to turn them on.
-  syncer::UserSelectableTypeSet types =
-      GetSyncService(0)->GetUserSettings()->GetRegisteredSelectableTypes();
-  ASSERT_TRUE(types.HasAll({syncer::UserSelectableType::kHistory,
-                            syncer::UserSelectableType::kTabs,
-                            syncer::UserSelectableType::kPreferences}));
-  GetSyncService(0)->GetUserSettings()->SetSelectedTypes(
-      /*sync_everything=*/true, types);
-  ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has(
-      syncer::UserSelectableType::kHistory));
-  ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has(
-      syncer::UserSelectableType::kTabs));
-  // Preferences, Themes and Search Engines are supported in transport mode,
-  // provided the enabled feature flags, irrespective of
-  // `kReplaceSyncPromosWithSignInPromos`. So they're reported as selected even
-  // when the user explicitly turns them on.
-  ASSERT_TRUE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().HasAll(
-      {syncer::UserSelectableType::kPreferences,
-       syncer::UserSelectableType::kThemes}));
-
-  ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive());
-  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
-            GetSyncService(0)->GetTransportState());
-
-  // Without `kReplaceSyncPromosWithSignInPromos`, none of the history-related
-  // types should be active in transport mode (even if the user has opted in).
-  EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::HISTORY));
-  EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(
-      syncer::HISTORY_DELETE_DIRECTIVES));
-  EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::SESSIONS));
-  EXPECT_FALSE(
-      GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_EVENTS));
-
-  // PREFERENCES, SEARCH_ENGINES and THEMES are active in transport mode
-  // irrespective of `kReplaceSyncPromosWithSignInPromos`, provided the
-  // enabled feature flags.
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::THEMES));
-  EXPECT_TRUE(
-      GetSyncService(0)->GetActiveDataTypes().Has(syncer::SEARCH_ENGINES));
-  EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES));
-  // TODO(crbug.com/412602018): With
-  // `kSyncSupportAlwaysSyncingPriorityPreferences` enabled,
-  // PRIORITY_PREFERENCES are active in transport mode and decoupled from user
-  // toggle. Update or add new test to cover PRIORITY_PREFERENCES.
-}
-
-#endif  // BUILDFLAG(IS_ANDROID)
-
-// SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest is
+// ReplaceSyncWithSigninMigrationSyncTest is
 // disabled on CrOS as the signed in, non-syncing state does not exist.
 // TODO(crbug.com/40145099): Android currently doesn't support PRE_ tests and
 // all of these are.
@@ -602,10 +596,9 @@
 // This test intends to test the mobile migration behavior, but runs on desktop.
 // Desktop and mobile have different behaviors, and as a consequence is test is
 // only an approximation.
-class SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest
-    : public SingleClientStandaloneTransportSyncTest {
+class ReplaceSyncWithSigninMigrationSyncTest : public SyncTest {
  public:
-  SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest() {
+  ReplaceSyncWithSigninMigrationSyncTest() : SyncTest(SINGLE_CLIENT) {
     // Various features that are required for types to be supported in transport
     // mode are unconditionally enabled.
     default_features_.InitWithFeatures(
@@ -622,17 +615,15 @@
         {{syncer::kReplaceSyncPromosWithSignInPromos, !content::IsPreTest()},
          {switches::kEnablePreferencesAccountStorage, !content::IsPreTest()}});
   }
-  ~SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest()
-      override = default;
+  ~ReplaceSyncWithSigninMigrationSyncTest() override = default;
 
  private:
   base::test::ScopedFeatureList default_features_;
   base::test::ScopedFeatureList sync_to_signin_feature_;
 };
 
-IN_PROC_BROWSER_TEST_F(
-    SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest,
-    PRE_MigratesSignedInUser) {
+IN_PROC_BROWSER_TEST_F(ReplaceSyncWithSigninMigrationSyncTest,
+                       PRE_MigratesSignedInUser) {
   ASSERT_TRUE(SetupClients());
   // Sign in, without turning on Sync-the-feature.
   ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount());
@@ -661,9 +652,8 @@
             GetSyncService(0)->GetTransportState());
 }
 
-IN_PROC_BROWSER_TEST_F(
-    SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest,
-    MigratesSignedInUser) {
+IN_PROC_BROWSER_TEST_F(ReplaceSyncWithSigninMigrationSyncTest,
+                       MigratesSignedInUser) {
   ASSERT_TRUE(SetupClients());
 
   ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
@@ -687,9 +677,8 @@
       syncer::UserSelectableType::kPreferences));
 }
 
-IN_PROC_BROWSER_TEST_F(
-    SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest,
-    PRE_MigratesSignedInCustomPassphraseUser) {
+IN_PROC_BROWSER_TEST_F(ReplaceSyncWithSigninMigrationSyncTest,
+                       PRE_MigratesSignedInCustomPassphraseUser) {
   ASSERT_TRUE(SetupClients());
   // Sign in, without turning on Sync-the-feature.
   ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount());
@@ -714,9 +703,8 @@
       syncer::UserSelectableType::kPreferences));
 }
 
-IN_PROC_BROWSER_TEST_F(
-    SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest,
-    MigratesSignedInCustomPassphraseUser) {
+IN_PROC_BROWSER_TEST_F(ReplaceSyncWithSigninMigrationSyncTest,
+                       MigratesSignedInCustomPassphraseUser) {
   ASSERT_TRUE(SetupClients());
 
   ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc
index 5744fb9c..c2eddc6c 100644
--- a/chrome/browser/sync/test/integration/sync_test.cc
+++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -58,6 +58,8 @@
 #include "chrome/common/chrome_switches.h"
 #include "components/bookmarks/test/bookmark_test_helpers.h"
 #include "components/browser_sync/browser_sync_switches.h"
+#include "components/commerce/core/commerce_feature_list.h"
+#include "components/data_sharing/public/features.h"
 #include "components/gcm_driver/fake_gcm_profile_service.h"
 #include "components/gcm_driver/gcm_profile_service.h"
 #include "components/gcm_driver/instance_id/instance_id.h"
@@ -65,6 +67,8 @@
 #include "components/gcm_driver/instance_id/instance_id_profile_service.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/os_crypt/sync/os_crypt_mocker.h"
+#include "components/password_manager/core/browser/password_manager_buildflags.h"
+#include "components/plus_addresses/features.h"
 #include "components/prefs/scoped_user_pref_update.h"
 #include "components/signin/public/base/consent_level.h"
 #include "components/signin/public/base/signin_switches.h"
@@ -105,6 +109,7 @@
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/password_manager/android/password_manager_util_bridge.h"
 #include "chrome/browser/sync/test/integration/sync_test_utils_android.h"
 #else  // BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/ui/browser.h"
@@ -1075,12 +1080,19 @@
 syncer::DataTypeSet AllowedTypesInStandaloneTransportMode() {
   static_assert(55 == syncer::GetNumDataTypes(),
                 "Add new types below if they can run in transport mode");
+
+#if BUILDFLAG(IS_ANDROID)
+  // On Android, `kReplaceSyncPromosWithSignInPromos` has been enabled by
+  // default for a long time, so it is not expected to be exercised in tests.
+  CHECK(
+      base::FeatureList::IsEnabled(syncer::kReplaceSyncPromosWithSignInPromos));
+#endif  // BUILDFLAG(IS_ANDROID)
+
   // Only some types will run by default in transport mode (i.e. without their
   // own separate opt-in).
   syncer::DataTypeSet allowed_types = {syncer::AUTOFILL_WALLET_CREDENTIAL,
                                        syncer::AUTOFILL_WALLET_DATA,
                                        syncer::AUTOFILL_WALLET_USAGE,
-                                       syncer::CONTACT_INFO,
                                        syncer::DEVICE_INFO,
                                        syncer::SECURITY_EVENTS,
                                        syncer::SEND_TAB_TO_SELF,
@@ -1088,12 +1100,20 @@
                                        syncer::USER_CONSENTS};
   allowed_types.PutAll(syncer::ControlTypes());
 
-  allowed_types.Put(syncer::PLUS_ADDRESS);
-  allowed_types.Put(syncer::PLUS_ADDRESS_SETTING);
-  allowed_types.Put(syncer::PASSWORDS);
-  allowed_types.Put(syncer::WEBAUTHN_CREDENTIAL);
-  allowed_types.Put(syncer::INCOMING_PASSWORD_SHARING_INVITATION);
-  allowed_types.Put(syncer::OUTGOING_PASSWORD_SHARING_INVITATION);
+#if BUILDFLAG(IS_CHROMEOS)
+  // OS sync types run in transport mode.
+  allowed_types.PutAll({syncer::APP_LIST, syncer::ARC_PACKAGE,
+                        syncer::OS_PREFERENCES,
+                        syncer::OS_PRIORITY_PREFERENCES});
+
+  // Some of the feature-guarded logic in the #else branch below could make
+  // sense for ChromeOS too. However, since there are no immediate plans to
+  // roll them out on ChromeOS, they are excluded in this test to avoid
+  // accidental rollouts on ChromeOS transport mode (which is somewhat special,
+  // and reachable only in advanced scenarios such as the user having cleared
+  // data via sync dashboard).
+#else  // BUILDFLAG(IS_CHROMEOS)
+  allowed_types.Put(syncer::CONTACT_INFO);
 
   if (base::FeatureList::IsEnabled(
           switches::kEnablePreferencesAccountStorage)) {
@@ -1111,37 +1131,44 @@
           syncer::kReplaceSyncPromosWithSignInPromos)) {
     allowed_types.Put(syncer::AUTOFILL_WALLET_METADATA);
     allowed_types.Put(syncer::AUTOFILL_WALLET_OFFER);
-    allowed_types.Put(syncer::COLLABORATION_GROUP);
     allowed_types.Put(syncer::HISTORY);
     allowed_types.Put(syncer::HISTORY_DELETE_DIRECTIVES);
-    allowed_types.Put(syncer::PRODUCT_COMPARISON);
     allowed_types.Put(syncer::SAVED_TAB_GROUP);
     allowed_types.Put(syncer::SESSIONS);
-    allowed_types.Put(syncer::SHARED_TAB_GROUP_DATA);
     allowed_types.Put(syncer::USER_EVENTS);
+
+    if (data_sharing::features::IsDataSharingFunctionalityEnabled()) {
+      allowed_types.Put(syncer::SHARED_TAB_GROUP_DATA);
+      allowed_types.Put(syncer::COLLABORATION_GROUP);
+
+      if (base::FeatureList::IsEnabled(
+              syncer::kSyncSharedTabGroupAccountData)) {
+        allowed_types.Put(syncer::SHARED_TAB_GROUP_ACCOUNT_DATA);
+      }
+    }
+
+    if (base::FeatureList::IsEnabled(commerce::kProductSpecifications)) {
+      allowed_types.Put(syncer::PRODUCT_COMPARISON);
+    }
   }
   if (base::FeatureList::IsEnabled(syncer::kSyncAutofillLoyaltyCard)) {
     allowed_types.Put(syncer::AUTOFILL_VALUABLE);
   }
-  if (base::FeatureList::IsEnabled(syncer::kSyncSharedTabGroupAccountData)) {
-    allowed_types.Put(syncer::SHARED_TAB_GROUP_ACCOUNT_DATA);
+
+#if BUILDFLAG(IS_ANDROID) && !BUILDFLAG(USE_LOGIN_DATABASE_AS_BACKEND)
+  // On Android, PASSWORDS require that Google Play Services is present.
+  password_manager_android_util::PasswordManagerUtilBridge util_bridge;
+  if (util_bridge.IsInternalBackendPresent()) {
+    allowed_types.Put(syncer::PASSWORDS);
   }
+#else   // BUILDFLAG(IS_ANDROID) && !BUILDFLAG(USE_LOGIN_DATABASE_AS_BACKEND)
+  allowed_types.Put(syncer::PASSWORDS);
+#endif  // BUILDFLAG(IS_ANDROID) && !BUILDFLAG(USE_LOGIN_DATABASE_AS_BACKEND)
+
 #if BUILDFLAG(IS_ANDROID)
-  if (base::FeatureList::IsEnabled(syncer::kWebApkBackupAndRestoreBackend)) {
-    allowed_types.Put(syncer::WEB_APKS);
-  }
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS)
-  // OS sync types run in transport mode.
-  allowed_types.PutAll({syncer::APP_LIST, syncer::ARC_PACKAGE,
-                        syncer::OS_PREFERENCES, syncer::OS_PRIORITY_PREFERENCES,
-                        syncer::PRINTERS,
-                        syncer::PRINTERS_AUTHORIZATION_SERVERS,
-                        syncer::WIFI_CONFIGURATIONS, syncer::WORKSPACE_DESK});
-#endif  // BUILDFLAG(IS_CHROMEOS)
-
-#if !BUILDFLAG(IS_ANDROID)
+  // TODO(crbug.com/420912307): Allow `syncer::WEB_APKS` if
+  // `syncer::kWebApkBackupAndRestoreBackend` is enabled.
+#else   // BUILDFLAG(IS_ANDROID)
   if (base::FeatureList::IsEnabled(syncer::kSeparateLocalAndAccountThemes)) {
     allowed_types.Put(syncer::THEMES);
   }
@@ -1150,7 +1177,21 @@
           syncer::kSeparateLocalAndAccountSearchEngines)) {
     allowed_types.Put(syncer::SEARCH_ENGINES);
   }
-#endif  // !BUILDFLAG(IS_ANDROID)
+
+  // These types are excluded on Android as they run outside Chrome.
+  allowed_types.Put(syncer::INCOMING_PASSWORD_SHARING_INVITATION);
+  allowed_types.Put(syncer::OUTGOING_PASSWORD_SHARING_INVITATION);
+  allowed_types.Put(syncer::WEBAUTHN_CREDENTIAL);
+#endif  // BUILDFLAG(IS_ANDROID)
+#endif  // BUILDFLAG(IS_CHROMEOS)
+
+  if (base::FeatureList::IsEnabled(
+          plus_addresses::features::kPlusAddressesEnabled) &&
+      !plus_addresses::features::kEnterprisePlusAddressServerUrl.Get()
+           .empty()) {
+    allowed_types.Put(syncer::PLUS_ADDRESS);
+    allowed_types.Put(syncer::PLUS_ADDRESS_SETTING);
+  }
 
   return allowed_types;
 }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
index 82e5a0a..f44dd176 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
@@ -29,7 +29,7 @@
 @NullMarked
 public class EmptyTabObserver implements TabObserver {
     @Override
-    public void onInitialized(Tab tab, String appId) {}
+    public void onInitialized(Tab tab, @Nullable String appId) {}
 
     @Override
     public void onShown(Tab tab, @TabSelectionType int type) {}
@@ -65,7 +65,7 @@
     public void onRestoreFailed(Tab tab) {}
 
     @Override
-    public void onFaviconUpdated(Tab tab, Bitmap icon, GURL iconUrl) {}
+    public void onFaviconUpdated(Tab tab, @Nullable Bitmap icon, @Nullable GURL iconUrl) {}
 
     @Override
     public void onTitleUpdated(Tab tab) {}
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.java
index c5c4c66..a39399a 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.tab;
 
+import static org.chromium.build.NullUtil.assertNonNull;
+
 import android.content.Context;
 import android.view.View;
 
@@ -99,9 +101,18 @@
     Context getContext();
 
     /**
-     * @return The {@link WindowAndroid} associated with this {@link Tab}.
+     * Returns the {@link WindowAndroid} associated with this {@link Tab}. May be null if the tab is
+     * detached.
      */
-    WindowAndroid getWindowAndroid();
+    @Nullable WindowAndroid getWindowAndroid();
+
+    /**
+     * Returns the {@link WindowAndroid} associated with this {@link Tab}. Asserts that the {@link
+     * WindowAndroid} is not null.
+     */
+    default WindowAndroid getWindowAndroidChecked() {
+        return assertNonNull(getWindowAndroid());
+    }
 
     /**
      * Update the attachment state to Window(Activity).
@@ -115,16 +126,15 @@
             @Nullable WindowAndroid window, @Nullable TabDelegateFactory tabDelegateFactory);
 
     /**
-     * @return Content view used for rendered web contents. Can be null
-     *    if web contents is null.
+     * @return Content view used for rendered web contents. Can be null if web contents is null.
      */
-    ContentView getContentView();
+    @Nullable ContentView getContentView();
 
     /**
      * @return The {@link View} displaying the current page in the tab. This can be {@code null}, if
-     *         the tab is frozen or being initialized or destroyed.
+     *     the tab is frozen or being initialized or destroyed.
      */
-    View getView();
+    @Nullable View getView();
 
     /**
      * @return The {@link TabViewManager} that is responsible for managing custom {@link View}s
@@ -139,7 +149,7 @@
     /**
      * @return Parameters that should be used for a lazily loaded Tab. May be null.
      */
-    LoadUrlParams getPendingLoadParams();
+    @Nullable LoadUrlParams getPendingLoadParams();
 
     /**
      * @return The URL that is loaded in the current tab. This may not be the same as
@@ -160,10 +170,10 @@
 
     /**
      * @return The {@link NativePage} associated with the current page, or {@code null} if there is
-     *         no current page or the current page is displayed using something besides
-     *         {@link NativePage}.
+     *     no current page or the current page is displayed using something besides {@link
+     *     NativePage}.
      */
-    NativePage getNativePage();
+    @Nullable NativePage getNativePage();
 
     /**
      * @return Whether or not the {@link Tab} represents a {@link NativePage}.
@@ -418,7 +428,7 @@
     /**
      * @return content state bytes for the {@link Tab}
      */
-    WebContentsState getWebContentsState();
+    @Nullable WebContentsState getWebContentsState();
 
     /**
      * @return timestamp in milliseconds when the tab was last interacted.
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java
index 0a4a203..6fc77ea5 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java
@@ -41,7 +41,7 @@
         tab.addObserver(
                 new EmptyTabObserver() {
                     @Override
-                    public void onInitialized(Tab tab, String appId) {
+                    public void onInitialized(Tab tab, @Nullable String appId) {
                         if (appId != null) setAppId(appId);
                     }
 
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabDelegateFactory.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabDelegateFactory.java
index 02498fb..b6f34a0 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabDelegateFactory.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabDelegateFactory.java
@@ -61,5 +61,5 @@
      * @return A NativePage showing the specified url or null.
      */
     @Nullable NativePage createNativePage(
-            String url, NativePage candidatePage, Tab tab, PdfInfo pdfInfo);
+            String url, @Nullable NativePage candidatePage, Tab tab, @Nullable PdfInfo pdfInfo);
 }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java
index 1635d8d0..ce60664 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java
@@ -25,12 +25,13 @@
 @NullMarked
 public interface TabObserver {
     /**
-     * Called when a {@link Tab} finished initialization. The {@link TabState} contains,
-     * if not {@code null}, various states that a Tab should restore itself from.
+     * Called when a {@link Tab} finished initialization. The {@link TabState} contains, if not
+     * {@code null}, various states that a Tab should restore itself from.
+     *
      * @param tab The notifying {@link Tab}.
      * @param appId ID of the external app that opened this tab.
      */
-    void onInitialized(Tab tab, String appId);
+    void onInitialized(Tab tab, @Nullable String appId);
 
     /**
      * Called when a {@link Tab} is shown.
@@ -106,11 +107,12 @@
 
     /**
      * Called when the favicon of a {@link Tab} has been updated.
+     *
      * @param tab The notifying {@link Tab}.
      * @param icon The favicon that was received.
      * @param iconUrl The URL that the icon was fetched from.
      */
-    void onFaviconUpdated(Tab tab, Bitmap icon, GURL iconUrl);
+    void onFaviconUpdated(Tab tab, @Nullable Bitmap icon, @Nullable GURL iconUrl);
 
     /**
      * Called when the title of a {@link Tab} changes.
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java
index d5ae5fb..280bda39 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java
@@ -45,7 +45,7 @@
 
     @Override
     public final void destroy() {
-        cleanupWebContents(mWebContents);
+        if (mWebContents != null) cleanupWebContents(mWebContents);
         destroyInternal();
     }
 
@@ -64,7 +64,8 @@
 
     /**
      * Called when {@link WebContents} gets swapped out.
+     *
      * @param webContents WebContents object that just became inactive.
      */
-    public abstract void cleanupWebContents(@Nullable WebContents webContents);
+    public abstract void cleanupWebContents(WebContents webContents);
 }
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelper.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelper.java
index 3c359ee..9a24532 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelper.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelper.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.tab_group_sync;
 
+import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.tab.Tab;
@@ -92,12 +93,16 @@
 
     private void closeDeletedGroupsFromTabModel() {
         LogUtils.log(TAG, "closeDeletedGroupsFromTabModel");
+        int tabGroupsClosed = 0;
         for (LocalTabGroupId tabGroupId : mTabGroupSyncService.getDeletedGroupIds()) {
             if (!TabGroupSyncUtils.isInCurrentWindow(mTabGroupModelFilter, tabGroupId)) continue;
 
             mLocalTabGroupMutationHelper.closeTabGroup(
                     tabGroupId, ClosingSource.CLEANED_UP_ON_STARTUP);
+            tabGroupsClosed++;
         }
+        RecordHistogram.recordCount1000Histogram(
+                "TabGroups.CloseTabGroupsDeletedRemotely", tabGroupsClosed);
     }
 
     /**
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelperUnitTest.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelperUnitTest.java
index 948f8ef5..6b1db67 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelperUnitTest.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelperUnitTest.java
@@ -27,6 +27,7 @@
 
 import org.chromium.base.Token;
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.HistogramWatcher;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
@@ -153,12 +154,16 @@
         List<LocalTabGroupId> deletedIds = new ArrayList<>();
         deletedIds.add(LOCAL_TAB_GROUP_ID_1);
         when(mTabGroupSyncService.getDeletedGroupIds()).thenReturn(deletedIds);
+        HistogramWatcher histogramExpectation =
+                HistogramWatcher.newSingleRecordWatcher(
+                        "TabGroups.CloseTabGroupsDeletedRemotely", 1);
 
         // Init. Deleted groups should be closed.
         mStartupHelper.initializeTabGroupSync();
         verify(mTabGroupSyncService).getDeletedGroupIds();
         verify(mLocalMutationHelper, atLeastOnce())
                 .closeTabGroup(eq(LOCAL_TAB_GROUP_ID_1), eq(ClosingSource.CLEANED_UP_ON_STARTUP));
+        histogramExpectation.assertExpected();
     }
 
     @Test
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserver.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserver.java
index 51877da..207e71dee 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserver.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserver.java
@@ -7,6 +7,7 @@
 import android.text.TextUtils;
 
 import org.chromium.base.Callback;
+import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.supplier.Supplier;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
@@ -135,6 +136,7 @@
 
         mEnableLocalObserverCallback.onResult(false);
         mLocalTabGroupMutationHelper.closeTabGroup(localId, ClosingSource.DELETED_FROM_SYNC);
+        RecordHistogram.recordCount1000Histogram("TabGroups.CloseTabGroupsDeletedRemotely", 1);
         mEnableLocalObserverCallback.onResult(true);
     }
 
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserverUnitTest.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserverUnitTest.java
index 991f601..2183a4b6 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserverUnitTest.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserverUnitTest.java
@@ -26,6 +26,7 @@
 import org.chromium.base.Token;
 import org.chromium.base.supplier.Supplier;
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.HistogramWatcher;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.MockTab;
@@ -193,15 +194,24 @@
     @Test
     public void testTabGroupRemoved() {
         addOneTab();
+        HistogramWatcher histogramExpectation =
+                HistogramWatcher.newSingleRecordWatcher(
+                        "TabGroups.CloseTabGroupsDeletedRemotely", 1);
         mRemoteObserver.onTabGroupRemoved(LOCAL_TAB_GROUP_ID_1, TriggerSource.REMOTE);
         verify(mLocalMutationHelper).closeTabGroup(any(), eq(ClosingSource.DELETED_FROM_SYNC));
+        histogramExpectation.assertExpected();
     }
 
     @Test
     public void testTabGroupRemovedForDifferentWindow() {
         addOneTab();
+        HistogramWatcher histogramExpectation =
+                HistogramWatcher.newBuilder()
+                        .expectNoRecords("TabGroups.CloseTabGroupsDeletedRemotely")
+                        .build();
         mRemoteObserver.onTabGroupRemoved(LOCAL_TAB_GROUP_ID_2, TriggerSource.REMOTE);
         verify(mLocalMutationHelper, never()).closeTabGroup(any(), anyInt());
+        histogramExpectation.assertExpected();
     }
 
     @Test
diff --git a/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabContentManager.java b/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabContentManager.java
index 918d499c..d2a2b19 100644
--- a/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabContentManager.java
+++ b/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabContentManager.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.tab_ui;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import static java.lang.Math.min;
 
 import android.content.Context;
@@ -239,6 +241,7 @@
         if (nativePage == null && !isNativeViewShowing) {
             return null;
         }
+        assumeNonNull(nativePage);
 
         View viewToDraw = null;
         if (isNativeViewShowing) {
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java
index be63c41..b3b6191c 100644
--- a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java
+++ b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java
@@ -18,6 +18,7 @@
 import org.chromium.chrome.browser.fullscreen.FullscreenManager;
 import org.chromium.chrome.browser.layouts.LayoutManager;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeUtils.EdgeToEdgeDebuggingInfo;
 import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgeManager;
 import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgePadAdjuster;
 import org.chromium.components.browser_ui.edge_to_edge.SystemBarColorHelper;
@@ -40,8 +41,8 @@
      * @param windowAndroid The current {@link WindowAndroid} to allow drawing under System Bars.
      * @param tabObservableSupplier Supplies an {@Link Observer} that is notified whenever the Tab
      *     changes.
-     * @param edgeToEdgeStateProvider Provides the edge-to-edge state and allows for requests to
-     *     draw edge-to-edge.
+     * @param edgeToEdgeManager Provides the edge-to-edge state and allows for requests to draw
+     *     edge-to-edge.
      * @param browserControlsStateProvider Provides the state of the BrowserControls so we can tell
      *     if the Toolbar is changing.
      * @param layoutManagerSupplier The supplier of {@link LayoutManager} for checking the active
@@ -57,7 +58,8 @@
             EdgeToEdgeManager edgeToEdgeManager,
             BrowserControlsStateProvider browserControlsStateProvider,
             ObservableSupplier<LayoutManager> layoutManagerSupplier,
-            FullscreenManager fullscreenManager) {
+            FullscreenManager fullscreenManager,
+            EdgeToEdgeDebuggingInfo edgeToEdgeDebuggingInfo) {
         if (Build.VERSION.SDK_INT < VERSION_CODES.R) return null;
         assert EdgeToEdgeUtils.isEdgeToEdgeBottomChinEnabled(activity);
         return new EdgeToEdgeControllerImpl(
@@ -68,7 +70,8 @@
                 edgeToEdgeManager,
                 browserControlsStateProvider,
                 layoutManagerSupplier,
-                fullscreenManager);
+                fullscreenManager,
+                edgeToEdgeDebuggingInfo);
     }
 
     /**
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java
index 067aead..42c6eab3 100644
--- a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java
+++ b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java
@@ -40,6 +40,7 @@
 import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgeManager;
 import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgePadAdjuster;
 import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgeStateProvider;
+import org.chromium.content_public.browser.Page;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.WebContentsObserver;
 import org.chromium.ui.base.WindowAndroid;
@@ -156,6 +157,7 @@
     private @Nullable WebContentsObserver mWebContentsObserver;
 
     private boolean mIsBottomChinEnabled;
+    private final EdgeToEdgeUtils.EdgeToEdgeDebuggingInfo mEdgeToEdgeDebuggingInfo;
 
     /**
      * Whether the system is drawing "toEdge" (i.e. the edge-to-edge wrapper has no bottom padding).
@@ -211,13 +213,15 @@
             EdgeToEdgeManager edgeToEdgeManager,
             BrowserControlsStateProvider browserControlsStateProvider,
             ObservableSupplier<LayoutManager> layoutManagerSupplier,
-            FullscreenManager fullscreenManager) {
+            FullscreenManager fullscreenManager,
+            EdgeToEdgeUtils.EdgeToEdgeDebuggingInfo edgeToEdgeDebuggingInfo) {
         mActivity = activity;
         mWindowAndroid = windowAndroid;
         mEdgeToEdgeManager = edgeToEdgeManager;
         mPxToDp = 1.f / mActivity.getResources().getDisplayMetrics().density;
         mDisablePaddingRootView = EdgeToEdgeUtils.isEdgeToEdgeEverywhereEnabled();
         mIsBottomChinEnabled = EdgeToEdgeUtils.isEdgeToEdgeBottomChinEnabled(activity);
+        mEdgeToEdgeDebuggingInfo = edgeToEdgeDebuggingInfo;
 
         mEdgeToEdgeOsWrapper =
                 edgeToEdgeOsWrapper == null && !mDisablePaddingRootView
@@ -436,6 +440,18 @@
                             observer.onSafeAreaConstraintChanged(mHasSafeAreaConstraint);
                         }
                     }
+
+                    @Override
+                    public void firstContentfulPaintInPrimaryMainFrame(Page page) {
+                        if (mEdgeToEdgeDebuggingInfo.isUsed()) return;
+                        mEdgeToEdgeDebuggingInfo.addToDebugReport(
+                                "EdgeToEdgeController->firstContentfulPaintInPrimaryMainFrame",
+                                true,
+                                EdgeToEdgeUtils.isEdgeToEdgeBottomChinEnabled(mActivity),
+                                mActivity.getWindow(),
+                                mWindowAndroid);
+                        mEdgeToEdgeDebuggingInfo.uploadReport();
+                    }
                 };
     }
 
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java b/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java
index 9656122..534bcd75 100644
--- a/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java
+++ b/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java
@@ -70,6 +70,7 @@
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabObserver;
 import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeControllerImpl.SupportedConfigurationSwitch;
+import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeUtils.EdgeToEdgeDebuggingInfo;
 import org.chromium.chrome.browser.ui.native_page.NativePage;
 import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgeManager;
 import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgePadAdjuster;
@@ -176,6 +177,7 @@
     @Mock private BrowserControlsStateProvider mBrowserControlsStateProvider;
     @Mock private LayoutManager mLayoutManager;
     @Mock private FullscreenManager mFullscreenManager;
+    @Mock private EdgeToEdgeDebuggingInfo mEdgeToEdgeDebuggingInfo;
 
     @Implements(EdgeToEdgeControllerFactory.class)
     static class ShadowEdgeToEdgeControllerFactory extends EdgeToEdgeControllerFactory {
@@ -236,7 +238,8 @@
                         mEdgeToEdgeManager,
                         mBrowserControlsStateProvider,
                         mLayoutManagerSupplier,
-                        mFullscreenManager);
+                        mFullscreenManager,
+                        mEdgeToEdgeDebuggingInfo);
         verify(mEdgeToEdgeStateProvider, times(1)).acquireSetDecorFitsSystemWindowToken();
 
         if (!EdgeToEdgeUtils.isEdgeToEdgeEverywhereEnabled()) {
@@ -447,7 +450,8 @@
                                 mEdgeToEdgeManager,
                                 mBrowserControlsStateProvider,
                                 mLayoutManagerSupplier,
-                                mFullscreenManager);
+                                mFullscreenManager,
+                                null);
         assertNotNull(liveController);
         liveController.setIsOptedIntoEdgeToEdgeForTesting(true);
         liveController.setIsDrawingToEdgeForTesting(true);
@@ -1123,6 +1127,20 @@
                 EdgeToEdgeUtils.hasTappableNavigationBar(window));
     }
 
+    @Test
+    public void firstContentfulPaint_uploadDebuggingReport() {
+        // Standard setup of a Web Tab ToEdge
+        when(mTab.isNativePage()).thenReturn(false);
+        mTabProvider.set(mTab);
+        verifyInteractions(mTab);
+
+        WebContentsObserver webContentsObserver =
+                mEdgeToEdgeControllerImpl.getWebContentsObserver();
+        assertNotNull(webContentsObserver);
+        webContentsObserver.firstContentfulPaintInPrimaryMainFrame(null);
+        verify(mEdgeToEdgeDebuggingInfo).uploadReport();
+    }
+
     void assertToEdgeExpectations() {
         // Pad the top only, bottom is ToEdge.
         verify(mOsWrapper, atLeastOnce())
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeDebuggingInfoTest.java b/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeDebuggingInfoTest.java
index ef7562a2..90e977f 100644
--- a/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeDebuggingInfoTest.java
+++ b/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeDebuggingInfoTest.java
@@ -57,7 +57,7 @@
     @Mock private Window mWindow;
     @Mock private View mDecorView;
 
-    private final EdgeToEdgeDebuggingInfo mEdgeToEdgeDebuggingInfo = new EdgeToEdgeDebuggingInfo();
+    private EdgeToEdgeDebuggingInfo mEdgeToEdgeDebuggingInfo;
     private final PayloadCallbackHelper<String> mCrashUploadCallback =
             new PayloadCallbackHelper<>();
 
@@ -65,18 +65,19 @@
     public void setUp() {
         EdgeToEdgeUtils.setObservedTappableNavigationBarForTesting(false);
         doReturn(mDecorView).when(mWindow).getDecorView();
+        mEdgeToEdgeDebuggingInfo = new EdgeToEdgeDebuggingInfo(mCrashUploadCallback::notifyCalled);
     }
 
     @Test
     public void withValidGestureNavBarInsets() {
         setupMockWindowInsets(NAV_BAR_ONLY_INSETS);
-        mEdgeToEdgeDebuggingInfo.buildDebugReport(
-                mWindow,
-                /* windowAndroid= */ null,
+        mEdgeToEdgeDebuggingInfo.addToDebugReport(
+                "callSite",
                 /* hasEdgeToEdgeController= */ true,
                 /* isSupportedConfiguration= */ true,
-                "callSite",
-                mCrashUploadCallback::notifyCalled);
+                mWindow,
+                /* windowAndroid= */ null);
+        mEdgeToEdgeDebuggingInfo.uploadReport();
 
         assertEquals(
                 "Configuration is not case of interests.", 0, mCrashUploadCallback.getCallCount());
@@ -86,13 +87,13 @@
     public void withValidTappableNavBarInsets() {
         // Case where controller is not created, window has consistent tappable nav bar insets.
         setupMockWindowInsets(NAV_BAR_TAPPABLE_INSETS);
-        mEdgeToEdgeDebuggingInfo.buildDebugReport(
-                mWindow,
-                /* windowAndroid= */ null,
+        mEdgeToEdgeDebuggingInfo.addToDebugReport(
+                "callSite",
                 /* hasEdgeToEdgeController= */ false,
                 /* isSupportedConfiguration= */ false,
-                "callSite",
-                mCrashUploadCallback::notifyCalled);
+                mWindow,
+                /* windowAndroid= */ null);
+        mEdgeToEdgeDebuggingInfo.uploadReport();
 
         assertEquals(
                 "Configuration is not case of interests.", 0, mCrashUploadCallback.getCallCount());
@@ -101,13 +102,13 @@
     @Test
     public void invalidTappableNavBarInsets() {
         setupMockWindowInsets(NAV_BAR_TAPPABLE_INSETS);
-        mEdgeToEdgeDebuggingInfo.buildDebugReport(
-                mWindow,
-                /* windowAndroid= */ null,
+        mEdgeToEdgeDebuggingInfo.addToDebugReport(
+                "callSite",
                 /* hasEdgeToEdgeController= */ true,
                 /* isSupportedConfiguration= */ false,
-                "callSite",
-                mCrashUploadCallback::notifyCalled);
+                mWindow,
+                /* windowAndroid= */ null);
+        mEdgeToEdgeDebuggingInfo.uploadReport();
 
         assertEquals(
                 "Configuration is a case of interests.", 1, mCrashUploadCallback.getCallCount());
@@ -118,13 +119,13 @@
     public void emptyTappableNavBarInsets() {
         setupMockWindowInsets(EMPTY_NAV_BAR_INSETS);
         mEdgeToEdgeDebuggingInfo.setMissingNavBarInsetsReason(MissingNavbarInsetsReason.OTHER);
-        mEdgeToEdgeDebuggingInfo.buildDebugReport(
-                mWindow,
-                /* windowAndroid= */ null,
+        mEdgeToEdgeDebuggingInfo.addToDebugReport(
+                "callSite",
                 /* hasEdgeToEdgeController= */ true,
                 /* isSupportedConfiguration= */ true,
-                "callSite",
-                mCrashUploadCallback::notifyCalled);
+                mWindow,
+                /* windowAndroid= */ null);
+        mEdgeToEdgeDebuggingInfo.uploadReport();
 
         assertEquals(
                 "Report when nav bar insets are empty at controller creation.",
diff --git a/chrome/browser/ui/android/edge_to_edge/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeUtils.java b/chrome/browser/ui/android/edge_to_edge/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeUtils.java
index 6016e88..91fa69c 100644
--- a/chrome/browser/ui/android/edge_to_edge/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeUtils.java
+++ b/chrome/browser/ui/android/edge_to_edge/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeUtils.java
@@ -490,50 +490,59 @@
     public static class EdgeToEdgeDebuggingInfo {
         boolean mHasUploaded;
         @Nullable @MissingNavbarInsetsReason Integer mMissingNavBarReason;
+        @Nullable String mUploadMessage;
+        final Callback<String> mReportUploadCallback;
 
         /**
-         * Gather the current debug information
+         * Create an EdgeToEdgeDebuggingInfo for logging info useful to debugging edge-to-edge
+         * issues.
          *
-         * @param window The current window.
-         * @param windowAndroid The window android of the activity.
-         * @param hasEdgeToEdgeController Whether the activity has an EdgeToEdgeController.
-         * @param isSupportedConfiguration Whether the activity supports for edge-to-edge.
-         * @param callSite The call site of the debugging info.
          * @param reportUploadCallback The callback to update debugging report.
          */
-        public void buildDebugReport(
-                @Nullable Window window,
-                @Nullable WindowAndroid windowAndroid,
+        public EdgeToEdgeDebuggingInfo(Callback<String> reportUploadCallback) {
+            mReportUploadCallback = reportUploadCallback;
+        }
+
+        /**
+         * Add to the current debug information
+         *
+         * @param callSite The call site of the debugging info.
+         * @param hasEdgeToEdgeController Whether the activity has an EdgeToEdgeController.
+         * @param isSupportedConfiguration Whether the activity supports for edge-to-edge.
+         * @param window The current window.
+         * @param windowAndroid The window android of the activity.
+         */
+        public void addToDebugReport(
+                String callSite,
                 boolean hasEdgeToEdgeController,
                 boolean isSupportedConfiguration,
-                String callSite,
-                Callback<String> reportUploadCallback) {
+                @Nullable Window window,
+                @Nullable WindowAndroid windowAndroid) {
             if (mHasUploaded || !ChromeFeatureList.sEdgeToEdgeDebugging.isEnabled()) return;
-
             if (!isCaseOfInterests(hasEdgeToEdgeController, window)) return;
 
-            String missingNavbarReasonString =
-                    mMissingNavBarReason != null ? String.valueOf(mMissingNavBarReason) : "null";
-            String state =
-                    "EdgeToEdgeDebugging: callSite: "
-                            + callSite
-                            + " \nEdgeToEdgeController hasValue: "
-                            + hasEdgeToEdgeController
-                            + " \nisSupportedConfiguration: "
-                            + isSupportedConfiguration
-                            + " \nedgeToEdgeEverywhere: "
-                            + EdgeToEdgeUtils.isEdgeToEdgeEverywhereEnabled()
-                            + " \nobservedTappableNavigationBar: "
-                            + sObservedTappableNavigationBar
-                            + " \nmissingNavBarReason: "
-                            + missingNavbarReasonString;
+            if (mUploadMessage == null) {
+                mUploadMessage =
+                        "EdgeToEdgeDebugging:"
+                                + " \nedgeToEdgeEverywhere: "
+                                + EdgeToEdgeUtils.isEdgeToEdgeEverywhereEnabled()
+                                + " \nmissingNavBarReason: "
+                                + mMissingNavBarReason;
+            }
 
+            String hasSeenNonZeroNavBar = "";
             String rawWindowInsetsIndicateGestureNav = "";
             String rawWindowInsetsState = "";
             String rawWindowInsetsIgnoringVisibilityState = "";
             String rawWindowInsetsTappableState = "";
-            String rawWindowInsetsStateSystemGestures = "";
+            String rawWindowInsetsSystemGesturesState = "";
             if (windowAndroid != null && windowAndroid.getInsetObserver() != null) {
+                hasSeenNonZeroNavBar =
+                        " \nhasSeenNonZeroNavBar: "
+                                + windowAndroid
+                                        .getInsetObserver()
+                                        .hasSeenNonZeroNavigationBarInsets();
+
                 var lastRawWindowInsets = windowAndroid.getInsetObserver().getLastRawWindowInsets();
                 var gestureNavString =
                         lastRawWindowInsets == null
@@ -580,14 +589,13 @@
                                         .getInsetsIgnoringVisibility(
                                                 WindowInsetsCompat.Type.systemGestures())
                                         .toString();
-                rawWindowInsetsStateSystemGestures =
+                rawWindowInsetsSystemGesturesState =
                         " \nlastRawWindowInsets systemGestures: " + systemGesturesInsetsString;
             }
 
             String windowMetricsIndicateGestureNav = "";
             String windowMetricsInsetsState = "";
             String windowMetricsInsetsStateTappable = "";
-            String windowMetricsInsetsStateMandatoryGestures = "";
             String windowMetricsInsetsStateSystemGestures = "";
             if (Build.VERSION.SDK_INT >= VERSION_CODES.R) {
                 if (window != null
@@ -623,18 +631,6 @@
                     windowMetricsInsetsStateTappable =
                             " \nwindowMetricsInsetsTappable: " + insetsStringTappable;
 
-                    var insetsStringMandatoryGestures =
-                            windowInsets == null
-                                    ? "null"
-                                    : windowInsets
-                                            .getInsets(
-                                                    WindowInsetsCompat.Type
-                                                            .mandatorySystemGestures())
-                                            .toString();
-                    windowMetricsInsetsStateMandatoryGestures =
-                            " \nwindowMetricsInsetsMandatoryGestures: "
-                                    + insetsStringMandatoryGestures;
-
                     var insetsStringSystemGestures =
                             windowInsets == null
                                     ? "null"
@@ -645,21 +641,33 @@
                             " \nwindowMetricsInsetsSystemGestures: " + insetsStringSystemGestures;
                 }
             }
-
-            // Ensure report is only sent once.
-            mHasUploaded = true;
-            reportUploadCallback.onResult(
-                    state
+            mUploadMessage +=
+                    "\n\ncallSite: "
+                            + callSite
+                            + hasSeenNonZeroNavBar
+                            + "\nisSupportedConfiguration: "
+                            + isSupportedConfiguration
+                            + " \nobservedTappableNavigationBar: "
+                            + sObservedTappableNavigationBar
                             + rawWindowInsetsIndicateGestureNav
                             + rawWindowInsetsState
                             + rawWindowInsetsIgnoringVisibilityState
                             + rawWindowInsetsTappableState
-                            + rawWindowInsetsStateSystemGestures
+                            + rawWindowInsetsSystemGesturesState
                             + windowMetricsIndicateGestureNav
                             + windowMetricsInsetsState
                             + windowMetricsInsetsStateTappable
-                            + windowMetricsInsetsStateMandatoryGestures
-                            + windowMetricsInsetsStateSystemGestures);
+                            + windowMetricsInsetsStateSystemGestures;
+        }
+
+        /** Uploads the current report. */
+        public void uploadReport() {
+            if (mHasUploaded || !ChromeFeatureList.sEdgeToEdgeDebugging.isEnabled()) return;
+            if (mUploadMessage == null) return;
+
+            // Ensure report is only sent once.
+            mHasUploaded = true;
+            mReportUploadCallback.onResult(mUploadMessage);
         }
 
         /** Returns whether the the instance has uploaded any report. */
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
index e54aec7f..184a026 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.omnibox.suggestions;
 
+
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Resources;
@@ -639,8 +640,9 @@
         // When invoked directly from a browser, we want to trigger switch to tab animation.
         // If invoked from other activities, ex. searchActivity, we do not need to trigger the
         // animation since Android will show the animation for switching apps.
-        if (tab.getWindowAndroid().getActivityState() == ActivityState.STOPPED
-                || tab.getWindowAndroid().getActivityState() == ActivityState.DESTROYED) {
+        WindowAndroid windowAndroid = tab.getWindowAndroidChecked();
+        if (windowAndroid.getActivityState() == ActivityState.STOPPED
+                || windowAndroid.getActivityState() == ActivityState.DESTROYED) {
             mBringTabToFrontCallback.onResult(tab);
             return true;
         }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java
index 02f8c17..9f0d1cc 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java
@@ -954,7 +954,7 @@
         // We have a tab, and tab manager. The tab is part of the stopped activity.
         doReturn(mTab).when(mAutocompleteController).getMatchingTabForSuggestion(any());
         mTabWindowManagerSupplier.set(mTabManager);
-        doReturn(mMockWindowAndroid).when(mTab).getWindowAndroid();
+        doReturn(mMockWindowAndroid).when(mTab).getWindowAndroidChecked();
         doReturn(ActivityState.STOPPED).when(mMockWindowAndroid).getActivityState();
         assertTrue(mMediator.maybeSwitchToTab(null));
     }
@@ -969,7 +969,7 @@
         // https://crbug.com/1300447
         doReturn(mTab).when(mAutocompleteController).getMatchingTabForSuggestion(any());
         mTabWindowManagerSupplier.set(mTabManager);
-        doReturn(mMockWindowAndroid).when(mTab).getWindowAndroid();
+        doReturn(mMockWindowAndroid).when(mTab).getWindowAndroidChecked();
         doReturn(ActivityState.RESUMED).when(mMockWindowAndroid).getActivityState();
         doReturn(null).when(mTabManager).getTabModelForTab(any());
         assertFalse(mMediator.maybeSwitchToTab(null));
@@ -985,7 +985,7 @@
         // https://crbug.com/1300447
         doReturn(mTab).when(mAutocompleteController).getMatchingTabForSuggestion(any());
         mTabWindowManagerSupplier.set(mTabManager);
-        doReturn(mMockWindowAndroid).when(mTab).getWindowAndroid();
+        doReturn(mMockWindowAndroid).when(mTab).getWindowAndroidChecked();
         doReturn(ActivityState.RESUMED).when(mMockWindowAndroid).getActivityState();
         doReturn(mTabModel).when(mTabManager).getTabModelForTab(any());
 
@@ -1004,7 +1004,7 @@
         // The tab reports association with an existing model; the model confirms this.
         doReturn(mTab).when(mAutocompleteController).getMatchingTabForSuggestion(any());
         mTabWindowManagerSupplier.set(mTabManager);
-        doReturn(mMockWindowAndroid).when(mTab).getWindowAndroid();
+        doReturn(mMockWindowAndroid).when(mTab).getWindowAndroidChecked();
         doReturn(ActivityState.RESUMED).when(mMockWindowAndroid).getActivityState();
         doReturn(mTabModel).when(mTabManager).getTabModelForTab(any());
         doReturn(1).when(mTabModel).getCount();
diff --git a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfUtils.java b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfUtils.java
index 0506a50..3208fda 100644
--- a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfUtils.java
+++ b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfUtils.java
@@ -176,7 +176,7 @@
      * @param nativePage The NativePage being used to retrieve pdf information.
      * @return Pdf information including filename, filepath etc.
      */
-    public static @Nullable PdfInfo getPdfInfo(NativePage nativePage) {
+    public static @Nullable PdfInfo getPdfInfo(@Nullable NativePage nativePage) {
         if (nativePage == null || !nativePage.isPdf()) {
             return null;
         }
@@ -223,7 +223,7 @@
     }
 
     /** Return the type of the pdf page. */
-    public static @PdfPageType int getPdfPageType(NativePage pdfPage) {
+    public static @PdfPageType int getPdfPageType(@Nullable NativePage pdfPage) {
         if (pdfPage == null || !pdfPage.isPdf()) {
             return PdfPageType.NONE;
         }
@@ -281,7 +281,7 @@
      * @param nativePage When the native page is a pdf page, record whether it is frozen before the
      *     tab is displayed.
      */
-    public static void recordIsPdfFrozen(NativePage nativePage) {
+    public static void recordIsPdfFrozen(@Nullable NativePage nativePage) {
         if (nativePage == null) {
             return;
         }
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index 669be14f..6807fa4 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -1131,6 +1131,12 @@
       <message name="IDS_CONTEXTUAL_SEARCH_SEE_BETTER_RESULTS_SUMMARY" desc="Summary for the see better results switch in Contextual Search preference.">
         By including more of a page’s text, you might see better results
       </message>
+      <message name="IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT" desc="The text for a button, which when pressed opens the latest search results for the currently selected text.">
+        Latest results
+      </message>
+      <message name="IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT_VARIANT" desc="The text for a button, which when pressed allows the user to see more information about the currently selected text.">
+        See more
+      </message>
       <message name="IDS_DO_NOT_TRACK_TITLE" desc="Title for the 'Do Not Track' preference. Please leave the 'Do Not Track' part in English according to the glossary.">
         Send a “Do Not Track” request
       </message>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT.png.sha1
new file mode 100644
index 0000000..6374ab2
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT.png.sha1
@@ -0,0 +1 @@
+6bde8bd2623645db4c7bb139360d8a3123f6f915
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT_VARIANT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT_VARIANT.png.sha1
new file mode 100644
index 0000000..effaa132
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT_VARIANT.png.sha1
@@ -0,0 +1 @@
+e71e73808b7735cd7472397de298b8a578d21ffe
\ No newline at end of file
diff --git a/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.cc b/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.cc
index faba73c..fd4d6fa 100644
--- a/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.cc
+++ b/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.cc
@@ -17,6 +17,9 @@
 // This JNI header is generated from TabCollectionTabModelImpl.java.
 #include "chrome/android/chrome_jni_headers/TabCollectionTabModelImpl_jni.h"
 
+using base::android::JavaParamRef;
+using base::android::ScopedJavaLocalRef;
+
 namespace tabs {
 
 namespace {
@@ -29,7 +32,7 @@
     Profile* profile)
     : java_object_(env, java_object),
       profile_(profile),
-      tab_strip_collection_(std::make_unique<tabs::TabStripCollection>()) {}
+      tab_strip_collection_(std::make_unique<TabStripCollection>()) {}
 
 TabCollectionTabModelImpl::~TabCollectionTabModelImpl() = default;
 
@@ -43,14 +46,14 @@
 
 int TabCollectionTabModelImpl::GetIndexOfTabRecursive(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& j_tab_android) const {
+    const JavaParamRef<jobject>& j_tab_android) const {
   TabAndroid* target_tab = TabAndroid::GetNativeTab(env, j_tab_android);
   if (!target_tab) {
     return kInvalidTabIndex;
   }
 
   int current_index = 0;
-  for (tabs::TabInterface* tab_in_collection : *tab_strip_collection_) {
+  for (TabInterface* tab_in_collection : *tab_strip_collection_) {
     if (tab_in_collection == target_tab) {
       return current_index;
     }
@@ -59,13 +62,24 @@
   return kInvalidTabIndex;
 }
 
+ScopedJavaLocalRef<jobject> TabCollectionTabModelImpl::GetTabAtIndexRecursive(
+    JNIEnv* env,
+    size_t index) const {
+  if (index >= tab_strip_collection_->TabCountRecursive()) {
+    return ScopedJavaLocalRef<jobject>();
+  }
+  TabInterface* tab = tab_strip_collection_->GetTabAtIndexRecursive(index);
+  TabAndroid* tab_android = static_cast<TabAndroid*>(tab);
+  return tab_android->GetJavaObject();
+}
+
 static jlong JNI_TabCollectionTabModelImpl_Init(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& j_java_object,
-    const base::android::JavaParamRef<jobject>& j_profile) {
+    const JavaParamRef<jobject>& j_java_object,
+    const JavaParamRef<jobject>& j_profile) {
   Profile* profile = Profile::FromJavaObject(j_profile);
-  tabs::TabCollectionTabModelImpl* tab_collection_tab_model_impl =
-      new tabs::TabCollectionTabModelImpl(env, j_java_object, profile);
+  TabCollectionTabModelImpl* tab_collection_tab_model_impl =
+      new TabCollectionTabModelImpl(env, j_java_object, profile);
   return reinterpret_cast<intptr_t>(tab_collection_tab_model_impl);
 }
 
diff --git a/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.h b/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.h
index 51ce4ca..14efc8f4 100644
--- a/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.h
+++ b/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.h
@@ -41,6 +41,11 @@
       JNIEnv* env,
       const jni_zero::JavaParamRef<jobject>& j_tab_android) const;
 
+  // Recurses until reaching the given index. Returns null if not found.
+  base::android::ScopedJavaLocalRef<jobject> GetTabAtIndexRecursive(
+      JNIEnv* env,
+      size_t index) const;
+
  private:
   JavaObjectWeakGlobalRef java_object_;
   raw_ptr<Profile> profile_;
diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java
index b2b2dce..b03b729 100644
--- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java
+++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.theme;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.graphics.Color;
@@ -45,7 +47,7 @@
      * @return The background color of {@link Tab}.
      */
     public static @ColorInt int getBackgroundColor(Tab tab) {
-        if (tab.isNativePage()) return tab.getNativePage().getBackgroundColor();
+        if (tab.isNativePage()) return assumeNonNull(tab.getNativePage()).getBackgroundColor();
 
         WebContents tabWebContents = tab.getWebContents();
         RenderWidgetHostView rwhv =
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/TranslateToolbarButtonController.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/TranslateToolbarButtonController.java
index e872382..1894f7f 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/TranslateToolbarButtonController.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/TranslateToolbarButtonController.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.toolbar.adaptive;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 import android.view.View;
@@ -80,7 +82,7 @@
     protected boolean shouldShowButton(@Nullable Tab tab) {
         if (tab == null) return false;
         if (!super.shouldShowButton(tab)) return false;
-        if (tab.isNativePage() && tab.getNativePage().isPdf()) return false;
+        if (tab.isNativePage() && assumeNonNull(tab.getNativePage()).isPdf()) return false;
         return UrlUtilities.isHttpOrHttps(tab.getUrl());
     }
 }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediatorTest.java
index c05a7ffc..dd4d246 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediatorTest.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediatorTest.java
@@ -169,7 +169,8 @@
                         mEdgeToEdgeManager,
                         mBrowserControlsStateProvider,
                         new ObservableSupplierImpl<>(mLayoutManager),
-                        mFullscreenManager);
+                        mFullscreenManager,
+                        null);
         BottomControlsMediator plainMediator =
                 new BottomControlsMediator(
                         mWindowAndroid,
@@ -201,7 +202,8 @@
                         mEdgeToEdgeManager,
                         mBrowserControlsStateProvider,
                         new ObservableSupplierImpl<>(mLayoutManager),
-                        mFullscreenManager);
+                        mFullscreenManager,
+                        null);
         new BottomControlsMediator(
                 mWindowAndroid,
                 mModel,
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java
index d4b3630c5..846f5684 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.toolbar.load_progress;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import org.chromium.base.MathUtils;
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.build.annotations.NullMarked;
@@ -83,7 +85,8 @@
                                                 tab.getUrl(),
                                                 tab.isIncognito(),
                                                 tab.isNativePage()
-                                                        && tab.getNativePage().isPdf())) {
+                                                        && assumeNonNull(tab.getNativePage())
+                                                                .isPdf())) {
                                     return;
                                 }
 
@@ -135,7 +138,7 @@
             if (NativePage.isNativePageUrl(
                     tab.getUrl(),
                     tab.isIncognito(),
-                    tab.isNativePage() && tab.getNativePage().isPdf())) {
+                    tab.isNativePage() && assumeNonNull(tab.getNativePage()).isPdf())) {
                 finishLoadProgress(false);
             } else {
                 startLoadProgress();
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.cc b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.cc
index 7e143aba..0446063 100644
--- a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.cc
+++ b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.cc
@@ -40,19 +40,24 @@
     }
     return;
   }
-  DCHECK(sharesheet_bubble_view_owned_);
+  CHECK(sharesheet_bubble_view_owned_);
   // The BubbleView gives its own ownership to the widget in ShowBubble(), so we
-  // relinquish our ownership here.
+  // relinquish our ownership here. Unratinaed is safe because this object will
+  // be deleted after the widget is deleted.
   sharesheet_bubble_view_owned_.release()->ShowBubble(
       std::move(targets), std::move(intent), std::move(delivered_callback),
-      std::move(close_callback));
+      base::BindOnce(&SharesheetBubbleViewDelegate::OnClose,
+                     base::Unretained(this), std::move(close_callback)));
 }
 
 void SharesheetBubbleViewDelegate::ShowNearbyShareBubbleForArc(
     apps::IntentPtr intent,
     ::sharesheet::DeliveredCallback delivered_callback,
     ::sharesheet::CloseCallback close_callback) {
-  if (IsBubbleVisible()) {
+  if (!sharesheet_bubble_view_owned_) {
+    if (!IsBubbleVisible()) {
+      sharesheet_bubble_view_->GetWidget()->Show();
+    }
     if (delivered_callback) {
       std::move(delivered_callback)
           .Run(::sharesheet::SharesheetResult::kErrorAlreadyOpen);
@@ -62,12 +67,13 @@
     }
     return;
   }
-  DCHECK(sharesheet_bubble_view_owned_);
+  CHECK(sharesheet_bubble_view_owned_);
   // The BubbleView gives its own ownership to the widget in
   // ShowNearbyShareBubbleForArc(), so we relinquish our ownership here.
   sharesheet_bubble_view_owned_.release()->ShowNearbyShareBubbleForArc(
       std::move(intent), std::move(delivered_callback),
-      std::move(close_callback));
+      base::BindOnce(&SharesheetBubbleViewDelegate::OnClose,
+                     base::Unretained(this), std::move(close_callback)));
 }
 
 void SharesheetBubbleViewDelegate::OnActionLaunched(bool has_action_view) {
@@ -100,11 +106,20 @@
 }
 
 bool SharesheetBubbleViewDelegate::IsBubbleVisible() const {
-  DCHECK(sharesheet_bubble_view_);
+  CHECK(sharesheet_bubble_view_);
   return sharesheet_bubble_view_->GetWidget() &&
          sharesheet_bubble_view_->GetWidget()->IsVisible();
 }
 
+void SharesheetBubbleViewDelegate::OnClose(
+    ::sharesheet::CloseCallback close_callback,
+    views::Widget::ClosedReason reason) {
+  if (close_callback) {
+    std::move(close_callback).Run(reason);
+  }
+  sharesheet_bubble_view_ = nullptr;
+}
+
 SharesheetBubbleView* SharesheetBubbleViewDelegate::GetBubbleViewForTesting() {
   return sharesheet_bubble_view_;
 }
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.h b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.h
index 4d1c881..885276f 100644
--- a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.h
+++ b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.h
@@ -53,6 +53,9 @@
   friend class SharesheetBubbleViewTest;
   friend class SharesheetBubbleViewNearbyShareBrowserTest;
 
+  void OnClose(::sharesheet::CloseCallback close_callback,
+               views::Widget::ClosedReason reason);
+
   SharesheetBubbleView* GetBubbleViewForTesting();
 
   std::unique_ptr<SharesheetBubbleView> sharesheet_bubble_view_owned_;
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_unittest.cc b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_unittest.cc
index 3cc193c..25898312 100644
--- a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_unittest.cc
+++ b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_unittest.cc
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "ash/frame/non_client_frame_view_ash.h"
+#include "ash/wm/window_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
@@ -40,6 +41,8 @@
 #include "ui/views/view.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_delegate.h"
+#include "ui/views/widget/widget_observer.h"
+#include "ui/wm/core/transient_window_manager.h"
 
 namespace {
 
@@ -69,7 +72,8 @@
   }
 };
 
-class SharesheetBubbleViewTest : public ChromeAshTestBase {
+class SharesheetBubbleViewTest : public ChromeAshTestBase,
+                                 public views::WidgetObserver {
  public:
   SharesheetBubbleViewTest() = default;
 
@@ -101,15 +105,19 @@
     if (bubble_delegate_) {
       bubble_delegate_->CloseBubble(::sharesheet::SharesheetResult::kCancel);
     }
-    ASSERT_FALSE(sharesheet_widget_);
+    ASSERT_FALSE(sharesheet_bubble_view_);
     ChromeAshTestBase::TearDown();
   }
 
+  ::sharesheet::SharesheetService* GetSharesheetService() {
+    return ::sharesheet::SharesheetServiceFactory::GetForProfile(
+        profile_.get());
+  }
+
   void ShowAndVerifyBubble(apps::IntentPtr intent,
                            ::sharesheet::LaunchSource source,
                            int num_actions_to_add = 0) {
-    ::sharesheet::SharesheetService* const sharesheet_service =
-        ::sharesheet::SharesheetServiceFactory::GetForProfile(profile_.get());
+    auto* sharesheet_service = GetSharesheetService();
     sharesheet_service->ShowBubbleForTesting(
         parent_window_, std::move(intent), source,
         /*delivered_callback=*/base::DoNothing(),
@@ -124,6 +132,8 @@
     EXPECT_NE(sharesheet_bubble_view_, nullptr);
     EXPECT_EQ(sharesheet_bubble_view_->GetID(), SHARESHEET_BUBBLE_VIEW_ID);
 
+    sharesheet_bubble_view_->GetWidget()->AddObserver(this);
+
     ASSERT_TRUE(bubble_delegate_->IsBubbleVisible());
     sharesheet_widget_ = sharesheet_bubble_view_->GetWidget();
     ASSERT_EQ(sharesheet_widget_->GetName(), "SharesheetBubbleView");
@@ -132,26 +142,29 @@
 
   void CloseBubble() {
     bubble_delegate_->CloseBubble(::sharesheet::SharesheetResult::kCancel);
-    ASSERT_FALSE(sharesheet_widget_);
+    ASSERT_FALSE(sharesheet_bubble_view_);
   }
 
   void CloseBubbleWithEscKey() {
     GetEventGenerator()->PressAndReleaseKey(ui::VKEY_ESCAPE);
-    ASSERT_FALSE(sharesheet_widget_);
+    ASSERT_FALSE(sharesheet_bubble_view_);
   }
 
-  bool IsSharesheetVisible() {
-    return sharesheet_widget_ && sharesheet_widget_->IsVisible();
-  }
+  bool IsSharesheetVisible() { return sharesheet_widget_->IsVisible(); }
 
   views::Widget* sharesheet_widget() { return sharesheet_widget_; }
 
   void OnClose(views::Widget::ClosedReason reason) {
     sharesheet_bubble_view_ = nullptr;
-    sharesheet_widget_ = nullptr;
     bubble_delegate_ = nullptr;
   }
 
+  // views::WidgetObserver::
+  void OnWidgetDestroyed(views::Widget* widget) override {
+    widget->RemoveObserver(this);
+    sharesheet_widget_ = nullptr;
+  }
+
   SharesheetBubbleView* sharesheet_bubble_view() {
     return sharesheet_bubble_view_;
   }
@@ -278,13 +291,15 @@
       ui::ScopedAnimationDurationScaleMode::SLOW_DURATION);
   GetEventGenerator()->PressAndReleaseKey(ui::VKEY_TAB);
   ASSERT_TRUE(targets_view->children()[0]->HasFocus());
+
+  // Wait for the widget to get destroyed.
+  views::test::WidgetDestroyedWaiter widget_observer(sharesheet_widget());
+
   GetEventGenerator()->PressAndReleaseKey(ui::VKEY_RETURN);
 
   // Click on copy target.
   Click(targets_view->children()[0]);
 
-  // Wait for the widget to get destroyed.
-  views::test::WidgetDestroyedWaiter widget_observer(sharesheet_widget());
   // Ensure the widget does close.
   widget_observer.Wait();
 
@@ -523,5 +538,37 @@
   ASSERT_FALSE(IsSharesheetVisible());
 }
 
+TEST_F(SharesheetBubbleViewTest, ReshowHiddenBubble) {
+  auto* sharesheet_service = GetSharesheetService();
+  auto app_window = CreateAppWindow();
+
+  auto* transient_window_manager =
+      ::wm::TransientWindowManager::GetIfExists(app_window.get());
+  EXPECT_EQ(0u, transient_window_manager->transient_children().size());
+
+  sharesheet_service->AddShareActionForTest(
+      ::sharesheet::ShareActionType::kNearbyShare);
+  sharesheet_service->ShowNearbyShareBubbleForArc(
+      app_window.get(), ::sharesheet::CreateValidTextIntent(),
+      ::sharesheet::LaunchSource::kUnknown, base::DoNothing(),
+      base::DoNothing(), base::DoNothing());
+  ASSERT_EQ(1u, transient_window_manager->transient_children().size());
+
+  auto* bubble_window = transient_window_manager->transient_children()[0].get();
+
+  window_util::MinimizeAndHideWithoutAnimation({app_window.get()});
+
+  EXPECT_FALSE(app_window->IsVisible());
+  EXPECT_FALSE(bubble_window->IsVisible());
+
+  // Reshowing the bubble shouldn't crash.
+  sharesheet_service->ShowNearbyShareBubbleForArc(
+      app_window.get(), ::sharesheet::CreateValidTextIntent(),
+      ::sharesheet::LaunchSource::kUnknown, base::DoNothing(),
+      base::DoNothing(), base::DoNothing());
+
+  EXPECT_TRUE(bubble_window->IsVisible());
+}
+
 }  // namespace sharesheet
 }  // namespace ash
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 79623d8..277cbd8 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -509,6 +509,16 @@
 ////////////////////////////////////////////////////////////////////////////////
 // Browser, CreateParams:
 
+BrowserWindowInterface* BrowserWindowInterface::FromSessionID(
+    const SessionID& session_id) {
+  for (Browser* browser : *BrowserList::GetInstance()) {
+    if (browser->GetSessionID() == session_id) {
+      return browser;
+    }
+  }
+  return nullptr;
+}
+
 Browser::CreateParams::CreateParams(Profile* profile, bool user_gesture)
     : CreateParams(TYPE_NORMAL, profile, user_gesture) {}
 
diff --git a/chrome/browser/ui/browser_window/browser_window_features.cc b/chrome/browser/ui/browser_window/browser_window_features.cc
index 78493406e..3f42b88e 100644
--- a/chrome/browser/ui/browser_window/browser_window_features.cc
+++ b/chrome/browser/ui/browser_window/browser_window_features.cc
@@ -389,6 +389,7 @@
   memory_saver_opt_in_iph_controller_.reset();
   lens_overlay_entry_point_controller_.reset();
   tab_search_toolbar_button_controller_.reset();
+  toast_service_.reset();
   extension_window_controller_.reset();
 
 #if BUILDFLAG(ENABLE_GLIC)
diff --git a/chrome/browser/ui/browser_window/public/browser_window_interface.h b/chrome/browser/ui/browser_window/public/browser_window_interface.h
index b9499d4..532b5723 100644
--- a/chrome/browser/ui/browser_window/public/browser_window_interface.h
+++ b/chrome/browser/ui/browser_window/public/browser_window_interface.h
@@ -98,6 +98,9 @@
   // The following methods will be removed in the future.
 
 #if !BUILDFLAG(IS_ANDROID)
+  // Returns nullptr if no browser window with the given session ID exists.
+  static BrowserWindowInterface* FromSessionID(const SessionID& session_id);
+
   // The contents of the active tab is rendered in a views::WebView. When the
   // active tab switches, the contents of the views::WebView is modified, but
   // the instance itself remains the same.
diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_client.cc b/chrome/browser/ui/omnibox/chrome_omnibox_client.cc
index 911c52c..a3e2207 100644
--- a/chrome/browser/ui/omnibox/chrome_omnibox_client.cc
+++ b/chrome/browser/ui/omnibox/chrome_omnibox_client.cc
@@ -834,6 +834,13 @@
   return std::nullopt;
 }
 
+void ChromeOmniboxClient::MaybePrewarmForDefaultSearchEngine() {
+  auto* prerender_manager = PrerenderManager::GetOrCreateForWebContents(
+      location_bar_->GetWebContents());
+  CHECK(prerender_manager);
+  prerender_manager->MaybeStartPrewarmSearchResult();
+}
+
 base::WeakPtr<OmniboxClient> ChromeOmniboxClient::AsWeakPtr() {
   return weak_factory_.GetWeakPtr();
 }
diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_client.h b/chrome/browser/ui/omnibox/chrome_omnibox_client.h
index 1156032..5fc63d2 100644
--- a/chrome/browser/ui/omnibox/chrome_omnibox_client.h
+++ b/chrome/browser/ui/omnibox/chrome_omnibox_client.h
@@ -124,6 +124,7 @@
   bool IsHistoryEmbeddingsEnabled() const override;
   std::optional<lens::proto::LensOverlaySuggestInputs>
   GetLensOverlaySuggestInputs() const override;
+  void MaybePrewarmForDefaultSearchEngine() override;
   base::WeakPtr<OmniboxClient> AsWeakPtr() override;
 
   // Update shortcuts when a navigation succeeds.
diff --git a/chrome/browser/ui/omnibox/omnibox_search_aggregator_browsertest.cc b/chrome/browser/ui/omnibox/omnibox_search_aggregator_browsertest.cc
index 74b9577..4c9059856 100644
--- a/chrome/browser/ui/omnibox/omnibox_search_aggregator_browsertest.cc
+++ b/chrome/browser/ui/omnibox/omnibox_search_aggregator_browsertest.cc
@@ -256,8 +256,9 @@
   }
 };
 
+// TODO(crbug.com/425120649) Flaky.
 IN_PROC_BROWSER_TEST_F(OmniboxSearchAggregatorSingleRequestTest,
-                       GoodJsonResponse) {
+                       DISABLED_GoodJsonResponse) {
   net::test_server::ControllableHttpResponse search_aggregator_response(
       embedded_test_server(), kSearchAggregatorPolicySuggestPath);
   ASSERT_TRUE(embedded_test_server()->Start());
@@ -333,8 +334,9 @@
       })));
 }
 
+// TODO(crbug.com/425120649): Flaky.
 IN_PROC_BROWSER_TEST_F(OmniboxSearchAggregatorTest,
-                       GoodJsonResponseMultipleRequests) {
+                       DISABLED_GoodJsonResponseMultipleRequests) {
   std::vector<std::unique_ptr<net::test_server::ControllableHttpResponse>>
       requests = {};
   for (size_t i = 0; i < 3; ++i) {
@@ -406,8 +408,9 @@
           })));
 }
 
+// TODO(crbug.com/425120649) Flaky.
 IN_PROC_BROWSER_TEST_F(OmniboxSearchAggregatorSingleRequestTest,
-                       RedirectedResponse) {
+                       DISABLED_RedirectedResponse) {
   net::test_server::ControllableHttpResponse redirect_response(
       embedded_test_server(), kSearchAggregatorPolicySuggestPath);
   const std::string redirected_path = "/suggest-redirect";
@@ -513,15 +516,10 @@
       search_aggregator_query_response_;
 };
 
-// TODO(crbug.com/421836646): Re-enable this test once the flakiness is
-// resolved.
-#if BUILDFLAG(IS_WIN)
-#define MAYBE_HTTPErrorResponse DISABLED_HTTPErrorResponse
-#else
-#define MAYBE_HTTPErrorResponse HTTPErrorResponse
-#endif
+// TODO(crbug.com/421836646): Flaky on `BUILDFLAG(IS_WIN)`
+// TODO(crbug.com/425120649): Flaky.
 IN_PROC_BROWSER_TEST_P(OmniboxSearchAggregatorHTTPErrorTest,
-                       MAYBE_HTTPErrorResponse) {
+                       DISABLED_HTTPErrorResponse) {
   AutocompleteInput input(
       kSearchInput, metrics::OmniboxEventProto::NTP,
       ChromeAutocompleteSchemeClassifier(browser()->profile()));
diff --git a/chrome/browser/ui/passwords/password_change_ui_controller.cc b/chrome/browser/ui/passwords/password_change_ui_controller.cc
index 48c3b2f..4ab50a2 100644
--- a/chrome/browser/ui/passwords/password_change_ui_controller.cc
+++ b/chrome/browser/ui/passwords/password_change_ui_controller.cc
@@ -149,7 +149,7 @@
   }
 
   // Close the toast before attempting to open any dialog.
-  CloseDialogWidget(views::Widget::ClosedReason::kUnspecified);
+  CloseToastWidget(views::Widget::ClosedReason::kUnspecified);
   ShowDialog(
       std::move(std::get<std::unique_ptr<ui::DialogModel>>(configuration)));
 }
diff --git a/chrome/browser/ui/tabs/BUILD.gn b/chrome/browser/ui/tabs/BUILD.gn
index 2aab74c..9c905f0 100644
--- a/chrome/browser/ui/tabs/BUILD.gn
+++ b/chrome/browser/ui/tabs/BUILD.gn
@@ -138,6 +138,7 @@
       "existing_tab_group_sub_menu_model.h",
       "existing_window_sub_menu_model.h",
       "recent_tabs_sub_menu_model.h",
+      "split_tab_menu_model.h",
       "tab_model.h",
     ]
 
@@ -172,6 +173,7 @@
       "existing_comparison_table_sub_menu_model.cc",
       "existing_tab_group_sub_menu_model.cc",
       "existing_window_sub_menu_model.cc",
+      "split_tab_menu_model.cc",
       "tab_model.cc",
     ]
 
@@ -267,7 +269,6 @@
       "pinned_tab_codec.h",
       "pinned_tab_service.h",
       "pinned_tab_service_factory.h",
-      "split_tab_menu_model.h",
       "split_tab_util.h",
       "tab_renderer_data.h",
       "tab_style.h",
@@ -317,7 +318,6 @@
       "pinned_tab_service.cc",
       "pinned_tab_service_factory.cc",
       "recent_tabs_sub_menu_model.cc",
-      "split_tab_menu_model.cc",
       "split_tab_util.cc",
       "tab_dialog_manager.cc",
       "tab_features.cc",
diff --git a/chrome/browser/ui/tabs/existing_base_sub_menu_model.h b/chrome/browser/ui/tabs/existing_base_sub_menu_model.h
index 3e05ec5..f55b15f 100644
--- a/chrome/browser/ui/tabs/existing_base_sub_menu_model.h
+++ b/chrome/browser/ui/tabs/existing_base_sub_menu_model.h
@@ -44,6 +44,7 @@
   static constexpr int kMinExistingWindowCommandId = 1001;
   static constexpr int kMinExistingTabGroupCommandId = 1301;
   static constexpr int kMinExistingComparisonTableCommandId = 1601;
+  static constexpr int kMinSplitTabMenuModelCommandId = 1701;
 
   ExistingBaseSubMenuModel(const ExistingBaseSubMenuModel&) = delete;
   ExistingBaseSubMenuModel& operator=(const ExistingBaseSubMenuModel&) = delete;
diff --git a/chrome/browser/ui/tabs/split_tab_menu_model.h b/chrome/browser/ui/tabs/split_tab_menu_model.h
index 2b38e92..8a728d5 100644
--- a/chrome/browser/ui/tabs/split_tab_menu_model.h
+++ b/chrome/browser/ui/tabs/split_tab_menu_model.h
@@ -9,6 +9,7 @@
 #include <optional>
 #include <string>
 
+#include "chrome/browser/ui/tabs/existing_base_sub_menu_model.h"
 #include "ui/base/interaction/element_identifier.h"
 #include "ui/menus/simple_menu_model.h"
 
@@ -40,8 +41,9 @@
   // Enum class denoting which close tab menu item the menu should show.
   enum class CloseTabMenuItem { kNone, kCloseStartEndTab, kCloseSpecifiedTab };
 
+  // Start command IDs at 1701 to avoid conflicts with other submenus.
   enum class CommandId {
-    kReversePosition,
+    kReversePosition = ExistingBaseSubMenuModel::kMinSplitTabMenuModelCommandId,
     kCloseSpecifiedTab,
     kCloseStartTab,
     kCloseEndTab,
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h
index 7caf314e..1c4636f 100644
--- a/chrome/browser/ui/ui_features.h
+++ b/chrome/browser/ui/ui_features.h
@@ -88,7 +88,7 @@
     kPreloadTopChromeWebUIMode(
         &kPreloadTopChromeWebUI,
         kPreloadTopChromeWebUIModeName,
-        PreloadTopChromeWebUIMode::kPreloadOnMakeContents,
+        PreloadTopChromeWebUIMode::kPreloadOnWarmup,
         &kPreloadTopChromeWebUIModeOptions);
 
 // If smart preload is enabled, the preload WebUI is determined by historical
diff --git a/chrome/browser/ui/views/external_protocol_dialog.cc b/chrome/browser/ui/views/external_protocol_dialog.cc
index 5e7aafa..9093d693 100644
--- a/chrome/browser/ui/views/external_protocol_dialog.cc
+++ b/chrome/browser/ui/views/external_protocol_dialog.cc
@@ -10,6 +10,8 @@
 #include "base/types/optional_util.h"
 #include "build/build_config.h"
 #include "chrome/browser/external_protocol/external_protocol_handler.h"
+#include "chrome/browser/picture_in_picture/picture_in_picture_occlusion_observer.h"
+#include "chrome/browser/picture_in_picture/scoped_picture_in_picture_occlusion_observation.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/shell_integration.h"
 #include "chrome/browser/tab_contents/tab_util.h"
@@ -32,6 +34,7 @@
 #include "ui/views/controls/message_box_view.h"
 #include "ui/views/layout/fill_layout.h"
 #include "ui/views/widget/widget.h"
+#include "ui/views/window/dialog_client_view.h"
 
 using content::WebContents;
 
@@ -49,6 +52,44 @@
 
 }  // namespace
 
+class ExternalProtocolDialog::PictureInPictureWatcher
+    : public PictureInPictureOcclusionObserver {
+ public:
+  explicit PictureInPictureWatcher(ExternalProtocolDialog* dialog)
+      : dialog_(dialog) {
+    CHECK(dialog_);
+    occlusion_observation_.Observe(dialog_->GetWidget());
+  }
+
+  PictureInPictureWatcher(const PictureInPictureWatcher&) = delete;
+  PictureInPictureWatcher& operator=(const PictureInPictureWatcher&) = delete;
+  ~PictureInPictureWatcher() override = default;
+
+  // Returns true whenever `dialog_` is occluded by Picture-in-Picture windows,
+  // false otherwise.
+  bool OccludedByPictureInPicture() { return occluded_by_picture_in_picture_; }
+
+  // Simulates Picture-in-Picture occlussion changed for testing.
+  void SimulateOcclusionStateChangedForTesting(bool occluded) {
+    OnOcclusionStateChanged(occluded);
+  }
+
+ private:
+  // PictureInPictureOcclusionObserver:
+  void OnOcclusionStateChanged(bool occluded) override {
+    // Protect from immediate input if the dialog has just become unoccluded.
+    if (occluded_by_picture_in_picture_ && !occluded) {
+      dialog_->TriggerInputProtection();
+    }
+
+    occluded_by_picture_in_picture_ = occluded;
+  }
+
+  ScopedPictureInPictureOcclusionObservation occlusion_observation_{this};
+  bool occluded_by_picture_in_picture_ = false;
+  const raw_ptr<ExternalProtocolDialog> dialog_;
+};
+
 #if !BUILDFLAG(IS_CHROMEOS)
 // static
 void ExternalProtocolHandler::RunExternalProtocolDialog(
@@ -137,6 +178,7 @@
   }
 
   constrained_window::ShowWebModalDialogViews(this, web_contents);
+  picture_in_picture_watcher_ = std::make_unique<PictureInPictureWatcher>(this);
 }
 
 ExternalProtocolDialog::~ExternalProtocolDialog() = default;
@@ -176,6 +218,32 @@
       url_, web_contents_.get(), initiator_document_);
 }
 
+void ExternalProtocolDialog::TriggerInputProtection() {
+  GetDialogClientView()->TriggerInputProtection();
+}
+
+bool ExternalProtocolDialog::ShouldIgnoreButtonPressedEventHandling(
+    View* button,
+    const ui::Event& event) const {
+  // Ignore button pressed events whenever we are occluded by a
+  // Picture-in-Picture window.
+  return picture_in_picture_watcher_
+             ? picture_in_picture_watcher_->OccludedByPictureInPicture()
+             : false;
+}
+
+bool ExternalProtocolDialog::ShouldAllowKeyEventsDuringInputProtection() const {
+  return false;
+}
+
+void ExternalProtocolDialog::SimulateOcclusionStateChangedForTesting(
+    bool occluded) {
+  CHECK(picture_in_picture_watcher_);
+  picture_in_picture_watcher_
+      ->SimulateOcclusionStateChangedForTesting(  // IN-TEST
+          occluded);
+}
+
 void ExternalProtocolDialog::SetRememberSelectionCheckboxCheckedForTesting(
     bool checked) {
   message_box_view_->SetCheckBoxSelected(checked);
diff --git a/chrome/browser/ui/views/external_protocol_dialog.h b/chrome/browser/ui/views/external_protocol_dialog.h
index e77fc97..97f376a 100644
--- a/chrome/browser/ui/views/external_protocol_dialog.h
+++ b/chrome/browser/ui/views/external_protocol_dialog.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_UI_VIEWS_EXTERNAL_PROTOCOL_DIALOG_H_
 #define CHROME_BROWSER_UI_VIEWS_EXTERNAL_PROTOCOL_DIALOG_H_
 
+#include <memory>
+
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "content/public/browser/weak_document_ptr.h"
@@ -25,6 +27,11 @@
 class MessageBoxView;
 }
 
+// Dialog that asks the user to confirm launching a url using the external
+// protocol handler.
+//
+// Users can allow or block the launch and optionally remember this decision
+// for the specific protocol and initiating origin.
 class ExternalProtocolDialog : public views::DialogDelegateView {
   METADATA_HEADER(ExternalProtocolDialog, views::DialogDelegateView)
 
@@ -49,6 +56,18 @@
   void SetRememberSelectionCheckboxCheckedForTesting(bool checked);
   void OnDialogAccepted();
 
+  // Trigger input protection to protect against certain kinds of clickjacking.
+  void TriggerInputProtection();
+
+  // views::DialogDelegate:
+  bool ShouldIgnoreButtonPressedEventHandling(
+      View* button,
+      const ui::Event& event) const override;
+  bool ShouldAllowKeyEventsDuringInputProtection() const override;
+
+  // Simulates Picture-in-Picture occlussion changed for testing.
+  void SimulateOcclusionStateChangedForTesting(bool occluded);
+
   const base::WeakPtr<content::WebContents> web_contents_;
 
   const GURL url_;
@@ -58,6 +77,11 @@
 
   // The message box whose commands we handle.
   raw_ptr<views::MessageBoxView> message_box_view_ = nullptr;
+
+  // The PictureInPictureWatcher tracks dialog occlussions by Picture-in-Picture
+  // windows, to ensure input protection and ignore spurious interactions.
+  class PictureInPictureWatcher;
+  std::unique_ptr<PictureInPictureWatcher> picture_in_picture_watcher_;
 };
 
 #endif  // CHROME_BROWSER_UI_VIEWS_EXTERNAL_PROTOCOL_DIALOG_H_
diff --git a/chrome/browser/ui/views/external_protocol_dialog_browsertest.cc b/chrome/browser/ui/views/external_protocol_dialog_browsertest.cc
index 0e7fd50..6701ff9 100644
--- a/chrome/browser/ui/views/external_protocol_dialog_browsertest.cc
+++ b/chrome/browser/ui/views/external_protocol_dialog_browsertest.cc
@@ -18,7 +18,11 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
+#include "ui/events/event.h"
+#include "ui/events/event_utils.h"
 #include "ui/views/controls/button/checkbox.h"
+#include "ui/views/metrics.h"
+#include "ui/views/test/button_test_api.h"
 
 IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest, TestAccept) {
   ShowUi(std::string("https://example.test"));
@@ -140,3 +144,55 @@
   // request initiator
   EXPECT_EQ(launch_url_, "b.test");
 }
+
+IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest,
+                       TestPictureInPictureOcclusionStateChanges) {
+  ShowUi(std::string("https://example.test"));
+  ui::MouseEvent mouse_event(ui::EventType::kMousePressed, gfx::Point(),
+                             gfx::Point(), ui::EventTimeForNow(), 0, 0);
+  EXPECT_FALSE(ShouldIgnoreButtonPressedEventHandling(nullptr, mouse_event));
+
+  // Simulate Picture-in-Picture dialog occlusion.
+  SimulateOcclusionStateChanged(true);
+  EXPECT_TRUE(ShouldIgnoreButtonPressedEventHandling(nullptr, mouse_event));
+
+  // Simulate Picture-in-Picture dialog not occluded.
+  SimulateOcclusionStateChanged(false);
+  EXPECT_FALSE(ShouldIgnoreButtonPressedEventHandling(nullptr, mouse_event));
+}
+
+IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest,
+                       TestShouldIgnoreButtonEventsWhenOccluded) {
+  ShowUi(std::string("https://example.test"));
+
+  ui::MouseEvent mouse_event(ui::EventType::kMousePressed, gfx::Point(),
+                             gfx::Point(), ui::EventTimeForNow(), 0, 0);
+
+  // Initially not occluded by Picture-in-Picture.
+  EXPECT_FALSE(ShouldIgnoreButtonPressedEventHandling(nullptr, mouse_event));
+
+  SimulateOcclusionStateChanged(true);
+  EXPECT_TRUE(ShouldIgnoreButtonPressedEventHandling(nullptr, mouse_event));
+
+  SimulateOcclusionStateChanged(false);
+  EXPECT_FALSE(ShouldIgnoreButtonPressedEventHandling(nullptr, mouse_event));
+}
+
+IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest,
+                       TestKeyEventsAreProtected) {
+  ShowUi(std::string("https://example.test"));
+  EXPECT_FALSE(ShouldAllowKeyEventsDuringInputProtection());
+
+  ui::KeyEvent press_enter(ui::EventType::kKeyPressed, ui::VKEY_RETURN,
+                           ui::EF_NONE, ui::EventTimeForNow());
+  views::test::ButtonTestApi(dialog_->GetOkButton()).NotifyClick(press_enter);
+  EXPECT_FALSE(url_did_launch_);
+
+  ui::KeyEvent press_enter_delayed(
+      ui::EventType::kKeyPressed, ui::VKEY_RETURN, ui::EF_NONE,
+      ui::EventTimeForNow() +
+          base::Milliseconds(views::GetDoubleClickInterval()));
+  views::test::ButtonTestApi(dialog_->GetOkButton())
+      .NotifyClick(press_enter_delayed);
+  EXPECT_TRUE(url_did_launch_);
+}
diff --git a/chrome/browser/ui/views/external_protocol_dialog_test_harness.cc b/chrome/browser/ui/views/external_protocol_dialog_test_harness.cc
index 60e320d..45de794 100644
--- a/chrome/browser/ui/views/external_protocol_dialog_test_harness.cc
+++ b/chrome/browser/ui/views/external_protocol_dialog_test_harness.cc
@@ -23,6 +23,19 @@
     dialog_->SetRememberSelectionCheckboxCheckedForTesting(checked);
   }
 
+  void SimulateOcclusionStateChanged(bool occluded) {
+    dialog_->SimulateOcclusionStateChangedForTesting(occluded);
+  }
+
+  bool ShouldIgnoreButtonPressedEventHandling(views::View* button,
+                                              const ui::Event& event) const {
+    return dialog_->ShouldIgnoreButtonPressedEventHandling(button, event);
+  }
+
+  bool ShouldAllowKeyEventsDuringInputProtection() const {
+    return dialog_->ShouldAllowKeyEventsDuringInputProtection();
+  }
+
  private:
   raw_ptr<ExternalProtocolDialog> dialog_;
 };
@@ -81,6 +94,25 @@
   test::ExternalProtocolDialogTestApi(dialog_).SetCheckBoxSelected(checked);
 }
 
+void ExternalProtocolDialogBrowserTest::SimulateOcclusionStateChanged(
+    bool occluded) {
+  test::ExternalProtocolDialogTestApi(dialog_).SimulateOcclusionStateChanged(
+      occluded);
+}
+
+bool ExternalProtocolDialogBrowserTest::ShouldIgnoreButtonPressedEventHandling(
+    views::View* button,
+    const ui::Event& event) const {
+  return test::ExternalProtocolDialogTestApi(dialog_)
+      .ShouldIgnoreButtonPressedEventHandling(button, event);
+}
+
+bool ExternalProtocolDialogBrowserTest::
+    ShouldAllowKeyEventsDuringInputProtection() const {
+  return test::ExternalProtocolDialogTestApi(dialog_)
+      .ShouldAllowKeyEventsDuringInputProtection();
+}
+
 // ExternalProtocolHandler::Delegate:
 scoped_refptr<shell_integration::DefaultSchemeClientWorker>
 ExternalProtocolDialogBrowserTest::CreateShellWorker(const GURL& url) {
diff --git a/chrome/browser/ui/views/external_protocol_dialog_test_harness.h b/chrome/browser/ui/views/external_protocol_dialog_test_harness.h
index 6aba114..d18e83e 100644
--- a/chrome/browser/ui/views/external_protocol_dialog_test_harness.h
+++ b/chrome/browser/ui/views/external_protocol_dialog_test_harness.h
@@ -30,6 +30,23 @@
 
   void SetChecked(bool checked);
 
+  // Returns true if the `ExternalProtocolDialog` is occluded by a
+  // Picture-in-Picture window.
+  bool OccludedByPictureInPicture() const;
+
+  // Sets the `ExternalProtocolDialog` Picture-in-Picture occlusion state to the
+  // `occluded` value.
+  void SimulateOcclusionStateChanged(bool occluded);
+
+  // Returns true if button pressed events on the `ExternalProtocolDialog`
+  // should be ignored.
+  bool ShouldIgnoreButtonPressedEventHandling(views::View* button,
+                                              const ui::Event& event) const;
+
+  // Returns true if key events on the `ExternalProtocolDialog` should be
+  // allowed when input protection is active.
+  bool ShouldAllowKeyEventsDuringInputProtection() const;
+
   // ExternalProtocolHandler::Delegate:
   scoped_refptr<shell_integration::DefaultSchemeClientWorker> CreateShellWorker(
       const GURL& url) override;
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 88ba0f94..c2e9f77 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -4787,13 +4787,12 @@
   const int relative_active_position = active_index - first_split_tab_index;
   multi_contents_view_->SetActiveIndex(relative_active_position);
 
+  multi_contents_view_->UpdateSplitRatio(
+      split_data->visual_data()->split_ratio());
+
   if (focus_active_view) {
     multi_contents_view_->GetActiveContentsView()->RequestFocus();
   }
-
-  // Update visual information for the split.
-  multi_contents_view_->UpdateSplitRatio(
-      split_data->visual_data()->split_ratio());
 }
 
 void BrowserView::HideSplitView() {
@@ -4817,6 +4816,14 @@
       browser_->tab_strip_model()->GetIndexOfTab(first_tab);
   const int relative_active_position = active_index - first_split_tab_index;
   multi_contents_view_->SetActiveIndex(relative_active_position);
+
+  // When active tab changes inside a split, it's generally due to focus change.
+  // However, there are cases where inactive tab can be activated without a
+  // focus change e.g. using tab shortcuts and in these cases update focus.
+  if (GetWidget()->IsActive() &&
+      multi_contents_view_->GetInactiveContentsView()->HasFocus()) {
+    multi_contents_view_->GetActiveContentsView()->RequestFocus();
+  }
 }
 
 void BrowserView::UpdateContentsInSplitView(
diff --git a/chrome/browser/ui/views/frame/browser_view_browsertest.cc b/chrome/browser/ui/views/frame/browser_view_browsertest.cc
index 25b0c75..ffa3c7cc 100644
--- a/chrome/browser/ui/views/frame/browser_view_browsertest.cc
+++ b/chrome/browser/ui/views/frame/browser_view_browsertest.cc
@@ -69,7 +69,6 @@
 #include "ui/accessibility/platform/ax_platform_node_test_helper.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/ui_base_features.h"
-#include "ui/views/widget/any_widget_observer.h"
 #include "url/url_constants.h"
 
 #if defined(USE_AURA)
@@ -148,6 +147,49 @@
   raw_ptr<content::WebContents, DanglingUntriaged> other_;
 };
 
+// Waits for a different view to claim focus within a widget with the specified
+// name.
+class TestFocusChangeWaiter : public views::FocusChangeListener {
+ public:
+  TestFocusChangeWaiter(views::FocusManager* focus_manager,
+                        const std::string& expected_widget_name)
+      : focus_manager_(focus_manager),
+        expected_widget_name_(expected_widget_name) {
+    if (auto* current_focused_view = focus_manager->GetFocusedView()) {
+      previous_view_id_ = current_focused_view->GetID();
+    } else {
+      previous_view_id_ = -1;
+    }
+    focus_manager_->AddFocusChangeListener(this);
+  }
+
+  TestFocusChangeWaiter(const TestFocusChangeWaiter&) = delete;
+  TestFocusChangeWaiter& operator=(const TestFocusChangeWaiter&) = delete;
+  ~TestFocusChangeWaiter() override {
+    focus_manager_->RemoveFocusChangeListener(this);
+  }
+
+  void Wait() { run_loop_.Run(); }
+
+ private:
+  // views::FocusChangeListener:
+  void OnDidChangeFocus(views::View* focused_before,
+                        views::View* focused_now) override {
+    if (focused_now && focused_now->GetID() != previous_view_id_) {
+      views::Widget* widget = focused_now->GetWidget();
+      if (widget && widget->GetName() == expected_widget_name_) {
+        run_loop_.Quit();
+      }
+    }
+  }
+
+  raw_ptr<views::FocusManager> focus_manager_;
+  base::RunLoop run_loop_;
+  int previous_view_id_;
+  std::string expected_widget_name_;
+  base::WeakPtrFactory<TestFocusChangeWaiter> weak_factory_{this};
+};
+
 class TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {
  public:
   explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)
@@ -532,10 +574,19 @@
 
   content::WebContents* contents = browser_view()->GetActiveWebContents();
   auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents);
-  views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{},
-                                       "MessageBoxView");
+
+  // `ViewAXPlatformNodeDelegate::GetChildWidgets` expects the following
+  // conditions to be met in order to conclude that a tab modal dialog is
+  // showing:
+  // 1. The dialog is included in `Widget::GetAllOwnedWidgets()`.
+  // 2. The currently-focused view is contained in the dialog.
+  // Waiting for the dialog to be shown should ensure that the first
+  // condition is met. But we also need to wait for the focus to change
+  // or the second condition flakily fails.
+  TestFocusChangeWaiter focus_waiter(browser_view()->GetFocusManager(),
+                                     "MessageBoxView");
   TabModalConfirmDialog::Create(std::move(delegate), contents);
-  ASSERT_TRUE(waiter.WaitIfNeededAndGet());
+  focus_waiter.Wait();
 
   // The tab modal dialog should be in the accessibility tree; everything else
   // should be hidden. So we expect an "OK" button and no reload button.
diff --git a/chrome/browser/ui/views/frame/multi_contents_view_interactive_uitest.cc b/chrome/browser/ui/views/frame/multi_contents_view_interactive_uitest.cc
index 1299c3bd..bcc78f4 100644
--- a/chrome/browser/ui/views/frame/multi_contents_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/frame/multi_contents_view_interactive_uitest.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/ui/views/frame/multi_contents_view_drop_target_controller.h"
 #include "chrome/browser/ui/views/frame/multi_contents_view_mini_toolbar.h"
 #include "chrome/browser/ui/views/test/split_tabs_interactive_test_mixin.h"
+#include "chrome/browser/ui/views/test/tab_strip_interactive_test_mixin.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/interaction/interactive_browser_test.h"
@@ -69,7 +70,8 @@
 }  // namespace
 
 class MultiContentsViewUiTest
-    : public SplitTabsInteractiveTestMixin<InteractiveBrowserTest> {
+    : public SplitTabsInteractiveTestMixin<
+          TabStripInteractiveTestMixin<InteractiveBrowserTest>> {
  protected:
   TabStripModel* tab_strip_model() { return browser()->tab_strip_model(); }
 
@@ -155,11 +157,6 @@
     return result;
   }
 
-  auto CheckTabIsActive(int index) {
-    return CheckResult([this]() { return tab_strip_model()->active_index(); },
-                       index);
-  }
-
   auto CheckActiveContentsHasFocus() {
     return CheckView(
         MultiContentsView::kMultiContentsViewElementId,
@@ -179,8 +176,8 @@
 // visible
 IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest, EnterAndExitSplitViews) {
   RunTestSequence(
-      CreateTabsAndEnterSplitView(), CheckTabIsActive(0), ExitSplitView(0),
-      CheckTabIsActive(0),
+      CreateTabsAndEnterSplitView(), WaitForActiveTabChange(0),
+      ExitSplitView(0), WaitForActiveTabChange(0),
       CheckResult([this]() { return tab_strip_model()->count(); }, 2u));
 }
 
@@ -190,14 +187,16 @@
   DEFINE_LOCAL_STATE_IDENTIFIER_VALUE(MultiContentsViewBoundsChangedObserver,
                                       kMultiContentsViewBoundsChangedObserver);
   RunTestSequence(
-      CreateTabsAndEnterSplitView(), CheckTabIsActive(0),
+      CreateTabsAndEnterSplitView(), WaitForActiveTabChange(0),
       AddInstrumentedTab(kSecondTab, GURL(chrome::kChromeUISettingsURL), 2),
-      CheckTabIsActive(2), SelectTab(kTabStripElementId, 0, InputType::kMouse),
+      WaitForActiveTabChange(2),
+      SelectTab(kTabStripElementId, 0, InputType::kMouse),
       // Check if there is just one resizing event that happens when switching
       // between a split view to a regular tab.
-      CheckTabIsActive(0),
+      WaitForActiveTabChange(0),
       ObserveState(kMultiContentsViewBoundsChangedObserver, browser()),
-      SelectTab(kTabStripElementId, 2, InputType::kMouse), CheckTabIsActive(2),
+      SelectTab(kTabStripElementId, 2, InputType::kMouse),
+      WaitForActiveTabChange(2),
       CheckState(kMultiContentsViewBoundsChangedObserver, 1),
       StopObservingState(kMultiContentsViewBoundsChangedObserver));
 }
@@ -206,8 +205,8 @@
 // focused using mouse click.
 IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest,
                        ActivatesInactiveViewUsingMouseClick) {
-  RunTestSequence(CreateTabsAndEnterSplitView(), CheckTabIsActive(0),
-                  FocusInactiveTabInSplit(), CheckTabIsActive(1),
+  RunTestSequence(CreateTabsAndEnterSplitView(), WaitForActiveTabChange(0),
+                  FocusInactiveTabInSplit(), WaitForActiveTabChange(1),
                   CheckActiveContentsHasFocus());
 }
 
@@ -216,7 +215,7 @@
 IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest,
                        ActivatesInactiveViewUsingKeyboard) {
   RunTestSequence(
-      CreateTabsAndEnterSplitView(), CheckTabIsActive(0),
+      CreateTabsAndEnterSplitView(), WaitForActiveTabChange(0),
       // The second contents view should be next in the focus order after
       // the resize handle so send a TAB key event to move focus to inactive tab
       FocusElement(
@@ -224,7 +223,26 @@
       SendKeyPress(
           MultiContentsResizeHandle::kMultiContentsResizeHandleElementId,
           ui::VKEY_TAB),
-      CheckTabIsActive(1), CheckActiveContentsHasFocus());
+      WaitForActiveTabChange(1), CheckActiveContentsHasFocus());
+}
+
+// Check that MultiContentsView changes its active view when the tab shortcut
+// is used and the active view has focus.
+IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest,
+                       ActivatesInactiveViewUsingAccelerator) {
+  const int kControlCommandModifier =
+#if BUILDFLAG(IS_MAC)
+      ui::EF_COMMAND_DOWN;
+#else
+      ui::EF_CONTROL_DOWN;
+#endif
+
+  RunTestSequence(
+      CreateTabsAndEnterSplitView(), WaitForActiveTabChange(0),
+      FocusWebContents(kNewTab),
+      SendAccelerator(kBrowserViewElementId,
+                      ui::Accelerator(ui::VKEY_2, kControlCommandModifier)),
+      WaitForActiveTabChange(1), CheckActiveContentsHasFocus());
 }
 
 // Check focus for the MultiContentView when in split view
@@ -235,7 +253,8 @@
       AddInstrumentedTab(kSecondTab, GURL(chrome::kChromeUISettingsURL), 2),
       FocusWebContents(kSecondTab),
       CheckResult([this]() { return tab_strip_model()->count(); }, 3u),
-      EnterSplitView(2, 0), CheckTabIsActive(2), CheckActiveContentsHasFocus());
+      EnterSplitView(2, 0), WaitForActiveTabChange(2),
+      CheckActiveContentsHasFocus());
 }
 
 // Split view active tab change while browser window doesn't have focus. This
@@ -262,11 +281,11 @@
       AddInstrumentedTab(kSecondTab, GURL(chrome::kChromeUISettingsURL), 2),
       FocusWebContents(kSecondTab),
       CheckResult([this]() { return tab_strip_model()->count(); }, 3u),
-      EnterSplitView(2, 0), CheckTabIsActive(2),
+      EnterSplitView(2, 0), WaitForActiveTabChange(2),
       PressButton(kTabSearchButtonElementId),
       WaitForShow(kTabSearchBubbleElementId),
       Do([this]() { browser()->tab_strip_model()->ActivateTabAt(1); }),
-      WaitForHide(kTabSearchBubbleElementId), CheckTabIsActive(1),
+      WaitForHide(kTabSearchBubbleElementId), WaitForActiveTabChange(1),
       CheckActiveContentsHasFocus());
 }
 
@@ -295,28 +314,28 @@
       AddInstrumentedTab(kSecondTab, GURL(chrome::kChromeUISettingsURL), 2),
       FocusWebContents(kSecondTab),
       CheckResult([this]() { return tab_strip_model()->count(); }, 3u),
-      EnterSplitView(2, 0), CheckTabIsActive(2),
+      EnterSplitView(2, 0), WaitForActiveTabChange(2),
       // Switch from the split view to a regular tab
-      SelectTab(kTabStripElementId, 0, InputType::kMouse), CheckTabIsActive(0),
-      FocusWebContents(kNewTab),
+      SelectTab(kTabStripElementId, 0, InputType::kMouse),
+      WaitForActiveTabChange(0), FocusWebContents(kNewTab),
       // Launch the tab search bubble using the tab search button
       PressButton(kTabSearchButtonElementId),
       WaitForShow(kTabSearchBubbleElementId),
       // Switch from a regular tab directly to an inactive tab, which is on
       // the left side of a split with the TabSearch bubble dialog opened.
       Do([this]() { browser()->tab_strip_model()->ActivateTabAt(1); }),
-      WaitForHide(kTabSearchBubbleElementId), CheckTabIsActive(1),
+      WaitForHide(kTabSearchBubbleElementId), WaitForActiveTabChange(1),
       CheckActiveContentsHasFocus(),
       // Switch out of the split view back to the regular tab
-      SelectTab(kTabStripElementId, 0, InputType::kMouse), CheckTabIsActive(0),
-      FocusWebContents(kNewTab),
+      SelectTab(kTabStripElementId, 0, InputType::kMouse),
+      WaitForActiveTabChange(0), FocusWebContents(kNewTab),
       // Launch the tab search bubble using the tab search button
       PressButton(kTabSearchButtonElementId),
       WaitForShow(kTabSearchBubbleElementId),
       // Switch from a regular tab directly to an inactive tab, which is on
       // the right side of a split with the TabSearch bubble dialog opened.
       Do([this]() { browser()->tab_strip_model()->ActivateTabAt(2); }),
-      WaitForHide(kTabSearchBubbleElementId), CheckTabIsActive(2),
+      WaitForHide(kTabSearchBubbleElementId), WaitForActiveTabChange(2),
       CheckActiveContentsHasFocus());
 }
 
@@ -418,18 +437,18 @@
 IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest,
                        ActivatesMostRecentlyActiveTabInSplit) {
   RunTestSequence(
-      CreateTabsAndEnterSplitView(), CheckTabIsActive(0),
+      CreateTabsAndEnterSplitView(), WaitForActiveTabChange(0),
       AddInstrumentedTab(kSecondTab, GURL(chrome::kChromeUISettingsURL), 2),
-      CheckTabIsActive(2),
+      WaitForActiveTabChange(2),
       // Since tab 0 and 1 are part of a split view and tab 0 was the most
       // recently focused half of the split it should become the active tab, but
       // both tabs will be visible.
       SelectTab(kTabStripElementId, 1, InputType::kMouse, 0),
-      CheckTabIsActive(0),
+      WaitForActiveTabChange(0),
       // Select another tab in the split view and ensure the active index
       // doesn't change since it isn't the currently focused tab.
       SelectTab(kTabStripElementId, 1, InputType::kMouse, 0),
-      CheckTabIsActive(0));
+      WaitForActiveTabChange(0));
 }
 
 IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest,
@@ -490,8 +509,8 @@
                      GURL(chrome::kChromeUISettingsURL);
                  return first_web_contents_set && second_web_contents_set;
                }),
-      WaitForState(kMultiContentsViewSwapObserver, true), CheckTabIsActive(1),
-      CheckActiveContentsHasFocus());
+      WaitForState(kMultiContentsViewSwapObserver, true),
+      WaitForActiveTabChange(1), CheckActiveContentsHasFocus());
 }
 
 IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest,
@@ -546,8 +565,8 @@
                      GURL(chrome::kChromeUISettingsURL);
                  return first_web_contents_set && second_web_contents_set;
                }),
-      WaitForState(kMultiContentsViewSwapObserver, true), CheckTabIsActive(1),
-      CheckActiveContentsHasFocus());
+      WaitForState(kMultiContentsViewSwapObserver, true),
+      WaitForActiveTabChange(1), CheckActiveContentsHasFocus());
 }
 
 IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest,
@@ -578,7 +597,7 @@
                        MiniToolbarShownForInactiveContents) {
   RunTestSequence(
       // Open split view.
-      CreateTabsAndEnterSplitView(), CheckTabIsActive(0),
+      CreateTabsAndEnterSplitView(), WaitForActiveTabChange(0),
       // Verify the mini toolbar is only visible for the inactive contents.
       Check([&]() {
         return !multi_contents_view()
@@ -589,7 +608,7 @@
         return multi_contents_view()->mini_toolbar_for_testing(1)->GetVisible();
       }),
       // Focus inactive contents and verify active tab.
-      FocusInactiveTabInSplit(), CheckTabIsActive(1),
+      FocusInactiveTabInSplit(), WaitForActiveTabChange(1),
       // Verify the mini toolbar is only visile for the newly inactive contents.
       Check([&]() {
         return multi_contents_view()->mini_toolbar_for_testing(0)->GetVisible();
@@ -713,7 +732,7 @@
                        DISABLED_ShowsDropTargetOnLinkDragged) {
   RunTestSequence(
       AddInstrumentedTab(kNewTab, GetURL("/links.html"), 0),
-      CheckTabIsActive(0),
+      WaitForActiveTabChange(0),
       // Drag an href element to the drop target area. The drop
       // target should be shown.
       MoveMouseTo(kNewTab, DeepQuery{"#title1"}),
@@ -726,7 +745,7 @@
                        DoesNotShowDropTargetOnNonURLDragged) {
   RunTestSequence(
       AddInstrumentedTab(kNewTab, GetURL("/button.html"), 0),
-      CheckTabIsActive(0),
+      WaitForActiveTabChange(0),
       // Dragging a non-url to the drop target area should have no
       // effect.
       MoveMouseTo(kNewTab, DeepQuery{"#button"}),
@@ -781,7 +800,7 @@
   const std::string kBookmarkButtonId = "bookmark_button";
   RunTestSequence(
       AddInstrumentedTab(kNewTab, GURL(chrome::kChromeUISettingsURL), 0),
-      CheckTabIsActive(0), WaitForShow(kBookmarkBarElementId),
+      WaitForActiveTabChange(0), WaitForShow(kBookmarkBarElementId),
       NameBookmarkButton(kBookmarkButtonId, bookmark_title),
       MoveMouseTo(kBookmarkButtonId),
       DragMouseToWithoutWait(MultiContentsView::kMultiContentsViewElementId,
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_container_view_browsertest.cc b/chrome/browser/ui/views/frame/webui_tab_strip_container_view_browsertest.cc
deleted file mode 100644
index a395a1a3..0000000
--- a/chrome/browser/ui/views/frame/webui_tab_strip_container_view_browsertest.cc
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/views/frame/webui_tab_strip_container_view.h"
-
-#include <utility>
-
-#include "base/test/scoped_feature_list.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/ui_features.h"
-#include "chrome/browser/ui/views/frame/browser_view.h"
-#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
-#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui.h"
-#include "chrome/test/base/in_process_browser_test.h"
-#include "content/public/test/browser_test.h"
-#include "ui/base/pointer/touch_ui_controller.h"
-
-class WebUITabStripContainerViewBrowserTest : public InProcessBrowserTest {
- public:
-  WebUITabStripContainerViewBrowserTest() {
-    feature_override_.InitAndEnableFeature(features::kWebUITabStrip);
-  }
-
-  ~WebUITabStripContainerViewBrowserTest() override = default;
-
-  void SetUpOnMainThread() override {
-    InProcessBrowserTest::SetUpOnMainThread();
-    browser_view_ = BrowserView::GetBrowserViewForBrowser(browser());
-  }
-
-  void TearDownOnMainThread() override {
-    browser_view_ = nullptr;
-    InProcessBrowserTest::TearDownOnMainThread();
-  }
-
-  BrowserView* browser_view() { return browser_view_; }
-
- private:
-  base::test::ScopedFeatureList feature_override_;
-  ui::TouchUiController::TouchUiScoperForTesting touch_ui_scoper_{true};
-
- protected:
-  raw_ptr<BrowserView> browser_view_ = nullptr;
-};
-
-IN_PROC_BROWSER_TEST_F(WebUITabStripContainerViewBrowserTest,
-                       TabStripStartsClosed) {
-  EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip(
-      browser_view()->browser()));
-  ASSERT_NE(nullptr, browser_view()->webui_tab_strip());
-  EXPECT_FALSE(browser_view()->webui_tab_strip()->GetVisible());
-}
-
-IN_PROC_BROWSER_TEST_F(WebUITabStripContainerViewBrowserTest,
-                       TouchModeTransition) {
-  EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip(
-      browser_view()->browser()));
-  EXPECT_NE(nullptr, browser_view()->webui_tab_strip());
-  EXPECT_FALSE(browser_view()->GetTabStripVisible());
-
-  ui::TouchUiController::TouchUiScoperForTesting disable_touch_mode(false);
-  EXPECT_FALSE(WebUITabStripContainerView::UseTouchableTabStrip(
-      browser_view()->browser()));
-  EXPECT_TRUE(browser_view()->GetTabStripVisible());
-
-  ui::TouchUiController::TouchUiScoperForTesting reenable_touch_mode(true);
-  EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip(
-      browser_view()->browser()));
-  EXPECT_FALSE(browser_view()->GetTabStripVisible());
-  ASSERT_NE(nullptr, browser_view()->webui_tab_strip());
-}
-
-IN_PROC_BROWSER_TEST_F(WebUITabStripContainerViewBrowserTest,
-                       ButtonsPresentInToolbar) {
-  ASSERT_NE(nullptr, browser_view()->toolbar()->new_tab_button_for_testing());
-  EXPECT_TRUE(browser_view()->toolbar()->Contains(
-      browser_view()->toolbar()->new_tab_button_for_testing()));
-  EXPECT_TRUE(
-      browser_view()->toolbar()->new_tab_button_for_testing()->GetVisible());
-  ASSERT_NE(nullptr, browser_view()->webui_tab_strip()->tab_counter());
-  EXPECT_TRUE(browser_view()->toolbar()->Contains(
-      browser_view()->webui_tab_strip()->tab_counter()));
-}
-
-IN_PROC_BROWSER_TEST_F(WebUITabStripContainerViewBrowserTest,
-                       CloseContainerOnRendererCrash) {
-  auto* webui_tab_strip = browser_view()->webui_tab_strip();
-  webui_tab_strip->PrimaryMainFrameRenderProcessGone(
-      base::TerminationStatus::TERMINATION_STATUS_PROCESS_CRASHED);
-  EXPECT_EQ(false, webui_tab_strip->GetVisible());
-  webui_tab_strip->SetVisibleForTesting(true);
-  EXPECT_EQ(true, webui_tab_strip->GetVisible());
-}
-
-class WebUITabStripDevToolsBrowserTest
-    : public WebUITabStripContainerViewBrowserTest {
- public:
-  WebUITabStripDevToolsBrowserTest() = default;
-  ~WebUITabStripDevToolsBrowserTest() override = default;
-
-  void SetUpOnMainThread() override {
-    WebUITabStripContainerViewBrowserTest::SetUpOnMainThread();
-    Browser::CreateParams params =
-        Browser::CreateParams::CreateForDevTools(browser()->profile());
-    devtools_browser_ = Browser::Create(params);
-  }
-
-  void TearDownOnMainThread() override {
-    devtools_browser_ = nullptr;
-    WebUITabStripContainerViewBrowserTest::TearDownOnMainThread();
-  }
-
- protected:
-  raw_ptr<Browser> devtools_browser_ = nullptr;
-};
-
-// Regression test for crbug.com/1010247, crbug.com/1090208.
-IN_PROC_BROWSER_TEST_F(WebUITabStripDevToolsBrowserTest,
-                       DevToolsWindowHasNoTabStrip) {
-  BrowserView* devtools_browser_view =
-      BrowserView::GetBrowserViewForBrowser(devtools_browser_);
-  ASSERT_TRUE(devtools_browser_view);
-
-  EXPECT_FALSE(
-      WebUITabStripContainerView::UseTouchableTabStrip(devtools_browser_));
-  EXPECT_EQ(nullptr, devtools_browser_view->webui_tab_strip());
-
-  ui::TouchUiController::TouchUiScoperForTesting disable_touch_mode(false);
-  ui::TouchUiController::TouchUiScoperForTesting reenable_touch_mode(true);
-  EXPECT_EQ(nullptr, devtools_browser_view->webui_tab_strip());
-}
-
-// TODO(crbug.com/40124617): add coverage of open and close gestures.
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_container_view_unittest.cc b/chrome/browser/ui/views/frame/webui_tab_strip_container_view_unittest.cc
new file mode 100644
index 0000000..8dc737e
--- /dev/null
+++ b/chrome/browser/ui/views/frame/webui_tab_strip_container_view_unittest.cc
@@ -0,0 +1,104 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/frame/webui_tab_strip_container_view.h"
+
+#include <utility>
+
+#include "base/functional/bind.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
+#include "chrome/browser/feature_engagement/tracker_factory.h"
+#include "chrome/browser/ui/browser_commands.h"
+#include "chrome/browser/ui/ui_features.h"
+#include "chrome/browser/ui/views/frame/browser_view.h"
+#include "chrome/browser/ui/views/frame/test_with_browser_view.h"
+#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
+#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui.h"
+#include "chrome/test/base/test_browser_window.h"
+#include "components/feature_engagement/public/feature_constants.h"
+#include "components/feature_engagement/test/mock_tracker.h"
+#include "content/public/common/drop_data.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "ui/base/pointer/touch_ui_controller.h"
+
+class WebUITabStripContainerViewTest : public TestWithBrowserView {
+ public:
+  template <typename... Args>
+  explicit WebUITabStripContainerViewTest(Args... args)
+      : TestWithBrowserView(args...) {
+    feature_override_.InitAndEnableFeature(features::kWebUITabStrip);
+  }
+
+  ~WebUITabStripContainerViewTest() override = default;
+
+ private:
+  base::test::ScopedFeatureList feature_override_;
+  ui::TouchUiController::TouchUiScoperForTesting touch_ui_scoper_{true};
+};
+
+TEST_F(WebUITabStripContainerViewTest, TabStripStartsClosed) {
+  EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip(
+      browser_view()->browser()));
+  ASSERT_NE(nullptr, browser_view()->webui_tab_strip());
+  EXPECT_FALSE(browser_view()->webui_tab_strip()->GetVisible());
+}
+
+TEST_F(WebUITabStripContainerViewTest, TouchModeTransition) {
+  EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip(
+      browser_view()->browser()));
+  EXPECT_NE(nullptr, browser_view()->webui_tab_strip());
+  EXPECT_FALSE(browser_view()->GetTabStripVisible());
+
+  ui::TouchUiController::TouchUiScoperForTesting disable_touch_mode(false);
+  EXPECT_FALSE(WebUITabStripContainerView::UseTouchableTabStrip(
+      browser_view()->browser()));
+  EXPECT_TRUE(browser_view()->GetTabStripVisible());
+
+  ui::TouchUiController::TouchUiScoperForTesting reenable_touch_mode(true);
+  EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip(
+      browser_view()->browser()));
+  EXPECT_FALSE(browser_view()->GetTabStripVisible());
+  ASSERT_NE(nullptr, browser_view()->webui_tab_strip());
+}
+
+TEST_F(WebUITabStripContainerViewTest, ButtonsPresentInToolbar) {
+  ASSERT_NE(nullptr, browser_view()->toolbar()->new_tab_button_for_testing());
+  EXPECT_TRUE(browser_view()->toolbar()->Contains(
+      browser_view()->toolbar()->new_tab_button_for_testing()));
+  EXPECT_TRUE(
+      browser_view()->toolbar()->new_tab_button_for_testing()->GetVisible());
+  ASSERT_NE(nullptr, browser_view()->webui_tab_strip()->tab_counter());
+  EXPECT_TRUE(browser_view()->toolbar()->Contains(
+      browser_view()->webui_tab_strip()->tab_counter()));
+}
+
+TEST_F(WebUITabStripContainerViewTest, CloseContainerOnRendererCrash) {
+  auto* webui_tab_strip = browser_view()->webui_tab_strip();
+  webui_tab_strip->PrimaryMainFrameRenderProcessGone(
+      base::TerminationStatus::TERMINATION_STATUS_PROCESS_CRASHED);
+  EXPECT_EQ(false, webui_tab_strip->GetVisible());
+  webui_tab_strip->SetVisibleForTesting(true);
+  EXPECT_EQ(true, webui_tab_strip->GetVisible());
+}
+
+class WebUITabStripDevToolsTest : public WebUITabStripContainerViewTest {
+ public:
+  WebUITabStripDevToolsTest()
+      : WebUITabStripContainerViewTest(Browser::TYPE_DEVTOOLS) {}
+  ~WebUITabStripDevToolsTest() override = default;
+};
+
+// Regression test for crbug.com/1010247, crbug.com/1090208.
+TEST_F(WebUITabStripDevToolsTest, DevToolsWindowHasNoTabStrip) {
+  EXPECT_FALSE(WebUITabStripContainerView::UseTouchableTabStrip(
+      browser_view()->browser()));
+  EXPECT_EQ(nullptr, browser_view()->webui_tab_strip());
+
+  ui::TouchUiController::TouchUiScoperForTesting disable_touch_mode(false);
+  ui::TouchUiController::TouchUiScoperForTesting reenable_touch_mode(true);
+  EXPECT_EQ(nullptr, browser_view()->webui_tab_strip());
+}
+
+// TODO(crbug.com/40124617): add coverage of open and close gestures.
diff --git a/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views_mac.mm b/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views_mac.mm
index 0ae31ab..fd828c74e 100644
--- a/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views_mac.mm
+++ b/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views_mac.mm
@@ -5,6 +5,7 @@
 #import "chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views_mac.h"
 
 #include <memory>
+#include <optional>
 
 #import "chrome/browser/renderer_host/chrome_render_widget_host_view_mac_delegate.h"
 #include "chrome/browser/ui/browser.h"
@@ -67,7 +68,9 @@
   // manually configured. This is tied to the `kSideBySide` experiment because
   // it is common to right click an inactive `WebContents` in split view.
   if (base::FeatureList::IsEnabled(features::kSideBySide)) {
-    if (!tabs::TabInterface::GetFromContents(web_contents_)->IsActivated()) {
+    std::optional<tabs::TabInterface*> tab_interface =
+        tabs::TabInterface::MaybeGetFromContents(web_contents_);
+    if (tab_interface.has_value() && !tab_interface.value()->IsActivated()) {
       web_contents_->Focus();
     }
   }
diff --git a/chrome/browser/ui/views/test/tab_strip_interactive_test_mixin.h b/chrome/browser/ui/views/test/tab_strip_interactive_test_mixin.h
index ad6e9cb..f1e5736 100644
--- a/chrome/browser/ui/views/test/tab_strip_interactive_test_mixin.h
+++ b/chrome/browser/ui/views/test/tab_strip_interactive_test_mixin.h
@@ -65,6 +65,18 @@
                 group_id)),
         T::MoveMouseTo(kTabGroupHeaderToHover));
   }
+
+  auto WaitForActiveTabChange(int index) {
+    DEFINE_LOCAL_STATE_IDENTIFIER_VALUE(ui::test::PollingStateObserver<int>,
+                                        kTabActiveChangeObserver);
+    return T::Steps(
+        T::PollState(kTabActiveChangeObserver,
+                     base::BindRepeating(
+                         &TabStripModel::active_index,
+                         base::Unretained(T::browser()->tab_strip_model()))),
+        T::WaitForState(kTabActiveChangeObserver, index),
+        T::StopObservingState(kTabActiveChangeObserver));
+  }
 };
 
 #endif  // CHROME_BROWSER_UI_VIEWS_TEST_TAB_STRIP_INTERACTIVE_TEST_MIXIN_H_
diff --git a/chrome/browser/ui/views/user_education/custom_webui_help_bubble.h b/chrome/browser/ui/views/user_education/custom_webui_help_bubble.h
index d5354da7..2e37f960 100644
--- a/chrome/browser/ui/views/user_education/custom_webui_help_bubble.h
+++ b/chrome/browser/ui/views/user_education/custom_webui_help_bubble.h
@@ -16,6 +16,7 @@
 #include "components/strings/grit/components_strings.h"
 #include "components/user_education/common/feature_promo/feature_promo_specification.h"
 #include "components/user_education/common/help_bubble/help_bubble_params.h"
+#include "components/user_education/views/help_bubble_factory_views.h"
 #include "components/user_education/views/help_bubble_views.h"
 #include "ui/base/interaction/element_identifier.h"
 #include "ui/base/interaction/element_tracker.h"
@@ -137,8 +138,25 @@
       user_education::HelpBubbleViews::TranslateArrow(arrow),
       wrapper->GetWeakPtr());
   auto* const bubble = bubble_ptr.get();
+
+  // Ensure that the bubble gets the correct background and frame color.
+  bubble->SetBackgroundColor(
+      wrapper->GetWebUIController()->GetBackgroundAndFrameColor());
+
+  // Specific shadow types are required for help bubbles in order to properly
+  // render visible bubble arrows.
+  bubble->set_shadow(
+      user_education::HelpBubbleFactoryViews::GetDefaultBubbleShadow());
+
   auto widget = base::WrapUnique(views::BubbleDialogDelegateView::CreateBubble(
       std::move(bubble_ptr), views::Widget::InitParams::CLIENT_OWNS_WIDGET));
+
+  // Maybe set the arrow. This may require recalculating the bubble bounds.
+  if (arrow != user_education::HelpBubbleArrow::kNone) {
+    bubble->GetBubbleFrameView()->SetDisplayVisibleArrow(true);
+    bubble->SizeToContents();
+  }
+
   wrapper->ShowUI();
   return base::WrapUnique(new CustomWebUIHelpBubble(
       std::move(widget), bubble, std::move(wrapper), params.anchor_element));
diff --git a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.cc b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.cc
index e590a6c1..9d4c121 100644
--- a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.cc
+++ b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.cc
@@ -5,7 +5,9 @@
 #include "chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h"
 
 #include "base/memory/raw_ref.h"
+#include "chrome/browser/ui/views/user_education/browser_user_education_service.h"
 #include "components/user_education/common/help_bubble/custom_help_bubble.h"
+#include "components/user_education/views/help_bubble_delegate.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "ui/webui/resources/cr_components/help_bubble/custom_help_bubble.mojom.h"
 
@@ -62,6 +64,11 @@
       std::move(pending_receiver));
 }
 
+ui::ColorId CustomWebUIHelpBubbleController::GetBackgroundAndFrameColor()
+    const {
+  return GetHelpBubbleDelegate()->GetHelpBubbleBackgroundColorId();
+}
+
 void CustomWebUIHelpBubbleController::CreateCustomHelpBubbleHandler(
     mojo::PendingReceiver<custom_help_bubble::mojom::CustomHelpBubbleHandler>
         handler) {
diff --git a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h
index f7b4fe2..7ecb865 100644
--- a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h
+++ b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h
@@ -14,6 +14,7 @@
 #include "content/public/browser/web_ui_controller.h"
 #include "content/public/common/url_constants.h"
 #include "mojo/public/cpp/bindings/receiver.h"
+#include "ui/color/color_id.h"
 #include "ui/webui/resources/cr_components/help_bubble/custom_help_bubble.mojom.h"
 
 // Derive your WebUIController from this if you want it to be used as a Custom
@@ -33,6 +34,10 @@
                      custom_help_bubble::mojom::CustomHelpBubbleHandlerFactory>
                          pending_receiver);
 
+  // Gets the background, frame, and arrow color for the bubble. Defaults to the
+  // normal help bubble background color.
+  virtual ui::ColorId GetBackgroundAndFrameColor() const;
+
   // This is required for wrapping help bubbles for Top Chrome.
   static constexpr std::string_view GetWebUIName() { return "UserEducation"; }
 
diff --git a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_interactive_uitest.cc b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_interactive_uitest.cc
index 239a56fc..51bf3560 100644
--- a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_interactive_uitest.cc
+++ b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_interactive_uitest.cc
@@ -11,6 +11,8 @@
 #include "chrome/browser/chrome_content_browser_client.h"
 #include "chrome/browser/ui/browser_element_identifiers.h"
 #include "chrome/browser/ui/user_education/browser_user_education_interface.h"
+#include "chrome/browser/ui/views/toolbar/browser_app_menu_button.h"
+#include "chrome/browser/ui/views/user_education/browser_user_education_service.h"
 #include "chrome/browser/ui/views/user_education/custom_webui_help_bubble.h"
 #include "chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h"
 #include "chrome/browser/ui/webui/top_chrome/top_chrome_web_ui_controller.h"
@@ -23,7 +25,9 @@
 #include "components/user_education/common/help_bubble/custom_help_bubble.h"
 #include "components/user_education/common/help_bubble/help_bubble.h"
 #include "components/user_education/common/help_bubble/help_bubble_params.h"
+#include "components/user_education/common/user_education_class_properties.h"
 #include "components/user_education/common/user_education_data.h"
+#include "components/user_education/views/help_bubble_delegate.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_controller.h"
@@ -44,6 +48,9 @@
 #include "ui/events/event_modifiers.h"
 #include "ui/events/keycodes/keyboard_codes.h"
 #include "ui/gfx/native_widget_types.h"
+#include "ui/views/animation/ink_drop.h"
+#include "ui/views/animation/ink_drop_host.h"
+#include "ui/views/bubble/bubble_dialog_delegate_view.h"
 #include "ui/webui/resources/cr_components/help_bubble/custom_help_bubble.mojom.h"
 #include "ui/webui/webui_util.h"
 
@@ -238,6 +245,42 @@
         .SetDescription("CheckIsDismissed()");
   }
 
+  static auto CheckIsAnchor(ElementSpecifier el, bool is_anchor) {
+    return Steps(CheckView(
+                     kToolbarAppMenuButtonElementId,
+                     [](BrowserAppMenuButton* button) {
+                       return button->GetProperty(
+                           user_education::kHasInProductHelpPromoKey);
+                     },
+                     is_anchor)
+                     .SetDescription("Check IPH key property."),
+                 CheckView(
+                     kToolbarAppMenuButtonElementId,
+                     [](BrowserAppMenuButton* button) {
+                       return views::InkDrop::Get(button)
+                           ->in_attention_state_for_testing();
+                     },
+                     is_anchor)
+                     .SetDescription("Check in attention state."));
+  }
+
+  static auto CheckFrame() {
+    return Steps(
+        CheckView(
+            CustomWebUIHelpBubble::kHelpBubbleIdForTesting,
+            [](views::BubbleDialogDelegateView* bubble) {
+              return bubble->GetBubbleFrameView()->GetDisplayVisibleArrow();
+            })
+            .SetDescription("Check frame has visible arrow."),
+        CheckView(
+            CustomWebUIHelpBubble::kHelpBubbleIdForTesting,
+            [](views::BubbleDialogDelegateView* bubble) {
+              return bubble->GetBubbleFrameView()->background_color();
+            },
+            GetHelpBubbleDelegate()->GetHelpBubbleBackgroundColorId())
+            .SetDescription("Check frame color."));
+  }
+
   const DeepQuery kCancelButton{"test-custom-help-bubble", "#cancel"};
   const DeepQuery kDismissButton{"test-custom-help-bubble", "#dismiss"};
   const DeepQuery kSnoozeButton{"test-custom-help-bubble", "#snooze"};
@@ -277,12 +320,14 @@
             return help_bubble && help_bubble->is_open();
           }),
       WaitForShow(CustomWebUIHelpBubble::kHelpBubbleIdForTesting),
+      CheckIsAnchor(kToolbarAppMenuButtonElementId, true), CheckFrame(),
       InstrumentNonTabWebView(kWebViewElementId,
                               CustomWebUIHelpBubble::kWebViewIdForTesting),
       ClickElement(kWebViewElementId, kCancelButton),
       WaitForEvent(kToolbarAppMenuButtonElementId, kCallbackEvent),
       Do([&help_bubble]() { help_bubble->Close(); }),
-      WaitForHide(CustomWebUIHelpBubble::kHelpBubbleIdForTesting));
+      WaitForHide(CustomWebUIHelpBubble::kHelpBubbleIdForTesting),
+      CheckIsAnchor(kToolbarAppMenuButtonElementId, false));
 }
 
 IN_PROC_BROWSER_TEST_F(CustomWebUIHelpBubbleUiTest, ShowPromo_Cancel) {
diff --git a/chrome/browser/ui/views/user_education/impl/browser_feature_promo_controller_2x_interactive_uitest.cc b/chrome/browser/ui/views/user_education/impl/browser_feature_promo_controller_2x_interactive_uitest.cc
index 5012ece..4c0c58af 100644
--- a/chrome/browser/ui/views/user_education/impl/browser_feature_promo_controller_2x_interactive_uitest.cc
+++ b/chrome/browser/ui/views/user_education/impl/browser_feature_promo_controller_2x_interactive_uitest.cc
@@ -420,6 +420,10 @@
       user_education::test::TestCustomHelpBubbleView::kBubbleId;
   RunTestSequence(
       MaybeShowPromo(kCustomUiTestFeature, CustomHelpBubbleShown{kBubbleId}),
+      CheckView(kBubbleId,
+                [](views::BubbleDialogDelegateView* bubble) {
+                  return bubble->GetBubbleFrameView()->GetDisplayVisibleArrow();
+                }),
       WithView(kBubbleId,
                [](views::View* view) { view->GetWidget()->Close(); }),
       WaitForHide(kBubbleId), CheckPromoRequested(kCustomUiTestFeature, false),
diff --git a/chrome/browser/ui/webui/ash/emulator/device_emulator_message_handler.cc b/chrome/browser/ui/webui/ash/emulator/device_emulator_message_handler.cc
index 973e0fb5..1f2dadf 100644
--- a/chrome/browser/ui/webui/ash/emulator/device_emulator_message_handler.cc
+++ b/chrome/browser/ui/webui/ash/emulator/device_emulator_message_handler.cc
@@ -226,7 +226,7 @@
 void DeviceEmulatorMessageHandler::HandleRemoveBluetoothDevice(
     const base::Value::List& args) {
   CHECK(!args.empty());
-  std::string path = args[0].GetString();
+  const std::string& path = args[0].GetString();
   fake_bluetooth_device_client_->RemoveDevice(
       dbus::ObjectPath(bluez::FakeBluetoothAdapterClient::kAdapterPath),
       dbus::ObjectPath(path));
@@ -327,7 +327,7 @@
 void DeviceEmulatorMessageHandler::HandleRemoveAudioNode(
     const base::Value::List& args) {
   CHECK(!args.empty());
-  std::string tmp_id = args[0].GetString();
+  const std::string& tmp_id = args[0].GetString();
   uint64_t id;
   CHECK(base::StringToUint64(tmp_id, &id));
 
@@ -462,7 +462,7 @@
 void DeviceEmulatorMessageHandler::UpdatePowerSourceId(
     const base::Value::List& args) {
   CHECK(!args.empty() && args[0].is_string());
-  std::string id = args[0].GetString();
+  const std::string& id = args[0].GetString();
   fake_power_manager_client_->SetPowerSource(id);
 }
 
diff --git a/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.cc b/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.cc
index 421a619..f946657 100644
--- a/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.cc
+++ b/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.cc
@@ -106,7 +106,7 @@
 void FloatingWorkspaceDialogHandler::ShowNetworkDetails(
     const base::Value::List& args) {
   CHECK_EQ(1u, args.size());
-  std::string guid = args[0].GetString();
+  const std::string& guid = args[0].GetString();
 
   // We need to pass NativeWindow to the network dialog here, because otherwise
   // the network dialog would be shown behind our main modal dialog.
@@ -119,7 +119,7 @@
 void FloatingWorkspaceDialogHandler::ShowNetworkConfig(
     const base::Value::List& args) {
   CHECK_EQ(1u, args.size());
-  std::string guid = args[0].GetString();
+  const std::string& guid = args[0].GetString();
 
   // We need to pass NativeWindow to the network dialog here, because otherwise
   // the network dialog would be shown behind our main modal dialog.
@@ -131,7 +131,7 @@
 
 void FloatingWorkspaceDialogHandler::AddNetwork(const base::Value::List& args) {
   CHECK_EQ(1u, args.size());
-  std::string onc_type = args[0].GetString();
+  const std::string& onc_type = args[0].GetString();
 
   // We need to pass NativeWindow to the network dialog here, because otherwise
   // the network dialog would be shown behind our main modal dialog.
@@ -145,7 +145,7 @@
 void FloatingWorkspaceDialogHandler::GetHostname(
     const base::Value::List& args) {
   CHECK_EQ(1u, args.size());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
   std::string hostname =
       NetworkHandler::Get()->network_state_handler()->hostname();
 
diff --git a/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_network_handler.cc b/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_network_handler.cc
index 79d503a4..b99f1e8 100644
--- a/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_network_handler.cc
+++ b/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_network_handler.cc
@@ -85,7 +85,7 @@
 void NetworkConfigMessageHandler::ShowNetworkDetails(
     const base::Value::List& args) {
   CHECK_EQ(1u, args.size());
-  std::string guid = args[0].GetString();
+  const std::string& guid = args[0].GetString();
 
   InternetDetailDialog::ShowDialog(guid);
 }
@@ -93,21 +93,21 @@
 void NetworkConfigMessageHandler::ShowNetworkConfig(
     const base::Value::List& args) {
   CHECK_EQ(1u, args.size());
-  std::string guid = args[0].GetString();
+  const std::string& guid = args[0].GetString();
 
   InternetConfigDialog::ShowDialogForNetworkId(guid);
 }
 
 void NetworkConfigMessageHandler::AddNetwork(const base::Value::List& args) {
   CHECK_EQ(1u, args.size());
-  std::string onc_type = args[0].GetString();
+  const std::string& onc_type = args[0].GetString();
 
   InternetConfigDialog::ShowDialogForNetworkType(onc_type);
 }
 
 void NetworkConfigMessageHandler::GetHostname(const base::Value::List& args) {
   CHECK_EQ(1u, args.size());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
   std::string hostname =
       NetworkHandler::Get()->network_state_handler()->hostname();
   Respond(callback_id, hostname);
diff --git a/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_reauth_handler.cc b/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_reauth_handler.cc
index 61f431b..c1ce6dd 100644
--- a/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_reauth_handler.cc
+++ b/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_reauth_handler.cc
@@ -310,8 +310,8 @@
   CHECK_EQ(params.size(), 7u);
   bool using_saml;
   GaiaId gaia_id(params[0].GetString());
-  std::string email = params[1].GetString();
-  std::string password = params[2].GetString();
+  const std::string& email = params[1].GetString();
+  const std::string& password = params[2].GetString();
   auto scraped_saml_passwords =
       ::login::ConvertToStringList(params[3].GetList());
   using_saml = params[4].GetBool();
@@ -414,7 +414,7 @@
 void LockScreenReauthHandler::HandleUpdateUserPassword(
     const base::Value::List& value) {
   DCHECK(!value.empty());
-  std::string old_password = value[0].GetString();
+  const std::string& old_password = value[0].GetString();
   lock_screen_reauth_manager_->UpdateUserPassword(old_password);
 }
 
diff --git a/chrome/browser/ui/webui/ash/login/welcome_screen_handler.cc b/chrome/browser/ui/webui/ash/login/welcome_screen_handler.cc
index 0501040..e50ccbb 100644
--- a/chrome/browser/ui/webui/ash/login/welcome_screen_handler.cc
+++ b/chrome/browser/ui/webui/ash/login/welcome_screen_handler.cc
@@ -321,8 +321,8 @@
     CHECK(value.is_list());
     const base::Value::List& timezone = value.GetList();
 
-    std::string timezone_id = timezone[0].GetString();
-    std::string timezone_name = timezone[1].GetString();
+    const std::string& timezone_id = timezone[0].GetString();
+    const std::string& timezone_name = timezone[1].GetString();
 
     base::Value::Dict timezone_option;
     timezone_option.Set("value", timezone_id);
diff --git a/chrome/browser/ui/webui/ash/multidevice_setup/multidevice_setup_handler.cc b/chrome/browser/ui/webui/ash/multidevice_setup/multidevice_setup_handler.cc
index 5c92006..8869276 100644
--- a/chrome/browser/ui/webui/ash/multidevice_setup/multidevice_setup_handler.cc
+++ b/chrome/browser/ui/webui/ash/multidevice_setup/multidevice_setup_handler.cc
@@ -71,7 +71,7 @@
   AllowJavascript();
 
   DCHECK(!args.empty());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
 
   const user_manager::User* user =
       ProfileHelper::Get()->GetUserByProfile(Profile::FromWebUI(web_ui()));
diff --git a/chrome/browser/ui/webui/ash/network_ui/network_logs_message_handler.cc b/chrome/browser/ui/webui/ash/network_ui/network_logs_message_handler.cc
index 64688b88..d694052 100644
--- a/chrome/browser/ui/webui/ash/network_ui/network_logs_message_handler.cc
+++ b/chrome/browser/ui/webui/ash/network_ui/network_logs_message_handler.cc
@@ -90,7 +90,7 @@
 
 void NetworkLogsMessageHandler::OnStoreLogs(const base::Value::List& list) {
   CHECK_EQ(2u, list.size());
-  std::string callback_id = list[0].GetString();
+  const std::string& callback_id = list[0].GetString();
   const base::Value::Dict& options = list[1].GetDict();
   AllowJavascript();
 
@@ -185,8 +185,8 @@
 void NetworkLogsMessageHandler::OnSetShillDebugging(
     const base::Value::List& list) {
   CHECK_EQ(2u, list.size());
-  std::string callback_id = list[0].GetString();
-  std::string subsystem = list[1].GetString();
+  const std::string& callback_id = list[0].GetString();
+  const std::string& subsystem = list[1].GetString();
   AllowJavascript();
   DebugDaemonClient::Get()->SetDebugMode(
       subsystem,
diff --git a/chrome/browser/ui/webui/ash/network_ui/onc_import_message_handler.cc b/chrome/browser/ui/webui/ash/network_ui/onc_import_message_handler.cc
index 059a67c..0352359 100644
--- a/chrome/browser/ui/webui/ash/network_ui/onc_import_message_handler.cc
+++ b/chrome/browser/ui/webui/ash/network_ui/onc_import_message_handler.cc
@@ -72,8 +72,8 @@
 
 void OncImportMessageHandler::OnImportONC(const base::Value::List& list) {
   CHECK_EQ(2u, list.size());
-  std::string callback_id = list[0].GetString();
-  std::string onc_blob = list[1].GetString();
+  const std::string& callback_id = list[0].GetString();
+  const std::string& onc_blob = list[1].GetString();
   AllowJavascript();
 
   // TODO(crbug.com/40753707): Pass the `NssCertDatabaseGetter` to
diff --git a/chrome/browser/ui/webui/ash/settings/pages/crostini/guest_os_handler.cc b/chrome/browser/ui/webui/ash/settings/pages/crostini/guest_os_handler.cc
index 33ab97d..18572b0 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/crostini/guest_os_handler.cc
+++ b/chrome/browser/ui/webui/ash/settings/pages/crostini/guest_os_handler.cc
@@ -83,7 +83,7 @@
     const base::Value::List& args) {
   AllowJavascript();
   CHECK_EQ(2U, args.size());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
 
   base::Value::List texts;
   for (const auto& path : args[1].GetList()) {
@@ -96,9 +96,9 @@
 void GuestOsHandler::HandleRemoveGuestOsSharedPath(
     const base::Value::List& args) {
   CHECK_EQ(3U, args.size());
-  std::string callback_id = args[0].GetString();
-  std::string vm_name = args[1].GetString();
-  std::string path = args[2].GetString();
+  const std::string& callback_id = args[0].GetString();
+  const std::string& vm_name = args[1].GetString();
+  const std::string& path = args[2].GetString();
 
   guest_os::GuestOsSharePathFactory::GetForProfile(profile_)->UnsharePath(
       vm_name, base::FilePath(path),
diff --git a/chrome/browser/ui/webui/ash/settings/pages/multidevice/multidevice_handler.cc b/chrome/browser/ui/webui/ash/settings/pages/multidevice/multidevice_handler.cc
index a3052bd..2977cbe 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/multidevice/multidevice_handler.cc
+++ b/chrome/browser/ui/webui/ash/settings/pages/multidevice/multidevice_handler.cc
@@ -340,7 +340,7 @@
     const base::Value::List& args) {
   const auto& list = args;
   DCHECK_GE(list.size(), 3u);
-  std::string callback_id = list[0].GetString();
+  const std::string& callback_id = list[0].GetString();
 
   int feature_as_int = list[1].GetInt();
 
diff --git a/chrome/browser/ui/webui/ash/settings/pages/people/fingerprint_handler.cc b/chrome/browser/ui/webui/ash/settings/pages/people/fingerprint_handler.cc
index b8376a06..5efb0d36 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/people/fingerprint_handler.cc
+++ b/chrome/browser/ui/webui/ash/settings/pages/people/fingerprint_handler.cc
@@ -235,7 +235,7 @@
     const base::Value::List& args) {
   const auto& list = args;
   CHECK_EQ(2U, list.size());
-  std::string callback_id = list[0].GetString();
+  const std::string& callback_id = list[0].GetString();
   int index = list[1].GetInt();
   CHECK_GE(index, 0);
   CHECK_LT(index, static_cast<int>(fingerprints_paths_.size()));
@@ -256,7 +256,7 @@
   const auto& list = args;
   // TODO(b/261412646): add unit tests to this class
   CHECK_EQ(3U, list.size());
-  std::string callback_id = list[0].GetString();
+  const std::string& callback_id = list[0].GetString();
   const std::string& auth_token = list[2].GetString();
   int index = list[1].GetInt();
   CHECK_GE(index, 0);
@@ -287,12 +287,12 @@
   const auto& list = args;
   CHECK_EQ(3U, list.size());
 
-  std::string callback_id = list[0].GetString();
+  const std::string& callback_id = list[0].GetString();
   int index = list[1].GetInt();
   CHECK_GE(index, 0);
   CHECK_LT(index, static_cast<int>(fingerprints_paths_.size()));
 
-  std::string new_label = list[2].GetString();
+  const std::string& new_label = list[2].GetString();
 
   AllowJavascript();
   fp_service_->SetRecordLabel(
diff --git a/chrome/browser/ui/webui/ash/settings/pages/power/power_section.cc b/chrome/browser/ui/webui/ash/settings/pages/power/power_section.cc
index 94472834..ac6123f 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/power/power_section.cc
+++ b/chrome/browser/ui/webui/ash/settings/pages/power/power_section.cc
@@ -195,6 +195,9 @@
                               Shell::Get()
                                   ->adaptive_charging_controller()
                                   ->IsAdaptiveChargingSupported());
+
+  html_source->AddBoolean("isBatteryChargeLimitAvailable",
+                          ash::features::IsBatteryChargeLimitAvailable());
 }
 
 void PowerSection::AddHandlers(content::WebUI* web_ui) {
diff --git a/chrome/browser/ui/webui/ash/settings/pages/printing/cups_printers_handler.cc b/chrome/browser/ui/webui/ash/settings/pages/printing/cups_printers_handler.cc
index 2637aa7..a6e6c51 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/printing/cups_printers_handler.cc
+++ b/chrome/browser/ui/webui/ash/settings/pages/printing/cups_printers_handler.cc
@@ -400,7 +400,7 @@
   AllowJavascript();
 
   CHECK_EQ(1U, args.size());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
 
   std::vector<Printer> printers =
       printers_manager_->GetPrinters(PrinterClass::kEnterprise);
@@ -832,7 +832,7 @@
 void CupsPrintersHandler::AddOrReconfigurePrinter(const base::Value::List& args,
                                                   bool is_printer_edit) {
   CHECK_EQ(2U, args.size());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
   const base::Value& printer_value = args[1];
   CHECK(printer_value.is_dict());
   const base::Value::Dict& printer_dict = printer_value.GetDict();
diff --git a/chrome/browser/ui/webui/ash/smb_shares/smb_handler.cc b/chrome/browser/ui/webui/ash/smb_shares/smb_handler.cc
index 4521d982..2c35121 100644
--- a/chrome/browser/ui/webui/ash/smb_shares/smb_handler.cc
+++ b/chrome/browser/ui/webui/ash/smb_shares/smb_handler.cc
@@ -75,11 +75,11 @@
 void SmbHandler::HandleSmbMount(const base::Value::List& args) {
   CHECK_EQ(8U, args.size());
 
-  std::string callback_id = args[0].GetString();
-  std::string mount_url = args[1].GetString();
-  std::string mount_name = args[2].GetString();
-  std::string username = args[3].GetString();
-  std::string password = args[4].GetString();
+  const std::string& callback_id = args[0].GetString();
+  const std::string& mount_url = args[1].GetString();
+  const std::string& mount_name = args[2].GetString();
+  const std::string& username = args[3].GetString();
+  const std::string& password = args[4].GetString();
   bool use_kerberos = args[5].GetBool();
   bool should_open_file_manager_after_mount = args[6].GetBool();
   bool save_credentials = args[7].GetBool();
@@ -136,7 +136,7 @@
 
 void SmbHandler::HandleHasAnySmbMountedBefore(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
   smb_client::SmbService* const service = GetLocalSmbService();
 
   AllowJavascript();
diff --git a/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.cc b/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.cc
index ef016d3a..f939cd10 100644
--- a/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.cc
+++ b/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.cc
@@ -303,7 +303,7 @@
     const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
   const base::Value& callback_id = args[0];
-  std::string id = args[1].GetString();
+  const std::string& id = args[1].GetString();
 
   AllowJavascript();
 
@@ -314,7 +314,7 @@
 void BookmarksMessageHandler::HandleSingleUploadClicked(
     const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
-  std::string id_string = args[0].GetString();
+  const std::string& id_string = args[0].GetString();
   int64_t id;
   base::StringToInt64(id_string, &id);
 
diff --git a/chrome/browser/ui/webui/metrics_handler.cc b/chrome/browser/ui/webui/metrics_handler.cc
index 64675006..fa07238 100644
--- a/chrome/browser/ui/webui/metrics_handler.cc
+++ b/chrome/browser/ui/webui/metrics_handler.cc
@@ -49,7 +49,7 @@
 
 void MetricsHandler::HandleRecordAction(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
-  std::string string_action = args[0].GetString();
+  const std::string& string_action = args[0].GetString();
   base::RecordComputedAction(string_action);
 }
 
diff --git a/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc b/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc
index 043eb43..12d4dfc 100644
--- a/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc
+++ b/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc
@@ -478,7 +478,7 @@
     return;
   }
 
-  std::string share_target_id = args[1].GetString();
+  const std::string& share_target_id = args[1].GetString();
   auto it = id_to_share_target_map_.find(share_target_id);
   if (it == id_to_share_target_map_.end()) {
     CD_LOG(ERROR, Feature::NS)
@@ -507,7 +507,7 @@
     return;
   }
 
-  std::string share_target_id = args[0].GetString();
+  const std::string& share_target_id = args[0].GetString();
   auto it = id_to_share_target_map_.find(share_target_id);
   if (it == id_to_share_target_map_.end()) {
     CD_LOG(ERROR, Feature::NS)
@@ -529,7 +529,7 @@
     return;
   }
 
-  std::string share_target_id = args[0].GetString();
+  const std::string& share_target_id = args[0].GetString();
   auto it = id_to_share_target_map_.find(share_target_id);
   if (it == id_to_share_target_map_.end()) {
     CD_LOG(ERROR, Feature::NS)
@@ -550,7 +550,7 @@
     return;
   }
 
-  std::string share_target_id = args[0].GetString();
+  const std::string& share_target_id = args[0].GetString();
   auto it = id_to_share_target_map_.find(share_target_id);
   if (it == id_to_share_target_map_.end()) {
     CD_LOG(ERROR, Feature::NS)
@@ -572,7 +572,7 @@
     return;
   }
 
-  std::string share_target_id = args[0].GetString();
+  const std::string& share_target_id = args[0].GetString();
   auto it = id_to_share_target_map_.find(share_target_id);
   if (it == id_to_share_target_map_.end()) {
     CD_LOG(ERROR, Feature::NS)
diff --git a/chrome/browser/ui/webui/password_manager/promo_cards_handler.cc b/chrome/browser/ui/webui/password_manager/promo_cards_handler.cc
index b58c668b..7bb4db0 100644
--- a/chrome/browser/ui/webui/password_manager/promo_cards_handler.cc
+++ b/chrome/browser/ui/webui/password_manager/promo_cards_handler.cc
@@ -130,7 +130,7 @@
     const base::Value::List& args) {
   AllowJavascript();
   CHECK_EQ(1U, args.size());
-  std::string promo_id = args[0].GetString();
+  const std::string& promo_id = args[0].GetString();
 
   for (auto& promo_card : promo_cards_) {
     if (promo_card->GetPromoID() == promo_id) {
diff --git a/chrome/browser/ui/webui/plural_string_handler.cc b/chrome/browser/ui/webui/plural_string_handler.cc
index 70e01a9..8c31b5c 100644
--- a/chrome/browser/ui/webui/plural_string_handler.cc
+++ b/chrome/browser/ui/webui/plural_string_handler.cc
@@ -44,7 +44,7 @@
   CHECK_EQ(3U, args.size());
 
   const base::Value& callback_id = args[0];
-  std::string message_name = args[1].GetString();
+  const std::string& message_name = args[1].GetString();
   int count = args[2].GetInt();
 
   auto string = GetPluralizedStringForMessageName(message_name, count);
@@ -68,9 +68,9 @@
   CHECK_EQ(5U, args.size());
 
   const base::Value& callback_id = args[0];
-  std::string message_name1 = args[1].GetString();
+  const std::string& message_name1 = args[1].GetString();
   int count1 = args[2].GetInt();
-  std::string message_name2 = args[3].GetString();
+  const std::string& message_name2 = args[3].GetString();
   int count2 = args[4].GetInt();
 
   auto string1 = GetPluralizedStringForMessageName(message_name1, count1);
diff --git a/chrome/browser/ui/webui/policy/policy_ui_handler.cc b/chrome/browser/ui/webui/policy/policy_ui_handler.cc
index 3165750f..e3279c1 100644
--- a/chrome/browser/ui/webui/policy/policy_ui_handler.cc
+++ b/chrome/browser/ui/webui/policy/policy_ui_handler.cc
@@ -351,7 +351,7 @@
 
 void PolicyUIHandler::HandleSetLocalTestPolicies(
     const base::Value::List& args) {
-  std::string policies = args[1].GetString();
+  const std::string& policies = args[1].GetString();
   AllowJavascript();
 
   if (!PolicyUI::ShouldLoadTestPage(Profile::FromWebUI(web_ui()))) {
@@ -367,7 +367,7 @@
   CHECK(local_test_provider);
 
 #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS)
-  std::string profile_separation_policy_response = args[2].GetString();
+  const std::string& profile_separation_policy_response = args[2].GetString();
   Profile::FromWebUI(web_ui())->GetPrefs()->ClearPref(
       prefs::kUserCloudSigninPolicyResponseFromPolicyTestPage);
   Profile::FromWebUI(web_ui())->GetPrefs()->SetDefaultPrefValue(
@@ -402,7 +402,7 @@
 
 void PolicyUIHandler::HandleRestartBrowser(const base::Value::List& args) {
   CHECK(args.size() == 2);
-  std::string policies = args[1].GetString();
+  const std::string& policies = args[1].GetString();
 
   // Set policies to preference
   PrefService* prefs = g_browser_process->local_state();
@@ -447,7 +447,7 @@
 void PolicyUIHandler::HandleUploadReport(const base::Value::List& args) {
   upload_report_count_ += 1;
   DCHECK_EQ(1u, args.size());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
   auto* report_scheduler = g_browser_process->browser_policy_connector()
                                ->chrome_browser_cloud_management_controller()
                                ->report_scheduler();
@@ -513,7 +513,7 @@
   AllowJavascript();
 #if !BUILDFLAG(IS_ANDROID)
   Profile* profile = Profile::FromWebUI(web_ui());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
 
   if (!base::FeatureList::IsEnabled(features::kEnablePolicyPromotionBanner) ||
       profile->IsIncognitoProfile() || profile->IsGuestSession() ||
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc
index f3d69bb..70c97b8b 100644
--- a/chrome/browser/ui/webui/settings/people_handler.cc
+++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -1407,7 +1407,7 @@
   CHECK_NE(user_choice, ChromeSigninUserChoice::kNoChoice);
 
   CHECK(args[1].is_string());
-  std::string signed_in_email = args[1].GetString();
+  const std::string& signed_in_email = args[1].GetString();
   CHECK(!signed_in_email.empty());
 
   AccountInfo account =
diff --git a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
index 22bcb17a..c310209 100644
--- a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
+++ b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
@@ -245,8 +245,8 @@
   if (!ok) {
     return custom_handlers::ProtocolHandler::EmptyProtocolHandler();
   }
-  std::string protocol = args[0].GetString();
-  std::string url = args[1].GetString();
+  const std::string& protocol = args[0].GetString();
+  const std::string& url = args[1].GetString();
   return custom_handlers::ProtocolHandler::CreateProtocolHandler(protocol,
                                                                  GURL(url));
 }
diff --git a/chrome/browser/ui/webui/settings/reset_settings_handler.cc b/chrome/browser/ui/webui/settings/reset_settings_handler.cc
index 2557154..00d6a771 100644
--- a/chrome/browser/ui/webui/settings/reset_settings_handler.cc
+++ b/chrome/browser/ui/webui/settings/reset_settings_handler.cc
@@ -145,7 +145,7 @@
   CHECK_EQ(3U, args.size());
   const std::string& callback_id = args[0].GetString();
   const bool& send_settings = args[1].GetBool();
-  std::string request_origin_string = args[2].GetString();
+  const std::string& request_origin_string = args[2].GetString();
   reset_report::ChromeResetReport::ResetRequestOrigin request_origin =
       ResetRequestOriginFromString(request_origin_string);
 
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
index 207b236..c35685b 100644
--- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
@@ -174,7 +174,7 @@
 void ClearBrowsingDataHandler::HandleClearBrowsingData(
     const base::Value::List& args_list) {
   CHECK_EQ(3U, args_list.size());
-  std::string webui_callback_id = args_list[0].GetString();
+  const std::string& webui_callback_id = args_list[0].GetString();
 
   PrefService* prefs = profile_->GetPrefs();
   uint64_t remove_mask = 0;
diff --git a/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc b/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc
index f1c2b21..a90d4d17 100644
--- a/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc
@@ -163,7 +163,7 @@
 void SecureDnsHandler::HandleGetSecureDnsResolverList(
     const base::Value::List& args) {
   AllowJavascript();
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
 
   ResolveJavascriptCallback(base::Value(callback_id),
                             GetSecureDnsResolverList());
diff --git a/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc b/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc
index e099baef..a1302ad1 100644
--- a/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc
@@ -116,7 +116,7 @@
     NOTREACHED();
   }
 
-  std::string url_string = args[1].GetString();
+  const std::string& url_string = args[1].GetString();
 
   GURL url;
   if (!settings_utils::FixupAndValidateStartupPage(url_string, &url)) {
@@ -141,7 +141,7 @@
     NOTREACHED();
   }
 
-  std::string url_string = args[2].GetString();
+  const std::string& url_string = args[2].GetString();
 
   GURL fixed_url;
   if (settings_utils::FixupAndValidateStartupPage(url_string, &fixed_url)) {
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler.cc b/chrome/browser/ui/webui/settings/site_settings_handler.cc
index daacf720..3035c50 100644
--- a/chrome/browser/ui/webui/settings/site_settings_handler.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_handler.cc
@@ -1001,9 +1001,9 @@
   AllowJavascript();
   CHECK_EQ(3U, args.size());
 
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
   int num_members = args[1].GetInt();
-  std::string rws_owner = args[2].GetString();
+  const std::string& rws_owner = args[2].GetString();
 
   const std::string label =
       base::UTF16ToUTF8(base::i18n::MessageFormatter::FormatWithNamedArgs(
@@ -1136,7 +1136,7 @@
   AllowJavascript();
 
   CHECK_EQ(1U, args.size());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
 
   all_sites_map_.clear();
   origin_permission_set_.clear();
@@ -1240,7 +1240,7 @@
   AllowJavascript();
 
   CHECK_EQ(2U, args.size());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
   const std::string& origin_string = args[1].GetString();
 
   base::Value::List result;
@@ -1257,7 +1257,7 @@
   AllowJavascript();
 
   CHECK_EQ(2U, args.size());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
   size_t max_sources = base::checked_cast<size_t>(args[1].GetInt());
 
   const std::vector<ContentSettingsType>& content_types =
@@ -1454,7 +1454,7 @@
 
   CHECK_EQ(3U, args.size());
   const base::Value& callback_id = args[0];
-  std::string origin = args[1].GetString();
+  const std::string& origin = args[1].GetString();
   const base::Value::List& types = args[2].GetList();
 
   // Note: Invalid URLs will just result in default settings being shown.
@@ -1564,7 +1564,7 @@
   CHECK_EQ(3U, args.size());
   const std::string& origin_string = args[0].GetString();
   const std::string* type_string = args[1].GetIfString();
-  std::string value = args[2].GetString();
+  const std::string& value = args[2].GetString();
 
   const GURL origin(origin_string);
   if (!origin.is_valid()) {
@@ -2058,7 +2058,7 @@
 void SiteSettingsHandler::HandleRemoveZoomLevel(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
 
-  std::string host_or_spec = args[0].GetString();
+  const std::string& host_or_spec = args[0].GetString();
 
   GURL url(host_or_spec);
   if (url.is_valid() && url.scheme() == chrome::kIsolatedAppScheme) {
diff --git a/chrome/browser/ui/webui/top_chrome/webui_contents_preload_manager_browsertest.cc b/chrome/browser/ui/webui/top_chrome/webui_contents_preload_manager_browsertest.cc
index db42de0..09ceaa6e 100644
--- a/chrome/browser/ui/webui/top_chrome/webui_contents_preload_manager_browsertest.cc
+++ b/chrome/browser/ui/webui/top_chrome/webui_contents_preload_manager_browsertest.cc
@@ -276,8 +276,14 @@
 
 // Tests that the time from the WebUI is requested to when First Contentful
 // Paint (FCP) is recorded.
+// TODO(crbug.com/40168622): this times out on Chromium OS ASan LSan Tests.
+#if BUILDFLAG(IS_CHROMEOS) && defined(ADDRESS_SANITIZER)
+#define MAYBE_RequestToFCPAndLCP DISABLED_RequestToFCPAndLCP
+#else
+#define MAYBE_RequestToFCPAndLCP RequestToFCPAndLCP
+#endif
 IN_PROC_BROWSER_TEST_F(WebUIContentsPreloadManagerPageLoadMetricsTest,
-                       RequestToFCPAndLCP) {
+                       MAYBE_RequestToFCPAndLCP) {
   // Serves the test origin with files from the test data folder.
   auto url_loader_interceptor =
       content::URLLoaderInterceptor::ServeFilesFromDirectoryAtOrigin(
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index c668686..a25e9d98 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1750075037-9fdd93ded420c6659efa2be98a33e5db289a50ae-e4f8e195a8345123a44875816a9e4f0d6e81cc76.profdata
+chrome-android32-main-1750096673-b3c92c4113b6bf9569bdd4f339bbaa39a09c604d-c9b0244ea9263753a08d76d364047eb5ce63ba3a.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index 69dd992..a58408c0 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1750081143-02a1187a76c1b51afe472fba8e61184aa7e931bc-e8210b0c49f70985863715d21f6b080ce7a9960a.profdata
+chrome-android64-main-1750092216-054bd26d04f2954849fc55ae7aa45cfddb1ae253-027844e56e587fa64df77c376df2c94f14b354a7.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 287de5a..c577095 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1750082360-981f89a10895f9029b8453d757e8e2c883b21ed9-c84d5761297ba5c1fd1c78c3556878e2d5ac8bbb.profdata
+chrome-mac-arm-main-1750096673-b94f71e0eb48851f936650f4ed55e63ef9e60df0-c9b0244ea9263753a08d76d364047eb5ce63ba3a.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 393bc0e7..d339165 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1750053232-7d69de9c36d51e9ae0238330d322e0e70e4929c2-1e7bd3c1484bb4a9e8c3ff5e58bcfe93f4fe86ba.profdata
+chrome-win32-main-1750064332-37e93b5e6c3c17929ce69ce32527533c44856ccb-ea889c052c9544f31174a229c79bacaa0fd36694.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 52ec6260..3efcee2 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1750064332-46c982fa88d5c2af61bc4b896d231c91708afebc-ea889c052c9544f31174a229c79bacaa0fd36694.profdata
+chrome-win64-main-1750075037-6ed8d89febffa68ca3472c6ac867f1f568bfb7f1-e4f8e195a8345123a44875816a9e4f0d6e81cc76.profdata
diff --git a/chrome/common/actor.mojom b/chrome/common/actor.mojom
index 8aca4ea8..b85868dc 100644
--- a/chrome/common/actor.mojom
+++ b/chrome/common/actor.mojom
@@ -183,6 +183,9 @@
   // executing.
   kExecutorDestroyed = 24,
 
+  // The target window no longer exists.
+  kWindowWentAway = 25,
+
   ///////////////////////////////////////////////////////////////////////
   // Codes 100-199: Errors for navigation. (Not part of the ToolAction union
   // as it's a browser-side tool.)
diff --git a/chrome/common/extensions/api/enterprise_reporting_private.idl b/chrome/common/extensions/api/enterprise_reporting_private.idl
index 6d580d2..2490d65 100644
--- a/chrome/common/extensions/api/enterprise_reporting_private.idl
+++ b/chrome/common/extensions/api/enterprise_reporting_private.idl
@@ -319,10 +319,14 @@
   enum DetectorType { PREDEFINED_DLP, USER_DEFINED };
 
   // Information for a data detector used to apply data masking functionality.
+  // The fields of this dictionary correspond to the proto fields of
+  // `MatchedUrlNavigationRule::DataMaskingAction`.
   dictionary MatchedDetector {
     DOMString detectorId;
     DOMString displayName;
-    DetectorType detectorType;
+    DOMString? maskType;
+    DOMString? pattern;
+    DetectorType? detectorType;
   };
 
   // Information for a data leak prevention rule that was used to mask data.
@@ -437,21 +441,15 @@
                                        DoneCallback callback);
   };
 
-  dictionary DataMaskingRule {
-    // Corresponds to `MatchedUrlNavigationRule::DataMaskingAction::mask_type`.
-    DOMString level;
-
-    // Corresponds to `MatchedUrlNavigationRule::DataMaskingAction::pattern`.
-    DOMString regex_pattern;
-
-    // The URL being navigated to that triggered the rule.
+  dictionary DataMaskingRules {
+    // The URL being navigated to that triggered the rules.
     DOMString url;
 
-    TriggeredRuleInfo triggeredRuleInfo;
+    TriggeredRuleInfo[] triggeredRuleInfo;
   };
 
   interface Events {
-    static void onDataMaskingRulesTriggered(DataMaskingRule[] rules);
+    static void onDataMaskingRulesTriggered(DataMaskingRules rules);
   };
 
 };
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index c2c4af0..27a94f3 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -3265,6 +3265,11 @@
 // sessions.
 inline constexpr char kKioskChromeAppsForceAllowed[] =
     "kiosk_chrome_apps_force_allowed";
+
+// A boolean pref which determines whether kiosk application level logs would be
+// collected and stored.
+inline constexpr char kKioskApplicationLogCollectionEnabled[] =
+    "kiosk_application_log_collection_enabled";
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \
diff --git a/chrome/enterprise_companion/BUILD.gn b/chrome/enterprise_companion/BUILD.gn
index 3b4c4aac..b6e8d24 100644
--- a/chrome/enterprise_companion/BUILD.gn
+++ b/chrome/enterprise_companion/BUILD.gn
@@ -468,9 +468,10 @@
 }
 
 if (is_mac && !is_component_build && enable_dsyms) {
+  _symbols_sources = [ "$root_out_dir/$enterprise_companion_product_full_name.app/Contents/MacOS/$enterprise_companion_product_full_name" ]
   action("syms") {
     script = "//build/redirect_stdout.py"
-    sources = [ "$root_out_dir/$enterprise_companion_product_full_name.app/Contents/MacOS/$enterprise_companion_product_full_name" ]
+    sources = _symbols_sources
     _dump_syms =
         "//third_party/breakpad:dump_syms($host_system_allocator_toolchain)"
     public_deps = [
@@ -494,6 +495,19 @@
                  root_build_dir),
            ]
   }
+
+  action("syms_archive") {
+    script = "//chrome/tools/build/mac/archive_symbols.py"
+    sources = _symbols_sources
+    deps = [ ":syms" ]
+    _output =
+        "$root_out_dir/$enterprise_companion_product_full_name.dSYM.tar.bz2"
+    outputs = [ _output ]
+    args = [ rebase_path(_output, root_out_dir) ] +
+           rebase_path(
+               [ "$root_out_dir/$enterprise_companion_product_full_name.dSYM" ],
+               root_out_dir)
+  }
 }
 
 # The contents of this zip are uploaded by archivers (//infra/archive_config).
@@ -517,9 +531,10 @@
     ]
     if (!is_component_build && enable_dsyms) {
       # Build symbols but do not include them in the archive. In official
-      # builds, the symbols built alongside the archive will be uploaded to the
-      # crash servers via symupload.
-      deps += [ ":syms" ]
+      # builds, breakpad symbols built alongside the archive will be uploaded to
+      # the crash servers via symupload and native symbols will be archived in
+      # chrome-unsigned.
+      deps += [ ":syms_archive" ]
     }
   } else if (is_win) {
     inputs = [ "$root_build_dir/enterprise_companion.exe" ]
diff --git a/chrome/renderer/accessibility/phrase_segmentation/dependency_parser_model.cc b/chrome/renderer/accessibility/phrase_segmentation/dependency_parser_model.cc
index 1841e55..fe0b85d 100644
--- a/chrome/renderer/accessibility/phrase_segmentation/dependency_parser_model.cc
+++ b/chrome/renderer/accessibility/phrase_segmentation/dependency_parser_model.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/renderer/accessibility/phrase_segmentation/dependency_parser_model.h"
 
+#include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/histogram_macros_local.h"
diff --git a/chrome/renderer/actor/page_stability_monitor.cc b/chrome/renderer/actor/page_stability_monitor.cc
index 615d425..8000267 100644
--- a/chrome/renderer/actor/page_stability_monitor.cc
+++ b/chrome/renderer/actor/page_stability_monitor.cc
@@ -48,24 +48,23 @@
 
 }  // namespace
 
-PageStabilityMonitor::PageStabilityMonitor(RenderFrame& frame,
-                                           int32_t task_id,
-                                           Journal& journal)
+PageStabilityMonitor::PageStabilityMonitor(RenderFrame& frame)
     : RenderFrameObserver(&frame) {
   CHECK(render_frame());
   CHECK(render_frame()->GetWebFrame());
   starting_request_count_ =
       render_frame()->GetWebFrame()->GetDocument().ActiveResourceRequestCount();
-
-  journal_entry_ =
-      journal.CreatePendingAsyncEntry(task_id, "PageStability", "");
 }
 
 PageStabilityMonitor::~PageStabilityMonitor() = default;
 
-void PageStabilityMonitor::WaitForStable(base::OnceClosure callback) {
+void PageStabilityMonitor::WaitForStable(int32_t task_id,
+                                         Journal& journal,
+                                         base::OnceClosure callback) {
   CHECK_EQ(state_, State::kInitial);
   CHECK(!is_stable_callback_);
+  journal_entry_ =
+      journal.CreatePendingAsyncEntry(task_id, "PageStability", "");
 
   is_stable_callback_ = std::move(callback);
 
diff --git a/chrome/renderer/actor/page_stability_monitor.h b/chrome/renderer/actor/page_stability_monitor.h
index 7592ccc..9fdee068 100644
--- a/chrome/renderer/actor/page_stability_monitor.h
+++ b/chrome/renderer/actor/page_stability_monitor.h
@@ -24,14 +24,14 @@
  public:
   // Constructs the monitor and takes a baseline observation of the document in
   // the given RenderFrame.
-  PageStabilityMonitor(content::RenderFrame& frame,
-                       int32_t task_id,
-                       Journal& journal);
+  explicit PageStabilityMonitor(content::RenderFrame& frame);
   ~PageStabilityMonitor() override;
 
   // Invokes the given callback when the page is deemed stable enough for an
   // observation to take place or when the document is no longer active.
-  void WaitForStable(base::OnceClosure callback);
+  void WaitForStable(int32_t task_id,
+                     Journal& journal,
+                     base::OnceClosure callback);
 
   // RenderFrameObserver
   void DidCommitProvisionalLoad(ui::PageTransition transition) override;
diff --git a/chrome/renderer/actor/tool_executor.cc b/chrome/renderer/actor/tool_executor.cc
index b6a0a09..0e99615 100644
--- a/chrome/renderer/actor/tool_executor.cc
+++ b/chrome/renderer/actor/tool_executor.cc
@@ -39,6 +39,8 @@
                               ToolExecutorCallback callback) {
   CHECK(!completion_callback_);
   completion_callback_ = std::move(callback);
+  journal_entry_ =
+      journal_->CreatePendingAsyncEntry(request->task_id, "InvokeTool", "");
 
   WebLocalFrame* web_frame = frame_->GetWebFrame();
   // Check LocalRoot in case the frame is a subframe.
@@ -100,21 +102,24 @@
       NOTREACHED();
   }
 
-  journal_->Log(request->task_id, "Renderer InvokeTool", tool->DebugString());
+  page_stability_monitor_ = std::make_unique<PageStabilityMonitor>(*frame_);
 
-  page_stability_monitor_ = std::make_unique<PageStabilityMonitor>(
-      *frame_, request->task_id, *journal_);
-
+  auto execute_journal = journal_->CreatePendingAsyncEntry(
+      request->task_id, "ExecuteTool", tool->DebugString());
   mojom::ActionResultPtr result = tool->Execute();
+  execute_journal.reset();
 
-  page_stability_monitor_->WaitForStable(base::BindOnce(
-      &ToolExecutor::ToolFinished, base::Unretained(this), std::move(result)));
+  page_stability_monitor_->WaitForStable(
+      request->task_id, *journal_,
+      base::BindOnce(&ToolExecutor::ToolFinished, base::Unretained(this),
+                     std::move(result)));
 }
 
 void ToolExecutor::ToolFinished(mojom::ActionResultPtr result) {
   CHECK(completion_callback_);
   page_stability_monitor_.reset();
   std::move(completion_callback_).Run(std::move(result));
+  journal_entry_.reset();
 }
 
 }  // namespace actor
diff --git a/chrome/renderer/actor/tool_executor.h b/chrome/renderer/actor/tool_executor.h
index 7a69e35..9b7a1ae 100644
--- a/chrome/renderer/actor/tool_executor.h
+++ b/chrome/renderer/actor/tool_executor.h
@@ -47,6 +47,7 @@
   base::raw_ref<Journal> journal_;
   std::unique_ptr<PageStabilityMonitor> page_stability_monitor_;
   ToolExecutorCallback completion_callback_;
+  std::unique_ptr<Journal::PendingAsyncEntry> journal_entry_;
 
   base::WeakPtrFactory<ToolExecutor> weak_ptr_factory_{this};
 };
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index 3d67ccaa..e022ae83 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -1752,7 +1752,7 @@
 #endif
 }
 
-void ChromeContentRendererClient::WillPrepareForEvaluationOnWorkerThread(
+void ChromeContentRendererClient::WillEvaluateServiceWorkerOnWorkerThread(
     blink::WebServiceWorkerContextProxy* context_proxy,
     v8::Local<v8::Context> v8_context,
     int64_t service_worker_version_id,
@@ -1762,20 +1762,12 @@
 #if BUILDFLAG(ENABLE_EXTENSIONS_CORE)
   extensions::ExtensionsRendererClient::Get()
       ->dispatcher()
-      ->WillPrepareForEvaluationOnWorkerThread(
+      ->WillEvaluateServiceWorkerOnWorkerThread(
           context_proxy, v8_context, service_worker_version_id,
           service_worker_scope, script_url, service_worker_token);
 #endif
 }
 
-void ChromeContentRendererClient::WillEvaluateServiceWorkerOnWorkerThread() {
-#if BUILDFLAG(ENABLE_EXTENSIONS_CORE)
-  extensions::ExtensionsRendererClient::Get()
-      ->dispatcher()
-      ->WillEvaluateServiceWorkerOnWorkerThread();
-#endif
-}
-
 void ChromeContentRendererClient::DidStartServiceWorkerContextOnWorkerThread(
     int64_t service_worker_version_id,
     const GURL& service_worker_scope,
diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h
index 5b4a0f2..8c08514 100644
--- a/chrome/renderer/chrome_content_renderer_client.h
+++ b/chrome/renderer/chrome_content_renderer_client.h
@@ -207,14 +207,13 @@
       blink::WebServiceWorkerContextProxy* context_proxy,
       const GURL& service_worker_scope,
       const GURL& script_url) override;
-  void WillPrepareForEvaluationOnWorkerThread(
+  void WillEvaluateServiceWorkerOnWorkerThread(
       blink::WebServiceWorkerContextProxy* context_proxy,
       v8::Local<v8::Context> v8_context,
       int64_t service_worker_version_id,
       const GURL& service_worker_scope,
       const GURL& script_url,
       const blink::ServiceWorkerToken& service_worker_token) override;
-  void WillEvaluateServiceWorkerOnWorkerThread() override;
   void DidStartServiceWorkerContextOnWorkerThread(
       int64_t service_worker_version_id,
       const GURL& service_worker_scope,
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 2a74de7..c877b9d0 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -4635,7 +4635,6 @@
 
         sources += [
           "../browser/extensions/api/identity/launch_web_auth_flow_delegate_ash_browsertest.cc",
-          "../browser/extensions/component_extension_browsertest.cc",
           "../browser/ui/views/extensions/web_file_handlers/web_file_handlers_file_launch_browsertest.cc",
         ]
       }
@@ -5744,7 +5743,6 @@
 
     if (enable_webui_tab_strip) {
       sources += [
-        "../browser/ui/views/frame/webui_tab_strip_container_view_browsertest.cc",
         "../browser/ui/views/frame/webui_tab_strip_field_trial_browsertest.cc",
         "../browser/ui/views/toolbar/webui_tab_counter_button_browsertest.cc",
         "../browser/ui/webui/tab_strip/tab_strip_ui_browsertest.cc",
@@ -6614,6 +6612,7 @@
 
   if (enable_webui_tab_strip) {
     sources += [
+      "../browser/ui/views/frame/webui_tab_strip_container_view_unittest.cc",
       "../browser/ui/webui/tab_strip/tab_strip_page_handler_unittest.cc",
       "../browser/ui/webui/tab_strip/tab_strip_ui_layout_unittest.cc",
       "../browser/ui/webui/tab_strip/thumbnail_tracker_unittest.cc",
@@ -12209,10 +12208,13 @@
     "//components/bookmarks/browser:test_support",
     "//components/bookmarks/managed",
     "//components/browser_sync",
+    "//components/commerce/core:feature_list",
     "//components/favicon/core",
     "//components/invalidation/impl",
     "//components/invalidation/impl:test_support",
     "//components/os_crypt/sync:test_support",
+    "//components/password_manager/core/browser:password_manager_buildflags",
+    "//components/plus_addresses:features",
     "//components/saved_tab_groups/public",
     "//components/signin/public/identity_manager:test_support",
     "//components/sync",
@@ -12270,6 +12272,7 @@
       ":sync_integration_test_support_jni_headers",
       ":test_support_jni_headers",
       "//chrome/browser/android/webapk:webapk_sources",
+      "//chrome/browser/password_manager/android:utils",
       "//chrome/browser/ui/android/tab_model",
       "//components/saved_tab_groups/public:conversion_utils",
     ]
diff --git a/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsActivity.java b/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsActivity.java
index d30d7ea3..e7e1302b 100644
--- a/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsActivity.java
+++ b/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsActivity.java
@@ -37,7 +37,12 @@
         mTest.appendCommandLineFlags(
                 "--remote-debugging-socket-name android_browsertests_devtools_remote");
 
-        NativeBrowserTest.deletePrivateDataDirectory(getPrivateDataDirectory());
+        // TODO(crbug.com/40200835): Enable PRE_ tests in android_browsertests
+        // Note that android_browsertests does not use this data directory. It
+        // uses a temp dir created by c++ code since https://crrev.com/c/1677591
+        if (!mTest.shouldKeepUserDataDir()) {
+            NativeBrowserTest.deletePrivateDataDirectory(getPrivateDataDirectory());
+        }
 
         // Replace ContentMain() with running our NativeTest suite.
         BrowserStartupController.getInstance()
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/dom_distiller/ReaderModePreferencesDialog.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/dom_distiller/ReaderModePreferencesDialog.java
index 1c65440..2c16c48 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/dom_distiller/ReaderModePreferencesDialog.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/dom_distiller/ReaderModePreferencesDialog.java
@@ -11,7 +11,6 @@
 import android.widget.SeekBar;
 import android.widget.Spinner;
 
-import androidx.test.espresso.Espresso;
 import androidx.test.espresso.action.GeneralClickAction;
 import androidx.test.espresso.action.GeneralLocation;
 import androidx.test.espresso.action.Press;
@@ -19,7 +18,8 @@
 import androidx.test.platform.app.InstrumentationRegistry;
 
 import org.chromium.base.test.transit.CarryOn;
-import org.chromium.base.test.transit.Condition;
+import org.chromium.base.test.transit.Triggers;
+import org.chromium.base.test.transit.TripBuilder;
 import org.chromium.base.test.transit.ViewElement;
 import org.chromium.chrome.browser.app.ChromeActivity;
 import org.chromium.chrome.test.R;
@@ -67,46 +67,26 @@
         fontSizeSliderElement = declareView(SeekBar.class, withId(R.id.font_size));
     }
 
-    public void pickColorLight(Condition condition) {
-        Condition.runAndWaitFor(lightButtonElement.getClickTrigger(), condition);
-    }
-
-    public void pickColorDark(Condition condition) {
-        Condition.runAndWaitFor(darkButtonElement.getClickTrigger(), condition);
-    }
-
-    public void pickColorSepia(Condition condition) {
-        Condition.runAndWaitFor(sepiaButtonElement.getClickTrigger(), condition);
-    }
-
-    public void setFontSizeSliderToMin(Condition condition) {
+    public TripBuilder setFontSizeSliderToMinTo() {
         // Min is 50% font size.
-        Condition.runAndWaitFor(
-                fontSizeSliderElement.getPerformTrigger(
-                        new GeneralClickAction(
-                                Tap.SINGLE, GeneralLocation.CENTER_LEFT, Press.FINGER)),
-                condition);
+        return fontSizeSliderElement.performViewActionTo(
+                new GeneralClickAction(Tap.SINGLE, GeneralLocation.CENTER_LEFT, Press.FINGER));
     }
 
-    public void setFontSizeSliderToMax(Condition condition) {
-        Condition.runAndWaitFor(
-                fontSizeSliderElement.getPerformTrigger(
-                        new GeneralClickAction(
-                                Tap.SINGLE, GeneralLocation.CENTER_RIGHT, Press.FINGER)),
-                condition);
-    }
-
-    public void pressBackToClose() {
-        drop(Espresso::pressBack);
+    public TripBuilder setFontSizeSliderToMaxTo() {
+        return fontSizeSliderElement.performViewActionTo(
+                new GeneralClickAction(Tap.SINGLE, GeneralLocation.CENTER_RIGHT, Press.FINGER));
     }
 
     public static ReaderModePreferencesDialog open(ChromeActivity activity) {
-        return CarryOn.pickUp(
-                new ReaderModePreferencesDialog(),
-                () ->
-                        MenuUtils.invokeCustomMenuActionSync(
-                                InstrumentationRegistry.getInstrumentation(),
-                                activity,
-                                R.id.reader_mode_prefs_id));
+        // TODO(crbug.com/350074837): when this is a Facility, use
+        // ChromeTriggers#invokeCustomMenuActionTo().
+        return Triggers.runTo(
+                        () ->
+                                MenuUtils.invokeCustomMenuActionSync(
+                                        InstrumentationRegistry.getInstrumentation(),
+                                        activity,
+                                        R.id.reader_mode_prefs_id))
+                .pickUpCarryOn(new ReaderModePreferencesDialog());
     }
 }
diff --git a/chrome/test/data/extensions/service_worker/mojo/manifest.json b/chrome/test/data/extensions/service_worker/mojo/manifest.json
deleted file mode 100644
index 51c919b..0000000
--- a/chrome/test/data/extensions/service_worker/mojo/manifest.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA22ThlvdzIV2u5FrtEP9ab+EjrI/nMcrY9NPoBqIannUPKpB4RjcKWNwsjyiHC/n5x1FQ6xNQ2LT9PSgOqk6hn1tIYkdrKYKGzpWHDaIsRqtIDPj0htcV1QvXB1Ct3xzR54Dn1OtZceoxPxtTOOD4po8I8zfos59TSyZk3XKSBlP8/laxo33Lze9gadH2wF6u1crBtbNq4O1Wj6DB5o7YKwu/KjY8MUcL4Eks8cAfvR+GXEgCqS5l4x2nnfAYdu/YhzeVCYKbwqUB+trCeYdtc20zLExOm9ruwJs9moD6wmAOBtgiTBqFb7iN4EpbvoupD0FFB/FWU1MzlkZXm/x+eQIDAQAB",
-  "name": "Test component extension",
-  "version": "1.0",
-  "manifest_version": 3,
-  "background": {
-    "service_worker": "sw.js"
-  },
-  "permissions": [
-    "mojoPrivate"
-  ]
-}
diff --git a/chrome/test/data/extensions/service_worker/mojo/sw.js b/chrome/test/data/extensions/service_worker/mojo/sw.js
deleted file mode 100644
index d7697b2..0000000
--- a/chrome/test/data/extensions/service_worker/mojo/sw.js
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-chrome.test.runTests([
-  function createMojoMessagePipe() {
-    let {handle0, handle1} = Mojo.createMessagePipe();
-    handle0.close();
-    handle1.close();
-    chrome.test.succeed();
-  }
-]);
diff --git a/chrome/test/data/webui/settings/site_details_test.ts b/chrome/test/data/webui/settings/site_details_test.ts
index 0678b04..4c544fb 100644
--- a/chrome/test/data/webui/settings/site_details_test.ts
+++ b/chrome/test/data/webui/settings/site_details_test.ts
@@ -53,6 +53,9 @@
   let websiteUsageProxy: TestWebsiteUsageBrowserProxy;
 
   // Initialize a site-details before each test.
+  //
+  // It may also be required to add the ContentSettingsType in the constructor
+  // in test_site_settings_prefs_browser_proxy.ts.
   setup(function() {
     loadTimeData.overrideValues({
       enableWebPrintingContentSetting: true,
@@ -191,6 +194,9 @@
           createContentSettingTypeToValuePair(
               ContentSettingsTypes.POINTER_LOCK,
               [createRawSiteException('https://foo.com:443')]),
+          createContentSettingTypeToValuePair(
+              ContentSettingsTypes.LOCAL_NETWORK_ACCESS,
+              [createRawSiteException('https://foo.com:443')]),
         ],
         [
           createContentSettingTypeToValuePair(
diff --git a/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.ts b/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.ts
index 66adee1..90bc7dc 100644
--- a/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.ts
+++ b/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.ts
@@ -140,6 +140,10 @@
     }
     // </if>
 
+    if (loadTimeData.getBoolean('enableLocalNetworkAccessSetting')) {
+      this.categoryList_.push(ContentSettingsTypes.LOCAL_NETWORK_ACCESS);
+    }
+
     this.prefs_ = createSiteSettingsPrefs([], [], []);
   }
 
diff --git a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java
index ffc5015..4a22295 100644
--- a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java
+++ b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java
@@ -31,7 +31,6 @@
 import android.content.pm.PackageManager;
 import android.media.AudioManager;
 import android.net.Uri;
-import android.os.Build;
 import android.os.PatternMatcher;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
@@ -282,23 +281,6 @@
     }
 
     @Test
-    @Config(sdk = {Build.VERSION_CODES.O})
-    public void testTurnsScreenOnIfTurnOnScreen_AndroidO() {
-        mActivityLifecycle =
-                Robolectric.buildActivity(
-                        CastWebContentsActivity.class,
-                        CastWebContentsIntentUtils.requestStartCastActivity(
-                                mWebContents, true, false, true, false, "0"));
-        mActivity = mActivityLifecycle.get();
-        mActivity.testingModeForTesting();
-        mActivityLifecycle.create();
-
-        Assert.assertTrue(
-                Shadows.shadowOf(mActivity.getWindow())
-                        .getFlag(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON));
-    }
-
-    @Test
     @Config(shadows = {ExtendedShadowActivity.class})
     public void testDoesNotTurnScreenOnIfNotTurnOnScreen() {
         mActivityLifecycle =
@@ -316,23 +298,6 @@
     }
 
     @Test
-    @Config(sdk = {Build.VERSION_CODES.O})
-    public void testDoesNotTurnScreenOnIfNotTurnOnScreen_AndroidO() {
-        mActivityLifecycle =
-                Robolectric.buildActivity(
-                        CastWebContentsActivity.class,
-                        CastWebContentsIntentUtils.requestStartCastActivity(
-                                mWebContents, true, false, true, false, "0"));
-        mActivity = mActivityLifecycle.get();
-        mActivity.testingModeForTesting();
-        mActivityLifecycle.create();
-
-        Assert.assertTrue(
-                Shadows.shadowOf(mActivity.getWindow())
-                        .getFlag(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON));
-    }
-
-    @Test
     public void testKeepsScreenOnIfRequested() {
         mActivityLifecycle =
                 Robolectric.buildActivity(
@@ -464,9 +429,7 @@
     }
 
     @Test
-    @Config(
-            shadows = {ExtendedShadowActivity.class},
-            sdk = {Build.VERSION_CODES.O})
+    @Config(shadows = {ExtendedShadowActivity.class})
     public void testStopWhileNotInPipModeDoesNotCloseActivity() {
         mShadowActivityManager.setLockTaskModeState(ActivityManager.LOCK_TASK_MODE_NONE);
         mActivityLifecycle.create().start().resume();
@@ -480,9 +443,7 @@
     }
 
     @Test
-    @Config(
-            shadows = {ExtendedShadowActivity.class},
-            sdk = {Build.VERSION_CODES.O})
+    @Config(shadows = {ExtendedShadowActivity.class})
     public void testStopWhileInPipModeDoesNotClosesActivity() {
         mShadowActivityManager.setLockTaskModeState(ActivityManager.LOCK_TASK_MODE_NONE);
         mActivityLifecycle.create().start().resume();
diff --git a/chromeos/ash/components/report/device_metrics/actives/one_day_impl.cc b/chromeos/ash/components/report/device_metrics/actives/one_day_impl.cc
index 1c8000e..68e6340 100644
--- a/chromeos/ash/components/report/device_metrics/actives/one_day_impl.cc
+++ b/chromeos/ash/components/report/device_metrics/actives/one_day_impl.cc
@@ -117,7 +117,7 @@
 }
 
 void OneDayImpl::OnCheckMembershipOprfComplete(
-    std::unique_ptr<std::string> response_body) {
+    std::optional<std::string> response_body) {
   // Use RAII to reset |url_loader_| after current function scope.
   auto url_loader = std::move(url_loader_);
 
@@ -127,18 +127,17 @@
 
   // Convert serialized response body to oprf response protobuf.
   FresnelPsmRlweOprfResponse psm_oprf_response;
-  bool is_response_body_set = response_body.get() != nullptr;
   base::UmaHistogramBoolean(kHistogramsIsPsm1DAOprfResponseBodySet,
-                            is_response_body_set);
+                            response_body.has_value());
 
-  if (!is_response_body_set ||
+  if (!response_body.has_value() ||
       !psm_oprf_response.ParseFromString(*response_body)) {
     base::UmaHistogramBoolean(kHistogramsIsPsm1DAOprfResponseParsedCorrectly,
                               false);
     LOG(ERROR) << "Oprf response net code = " << net_code;
     LOG(ERROR) << "Response body was not set or could not be parsed into "
                << "FresnelPsmRlweOprfResponse proto. "
-               << "Is response body set = " << is_response_body_set;
+               << "Is response body set = " << response_body.has_value();
     utils::RecordCheckMembershipCases(
         utils::PsmUseCase::k1DA,
         utils::CheckMembershipResponseCases::kOprfResponseBodyFailed);
@@ -208,7 +207,7 @@
 }
 
 void OneDayImpl::OnCheckMembershipQueryComplete(
-    std::unique_ptr<std::string> response_body) {
+    std::optional<std::string> response_body) {
   // Use RAII to reset |url_loader_| after current function scope.
   auto url_loader = std::move(url_loader_);
 
@@ -218,14 +217,12 @@
 
   // Convert serialized response body to fresnel query response protobuf.
   FresnelPsmRlweQueryResponse psm_query_response;
-  bool is_response_body_set = response_body.get() != nullptr;
-
-  if (!is_response_body_set ||
+  if (!response_body.has_value() ||
       !psm_query_response.ParseFromString(*response_body)) {
     LOG(ERROR) << "Query response net code = " << net_code;
     LOG(ERROR) << "Response body was not set or could not be parsed into "
                << "FresnelPsmRlweQueryResponse proto. "
-               << "Is response body set = " << is_response_body_set;
+               << "Is response body set = " << response_body.has_value();
     utils::RecordCheckMembershipCases(
         utils::PsmUseCase::k1DA,
         utils::CheckMembershipResponseCases::kQueryResponseBodyFailed);
@@ -318,7 +315,7 @@
                                 utils::GetMaxFresnelResponseSizeBytes());
 }
 
-void OneDayImpl::OnCheckInComplete(std::unique_ptr<std::string> response_body) {
+void OneDayImpl::OnCheckInComplete(std::optional<std::string> response_body) {
   // Use RAII to reset |url_loader_| after current function scope.
   auto url_loader = std::move(url_loader_);
 
diff --git a/chromeos/ash/components/report/device_metrics/actives/one_day_impl.h b/chromeos/ash/components/report/device_metrics/actives/one_day_impl.h
index 0ff016f93..8fa4c9905 100644
--- a/chromeos/ash/components/report/device_metrics/actives/one_day_impl.h
+++ b/chromeos/ash/components/report/device_metrics/actives/one_day_impl.h
@@ -33,14 +33,14 @@
   // UseCase:
   void CheckMembershipOprf() override;
   void OnCheckMembershipOprfComplete(
-      std::unique_ptr<std::string> response_body) override;
+      std::optional<std::string> response_body) override;
   void CheckMembershipQuery(
       const private_membership::rlwe::PrivateMembershipRlweOprfResponse&
           oprf_response) override;
   void OnCheckMembershipQueryComplete(
-      std::unique_ptr<std::string> response_body) override;
+      std::optional<std::string> response_body) override;
   void CheckIn() override;
-  void OnCheckInComplete(std::unique_ptr<std::string> response_body) override;
+  void OnCheckInComplete(std::optional<std::string> response_body) override;
   base::Time GetLastPingTimestamp() override;
   void SetLastPingTimestamp(base::Time ts) override;
   std::vector<private_membership::rlwe::RlwePlaintextId>
diff --git a/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.cc b/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.cc
index dff70cae..d50f081 100644
--- a/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.cc
+++ b/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.cc
@@ -72,7 +72,7 @@
 }
 
 void TwentyEightDayImpl::OnCheckMembershipOprfComplete(
-    std::unique_ptr<std::string> response_body) {
+    std::optional<std::string> response_body) {
   NOTREACHED();
 }
 
@@ -82,7 +82,7 @@
 }
 
 void TwentyEightDayImpl::OnCheckMembershipQueryComplete(
-    std::unique_ptr<std::string> response_body) {
+    std::optional<std::string> response_body) {
   NOTREACHED();
 }
 
@@ -113,13 +113,13 @@
 }
 
 void TwentyEightDayImpl::OnCheckInComplete(
-    std::unique_ptr<std::string> response_body) {
+    std::optional<std::string> response_body) {
   NOTREACHED();
 }
 
 void TwentyEightDayImpl::OnCheckInCompleteCustom(
     const FresnelImportDataRequest import_request,
-    std::unique_ptr<std::string> response_body) {
+    std::optional<std::string> response_body) {
   // Use RAII to reset |url_loader_| after current function scope.
   auto url_loader = std::move(url_loader_);
 
@@ -421,7 +421,7 @@
 }
 
 void TwentyEightDayImpl::OnCheckMembershipOprfCompleteFirstPhase(
-    std::unique_ptr<std::string> response_body) {
+    std::optional<std::string> response_body) {
   // Use RAII to reset |url_loader_| after current function scope.
   auto url_loader = std::move(url_loader_);
 
@@ -431,14 +431,12 @@
 
   // Convert serialized response body to oprf response protobuf.
   FresnelPsmRlweOprfResponse psm_oprf_response;
-  bool is_response_body_set = response_body.get() != nullptr;
-
-  if (!is_response_body_set ||
+  if (!response_body.has_value() ||
       !psm_oprf_response.ParseFromString(*response_body)) {
     LOG(ERROR) << "First phase OPRF response net code = " << net_code;
     LOG(ERROR) << "Response body was not set or could not be parsed into "
                << "FresnelPsmRlweOprfResponse proto. "
-               << "Is response body set = " << is_response_body_set;
+               << "Is response body set = " << response_body.has_value();
     std::move(callback_).Run();
     return;
   }
@@ -499,7 +497,7 @@
 }
 
 void TwentyEightDayImpl::OnCheckMembershipQueryCompleteFirstPhase(
-    std::unique_ptr<std::string> response_body) {
+    std::optional<std::string> response_body) {
   // Use RAII to reset |url_loader_| after current function scope.
   auto url_loader = std::move(url_loader_);
 
@@ -509,14 +507,12 @@
 
   // Convert serialized response body to fresnel query response protobuf.
   FresnelPsmRlweQueryResponse psm_query_response;
-  bool is_response_body_set = response_body.get() != nullptr;
-
-  if (!is_response_body_set ||
+  if (!response_body.has_value() ||
       !psm_query_response.ParseFromString(*response_body)) {
     LOG(ERROR) << "First phase query response net code = " << net_code;
     LOG(ERROR) << "Response body was not set or could not be parsed into "
                << "FresnelPsmRlweQueryResponse proto. "
-               << "Is response body set = " << is_response_body_set;
+               << "Is response body set = " << response_body.has_value();
     std::move(callback_).Run();
     return;
   }
@@ -756,7 +752,7 @@
 }
 
 void TwentyEightDayImpl::OnCheckMembershipOprfCompleteSecondPhase(
-    std::unique_ptr<std::string> response_body) {
+    std::optional<std::string> response_body) {
   // Use RAII to reset |url_loader_| after current function scope.
   auto url_loader = std::move(url_loader_);
 
@@ -766,14 +762,12 @@
 
   // Convert serialized response body to oprf response protobuf.
   FresnelPsmRlweOprfResponse psm_oprf_response;
-  bool is_response_body_set = response_body.get() != nullptr;
-
-  if (!is_response_body_set ||
+  if (!response_body.has_value() ||
       !psm_oprf_response.ParseFromString(*response_body)) {
     LOG(ERROR) << "Second phase OPRF response net code = " << net_code;
     LOG(ERROR) << "Response body was not set or could not be parsed into "
                << "FresnelPsmRlweOprfResponse proto. "
-               << "Is response body set = " << is_response_body_set;
+               << "Is response body set = " << response_body.has_value();
     std::move(callback_).Run();
     return;
   }
@@ -835,7 +829,7 @@
 }
 
 void TwentyEightDayImpl::OnCheckMembershipQueryCompleteSecondPhase(
-    std::unique_ptr<std::string> response_body) {
+    std::optional<std::string> response_body) {
   // Use RAII to reset |url_loader_| after current function scope.
   auto url_loader = std::move(url_loader_);
 
@@ -845,14 +839,12 @@
 
   // Convert serialized response body to fresnel query response protobuf.
   FresnelPsmRlweQueryResponse psm_query_response;
-  bool is_response_body_set = response_body.get() != nullptr;
-
-  if (!is_response_body_set ||
+  if (!response_body.has_value() ||
       !psm_query_response.ParseFromString(*response_body)) {
     LOG(ERROR) << "Second phase query response net code = " << net_code;
     LOG(ERROR) << "Response body was not set or could not be parsed into "
                << "FresnelPsmRlweQueryResponse proto. "
-               << "Is response body set = " << is_response_body_set;
+               << "Is response body set = " << response_body.has_value();
     std::move(callback_).Run();
     return;
   }
diff --git a/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.h b/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.h
index 97866c8..0a8f547 100644
--- a/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.h
+++ b/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.h
@@ -34,18 +34,18 @@
   // UseCase:
   void CheckMembershipOprf() override;
   void OnCheckMembershipOprfComplete(
-      std::unique_ptr<std::string> response_body) override;
+      std::optional<std::string> response_body) override;
   void CheckMembershipQuery(
       const private_membership::rlwe::PrivateMembershipRlweOprfResponse&
           oprf_response) override;
   void OnCheckMembershipQueryComplete(
-      std::unique_ptr<std::string> response_body) override;
+      std::optional<std::string> response_body) override;
   void CheckIn() override;
 
   // 28DA use case passes the import request back to callback completion.
-  void OnCheckInComplete(std::unique_ptr<std::string> response_body) override;
+  void OnCheckInComplete(std::optional<std::string> response_body) override;
   void OnCheckInCompleteCustom(const FresnelImportDataRequest import_request,
-                               std::unique_ptr<std::string> response_body);
+                               std::optional<std::string> response_body);
 
   base::Time GetLastPingTimestamp() override;
   void SetLastPingTimestamp(base::Time ts) override;
@@ -87,12 +87,12 @@
   GetPsmIdentifiersToQueryPhaseOne();
   void CheckMembershipOprfFirstPhase();
   void OnCheckMembershipOprfCompleteFirstPhase(
-      std::unique_ptr<std::string> response_body);
+      std::optional<std::string> response_body);
   void CheckMembershipQueryFirstPhase(
       const private_membership::rlwe::PrivateMembershipRlweOprfResponse&
           oprf_response);
   void OnCheckMembershipQueryCompleteFirstPhase(
-      std::unique_ptr<std::string> response_body);
+      std::optional<std::string> response_body);
 
   // Second phase of check membership should binary search for a single
   // identifier between day 2 and 26.
@@ -101,12 +101,12 @@
   GetPsmIdentifiersToQueryPhaseTwo();
   void CheckMembershipOprfSecondPhase();
   void OnCheckMembershipOprfCompleteSecondPhase(
-      std::unique_ptr<std::string> response_body);
+      std::optional<std::string> response_body);
   void CheckMembershipQuerySecondPhase(
       const private_membership::rlwe::PrivateMembershipRlweOprfResponse&
           oprf_response);
   void OnCheckMembershipQueryCompleteSecondPhase(
-      std::unique_ptr<std::string> response_body);
+      std::optional<std::string> response_body);
 
   // Maintains callback that is executed once this use case is done running.
   base::OnceCallback<void()> callback_;
diff --git a/chromeos/ash/components/report/device_metrics/churn/cohort_impl.cc b/chromeos/ash/components/report/device_metrics/churn/cohort_impl.cc
index 467b90f..3a12caf 100644
--- a/chromeos/ash/components/report/device_metrics/churn/cohort_impl.cc
+++ b/chromeos/ash/components/report/device_metrics/churn/cohort_impl.cc
@@ -109,7 +109,7 @@
 }
 
 void CohortImpl::OnCheckMembershipOprfComplete(
-    std::unique_ptr<std::string> response_body) {
+    std::optional<std::string> response_body) {
   // Use RAII to reset |url_loader_| after current function scope.
   auto url_loader = std::move(url_loader_);
 
@@ -119,14 +119,12 @@
 
   // Convert serialized response body to oprf response protobuf.
   FresnelPsmRlweOprfResponse psm_oprf_response;
-  bool is_response_body_set = response_body.get() != nullptr;
-
-  if (!is_response_body_set ||
+  if (!response_body.has_value() ||
       !psm_oprf_response.ParseFromString(*response_body)) {
     LOG(ERROR) << "Oprf response net code = " << net_code;
     LOG(ERROR) << "Response body was not set or could not be parsed into "
                << "FresnelPsmRlweOprfResponse proto. "
-               << "Is response body set = " << is_response_body_set;
+               << "Is response body set = " << response_body.has_value();
     std::move(callback_).Run();
     return;
   }
@@ -183,7 +181,7 @@
 }
 
 void CohortImpl::OnCheckMembershipQueryComplete(
-    std::unique_ptr<std::string> response_body) {
+    std::optional<std::string> response_body) {
   // Use RAII to reset |url_loader_| after current function scope.
   auto url_loader = std::move(url_loader_);
 
@@ -193,14 +191,12 @@
 
   // Convert serialized response body to fresnel query response protobuf.
   FresnelPsmRlweQueryResponse psm_query_response;
-  bool is_response_body_set = response_body.get() != nullptr;
-
-  if (!is_response_body_set ||
+  if (!response_body.has_value() ||
       !psm_query_response.ParseFromString(*response_body)) {
     LOG(ERROR) << "Query response net code = " << net_code;
     LOG(ERROR) << "Response body was not set or could not be parsed into "
                << "FresnelPsmRlweQueryResponse proto. "
-               << "Is response body set = " << is_response_body_set;
+               << "Is response body set = " << response_body.has_value();
     std::move(callback_).Run();
     return;
   }
@@ -277,7 +273,7 @@
                                 utils::GetMaxFresnelResponseSizeBytes());
 }
 
-void CohortImpl::OnCheckInComplete(std::unique_ptr<std::string> response_body) {
+void CohortImpl::OnCheckInComplete(std::optional<std::string> response_body) {
   // Use RAII to reset |url_loader_| after current function scope.
   auto url_loader = std::move(url_loader_);
 
diff --git a/chromeos/ash/components/report/device_metrics/churn/cohort_impl.h b/chromeos/ash/components/report/device_metrics/churn/cohort_impl.h
index dc1c5e5..139cc3876f 100644
--- a/chromeos/ash/components/report/device_metrics/churn/cohort_impl.h
+++ b/chromeos/ash/components/report/device_metrics/churn/cohort_impl.h
@@ -35,14 +35,14 @@
   // UseCase:
   void CheckMembershipOprf() override;
   void OnCheckMembershipOprfComplete(
-      std::unique_ptr<std::string> response_body) override;
+      std::optional<std::string> response_body) override;
   void CheckMembershipQuery(
       const private_membership::rlwe::PrivateMembershipRlweOprfResponse&
           oprf_response) override;
   void OnCheckMembershipQueryComplete(
-      std::unique_ptr<std::string> response_body) override;
+      std::optional<std::string> response_body) override;
   void CheckIn() override;
-  void OnCheckInComplete(std::unique_ptr<std::string> response_body) override;
+  void OnCheckInComplete(std::optional<std::string> response_body) override;
   base::Time GetLastPingTimestamp() override;
   void SetLastPingTimestamp(base::Time ts) override;
   std::vector<private_membership::rlwe::RlwePlaintextId>
diff --git a/chromeos/ash/components/report/device_metrics/churn/observation_impl.cc b/chromeos/ash/components/report/device_metrics/churn/observation_impl.cc
index fee829ea..714e7fe 100644
--- a/chromeos/ash/components/report/device_metrics/churn/observation_impl.cc
+++ b/chromeos/ash/components/report/device_metrics/churn/observation_impl.cc
@@ -114,7 +114,7 @@
 }
 
 void ObservationImpl::OnCheckMembershipOprfComplete(
-    std::unique_ptr<std::string> response_body) {
+    std::optional<std::string> response_body) {
   // Use RAII to reset |url_loader_| after current function scope.
   auto url_loader = std::move(url_loader_);
 
@@ -124,14 +124,12 @@
 
   // Convert serialized response body to oprf response protobuf.
   FresnelPsmRlweOprfResponse psm_oprf_response;
-  bool is_response_body_set = response_body.get() != nullptr;
-
-  if (!is_response_body_set ||
+  if (!response_body.has_value() ||
       !psm_oprf_response.ParseFromString(*response_body)) {
     LOG(ERROR) << "Oprf response net code = " << net_code;
     LOG(ERROR) << "Response body was not set or could not be parsed into "
                << "FresnelPsmRlweOprfResponse proto. "
-               << "Is response body set = " << is_response_body_set;
+               << "Is response body set = " << response_body.has_value();
     std::move(callback_).Run();
     return;
   }
@@ -189,7 +187,7 @@
 }
 
 void ObservationImpl::OnCheckMembershipQueryComplete(
-    std::unique_ptr<std::string> response_body) {
+    std::optional<std::string> response_body) {
   // Use RAII to reset |url_loader_| after current function scope.
   auto url_loader = std::move(url_loader_);
 
@@ -199,14 +197,12 @@
 
   // Convert serialized response body to fresnel query response protobuf.
   FresnelPsmRlweQueryResponse psm_query_response;
-  bool is_response_body_set = response_body.get() != nullptr;
-
-  if (!is_response_body_set ||
+  if (!response_body.has_value() ||
       !psm_query_response.ParseFromString(*response_body)) {
     LOG(ERROR) << "Query response net code = " << net_code;
     LOG(ERROR) << "Response body was not set or could not be parsed into "
                << "FresnelPsmRlweQueryResponse proto. "
-               << "Is response body set = " << is_response_body_set;
+               << "Is response body set = " << response_body.has_value();
     std::move(callback_).Run();
     return;
   }
@@ -286,7 +282,7 @@
 }
 
 void ObservationImpl::OnCheckInComplete(
-    std::unique_ptr<std::string> response_body) {
+    std::optional<std::string> response_body) {
   // Use RAII to reset |url_loader_| after current function scope.
   auto url_loader = std::move(url_loader_);
 
diff --git a/chromeos/ash/components/report/device_metrics/churn/observation_impl.h b/chromeos/ash/components/report/device_metrics/churn/observation_impl.h
index 3843c27..afc98c5 100644
--- a/chromeos/ash/components/report/device_metrics/churn/observation_impl.h
+++ b/chromeos/ash/components/report/device_metrics/churn/observation_impl.h
@@ -38,14 +38,14 @@
   // UseCase:
   void CheckMembershipOprf() override;
   void OnCheckMembershipOprfComplete(
-      std::unique_ptr<std::string> response_body) override;
+      std::optional<std::string> response_body) override;
   void CheckMembershipQuery(
       const private_membership::rlwe::PrivateMembershipRlweOprfResponse&
           oprf_response) override;
   void OnCheckMembershipQueryComplete(
-      std::unique_ptr<std::string> response_body) override;
+      std::optional<std::string> response_body) override;
   void CheckIn() override;
-  void OnCheckInComplete(std::unique_ptr<std::string> response_body) override;
+  void OnCheckInComplete(std::optional<std::string> response_body) override;
   base::Time GetLastPingTimestamp() override;
   void SetLastPingTimestamp(base::Time ts) override;
   std::vector<private_membership::rlwe::RlwePlaintextId>
diff --git a/chromeos/ash/components/report/device_metrics/use_case/use_case.h b/chromeos/ash/components/report/device_metrics/use_case/use_case.h
index 16b4cd41..4612056 100644
--- a/chromeos/ash/components/report/device_metrics/use_case/use_case.h
+++ b/chromeos/ash/components/report/device_metrics/use_case/use_case.h
@@ -119,7 +119,7 @@
 
   // Handle the response from the Oprf request.
   virtual void OnCheckMembershipOprfComplete(
-      std::unique_ptr<std::string> response_body) = 0;
+      std::optional<std::string> response_body) = 0;
 
   // Second phase of PSM check membership.
   // Get the result of whether the queried element(s) are in the set.
@@ -129,14 +129,13 @@
 
   // Handle the response from the Query request.
   virtual void OnCheckMembershipQueryComplete(
-      std::unique_ptr<std::string> response_body) = 0;
+      std::optional<std::string> response_body) = 0;
 
   // Import data to the Fresnel, and PSM database backend.
   virtual void CheckIn() = 0;
 
   // Handle the response from the Check-in request.
-  virtual void OnCheckInComplete(
-      std::unique_ptr<std::string> response_body) = 0;
+  virtual void OnCheckInComplete(std::optional<std::string> response_body) = 0;
 
   // Retrieve the last known ping timestamp for the use case from local state.
   virtual base::Time GetLastPingTimestamp() = 0;
diff --git a/clank b/clank
index 36c23c8..1dace63 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 36c23c84ecbd0d6f2633e7aae5f64cf4245061c4
+Subproject commit 1dace63d589c82eb30da99b3579c15199e4d0c69
diff --git a/components/BUILD.gn b/components/BUILD.gn
index d06ef3ae..fc2f440 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -65,6 +65,7 @@
         "dom_distiller/core/javascript/dom_distiller_viewer.js",
         "dom_distiller/core/javascript/domdistiller.js",
         "dom_distiller/core/javascript/extract_features.js",
+        "dom_distiller/core/javascript/readability_distiller.js",
       ]
       outputs = [ "{{bundle_resources_dir}}/" +
                   "{{source_root_relative_dir}}/{{source_file_part}}" ]
diff --git a/components/autofill/core/browser/payments/ANDROID_OWNERS b/components/autofill/core/browser/payments/ANDROID_OWNERS
new file mode 100644
index 0000000..b461a73
--- /dev/null
+++ b/components/autofill/core/browser/payments/ANDROID_OWNERS
@@ -0,0 +1 @@
+vishwasuppoor@google.com
diff --git a/components/cronet/gn2bp/gen_android_bp.py b/components/cronet/gn2bp/gen_android_bp.py
index 91f7c35b..a940caf 100755
--- a/components/cronet/gn2bp/gen_android_bp.py
+++ b/components/cronet/gn2bp/gen_android_bp.py
@@ -1373,7 +1373,6 @@
   source_module.genrule_srcs.add(':' + source_module.name)
   source_module.genrule_headers.add(header_module.name)
 
-  source_module.genrule_shared_libs.add('libprotobuf-cpp-lite')
   cmd += [f'--cpp_out=lite=true:{absolute_cpp_out_dir}']
 
   cmd += absolute_sources
diff --git a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerFeatures.java b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerFeatures.java
index 9e85228..74bb8dc6 100644
--- a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerFeatures.java
+++ b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerFeatures.java
@@ -32,11 +32,14 @@
 
     // Feature names -- alphabetical ordering.
     public static final String READER_MODE_AUTO_DISTILL = "ReaderModeAutoDistill";
+    public static final String READER_MODE_DISTILL_IN_APP = "ReaderModeDistillInApp";
     public static final String READER_MODE_IMPROVEMENTS = "ReaderModeImprovements";
 
     // Feature flags -- alphabetical ordering.
     public static final MutableFlagWithSafeDefault sReaderModeAutoDistill =
             newMutableFlagWithSafeDefault(READER_MODE_AUTO_DISTILL, /* defaultValue= */ false);
+    public static final MutableFlagWithSafeDefault sReaderModeDistillInApp =
+            newMutableFlagWithSafeDefault(READER_MODE_DISTILL_IN_APP, /* defaultValue= */ false);
     public static final MutableFlagWithSafeDefault sReaderModeImprovements =
             newMutableFlagWithSafeDefault(READER_MODE_IMPROVEMENTS, /* defaultValue= */ false);
 
diff --git a/components/dom_distiller/core/distiller_page.cc b/components/dom_distiller/core/distiller_page.cc
index 2ee387b8..4a9dcec 100644
--- a/components/dom_distiller/core/distiller_page.cc
+++ b/components/dom_distiller/core/distiller_page.cc
@@ -6,9 +6,11 @@
 
 #include <stddef.h>
 
+#include <algorithm>
 #include <utility>
 
 #include "base/debug/dump_without_crashing.h"
+#include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/json/json_writer.h"
 #include "base/location.h"
@@ -18,6 +20,8 @@
 #include "base/strings/to_string.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/single_thread_task_runner.h"
+#include "base/values.h"
+#include "components/dom_distiller/core/dom_distiller_features.h"
 #include "components/dom_distiller/core/extraction_utils.h"
 #include "components/grit/components_resources.h"
 #include "third_party/dom_distiller_js/dom_distiller.pb.h"
@@ -27,6 +31,64 @@
 
 namespace dom_distiller {
 
+namespace {
+
+// Counts the number of words in the text_content portion, used to record how
+// many words are present for a readability distillation. Note this won't work
+// as well on languages like Chinese where the space separation isn't the
+// same as in english.
+int CountWords(const std::string& text_content) {
+  int result = 0;
+  bool prev_char_whitespace = false;
+  for (const char& it : text_content) {
+    bool cur_char_whitespace = it == ' ';
+    if (prev_char_whitespace && !cur_char_whitespace) {
+      result++;
+    }
+    prev_char_whitespace = cur_char_whitespace;
+  }
+
+  return result + 1;
+}
+
+// Converts the js object returned by the readability distiller into the
+// DomDistillerResult expected by the distillation infra.
+bool ReadabilityDistillerResultToDomDistillerResult(
+    const base::Value& value,
+    proto::DomDistillerResult* result) {
+  if (!value.is_dict()) {
+    return false;
+  }
+
+  const base::DictValue* dict_value = value.GetIfDict();
+
+  if (dict_value->contains("title")) {
+    result->set_title(dict_value->Find("title")->GetString());
+  }
+  if (dict_value->contains("content")) {
+    auto* distilled_content = new proto::DistilledContent();
+    distilled_content->set_html(dict_value->Find("content")->GetString());
+    result->set_allocated_distilled_content(std::move(distilled_content));
+  }
+
+  if (dict_value->contains("dir")) {
+    result->set_text_direction(dict_value->Find("content")->GetString());
+  } else {
+    result->set_text_direction("auto");
+  }
+
+  if (dict_value->contains("textContent")) {
+    auto* statistics_info = new proto::StatisticsInfo();
+    std::string text_content = dict_value->Find("textContent")->GetString();
+    statistics_info->set_word_count(CountWords(text_content));
+    result->set_allocated_statistics_info(statistics_info);
+  }
+
+  return true;
+}
+
+}  // namespace
+
 DistillerPageFactory::~DistillerPageFactory() = default;
 
 DistillerPage::DistillerPage() : ready_(true) {}
@@ -44,7 +106,10 @@
   // the callback to OnDistillationDone happens.
   ready_ = false;
   distiller_page_callback_ = std::move(callback);
-  DistillPageImpl(gurl, GetDistillerScriptWithOptions(options));
+
+  DistillPageImpl(gurl, ShouldUseReadabilityDistiller()
+                            ? GetReadabilityDistillerScript()
+                            : GetDistillerScriptWithOptions(options));
 }
 
 void DistillerPage::OnDistillationDone(const GURL& page_url,
@@ -59,8 +124,11 @@
     found_content = false;
   } else {
     found_content =
-        dom_distiller::proto::json::DomDistillerResult::ReadFromValue(
-            *value, distiller_result.get());
+        ShouldUseReadabilityDistiller()
+            ? ReadabilityDistillerResultToDomDistillerResult(
+                  *value, distiller_result.get())
+            : dom_distiller::proto::json::DomDistillerResult::ReadFromValue(
+                  *value, distiller_result.get());
     if (!found_content) {
       DVLOG(1) << "Unable to parse DomDistillerResult.";
     }
diff --git a/components/dom_distiller/core/dom_distiller_features.cc b/components/dom_distiller/core/dom_distiller_features.cc
index cf3f1502..7ce15d4 100644
--- a/components/dom_distiller/core/dom_distiller_features.cc
+++ b/components/dom_distiller/core/dom_distiller_features.cc
@@ -38,7 +38,7 @@
     &kReaderModeUseReadability, /*name=*/"use_distiller",
     /*default_value=*/false};
 
-bool ShouldReadabilityDistiller() {
+bool ShouldUseReadabilityDistiller() {
   return base::FeatureList::IsEnabled(kReaderModeUseReadability) &&
          kReaderModeUseReadabilityUseDisiller.Get();
 }
@@ -58,6 +58,10 @@
              "ReaderModeAutoDistill",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kReaderModeDistillInApp,
+             "ReaderModeDistillInApp",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kReaderModeImprovements,
              "ReaderModeImprovements",
              base::FEATURE_DISABLED_BY_DEFAULT);
@@ -65,8 +69,8 @@
 namespace android {
 static jlong JNI_DomDistillerFeatureMap_GetNativeMap(JNIEnv* env) {
   static const base::Feature* const kFeaturesExposedToJava[] = {
-      &kReaderModeAutoDistill, &kReaderModeImprovements,
-      &kReaderModeUseReadability};
+      &kReaderModeAutoDistill, &kReaderModeDistillInApp,
+      &kReaderModeImprovements, &kReaderModeUseReadability};
   static base::NoDestructor<base::android::FeatureMap> kFeatureMap(
       kFeaturesExposedToJava);
   return reinterpret_cast<jlong>(kFeatureMap.get());
diff --git a/components/dom_distiller/core/dom_distiller_features.h b/components/dom_distiller/core/dom_distiller_features.h
index f9617e8..236e457 100644
--- a/components/dom_distiller/core/dom_distiller_features.h
+++ b/components/dom_distiller/core/dom_distiller_features.h
@@ -22,6 +22,7 @@
 #if BUILDFLAG(IS_ANDROID)
 // Feature declarations below -- alphabetical order.
 BASE_DECLARE_FEATURE(kReaderModeAutoDistill);
+BASE_DECLARE_FEATURE(kReaderModeDistillInApp);
 BASE_DECLARE_FEATURE(kReaderModeImprovements);
 #endif
 
diff --git a/components/dom_distiller/core/extraction_utils.cc b/components/dom_distiller/core/extraction_utils.cc
index bea79bd0..72276a2 100644
--- a/components/dom_distiller/core/extraction_utils.cc
+++ b/components/dom_distiller/core/extraction_utils.cc
@@ -38,4 +38,12 @@
                         options_json);
 }
 
+std::string GetReadabilityDistillerScript() {
+  std::string script =
+      ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
+          IDR_READABILITY_DISTILLER_JS);
+  CHECK(!script.empty());
+  return script;
+}
+
 }  // namespace dom_distiller
diff --git a/components/dom_distiller/core/extraction_utils.h b/components/dom_distiller/core/extraction_utils.h
index 16468a90..9d7cb44 100644
--- a/components/dom_distiller/core/extraction_utils.h
+++ b/components/dom_distiller/core/extraction_utils.h
@@ -11,11 +11,15 @@
 
 namespace dom_distiller {
 
-// Returns the JavaScript web page distillation script with selected
-// distallation `options`.
+// Returns the DomDistiller JavaScript web page distillation script with
+// selected distallation `options`.
 std::string GetDistillerScriptWithOptions(
     const dom_distiller::proto::DomDistillerOptions& options);
 
+// Returns the Javascript heuristic to determine if web pages are suitable for
+// reader mode.
+std::string GetReadabilityDistillerScript();
+
 }  // namespace dom_distiller
 
 #endif  // COMPONENTS_DOM_DISTILLER_CORE_EXTRACTION_UTILS_H_
diff --git a/components/dom_distiller/core/javascript/readability_distiller.js b/components/dom_distiller/core/javascript/readability_distiller.js
new file mode 100644
index 0000000..6937c327
--- /dev/null
+++ b/components/dom_distiller/core/javascript/readability_distiller.js
@@ -0,0 +1,29 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Runs readability heuristic on the page and return the result.
+(function() {
+try {
+  function initialize() {
+    // This include will be processed at build time by grit.
+    // clang-format off
+      // <include src="../../../../third_party/readability/src/Readability.js">
+    // clang-format on
+    window.Readability = Readability;
+  }
+  window.setTimeout = function() {};
+  window.clearTimeout = function() {};
+  initialize();
+
+  const article = new Readability(document.cloneNode(/*deep=*/ true)).parse();
+  return article;
+
+} catch (e) {
+  window.console.error('Error during distillation: ' + e);
+  if (e.stack !== undefined) {
+    window.console.error(e.stack);
+  }
+}
+return undefined;
+})();
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateClient.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateClient.java
index 2d5223c1..fa8b17b 100644
--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateClient.java
+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateClient.java
@@ -19,7 +19,7 @@
 public interface InterceptNavigationDelegateClient {
     /* Returns the WebContents in the context of which this InterceptNavigationDelegateImpl instance
      * is operating. */
-    WebContents getWebContents();
+    @Nullable WebContents getWebContents();
 
     /* Creates an ExternalNavigationHandler instance that is configured for this client. */
     @Nullable ExternalNavigationHandler createExternalNavigationHandler();
@@ -32,7 +32,7 @@
     boolean isIncognito();
 
     /* Returns the Activity associated with this client. */
-    Activity getActivity();
+    @Nullable Activity getActivity();
 
     /* Returns true if the tab associated with this client was launched from an external app. */
     boolean wasTabLaunchedFromExternalApp();
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java
index 89e311b5..27bf813 100644
--- a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java
+++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java
@@ -6,6 +6,7 @@
 
 import static org.chromium.build.NullUtil.assumeNonNull;
 
+import android.app.Activity;
 import android.util.Pair;
 
 import androidx.annotation.IntDef;
@@ -441,7 +442,7 @@
         // may have been closed.
         boolean onInitialNavigationChain = isTabOnInitialNavigationChain();
         boolean isWebContentsVisible =
-                mClient.getWebContents().getVisibility() == Visibility.VISIBLE;
+                assumeNonNull(mClient.getWebContents()).getVisibility() == Visibility.VISIBLE;
         ExternalNavigationParams params =
                 new ExternalNavigationParams.Builder(
                                 escapedUrl,
@@ -516,7 +517,8 @@
             ExternalNavigationParams params, boolean isExternalProtocol) {
         try (TraceEvent e = TraceEvent.scoped("shouldOverrideUrlLoading")) {
             OverrideUrlLoadingResult result = null;
-            if (shouldReparentTab(mClient.getWebContents())) {
+            WebContents webContents = assumeNonNull(mClient.getWebContents());
+            if (shouldReparentTab(webContents)) {
                 // Catches all cases where a navigation that starts in a PWA should cause a Tab
                 // reparenting towards the Chrome browser.
                 // TODO(crbug.com/416562397): eventually consider in-scope PWAs in the reparenting
@@ -561,8 +563,7 @@
             } else if (MDOC_SCHEME.equals(params.getUrl().getScheme())) {
                 scheme = InterceptScheme.MDOC_SCHEME;
                 ContentWebFeatureUsageUtils.logWebFeatureForCurrentPage(
-                        mClient.getWebContents(),
-                        WebFeature.IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK);
+                        webContents, WebFeature.IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK);
                 // Record spread of `result` in order to get an idea of by how much the
                 // IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK use counter is over counting as a user may
                 // cancel the OverrideUrlLoadingResultType.OVERRIDE_WITH_ASYNC_ACTION dialog.
@@ -573,8 +574,7 @@
             } else if (params.getUrl().getScheme().endsWith(OPENID4VP_SCHEME_SUFFIX)) {
                 scheme = InterceptScheme.OPENID4VP_SCHEME;
                 ContentWebFeatureUsageUtils.logWebFeatureForCurrentPage(
-                        mClient.getWebContents(),
-                        WebFeature.IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK);
+                        webContents, WebFeature.IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK);
                 // Record spread of `result` in order to get an idea of by how much the
                 // IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK use counter is over counting as a user may
                 // cancel the OverrideUrlLoadingResultType.OVERRIDE_WITH_ASYNC_ACTION dialog.
@@ -606,6 +606,7 @@
      */
     public void maybeUpdateNavigationHistory() {
         WebContents webContents = mClient.getWebContents();
+        assumeNonNull(webContents);
         NavigationController navigationController = webContents.getNavigationController();
         if (mClearAllForwardHistoryRequired && webContents != null) {
             navigationController.pruneForwardEntries();
@@ -659,9 +660,10 @@
     }
 
     private boolean isBrowserAuxiliaryNavigation() {
+        WebContents webContents = assumeNonNull(mClient.getWebContents());
         return mClient.isTabInBrowser()
-                && mClient.getWebContents().hasOpener()
-                && mClient.getWebContents().getOriginalWindowOpenDisposition()
+                && webContents.hasOpener()
+                && webContents.getOriginalWindowOpenDisposition()
                         == WindowOpenDisposition.NEW_FOREGROUND_TAB;
     }
 
@@ -733,14 +735,15 @@
                             // background and acted as an intermediate link redirector between two
                             // apps (crbug.com/487938).
                             if (mClient.wasTabLaunchedFromExternalApp()) {
+                                Activity activity = assumeNonNull(mClient.getActivity());
                                 if (mClient.getOrCreateRedirectHandler()
                                         .wasTaskStartedByExternalIntent()) {
                                     // If Chrome was only launched to perform a redirect, don't keep
                                     // its task in history.
-                                    mClient.getActivity().finishAndRemoveTask();
+                                    activity.finishAndRemoveTask();
                                 } else {
                                     // Takes Chrome out of the back stack.
-                                    mClient.getActivity().moveTaskToBack(false);
+                                    activity.moveTaskToBack(false);
                                 }
                             }
                             // Closing tab must happen after we potentially call
@@ -772,7 +775,7 @@
                         // index which was saved before this navigation, and remove the empty
                         // entries from the navigation history.
                         mClearAllForwardHistoryRequired = true;
-                        mClient.getWebContents()
+                        assumeNonNull(mClient.getWebContents())
                                 .getNavigationController()
                                 .goToNavigationIndex(lastCommittedEntryIndexBeforeNavigation);
                     }
@@ -820,7 +823,7 @@
                 assumeNonNull(mExternalNavHandler).canExternalAppHandleUrl(url)
                         ? R.string.blocked_navigation_warning
                         : R.string.unreachable_navigation_warning;
-        mClient.getWebContents()
+        assumeNonNull(mClient.getWebContents())
                 .addMessageToDevToolsConsole(
                         ConsoleMessageLevel.WARNING,
                         ContextUtils.getApplicationContext().getString(resId, url.getSpec()));
diff --git a/components/messages/android/internal/java/res/color/message_bg_color.xml b/components/messages/android/internal/java/res/color/message_bg_color.xml
index 465a419..5c71170 100644
--- a/components/messages/android/internal/java/res/color/message_bg_color.xml
+++ b/components/messages/android/internal/java/res/color/message_bg_color.xml
@@ -6,5 +6,5 @@
 -->
 
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
-  <item android:color="?attr/colorSurface"/>
+  <item android:color="?attr/colorSurfaceBright"/>
 </selector>
\ No newline at end of file
diff --git a/components/omnibox/browser/omnibox_client.h b/components/omnibox/browser/omnibox_client.h
index e65413d9..caed159b 100644
--- a/components/omnibox/browser/omnibox_client.h
+++ b/components/omnibox/browser/omnibox_client.h
@@ -289,6 +289,10 @@
   // Returns true if history embeddings is enabled and user has opted in.
   virtual bool IsHistoryEmbeddingsEnabled() const;
 
+  // Optionally warm-up for the default search engine so that we can navigate to
+  // the search result page effectively.
+  virtual void MaybePrewarmForDefaultSearchEngine() {}
+
   virtual base::WeakPtr<OmniboxClient> AsWeakPtr() = 0;
 };
 
diff --git a/components/omnibox/browser/omnibox_controller.cc b/components/omnibox/browser/omnibox_controller.cc
index 509ea7a7..2fe9792 100644
--- a/components/omnibox/browser/omnibox_controller.cc
+++ b/components/omnibox/browser/omnibox_controller.cc
@@ -72,6 +72,8 @@
 
 void OmniboxController::StartZeroSuggestPrefetch() {
   TRACE_EVENT0("omnibox", "OmniboxController::StartZeroSuggestPrefetch");
+  client_->MaybePrewarmForDefaultSearchEngine();
+
   auto page_classification =
       client_->GetPageClassification(/*is_prefetch=*/true);
 
diff --git a/components/optimization_guide/core/BUILD.gn b/components/optimization_guide/core/BUILD.gn
index 28bcc7c2..6c6f948 100644
--- a/components/optimization_guide/core/BUILD.gn
+++ b/components/optimization_guide/core/BUILD.gn
@@ -724,6 +724,7 @@
     ":filters_unit_tests",
     ":hints_unit_tests",
     ":model_execution_unit_tests",
+    ":unit_tests_bundle_data",
     "//base",
     "//base/test:test_support",
     "//components/optimization_guide/proto:optimization_guide_proto",
diff --git a/components/optimization_guide/core/hints/hints_manager.cc b/components/optimization_guide/core/hints/hints_manager.cc
index 10317ac8..986035e 100644
--- a/components/optimization_guide/core/hints/hints_manager.cc
+++ b/components/optimization_guide/core/hints/hints_manager.cc
@@ -388,7 +388,6 @@
       base::BindOnce(&HintsManager::OnHintCacheInitialized,
                      weak_ptr_factory_.GetWeakPtr()));
 }
-
 HintsManager::~HintsManager() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
@@ -761,6 +760,17 @@
   return std::vector<GURL>(urls_to_refresh.begin(), urls_to_refresh.end());
 }
 
+// Helper method to check if any registered optimization type is allowed for
+// proactive personalization
+bool HintsManager::HasPersonalizableTypesRegistered() {
+  return std::any_of(
+      registered_optimization_types_.begin(),
+      registered_optimization_types_.end(), [this](auto opt_type) {
+        return allowed_optimization_types_for_proactive_personalization_.Has(
+            opt_type);
+      });
+}
+
 void HintsManager::FetchHintsForActiveTabs() {
   active_tabs_hints_fetch_timer_.Stop();
   active_tabs_hints_fetch_timer_.Start(
@@ -811,6 +821,35 @@
       proto::CONTEXT_BATCH_UPDATE_ACTIVE_TABS, registered_optimization_types_,
       active_tab_urls_to_refresh, top_hosts, optimization_guide_logger_);
 
+  auto hints_fetched_callback =
+      base::BindOnce(&HintsManager::OnHintsForActiveTabsFetched,
+                     weak_ptr_factory_.GetWeakPtr(), top_hosts_set,
+                     base::flat_set<GURL>(active_tab_urls_to_refresh.begin(),
+                                          active_tab_urls_to_refresh.end()));
+  auto do_fetch_callback = base::BindOnce(
+      &HintsManager::FetchHintsForActiveTabsInternal,
+      weak_ptr_factory_.GetWeakPtr(), top_hosts, active_tab_urls_to_refresh,
+      proto::CONTEXT_BATCH_UPDATE_ACTIVE_TABS,
+      /*skip_cache=*/false, std::move(hints_fetched_callback),
+      /*request_context_metadata=*/std::nullopt);
+  if (HasPersonalizableTypesRegistered()) {
+    RequestAccessToken(
+        identity_manager_,
+        {GaiaConstants::kOptimizationGuideServiceGetHintsOAuth2Scope},
+        std::move(do_fetch_callback));
+  } else {
+    std::move(do_fetch_callback).Run(/*access_token=*/std::string());
+  }
+}
+
+void HintsManager::FetchHintsForActiveTabsInternal(
+    const std::vector<std::string>& top_hosts,
+    const std::vector<GURL>& active_tab_urls_to_refresh,
+    optimization_guide::proto::RequestContext request_context,
+    bool skip_cache,
+    HintsFetchedCallback hints_fetched_callback,
+    std::optional<proto::RequestContextMetadata> request_context_metadata,
+    const std::string& access_token) {
   if (!active_tabs_batch_update_hints_fetcher_) {
     DCHECK(hints_fetcher_factory_);
     active_tabs_batch_update_hints_fetcher_ =
@@ -819,13 +858,9 @@
   active_tabs_batch_update_hints_fetcher_->FetchOptimizationGuideServiceHints(
       top_hosts, active_tab_urls_to_refresh, registered_optimization_types_,
       proto::CONTEXT_BATCH_UPDATE_ACTIVE_TABS, application_locale_,
-      /*access_token=*/std::string(),
-      /*skip_cache=*/false,
-      base::BindOnce(&HintsManager::OnHintsForActiveTabsFetched,
-                     weak_ptr_factory_.GetWeakPtr(), top_hosts_set,
-                     base::flat_set<GURL>(active_tab_urls_to_refresh.begin(),
-                                          active_tab_urls_to_refresh.end())),
-      std::nullopt);
+      access_token,
+      /*skip_cache=*/false, std::move(hints_fetched_callback),
+      /*request_context_metadata=*/std::nullopt);
 }
 
 void HintsManager::OnHintsForActiveTabsFetched(
@@ -1695,12 +1730,7 @@
     return;
   }
 
-  if (std::any_of(
-          registered_optimization_types_.begin(),
-          registered_optimization_types_.end(), [&](auto opt_type) {
-            return allowed_optimization_types_for_proactive_personalization_
-                .Has(opt_type);
-          })) {
+  if (HasPersonalizableTypesRegistered()) {
     // Request access token before fetching hints.
     RequestAccessToken(
         identity_manager_,
diff --git a/components/optimization_guide/core/hints/hints_manager.h b/components/optimization_guide/core/hints/hints_manager.h
index d59bc9a..719a41f 100644
--- a/components/optimization_guide/core/hints/hints_manager.h
+++ b/components/optimization_guide/core/hints/hints_manager.h
@@ -280,6 +280,8 @@
   // fetch attempt was made.
   void ScheduleActiveTabsHintsFetch();
 
+  bool HasPersonalizableTypesRegistered();
+
   // Called to make a request to fetch hints from the remote Optimization Guide
   // Service. Used to fetch hints for origins frequently visited by the user and
   // URLs open in the active tab model.
@@ -592,6 +594,17 @@
 
   // Used to get |weak_ptr_| to self.
   base::WeakPtrFactory<HintsManager> weak_ptr_factory_{this};
+
+  // Wrapper that immediately invokes HintsFetcher for the purposes of fetching
+  // hints for active tabs.
+  void FetchHintsForActiveTabsInternal(
+      const std::vector<std::string>& top_hosts,
+      const std::vector<GURL>& active_tab_urls_to_refresh,
+      optimization_guide::proto::RequestContext request_context,
+      bool skip_cache,
+      HintsFetchedCallback hints_fetched_callback,
+      std::optional<proto::RequestContextMetadata> request_context_metadata,
+      const std::string& access_token);
 };
 
 }  // namespace optimization_guide
diff --git a/components/optimization_guide/core/hints/hints_manager_unittest.cc b/components/optimization_guide/core/hints/hints_manager_unittest.cc
index 6d495943..c8ba022e 100644
--- a/components/optimization_guide/core/hints/hints_manager_unittest.cc
+++ b/components/optimization_guide/core/hints/hints_manager_unittest.cc
@@ -3759,9 +3759,10 @@
       OptimizationGuideAccessTokenResult::kUserNotSignedIn, 1);
 }
 
-class HintsManagerProactivePersonalizedFetchingTest : public HintsManagerTest {
+class HintsManagerProactivePersonalizationFetchingTest
+    : public HintsManagerTest {
  public:
-  HintsManagerProactivePersonalizedFetchingTest() {
+  HintsManagerProactivePersonalizationFetchingTest() {
     scoped_list_.InitWithFeaturesAndParameters(
         {
             {
@@ -3799,7 +3800,7 @@
   base::test::ScopedFeatureList scoped_list_;
 };
 
-TEST_F(HintsManagerProactivePersonalizedFetchingTest,
+TEST_F(HintsManagerProactivePersonalizationFetchingTest,
        NotAnAllowedOptimizationTypeHintsFetchedAtNavigationTime) {
   base::CommandLine::ForCurrentProcess()->AppendSwitch(
       switches::kDisableCheckingUserPermissionsForTesting);
@@ -3821,7 +3822,7 @@
       RaceNavigationFetchAttemptStatus::kRaceNavigationFetchHostAndURL, 1);
 }
 
-TEST_F(HintsManagerProactivePersonalizedFetchingTest,
+TEST_F(HintsManagerProactivePersonalizationFetchingTest,
        AllowedOptimizationTypeHintsFetchedAtNavigationTime) {
   ASSERT_TRUE(identity_test_env()->identity_manager());
   AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable(
@@ -3848,7 +3849,7 @@
       RaceNavigationFetchAttemptStatus::kRaceNavigationFetchHostAndURL, 1);
 }
 
-TEST_F(HintsManagerProactivePersonalizedFetchingTest, TokenFailure) {
+TEST_F(HintsManagerProactivePersonalizationFetchingTest, TokenFailure) {
   ASSERT_TRUE(identity_test_env()->identity_manager());
   AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable(
       "test_email", signin::ConsentLevel::kSignin);
@@ -3870,4 +3871,142 @@
       OptimizationGuideAccessTokenResult::kTransientError, 1);
 }
 
+TEST_F(HintsManagerProactivePersonalizationFetchingTest,
+       FetchHintsForActiveTabsWithoutPersonalizableTypes) {
+  auto scoped_feature_list = SetUpDeferStartupActiveTabsHintsFetch(true);
+  base::HistogramTester histogram_tester;
+
+  base::CommandLine::ForCurrentProcess()->AppendSwitch(
+      switches::kDisableCheckingUserPermissionsForTesting);
+
+  ASSERT_TRUE(identity_test_env()->identity_manager());
+  AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable(
+      "test_email", signin::ConsentLevel::kSignin);
+
+  CreateHintsManager(
+      std::make_unique<FakeTopHostProvider>(std::vector<std::string>({})),
+      identity_test_env()->identity_manager());
+  hints_manager()->RegisterOptimizationTypes({proto::DEFER_ALL_SCRIPT});
+  hints_manager()->SetHintsFetcherFactoryForTesting(
+      BuildTestHintsFetcherFactory(
+          {HintsFetcherEndState::kFetchSuccessWithHostHints}));
+  InitializeWithDefaultConfig("1.0.0");
+
+  tab_url_provider()->SetUrls(
+      {GURL("https://a.com"), GURL("https://b.com"), GURL("chrome://new-tab")});
+
+  // No hints fetch should happen on startup.
+  RunUntilIdle();
+  histogram_tester.ExpectTotalCount(
+      "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 0);
+  EXPECT_EQ(0, tab_url_provider()->get_num_urls_called());
+
+  // Hints fetch should be triggered on deferred startup.
+  hints_manager()->OnDeferredStartup();
+
+  // No access token request is expected when there are no personalized types.
+
+  RunUntilIdle();
+  histogram_tester.ExpectBucketCount(
+      "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 2, 1);
+  EXPECT_EQ(1, tab_url_provider()->get_num_urls_called());
+  EXPECT_EQ(1,
+            active_tabs_batch_update_hints_fetcher()->num_fetches_requested());
+  EXPECT_EQ(
+      proto::RequestContext::CONTEXT_BATCH_UPDATE_ACTIVE_TABS,
+      active_tabs_batch_update_hints_fetcher()->request_context_requested());
+}
+
+TEST_F(HintsManagerProactivePersonalizationFetchingTest,
+       FetchHintsForActiveTabsWithPersonalizableTypes) {
+  auto scoped_feature_list = SetUpDeferStartupActiveTabsHintsFetch(true);
+  base::HistogramTester histogram_tester;
+
+  base::CommandLine::ForCurrentProcess()->AppendSwitch(
+      switches::kDisableCheckingUserPermissionsForTesting);
+
+  ASSERT_TRUE(identity_test_env()->identity_manager());
+  AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable(
+      "test_email", signin::ConsentLevel::kSignin);
+
+  CreateHintsManager(
+      std::make_unique<FakeTopHostProvider>(std::vector<std::string>({})),
+      identity_test_env()->identity_manager());
+  hints_manager()->RegisterOptimizationTypes({proto::SHOPPING_DISCOUNTS});
+  hints_manager()->SetHintsFetcherFactoryForTesting(
+      BuildTestHintsFetcherFactory(
+          {HintsFetcherEndState::kFetchSuccessWithHostHints}));
+  InitializeWithDefaultConfig("1.0.0");
+
+  tab_url_provider()->SetUrls(
+      {GURL("https://a.com"), GURL("https://b.com"), GURL("chrome://new-tab")});
+
+  // No hints fetch should happen on startup.
+  RunUntilIdle();
+  histogram_tester.ExpectTotalCount(
+      "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 0);
+  EXPECT_EQ(0, tab_url_provider()->get_num_urls_called());
+
+  // Hints fetch should be triggered on deferred startup.
+  hints_manager()->OnDeferredStartup();
+  RunUntilIdle();
+  // An access token request is expected with personalized types.
+  identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
+      "access_token", base::Time::Max());
+  histogram_tester.ExpectBucketCount(
+      "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 2, 1);
+  EXPECT_EQ(1, tab_url_provider()->get_num_urls_called());
+  EXPECT_EQ(1,
+            active_tabs_batch_update_hints_fetcher()->num_fetches_requested());
+  EXPECT_EQ(
+      proto::RequestContext::CONTEXT_BATCH_UPDATE_ACTIVE_TABS,
+      active_tabs_batch_update_hints_fetcher()->request_context_requested());
+}
+
+TEST_F(HintsManagerProactivePersonalizationFetchingTest,
+       FetchHintsForActiveTabsWithPersonalizableTypesWithTokenFailure) {
+  auto scoped_feature_list = SetUpDeferStartupActiveTabsHintsFetch(true);
+  base::HistogramTester histogram_tester;
+
+  base::CommandLine::ForCurrentProcess()->AppendSwitch(
+      switches::kDisableCheckingUserPermissionsForTesting);
+
+  ASSERT_TRUE(identity_test_env()->identity_manager());
+  AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable(
+      "test_email", signin::ConsentLevel::kSignin);
+
+  CreateHintsManager(
+      std::make_unique<FakeTopHostProvider>(std::vector<std::string>({})),
+      identity_test_env()->identity_manager());
+  hints_manager()->RegisterOptimizationTypes({proto::SHOPPING_DISCOUNTS});
+  hints_manager()->SetHintsFetcherFactoryForTesting(
+      BuildTestHintsFetcherFactory(
+          {HintsFetcherEndState::kFetchSuccessWithHostHints}));
+  InitializeWithDefaultConfig("1.0.0");
+
+  tab_url_provider()->SetUrls(
+      {GURL("https://a.com"), GURL("https://b.com"), GURL("chrome://new-tab")});
+
+  // No hints fetch should happen on startup.
+  RunUntilIdle();
+  histogram_tester.ExpectTotalCount(
+      "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 0);
+  EXPECT_EQ(0, tab_url_provider()->get_num_urls_called());
+
+  // Hints fetch should be triggered on deferred startup.
+  hints_manager()->OnDeferredStartup();
+  RunUntilIdle();
+  // An access token request is expected with personalized types.
+  identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithError(
+      GoogleServiceAuthError(GoogleServiceAuthError::CONNECTION_FAILED));
+  histogram_tester.ExpectUniqueSample(
+      "OptimizationGuide.AccessTokenHelper.Result",
+      OptimizationGuideAccessTokenResult::kTransientError, 1);
+  EXPECT_EQ(1,
+            active_tabs_batch_update_hints_fetcher()->num_fetches_requested());
+  EXPECT_EQ(
+      proto::RequestContext::CONTEXT_BATCH_UPDATE_ACTIVE_TABS,
+      active_tabs_batch_update_hints_fetcher()->request_context_requested());
+}
+
 }  // namespace optimization_guide
diff --git a/components/optimization_guide/core/optimization_guide_features.h b/components/optimization_guide/core/optimization_guide_features.h
index 70cb093..a3f188d 100644
--- a/components/optimization_guide/core/optimization_guide_features.h
+++ b/components/optimization_guide/core/optimization_guide_features.h
@@ -19,7 +19,6 @@
 #include "base/metrics/field_trial_params.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "components/optimization_guide/core/model_execution/feature_keys.h"
 #include "components/optimization_guide/core/optimization_guide_enums.h"
 #include "components/optimization_guide/proto/hints.pb.h"
 #include "components/optimization_guide/proto/model_execution.pb.h"
diff --git a/components/policy/resources/templates/policies.yaml b/components/policy/resources/templates/policies.yaml
index 0160191c..f6ba852 100644
--- a/components/policy/resources/templates/policies.yaml
+++ b/components/policy/resources/templates/policies.yaml
@@ -1367,6 +1367,7 @@
   1366: ''
   1367: AIModeSettings
   1368: WatermarkStyle
+  1369: KioskApplicationLogCollectionEnabled
 
 atomic_groups:
   1: Homepage
diff --git a/components/policy/resources/templates/policy_definitions/Kiosk/KioskApplicationLogCollectionEnabled.yaml b/components/policy/resources/templates/policy_definitions/Kiosk/KioskApplicationLogCollectionEnabled.yaml
new file mode 100644
index 0000000..8c0ab1f
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitions/Kiosk/KioskApplicationLogCollectionEnabled.yaml
@@ -0,0 +1,25 @@
+owners:
+- macinashutosh@google.com
+- irfedorova@google.com
+- file://chromeos/components/kiosk/OWNERS
+caption: Enable kiosk application log collection
+default: false
+desc: |-
+  Setting the policy to Enabled means Kiosk application level logs would be collected when a kiosk application is running on the device. Logs would be collected for all kiosk application types.
+  These logs would be stored in a separate kiosk_apps.log file.
+  Leaving this policy unset or setting it to Disabled means the Kiosk application level logs would not be collected.
+features:
+  dynamic_refresh: true
+  per_profile: true
+type: main
+schema:
+  type: boolean
+items:
+- caption: Enable Kiosk application logs
+  value: true
+- caption: Disable Kiosk application logs
+  value: false
+example_value: false
+future_on:
+- chrome_os
+tags: []
diff --git a/components/policy/test/data/pref_mapping/KioskApplicationLogCollectionEnabled.json b/components/policy/test/data/pref_mapping/KioskApplicationLogCollectionEnabled.json
new file mode 100644
index 0000000..1081b29
--- /dev/null
+++ b/components/policy/test/data/pref_mapping/KioskApplicationLogCollectionEnabled.json
@@ -0,0 +1,16 @@
+[
+    {
+        "os": [
+            "chromeos"
+        ],
+        "simple_policy_pref_mapping_test": {
+            "pref_name": "kiosk_application_log_collection_enabled",
+            "pref_location": "user_profile",
+            "default_value": false,
+            "values_to_test": [
+                true,
+                false
+            ]
+        }
+    }
+]
\ No newline at end of file
diff --git a/components/resources/dom_distiller_resources.grdp b/components/resources/dom_distiller_resources.grdp
index 3e2f084..5c0cd01 100644
--- a/components/resources/dom_distiller_resources.grdp
+++ b/components/resources/dom_distiller_resources.grdp
@@ -9,4 +9,5 @@
   <include name="IDR_EXTRACT_PAGE_FEATURES_JS" file="../dom_distiller/core/javascript/extract_features.js" type="BINDATA" />
   <include name="IDR_DISTILLABLE_PAGE_SERIALIZED_MODEL_NEW" file="../dom_distiller/core/data/distillable_page_model_new.bin" type="BINDATA" compress="gzip" />
   <include name="IDR_LONG_PAGE_SERIALIZED_MODEL" file="../dom_distiller/core/data/long_page_model.bin" type="BINDATA" compress="gzip" />
+  <include name="IDR_READABILITY_DISTILLER_JS" file="../dom_distiller/core/javascript/readability_distiller.js" flattenhtml="true" type="BINDATA" />
 </grit-part>
diff --git a/components/safe_browsing/core/common/proto/realtimeapi.proto b/components/safe_browsing/core/common/proto/realtimeapi.proto
index 2f2b75d..3951d52a 100644
--- a/components/safe_browsing/core/common/proto/realtimeapi.proto
+++ b/components/safe_browsing/core/common/proto/realtimeapi.proto
@@ -297,6 +297,7 @@
   optional bool block_screenshot = 8;
 
   message DataMaskingAction {
+    // The display name of the data masking detector.
     optional string display_name = 1;
 
     // The type of masking to be applied. This is either "LIGHT", "HARD" or
@@ -307,6 +308,9 @@
 
     // This is a regex pattern that will be used to match the URL.
     optional string pattern = 3;
+
+    // The id of the data masking detector.
+    optional string detector_id = 4;
   }
 
   // The set of data masking actions that should be applied to the URL due to
diff --git a/components/sensitive_content/android/java/src/org/chromium/components/sensitive_content/SensitiveContentClient.java b/components/sensitive_content/android/java/src/org/chromium/components/sensitive_content/SensitiveContentClient.java
index c63b462..d2ae777 100644
--- a/components/sensitive_content/android/java/src/org/chromium/components/sensitive_content/SensitiveContentClient.java
+++ b/components/sensitive_content/android/java/src/org/chromium/components/sensitive_content/SensitiveContentClient.java
@@ -20,6 +20,7 @@
 
 import org.chromium.base.ObserverList;
 import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.base.ViewAndroidDelegate;
 
@@ -167,7 +168,7 @@
      * @param view The new container view.
      */
     @Override
-    public void onUpdateContainerView(ViewGroup view) {
+    public void onUpdateContainerView(@Nullable ViewGroup view) {
         assert view == assumeNonNull(mViewAndroidDelegate.get()).getContainerView();
         setContentSensitivity(mContentIsSensitive);
     }
diff --git a/components/tab_groups/BUILD.gn b/components/tab_groups/BUILD.gn
index 6c3b137..184fd8d 100644
--- a/components/tab_groups/BUILD.gn
+++ b/components/tab_groups/BUILD.gn
@@ -54,6 +54,7 @@
     sources = [
       "android/java/res/values-night/colors.xml",
       "android/java/res/values/colors.xml",
+      "android/java/res/values/dimens.xml",
     ]
   }
 }
diff --git a/components/tab_groups/android/java/res/values/colors.xml b/components/tab_groups/android/java/res/values/colors.xml
index 42197e8..54248eb4 100644
--- a/components/tab_groups/android/java/res/values/colors.xml
+++ b/components/tab_groups/android/java/res/values/colors.xml
@@ -84,4 +84,5 @@
     <color name="tab_group_card_placeholder_color_yellow">@color/tab_group_card_secondary_color_yellow_light_gm3</color>
     <color name="tab_group_card_placeholder_color_yellow_incognito">@color/tab_group_card_secondary_color_yellow_dark_gm3</color>
 
+    <color name="tab_group_color_picker_incognito_ripple_color">@color/baseline_neutral_90</color>
 </resources>
\ No newline at end of file
diff --git a/components/tab_groups/android/java/res/values/dimens.xml b/components/tab_groups/android/java/res/values/dimens.xml
new file mode 100644
index 0000000..e2820ebc
--- /dev/null
+++ b/components/tab_groups/android/java/res/values/dimens.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2025 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<resources>
+    <item name="tab_group_color_picker_hovered_alpha" format="float" type="dimen">0.08</item>
+    <item name="tab_group_color_picker_focused_alpha" format="float" type="dimen">0.1</item>
+    <item name="tab_group_color_picker_pressed_alpha" format="float" type="dimen">0.12</item>
+</resources>
\ No newline at end of file
diff --git a/components/tab_groups/android/java/src/org/chromium/components/tab_groups/TabGroupColorPickerUtils.java b/components/tab_groups/android/java/src/org/chromium/components/tab_groups/TabGroupColorPickerUtils.java
index ef94e15..306a3bf3 100644
--- a/components/tab_groups/android/java/src/org/chromium/components/tab_groups/TabGroupColorPickerUtils.java
+++ b/components/tab_groups/android/java/src/org/chromium/components/tab_groups/TabGroupColorPickerUtils.java
@@ -5,10 +5,13 @@
 package org.chromium.components.tab_groups;
 
 import android.content.Context;
+import android.content.res.ColorStateList;
 import android.content.res.Resources;
+import android.graphics.Color;
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.ColorRes;
+import androidx.annotation.DimenRes;
 import androidx.core.content.ContextCompat;
 
 import com.google.android.material.color.MaterialColors;
@@ -16,10 +19,20 @@
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.browser_ui.styles.SemanticColorUtils;
 import org.chromium.ui.util.ColorUtils;
+import org.chromium.ui.util.ValueUtils;
 
 /** Helper class to handle tab group color picker related utilities. */
 @NullMarked
 public class TabGroupColorPickerUtils {
+
+    private static final int[][] HOVERED_FOCUSED_PRESSED_AND_NORMAL_STATES =
+            new int[][] {
+                new int[] {android.R.attr.state_hovered},
+                new int[] {android.R.attr.state_focused},
+                new int[] {android.R.attr.state_pressed},
+                new int[] {}
+            };
+
     /**
      * Get the color corresponding to the color id that is passed in. Adjust the color depending on
      * light/dark/incognito mode as well as dynamic color themes. This function should only be used
@@ -36,6 +49,35 @@
     }
 
     /**
+     * Builds a {@link ColorStateList} for the ripple effect in the tab group color picker. The
+     * ripple color adapts based on whether the current context is incognito or not, and applies
+     * different alpha values for hovered, focused, and pressed states.
+     *
+     * @param context The {@link Context} used to retrieve colors and dimensions.
+     * @param isIncognito A boolean indicating whether the current mode is incognito.
+     * @return A {@link ColorStateList} configured for the ripple effect.
+     */
+    public static ColorStateList buildTabGroupColorPickerRippleColorStateList(
+            Context context, boolean isIncognito) {
+        @DimenRes int hoveredAlpha = R.dimen.tab_group_color_picker_hovered_alpha;
+        @DimenRes int focusedAlpha = R.dimen.tab_group_color_picker_focused_alpha;
+        @DimenRes int pressedAlpha = R.dimen.tab_group_color_picker_pressed_alpha;
+        @ColorInt
+        int onSurfaceColor =
+                isIncognito
+                        ? ContextCompat.getColor(
+                                context, R.color.tab_group_color_picker_incognito_ripple_color)
+                        : SemanticColorUtils.getColorOnSurface(context);
+
+        int hoveredColor = getColorWithAlphaApplied(context, onSurfaceColor, hoveredAlpha);
+        int focusedColor = getColorWithAlphaApplied(context, onSurfaceColor, focusedAlpha);
+        int pressedColor = getColorWithAlphaApplied(context, onSurfaceColor, pressedAlpha);
+
+        int[] colors = new int[] {hoveredColor, focusedColor, pressedColor, Color.TRANSPARENT};
+        return new ColorStateList(HOVERED_FOCUSED_PRESSED_AND_NORMAL_STATES, colors);
+    }
+
+    /**
      * Get the color resource corresponding to the respective color item. This function should only
      * be used for retrieving items from the tab group color picker.
      *
@@ -298,4 +340,13 @@
             return MaterialColors.harmonizeWithPrimary(context, color);
         }
     }
+
+    private static @ColorInt int getColorWithAlphaApplied(
+            Context context, int color, @DimenRes int alphaRes) {
+        Resources resources = context.getResources();
+        float alpha = ValueUtils.getFloat(resources, alphaRes);
+        int alphaScaled = Math.round(alpha * 255);
+
+        return ColorUtils.setAlphaComponent(color, alphaScaled);
+    }
 }
diff --git a/components/tracing/common/etw_consumer_win.cc b/components/tracing/common/etw_consumer_win.cc
index f3be490..4194c950 100644
--- a/components/tracing/common/etw_consumer_win.cc
+++ b/components/tracing/common/etw_consumer_win.cc
@@ -188,11 +188,15 @@
         DLOG(ERROR) << "Error decoding CSwitch Event";
       }
       break;
+    case 50:  // ReadyThread
+      if (!DecodeReadyThreadEvent(header, buffer_context, packet_data)) {
+        DLOG(ERROR) << "Error decoding ReadyThread Event";
+      }
+      break;
     case 72:  // ThreadSetName (v2)
       OnThreadSetName(header, buffer_context, packet_data);
       break;
     default:
-      // 50: ReadyThread
       break;
   }
 }
@@ -447,6 +451,40 @@
   return true;
 }
 
+bool EtwConsumer::DecodeReadyThreadEvent(
+    const EVENT_HEADER& header,
+    const ETW_BUFFER_CONTEXT& buffer_context,
+    base::span<const uint8_t> packet_data) {
+  using perfetto::protos::pbzero::ReadyThreadEtwEvent;
+
+  // Size of ReadyThread v2 in bytes (1 x 32-bit plus 4 x 8-bit).
+  static constexpr size_t kMinimumReadyThreadLength = 1 * 4 + 4;
+  if (packet_data.size() < kMinimumReadyThreadLength) {
+    return false;
+  }
+
+  // Read and validate the contents of `packet_data`.
+  base::BufferIterator<const uint8_t> iterator{packet_data};
+  auto thread_id = *iterator.CopyObject<uint32_t>();
+  auto adjust_reason = *iterator.Object<int8_t>();
+  auto adjust_increment = *iterator.Object<int8_t>();
+  auto flag = *iterator.Object<int8_t>();
+
+  // Generate a ReadyThreadEtwEvent.
+  auto* event = MakeNextEvent(header, buffer_context);
+  if (inclusion_policy_.ShouldIncludeThreadId(header.ThreadId)) {
+    event->set_thread_id(header.ThreadId);
+  }
+  auto* ready_thread = event->set_ready_thread();
+  if (inclusion_policy_.ShouldIncludeThreadId(thread_id)) {
+    ready_thread->set_t_thread_id(thread_id);
+  }
+  ready_thread->set_adjust_reason_int(adjust_reason);
+  ready_thread->set_adjust_increment(adjust_increment);
+  ready_thread->set_flag_int(flag);
+  return true;
+}
+
 perfetto::protos::pbzero::EtwTraceEvent* EtwConsumer::MakeNextEvent(
     const EVENT_HEADER& header,
     const ETW_BUFFER_CONTEXT& buffer_context) {
diff --git a/components/tracing/common/etw_consumer_win.h b/components/tracing/common/etw_consumer_win.h
index adb7838..7c511186 100644
--- a/components/tracing/common/etw_consumer_win.h
+++ b/components/tracing/common/etw_consumer_win.h
@@ -123,6 +123,14 @@
                           base::span<const uint8_t> packet_data)
       VALID_CONTEXT_REQUIRED(sequence_checker_);
 
+  // Decodes a ReadyThread Event and emits a Perfetto trace event; see
+  // https://learn.microsoft.com/en-us/windows/win32/etw/readythread.
+  // Returns true on success, or false if `packet_data` is invalid.
+  bool DecodeReadyThreadEvent(const EVENT_HEADER& header,
+                              const ETW_BUFFER_CONTEXT& buffer_context,
+                              base::span<const uint8_t> packet_data)
+      VALID_CONTEXT_REQUIRED(sequence_checker_);
+
   // Returns a new perfetto trace event to be emitted for an ETW event with a
   // given event header. The timestamp and cpu fields of the returned event are
   // prepopulated.
diff --git a/components/tracing/common/etw_consumer_win_unittest.cc b/components/tracing/common/etw_consumer_win_unittest.cc
index c071143..912ee2b 100644
--- a/components/tracing/common/etw_consumer_win_unittest.cc
+++ b/components/tracing/common/etw_consumer_win_unittest.cc
@@ -93,6 +93,10 @@
   uint32_t old_thread_id;
 };
 
+struct ReadyThreadData {
+  uint32_t t_thread_id;
+};
+
 // Returns the MOF encoding of a sid, including the leading uint32_t and
 // TOKEN_USER.
 base::HeapArray<uint8_t> EncodeSid(size_t pointer_size) {
@@ -245,6 +249,19 @@
   return base::HeapArray<uint8_t>::CopiedFrom({buffer});
 }
 
+// Returns the MOF encoding of a v2 ReadyThread event.
+base::HeapArray<uint8_t> EncodeReadyThread(
+    const ReadyThreadData& ready_thread) {
+  std::vector<uint8_t> buffer;
+  auto iter = std::back_inserter(buffer);
+  std::ranges::copy(base::byte_span_from_ref(ready_thread.t_thread_id), iter);
+  buffer.insert(buffer.end(), 0x01);                   // AdjustReason
+  buffer.insert(buffer.end(), 0);                      // AdjustIncrement
+  buffer.insert(buffer.end(), 0x01);                   // Flag = THREAD_READIED
+  buffer.insert(buffer.end(), sizeof(uint8_t), 0x42);  // Reserved
+  return base::HeapArray<uint8_t>::CopiedFrom({buffer});
+}
+
 }  // namespace
 
 // A test fixture that instantiates an EtwConsumer and sends it some events to
@@ -324,20 +341,11 @@
     SendProcessDcEndEvent(EncodeProcess({.process_id = kSystemPid}));
   }
 
-  // Generates an ETW CSwitch event with `packet_data` as its payload and sends
-  // it to the EtwConsumer for processing. If the EtwConsumer generates a
-  // TracePacket containing a `CSwitchEtwEvent`, `cswitch_decoder` is
-  // constructed from it.
-  void ProcessCSwitchEvent(base::span<const uint8_t> packet_data) {
-    SendThreadEvent(/*version=*/2u, /*opcode=*/36u, packet_data);
-  }
-
-  // Validates the TracePacket processed by `decoder` and populates `c_switch`
+  // Validates the TracePacket processed by `decoder` and populates `event`
   // with a decoder for the first ETW event contained therein.
-  void ValidateAndDecodeCSwitch(
+  void ValidateAndDecodeEtwEvent(
       const MessageAndDecoder& decoder,
-      std::optional<perfetto::protos::pbzero::CSwitchEtwEvent::Decoder>&
-          c_switch) {
+      std::optional<perfetto::protos::pbzero::EtwTraceEvent::Decoder>& event) {
     auto& trace_packet_decoder = decoder.decoder();
 
     ASSERT_TRUE(trace_packet_decoder.has_timestamp());
@@ -346,50 +354,91 @@
     perfetto::protos::pbzero::EtwTraceEventBundle::Decoder bundle(
         trace_packet_decoder.etw_events());
     ASSERT_TRUE(bundle.has_event());
-    perfetto::protos::pbzero::EtwTraceEvent::Decoder event(*bundle.event());
-    ASSERT_TRUE(event.has_timestamp());
-    ASSERT_TRUE(event.has_cpu());
-    ASSERT_EQ(event.cpu(), kTestProcessorIndex);
-    ASSERT_TRUE(event.has_c_switch());
-    c_switch.emplace(event.c_switch());
+    event.emplace(*bundle.event());
+    ASSERT_TRUE(event->has_timestamp());
+    ASSERT_TRUE(event->has_cpu());
+    ASSERT_EQ(event->cpu(), kTestProcessorIndex);
+  }
+
+  // Generates an ETW CSwitch event with `packet_data` as its payload and sends
+  // it to the EtwConsumer for processing. If the EtwConsumer generates a
+  // TracePacket containing a `CSwitchEtwEvent`, a new decoder is constructed
+  // from it.
+  void ProcessCSwitchEvent(base::span<const uint8_t> packet_data) {
+    SendThreadEvent(/*version=*/2u, /*opcode=*/36u, kSystemTid, packet_data);
+  }
+
+  // Validates the TracePacket processed by `decoder` and populates `c_switch`
+  // with a decoder for the first ETW event contained therein.
+  void ValidateAndDecodeCSwitch(
+      const MessageAndDecoder& decoder,
+      std::optional<perfetto::protos::pbzero::CSwitchEtwEvent::Decoder>&
+          c_switch) {
+    std::optional<perfetto::protos::pbzero::EtwTraceEvent::Decoder> event;
+    ValidateAndDecodeEtwEvent(decoder, event);
+
+    ASSERT_TRUE(event->has_c_switch());
+    c_switch.emplace(event->c_switch());
+  }
+
+  // Generates an ETW ReadyThread event with `packet_data` as its payload and
+  // sends it to the EtwConsumer for processing. If the EtwConsumer generates a
+  // TracePacket containing a `ReadyThreadEtwEvent`, a new decoder is
+  // constructed from it.
+  void ProcessReadyThreadEvent(uint32_t thread_id,
+                               base::span<const uint8_t> packet_data) {
+    SendThreadEvent(/*version=*/2u, /*opcode=*/50u, thread_id, packet_data);
+  }
+
+  // Validates the TracePacket processed by `decoder` and populates
+  // `ready_thread` with a decoder for the first ETW event contained therein.
+  void ValidateAndDecodeReadyThread(
+      const MessageAndDecoder& decoder,
+      std::optional<perfetto::protos::pbzero::EtwTraceEvent::Decoder>& event,
+      std::optional<perfetto::protos::pbzero::ReadyThreadEtwEvent::Decoder>&
+          ready_thread) {
+    ValidateAndDecodeEtwEvent(decoder, event);
+
+    ASSERT_TRUE(event->has_ready_thread());
+    ready_thread.emplace(event->ready_thread());
   }
 
   void SendProcessStartEvent(base::span<const uint8_t> packet_data) {
-    SendProcessEvent(/*version=*/4u, /*opcode=*/1u, packet_data);
+    SendProcessEvent(/*version=*/4u, /*opcode=*/1u, kSystemTid, packet_data);
   }
 
   void SendProcessEndEvent(base::span<const uint8_t> packet_data) {
-    SendProcessEvent(/*version=*/4u, /*opcode=*/2u, packet_data);
+    SendProcessEvent(/*version=*/4u, /*opcode=*/2u, kSystemTid, packet_data);
   }
 
   void SendProcessDcStartEvent(base::span<const uint8_t> packet_data) {
-    SendProcessEvent(/*version=*/4u, /*opcode=*/3u, packet_data);
+    SendProcessEvent(/*version=*/4u, /*opcode=*/3u, kSystemTid, packet_data);
   }
 
   void SendProcessDcEndEvent(base::span<const uint8_t> packet_data) {
-    SendProcessEvent(/*version=*/4u, /*opcode=*/4u, packet_data);
+    SendProcessEvent(/*version=*/4u, /*opcode=*/4u, kSystemTid, packet_data);
   }
 
   void SendThreadStartEvent(base::span<const uint8_t> packet_data) {
-    SendThreadEvent(/*version=*/4u, /*opcode=*/1u, packet_data);
+    SendThreadEvent(/*version=*/4u, /*opcode=*/1u, kSystemTid, packet_data);
   }
 
   void SendThreadEndEvent(base::span<const uint8_t> packet_data) {
-    SendThreadEvent(/*version=*/4u, /*opcode=*/2u, packet_data);
+    SendThreadEvent(/*version=*/4u, /*opcode=*/2u, kSystemTid, packet_data);
   }
 
   void SendThreadDcStartEvent(base::span<const uint8_t> packet_data) {
-    SendThreadEvent(/*version=*/4u, /*opcode=*/3u, packet_data);
+    SendThreadEvent(/*version=*/4u, /*opcode=*/3u, kSystemTid, packet_data);
   }
 
   void SendThreadDcEndEvent(base::span<const uint8_t> packet_data) {
-    SendThreadEvent(/*version=*/4u, /*opcode=*/4u, packet_data);
+    SendThreadEvent(/*version=*/4u, /*opcode=*/4u, kSystemTid, packet_data);
   }
 
   void SendThreadSetName(uint32_t process_id,
                          uint32_t thread_id,
                          base::wcstring_view thread_name) {
-    SendThreadEvent(/*version=*/2, /*opcode=*/72,
+    SendThreadEvent(/*version=*/2, /*opcode=*/72, kSystemTid,
                     EncodeThreadSetName(process_id, thread_id, thread_name));
   }
 
@@ -409,24 +458,26 @@
   // `decoder` is constructed from it.
   void SendThreadEvent(uint8_t version,
                        uint8_t opcode,
+                       uint32_t thread_id,
                        base::span<const uint8_t> packet_data) {
     ProcessEvent({0x3d6fa8d1,
                   0xfe05,
                   0x11d0,
                   {0x9d, 0xda, 0x00, 0xc0, 0x4f, 0xd7, 0xba, 0x7c}},
-                 version, opcode, packet_data);
+                 version, opcode, thread_id, packet_data);
   }
 
   // Generates an ETW Process event with `packet_data` as its payload and sends
   // it to the EtwConsumer for processing.
   void SendProcessEvent(uint8_t version,
                         uint8_t opcode,
+                        uint32_t thread_id,
                         base::span<const uint8_t> packet_data) {
     ProcessEvent({0x3d6fa8d0,
                   0xfe05,
                   0x11d0,
                   {0x9d, 0xda, 0x00, 0xc0, 0x4f, 0xd7, 0xba, 0x7c}},
-                 version, opcode, packet_data);
+                 version, opcode, thread_id, packet_data);
   }
 
   // Returns the MOF encoding of a Process event (v4 by default).
@@ -450,9 +501,11 @@
   void ProcessEvent(const GUID& provider,
                     uint8_t version,
                     uint8_t opcode,
+                    uint32_t thread_id,
                     base::span<const uint8_t> packet_data) {
     EVENT_RECORD event_record = {
         .EventHeader = {.Flags = kEventHeaderFlags,
+                        .ThreadId = thread_id,
                         .ProviderId = provider,
                         .EventDescriptor = {.Version = version,
                                             .Opcode = opcode}},
@@ -551,6 +604,73 @@
   EXPECT_TRUE(c_switch->has_old_thread_id());
 }
 
+// Tests that no ReadyThreadEtwEvent is emitted for an empty ReadyThread ETW
+// event.
+TEST_F(EtwConsumerTest, ReadyThreadEventIsEmpty) {
+  ProcessReadyThreadEvent(kClientTid, {});
+  ASSERT_TRUE(decoders().empty());
+}
+
+// Tests that no ReadyThreadEtwEvent is emitted for a small ReadyThread ETW
+// event.
+TEST_F(EtwConsumerTest, ReadyThreadEventIsTooShort) {
+  static constexpr uint8_t kData[] = {0x00, 23};
+  ProcessReadyThreadEvent(kClientTid, {kData});
+  ASSERT_TRUE(decoders().empty());
+}
+
+// Tests that CSwitchEtwEvent is emitted for a CSwitch ETW event.
+TEST_F(EtwConsumerTest, ReadyThreadEvent) {
+  ProcessReadyThreadEvent(kClientTid,
+                          EncodeReadyThread({.t_thread_id = kClientTid2}));
+  ASSERT_EQ(decoders().size(), 1u);
+
+  std::optional<perfetto::protos::pbzero::EtwTraceEvent::Decoder> event;
+  std::optional<perfetto::protos::pbzero::ReadyThreadEtwEvent::Decoder>
+      ready_thread;
+  ASSERT_NO_FATAL_FAILURE(
+      ValidateAndDecodeReadyThread(*decoders().front(), event, ready_thread));
+
+  EXPECT_EQ(kClientTid, event->thread_id());
+  EXPECT_EQ(kClientTid2, ready_thread->t_thread_id());
+  EXPECT_EQ(0x01, ready_thread->adjust_reason_int());
+  EXPECT_EQ(0, ready_thread->adjust_increment());
+  EXPECT_EQ(0x01, ready_thread->flag_int());
+}
+
+// Tests that ReadyThread events have the thread IDs filtered as appropriate.
+TEST_F(EtwConsumerTest, ReadyThreadFiltering) {
+  // Target TID is masked if it doesn't belong to Chrome.
+  ProcessReadyThreadEvent(kClientTid,
+                          EncodeReadyThread({.t_thread_id = kSystemTid}));
+  ASSERT_EQ(decoders().size(), 1u);
+  std::optional<perfetto::protos::pbzero::EtwTraceEvent::Decoder> event;
+  std::optional<perfetto::protos::pbzero::ReadyThreadEtwEvent::Decoder>
+      ready_thread;
+  ASSERT_NO_FATAL_FAILURE(
+      ValidateAndDecodeReadyThread(*decoders().back(), event, ready_thread));
+  EXPECT_TRUE(event->has_thread_id());
+  EXPECT_FALSE(ready_thread->has_t_thread_id());
+
+  // Both TID and target TID are masked if neither belongs to Chrome.
+  ProcessReadyThreadEvent(kOtherTid,
+                          EncodeReadyThread({.t_thread_id = kSystemTid}));
+  ASSERT_EQ(decoders().size(), 2u);
+  ASSERT_NO_FATAL_FAILURE(
+      ValidateAndDecodeReadyThread(*decoders().back(), event, ready_thread));
+  EXPECT_FALSE(event->has_thread_id());
+  EXPECT_FALSE(ready_thread->has_t_thread_id());
+
+  // TID is masked if it doesn't belong to Chrome.
+  ProcessReadyThreadEvent(kOtherTid,
+                          EncodeReadyThread({.t_thread_id = kClientTid}));
+  ASSERT_EQ(decoders().size(), 3u);
+  ASSERT_NO_FATAL_FAILURE(
+      ValidateAndDecodeReadyThread(*decoders().back(), event, ready_thread));
+  EXPECT_FALSE(event->has_thread_id());
+  EXPECT_TRUE(ready_thread->has_t_thread_id());
+}
+
 TEST_F(EtwConsumerTest, ThreadSetName) {
   SendThreadSetName(kClientPid, kClientTid, L"kaboom");
   ASSERT_EQ(active_processes().GetThreadName(kClientTid), L"kaboom");
@@ -570,9 +690,11 @@
                                   .parent_id = kSystemPid,
                                   .image_file_name = "himom"},
                                  /*version=*/version);
-    SendProcessEvent(/*version=*/version, /*opcode=*/1u, payload);  // Start
+    SendProcessEvent(/*version=*/version, /*opcode=*/1u, kSystemTid,
+                     payload);  // Start
     ASSERT_EQ(active_processes().GetProcessImageFileName(kPid), "himom");
-    SendProcessEvent(/*version=*/version, /*opcode=*/2u, payload);  // End
+    SendProcessEvent(/*version=*/version, /*opcode=*/2u, kSystemTid,
+                     payload);  // End
     ASSERT_TRUE(active_processes().GetProcessImageFileName(kPid).empty());
   }
 }
@@ -586,10 +708,12 @@
     auto payload = EncodeThread(
         {.process_id = kClientPid, .thread_id = kTid, .thread_name = {}},
         /*version=*/version);
-    SendThreadEvent(/*version=*/version, /*opcode=*/1u, payload);  // Start
+    SendThreadEvent(/*version=*/version, /*opcode=*/1u, kSystemTid,
+                    payload);  // Start
     ASSERT_EQ(active_processes().GetThreadCategory(kTid),
               ActiveProcesses::Category::kClient);
-    SendThreadEvent(/*version=*/version, /*opcode=*/2u, payload);  // End
+    SendThreadEvent(/*version=*/version, /*opcode=*/2u, kSystemTid,
+                    payload);  // End
     ASSERT_EQ(active_processes().GetThreadCategory(kTid),
               ActiveProcesses::Category::kOther);
   }
diff --git a/components/user_education/views/custom_help_bubble_view.h b/components/user_education/views/custom_help_bubble_view.h
index ecc747a..d48d158 100644
--- a/components/user_education/views/custom_help_bubble_view.h
+++ b/components/user_education/views/custom_help_bubble_view.h
@@ -14,6 +14,7 @@
 #include "components/user_education/common/feature_promo/feature_promo_specification.h"
 #include "components/user_education/common/help_bubble/custom_help_bubble.h"
 #include "components/user_education/common/help_bubble/help_bubble_params.h"
+#include "components/user_education/views/help_bubble_factory_views.h"
 #include "components/user_education/views/help_bubble_views.h"
 #include "ui/base/interaction/element_identifier.h"
 #include "ui/base/interaction/element_tracker.h"
@@ -68,11 +69,25 @@
         auto* const anchor_element = build_params.anchor_element.get();
         auto bubble = bubble_factory_callback.Run(from_context, arrow,
                                                   std::move(build_params));
-        auto* const bubble_ptr = bubble.get();
+        T* const bubble_ptr = bubble.get();
+
+        // Specific shadow types are required for help bubbles in order to
+        // properly render visible bubble arrows.
+        bubble_ptr->set_shadow(
+            HelpBubbleFactoryViews::GetDefaultBubbleShadow());
+
         auto widget =
             base::WrapUnique(views::BubbleDialogDelegateView::CreateBubble(
                 std::move(bubble),
                 views::Widget::InitParams::CLIENT_OWNS_WIDGET));
+
+        // Maybe set the arrow. This may require recalculating the bubble
+        // bounds.
+        if (arrow != HelpBubbleArrow::kNone) {
+          bubble_ptr->GetBubbleFrameView()->SetDisplayVisibleArrow(true);
+          bubble_ptr->SizeToContents();
+        }
+
         widget->Show();
         return std::make_unique<CustomHelpBubbleViews>(
             std::move(widget), bubble_ptr, anchor_element, accept_button_action,
diff --git a/components/user_education/views/help_bubble_factory_views.cc b/components/user_education/views/help_bubble_factory_views.cc
index 692d33ac..c2d9612 100644
--- a/components/user_education/views/help_bubble_factory_views.cc
+++ b/components/user_education/views/help_bubble_factory_views.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include "build/build_config.h"
 #include "components/user_education/common/help_bubble/help_bubble_params.h"
 #include "components/user_education/common/user_education_class_properties.h"
 #include "components/user_education/views/help_bubble_delegate.h"
@@ -17,6 +18,7 @@
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/base/accelerators/accelerator_manager.h"
 #include "ui/base/interaction/element_tracker.h"
+#include "ui/views/bubble/bubble_border.h"
 #include "ui/views/controls/menu/menu_item_view.h"
 #include "ui/views/interaction/element_tracker_views.h"
 
@@ -73,4 +75,18 @@
   return result;
 }
 
+// static
+views::BubbleBorder::Shadow HelpBubbleFactoryViews::GetDefaultBubbleShadow() {
+#if BUILDFLAG(IS_MAC)
+  // On Mac, the default DIALOG_SHADOW is system-drawn, which is
+  // incompatible with visible bubble arrows. Therefore, always use
+  // STANDARD_SHADOW.
+  return views::BubbleBorder::STANDARD_SHADOW;
+#else
+  // On other platforms, all shadows are Views-drawn; use the (slightly
+  // better-looking) default DIALOG_SHADOW.
+  return views::BubbleBorder::DIALOG_SHADOW;
+#endif
+}
+
 }  // namespace user_education
diff --git a/components/user_education/views/help_bubble_factory_views.h b/components/user_education/views/help_bubble_factory_views.h
index 524f446..caa7f81 100644
--- a/components/user_education/views/help_bubble_factory_views.h
+++ b/components/user_education/views/help_bubble_factory_views.h
@@ -14,6 +14,7 @@
 #include "ui/base/interaction/element_identifier.h"
 #include "ui/base/interaction/element_tracker.h"
 #include "ui/base/interaction/framework_specific_implementation.h"
+#include "ui/views/bubble/bubble_border.h"
 #include "ui/views/widget/widget.h"
 
 namespace user_education {
@@ -39,6 +40,9 @@
   bool CanBuildBubbleForTrackedElement(
       const ui::TrackedElement* element) const override;
 
+  // Returns the default border type for help bubbles.
+  static views::BubbleBorder::Shadow GetDefaultBubbleShadow();
+
  protected:
   std::unique_ptr<HelpBubble> CreateBubbleImpl(
       ui::TrackedElement* element,
diff --git a/components/user_education/views/help_bubble_view.cc b/components/user_education/views/help_bubble_view.cc
index 1f5f361d..049cea2 100644
--- a/components/user_education/views/help_bubble_view.cc
+++ b/components/user_education/views/help_bubble_view.cc
@@ -22,6 +22,7 @@
 #include "components/user_education/common/help_bubble/help_bubble_params.h"
 #include "components/user_education/views/help_bubble_delegate.h"
 #include "components/user_education/views/help_bubble_event_relay.h"
+#include "components/user_education/views/help_bubble_factory_views.h"
 #include "components/user_education/views/help_bubble_views.h"
 #include "components/variations/variations_associated_data.h"
 #include "components/vector_icons/vector_icons.h"
@@ -324,21 +325,10 @@
     const internal::HelpBubbleAnchorParams& anchor,
     HelpBubbleParams params,
     std::unique_ptr<HelpBubbleEventRelay> event_relay)
-    : BubbleDialogDelegateView(
-          anchor.view,
-          HelpBubbleViews::TranslateArrow(params.arrow),
-#if BUILDFLAG(IS_MAC)
-          // On Mac, the default DIALOG_SHADOW is system-drawn, which is
-          // incompatible with visible bubble arrows. Therefore, always use
-          // STANDARD_SHADOW.
-          views::BubbleBorder::STANDARD_SHADOW
-#else
-          // On other platforms, all shadows are Views-drawn; use the (slightly
-          // better-looking) default DIALOG_SHADOW.
-          views::BubbleBorder::DIALOG_SHADOW
-#endif
-          ,
-          true),
+    : BubbleDialogDelegateView(anchor.view,
+                               HelpBubbleViews::TranslateArrow(params.arrow),
+                               HelpBubbleFactoryViews::GetDefaultBubbleShadow(),
+                               true),
       delegate_(delegate),
       event_relay_(std::move(event_relay)) {
   SetBackgroundColor(delegate_->GetHelpBubbleBackgroundColorId());
diff --git a/components/user_education/views/help_bubble_views.cc b/components/user_education/views/help_bubble_views.cc
index 350fcfa..512fccb 100644
--- a/components/user_education/views/help_bubble_views.cc
+++ b/components/user_education/views/help_bubble_views.cc
@@ -260,6 +260,11 @@
 
   bubble->GetWidget()->MakeCloseSynchronous(base::BindOnce(
       &CustomHelpBubbleViews::OnHelpBubbleClosing, base::Unretained(this)));
+
+  // Custom help bubble should always have an anchor view.
+  auto* const anchor_view = bubble->GetAnchorView();
+  anchor_view->SetProperty(user_education::kHasInProductHelpPromoKey, true);
+  user_education::MaybeApplyAttentionStateToTrackedElement(anchor_view);
 }
 
 CustomHelpBubbleViews::~CustomHelpBubbleViews() {
diff --git a/components/visited_url_ranking/internal/history_url_visit_data_fetcher.cc b/components/visited_url_ranking/internal/history_url_visit_data_fetcher.cc
index c66f7ede..21d2b9c 100644
--- a/components/visited_url_ranking/internal/history_url_visit_data_fetcher.cc
+++ b/components/visited_url_ranking/internal/history_url_visit_data_fetcher.cc
@@ -83,10 +83,10 @@
 }
 
 visited_url_ranking::URLVisit::Source GetVisitSource(
-    std::map<std::string,
-             std::pair<std::string, syncer::DeviceInfo::FormFactor>>
+    const std::map<std::string,
+                   std::pair<std::string, syncer::DeviceInfo::FormFactor>>&
         sync_device_info,
-    history::AnnotatedVisit annotated_visit,
+    const history::AnnotatedVisit& annotated_visit,
     raw_ptr<syncer::DeviceInfoSyncService> device_info_sync_service) {
   // The `originator_cache_guid` field is only set for foreign session visits
   // but some foreign visits are actually local as they can come from different
@@ -98,6 +98,7 @@
   if (annotated_visit.visit_row.originator_cache_guid.empty() ||
       (it != sync_device_info.end() &&
        (local_device_info_provider &&
+        local_device_info_provider->GetLocalDeviceInfo() &&
         it->second.first ==
             local_device_info_provider->GetLocalDeviceInfo()->client_name()))) {
     return visited_url_ranking::URLVisit::Source::kLocal;
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
index 1e371e7e..a31410f 100644
--- a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
+++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
@@ -18,10 +18,7 @@
 #include "base/containers/contains.h"
 #include "base/containers/queue.h"
 #include "base/debug/alias.h"
-#include "base/debug/crash_logging.h"
-#include "base/debug/dump_without_crashing.h"
 #include "base/functional/bind.h"
-#include "base/json/values_util.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/observer_list.h"
@@ -29,7 +26,6 @@
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
-#include "base/values.h"
 #include "components/input/utils.h"
 #include "components/viz/common/performance_hint_utils.h"
 #include "components/viz/common/surfaces/subtree_capture_id.h"
@@ -315,23 +311,9 @@
 void FrameSinkManagerImpl::DestroyCompositorFrameSink(
     const FrameSinkId& frame_sink_id,
     DestroyCompositorFrameSinkCallback callback) {
-  const bool is_root =
-      root_sink_map_.find(frame_sink_id) != root_sink_map_.end();
-  base::TimeTicks start = base::TimeTicks::Now();
-  frame_sinks_detached_ = 0;
-
   sink_map_.erase(frame_sink_id);
   root_sink_map_.erase(frame_sink_id);
   std::move(callback).Run();
-
-  base::TimeDelta time_taken_to_destroy = base::TimeTicks::Now() - start;
-  if (is_root && frame_sinks_detached_ != 0 &&
-      time_taken_to_destroy > base::Milliseconds(30)) {
-    base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&FrameSinkManagerImpl::DumpCrashKeys,
-                       weak_factory_.GetWeakPtr(), time_taken_to_destroy));
-  }
 }
 
 void FrameSinkManagerImpl::RegisterFrameSinkHierarchy(
@@ -691,16 +673,6 @@
     RecursivelyAttachBeginFrameSource(source_iter.second, source_iter.first);
 }
 
-void FrameSinkManagerImpl::DumpCrashKeys(
-    base::TimeDelta time_taken_to_destroy) {
-  base::Value::Dict dict = base::Value::Dict();
-  dict.Set("num_frame_sinks_detached", frame_sinks_detached_);
-  dict.Set("time_taken_us", base::TimeDeltaToValue(time_taken_to_destroy));
-  SCOPED_CRASH_KEY_STRING1024("crbug414568877", "crbug414568877",
-                              dict.DebugString());
-  base::debug::DumpWithoutCrashing();
-}
-
 void FrameSinkManagerImpl::RecursivelyAttachBeginFrameSource(
     const FrameSinkId& frame_sink_id,
     BeginFrameSource* source) {
@@ -744,7 +716,6 @@
       // RenderInputRouter (for layer tree frame sinks associated CFSS) and
       // updating it earlier may cause UAF bugs.
       if (GetInputManager()) {
-        frame_sinks_detached_++;
         GetInputManager()->SetBeginFrameSource(frame_sink_id, nullptr);
       }
       client_iter->second->SetBeginFrameSource(nullptr);
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.h b/components/viz/service/frame_sinks/frame_sink_manager_impl.h
index e2a54f89..3ebefa4 100644
--- a/components/viz/service/frame_sinks/frame_sink_manager_impl.h
+++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.h
@@ -398,9 +398,6 @@
   friend class CompositorFrameSinkSupportTestBase;
   friend class FlingSchedulerTest;
 
-  // TOOD(6635304): Remove once the crash investigation is complete.
-  void DumpCrashKeys(base::TimeDelta time_taken_to_destroy);
-
   // Metadata for a CompositorFrameSink.
   struct FrameSinkData {
     explicit FrameSinkData(bool report_activation);
@@ -617,8 +614,6 @@
 
   ReservedResourceIdTracker reserved_resource_id_tracker_;
 
-  int frame_sinks_detached_ = 0;
-
   gfx::Size copy_output_request_result_size_for_testing_;
 
   base::WeakPtrFactory<FrameSinkManagerImpl> weak_factory_{this};
diff --git a/components/viz/service/main/viz_compositor_thread_runner_impl.cc b/components/viz/service/main/viz_compositor_thread_runner_impl.cc
index 1fd24576..1e9ea74 100644
--- a/components/viz/service/main/viz_compositor_thread_runner_impl.cc
+++ b/components/viz/service/main/viz_compositor_thread_runner_impl.cc
@@ -46,6 +46,11 @@
   auto thread = std::make_unique<base::android::JavaHandlerThread>(kThreadName,
                                                                    thread_type);
   thread->Start();
+  thread->task_runner()->PostTask(
+      FROM_HERE, base::BindOnce([]() {
+        mojo::InterfaceEndpointClient::SetThreadNameSuffixForMetrics(
+            "VizCompositor");
+      }));
   return thread;
 #else  // !BUILDFLAG(IS_ANDROID)
 
@@ -74,6 +79,12 @@
 
   CHECK(thread->StartWithOptions(std::move(thread_options)));
 
+  thread->task_runner()->PostTask(
+      FROM_HERE, base::BindOnce([]() {
+        mojo::InterfaceEndpointClient::SetThreadNameSuffixForMetrics(
+            "VizCompositor");
+      }));
+
   return thread;
 #endif  // !BUILDFLAG(IS_ANDROID)
 }
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index 87335792..c5a52f4 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -503,7 +503,7 @@
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityCSSMarkerCrash) {
-  RunCSSTest(FILE_PATH_LITERAL("marker-crash.html"));
+  RunCrashTest(FILE_PATH_LITERAL("marker-crash.html"));
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
@@ -745,12 +745,12 @@
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityAreaCrash) {
-  RunHtmlTest(FILE_PATH_LITERAL("area-crash.html"));
+  RunCrashTest(FILE_PATH_LITERAL("area-crash.html"));
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
                        AccessibilityAreaSerializationCrash) {
-  RunHtmlTest(FILE_PATH_LITERAL("area-serialization-crash.html"));
+  RunCrashTest(FILE_PATH_LITERAL("area-serialization-crash.html"));
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
@@ -1619,11 +1619,11 @@
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityAriaOwnsCrash) {
-  RunAriaTest(FILE_PATH_LITERAL("aria-owns-crash.html"));
+  RunCrashTest(FILE_PATH_LITERAL("aria-owns-crash.html"));
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityAriaOwnsCrash2) {
-  RunAriaTest(FILE_PATH_LITERAL("aria-owns-crash-2.html"));
+  RunCrashTest(FILE_PATH_LITERAL("aria-owns-crash-2.html"));
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
@@ -1633,8 +1633,9 @@
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
                        AccessibilityAriaOwnsChildAndHiddenDescendantCrash) {
-  RunFormControlsTest(
-      FILE_PATH_LITERAL("aria-owns-child-and-hidden-descendant-crash.html"));
+  RunCrashTest(
+      FILE_PATH_LITERAL("aria-owns-child-and-hidden-descendant-crash.html"),
+      ui::kAXModeFormControls);
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
@@ -1658,7 +1659,7 @@
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
                        AccessibilityAriaOwnsReparentAboveOtherChangeCrash) {
-  RunRegressionTest(
+  RunCrashTest(
       FILE_PATH_LITERAL("aria-owns-reparent-above-other-change-crash.html"));
 }
 
@@ -2707,7 +2708,7 @@
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
                        AccessibilityHiddenNamedSlotNoSubtreeCrash) {
-  RunHtmlTest(FILE_PATH_LITERAL("hidden-named-slot-no-subtree-crash.html"));
+  RunCrashTest(FILE_PATH_LITERAL("hidden-named-slot-no-subtree-crash.html"));
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityHR) {
@@ -3663,7 +3664,8 @@
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
                        AccessibilityProgressMeterCrash) {
-  RunFormControlsTest(FILE_PATH_LITERAL("progress-meter-crash.html"));
+  RunCrashTest(FILE_PATH_LITERAL("progress-meter-crash.html"),
+               ui::kAXModeFormControls);
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityQ) {
@@ -3675,7 +3677,7 @@
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityReparentCrash) {
-  RunHtmlTest(FILE_PATH_LITERAL("reparent-crash.html"));
+  RunCrashTest(FILE_PATH_LITERAL("reparent-crash.html"));
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityReplaceData) {
@@ -4143,7 +4145,7 @@
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
                        AccessibilityNodeChangedCrashInEditableText) {
-  RunHtmlTest(FILE_PATH_LITERAL("node-changed-crash-in-editable-text.html"));
+  RunCrashTest(FILE_PATH_LITERAL("node-changed-crash-in-editable-text.html"));
 }
 
 // TODO(crbug.com/40866942): This test is failing on Android.
@@ -4238,12 +4240,12 @@
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, DeleteSelectionCrash) {
-  RunHtmlTest(FILE_PATH_LITERAL("delete-selection-crash.html"));
+  RunCrashTest(FILE_PATH_LITERAL("delete-selection-crash.html"));
 }
 
 IN_PROC_BROWSER_TEST_P(YieldingParserDumpAccessibilityTreeTest,
                        DeleteSelectionCrash) {
-  RunHtmlTest(FILE_PATH_LITERAL("delete-selection-crash.html"));
+  RunCrashTest(FILE_PATH_LITERAL("delete-selection-crash.html"));
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, NameImgLabelledbyInputsTree) {
@@ -4258,12 +4260,12 @@
 #endif
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
                        MAYBE_ReloadSelectionCrash) {
-  RunRegressionTest(FILE_PATH_LITERAL("reload-selection-crash.html"));
+  RunCrashTest(FILE_PATH_LITERAL("reload-selection-crash.html"));
 }
 
 IN_PROC_BROWSER_TEST_P(YieldingParserDumpAccessibilityTreeTest,
                        ReloadSelectionCrash) {
-  RunRegressionTest(FILE_PATH_LITERAL("reload-selection-crash.html"));
+  RunCrashTest(FILE_PATH_LITERAL("reload-selection-crash.html"));
 }
 
 //
@@ -4410,17 +4412,17 @@
 #if !BUILDFLAG(IS_MAC)
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
                        SelectExpandManyOptionsCrash) {
-  RunRegressionTest(FILE_PATH_LITERAL("select-expand-many-options-crash.html"));
+  RunCrashTest(FILE_PATH_LITERAL("select-expand-many-options-crash.html"));
 }
 #endif
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, XmlInIframeCrash) {
-  RunRegressionTest(FILE_PATH_LITERAL("xml-in-iframe-crash.html"));
+  RunCrashTest(FILE_PATH_LITERAL("xml-in-iframe-crash.html"));
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
                        RelationPointsToInvalidNodesCrash) {
-  RunRegressionTest(
+  RunCrashTest(
       FILE_PATH_LITERAL("relation-points-to-invalid-nodes-crash.html"));
 }
 
@@ -4464,7 +4466,7 @@
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, IgnoredCrash) {
-  RunRegressionTest(FILE_PATH_LITERAL("ignored-crash.html"));
+  RunCrashTest(FILE_PATH_LITERAL("ignored-crash.html"));
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, MissingParent) {
@@ -4511,7 +4513,7 @@
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
                        AccessibilitySlotCreationCrash) {
-  RunRegressionTest(FILE_PATH_LITERAL("slot-creation-crash.html"));
+  RunCrashTest(FILE_PATH_LITERAL("slot-creation-crash.html"));
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, TitleInShadow) {
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.h b/content/browser/accessibility/dump_accessibility_tree_browsertest.h
index b6fa1d75..c0bb32d 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.h
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.h
@@ -17,6 +17,7 @@
 constexpr const char kAccName[]{"accname"};
 constexpr const char kAria[]{"aria"};
 constexpr const char kCSS[]{"css"};
+constexpr const char kCrash[]{"crash"};
 constexpr const char kFormControls[]{"form-controls"};
 constexpr const char kHtml[]{"html"};
 constexpr const char kMathML[]{"mathml"};
@@ -64,6 +65,7 @@
   TEST_TYPE(AccName)
   TEST_TYPE(Aria)
   TEST_TYPE(CSS)
+  TEST_TYPE(Crash)
   TEST_TYPE(Html)
   TEST_TYPE(MathML)
   TEST_TYPE(DisplayLocking)
@@ -71,6 +73,11 @@
   TEST_TYPE(Regression)
   TEST_TYPE(TestHarness)
 
+  void RunCrashTest(const base::FilePath::CharType* file_path,
+                    ui::AXMode mode) {
+    RunTypedTest<kCrash>(file_path, mode);
+  }
+
   void RunFormControlsTest(const base::FilePath::CharType* file_path) {
     RunTypedTest<kFormControls>(file_path, ui::kAXModeFormControls);
   }
diff --git a/content/browser/indexed_db/BUILD.gn b/content/browser/indexed_db/BUILD.gn
index 214e23da..c01b146 100644
--- a/content/browser/indexed_db/BUILD.gn
+++ b/content/browser/indexed_db/BUILD.gn
@@ -70,10 +70,6 @@
     "instance/lock_request_data.h",
     "instance/pending_connection.cc",
     "instance/pending_connection.h",
-    "instance/record.cc",
-    "instance/record.h",
-    "instance/sqlite/backing_store_cursor_impl.cc",
-    "instance/sqlite/backing_store_cursor_impl.h",
     "instance/sqlite/backing_store_database_impl.cc",
     "instance/sqlite/backing_store_database_impl.h",
     "instance/sqlite/backing_store_impl.cc",
@@ -82,8 +78,6 @@
     "instance/sqlite/backing_store_transaction_impl.h",
     "instance/sqlite/database_connection.cc",
     "instance/sqlite/database_connection.h",
-    "instance/sqlite/record_iterator.cc",
-    "instance/sqlite/record_iterator.h",
     "instance/transaction.cc",
     "instance/transaction.h",
     "list_set.h",
diff --git a/content/browser/indexed_db/indexed_db_leveldb_coding.cc b/content/browser/indexed_db/indexed_db_leveldb_coding.cc
index cc2f1f4e..bb1ac2a2 100644
--- a/content/browser/indexed_db/indexed_db_leveldb_coding.cc
+++ b/content/browser/indexed_db/indexed_db_leveldb_coding.cc
@@ -420,14 +420,13 @@
   return EncodeIDBKeyRecursively(value, into, 0);
 }
 
-void EncodeSortableIDBKeyRecursively(const IndexedDBKey& value,
-                                     std::string* into) {
+void EncodeSortableIDBKey(const IndexedDBKey& value, std::string* into) {
   size_t previous_size = into->size();
   switch (value.type()) {
     case blink::mojom::IDBKeyType::Array: {
       EncodeByte(kOrderedArrayTypeByte, into);
       for (const IndexedDBKey& key : value.array()) {
-        EncodeSortableIDBKeyRecursively(key, into);
+        EncodeSortableIDBKey(key, into);
       }
       EncodeByte(kSentinel, into);
       DCHECK_GT(into->size(), previous_size);
@@ -457,12 +456,6 @@
   }
 }
 
-std::string EncodeSortableIDBKey(const IndexedDBKey& value) {
-  std::string encoded;
-  EncodeSortableIDBKeyRecursively(value, &encoded);
-  return encoded;
-}
-
 #define COMPILE_ASSERT_MATCHING_VALUES(a, b)                          \
   static_assert(                                                      \
       static_cast<unsigned char>(a) == static_cast<unsigned char>(b), \
diff --git a/content/browser/indexed_db/indexed_db_leveldb_coding.h b/content/browser/indexed_db/indexed_db_leveldb_coding.h
index 829f37b..4716a71b 100644
--- a/content/browser/indexed_db/indexed_db_leveldb_coding.h
+++ b/content/browser/indexed_db/indexed_db_leveldb_coding.h
@@ -73,8 +73,8 @@
 // collation operation. Unlike `EncodeIDBKey`, which makes use of length bytes,
 // this operation re-encodes variable-length values in a way that supports
 // sentinels.
-CONTENT_EXPORT std::string EncodeSortableIDBKey(
-    const blink::IndexedDBKey& value);
+CONTENT_EXPORT void EncodeSortableIDBKey(const blink::IndexedDBKey& value,
+                                         std::string* into);
 CONTENT_EXPORT void EncodeIDBKeyPath(const blink::IndexedDBKeyPath& value,
                                      std::string* into);
 CONTENT_EXPORT void EncodeBlobJournal(const BlobJournalType& journal,
diff --git a/content/browser/indexed_db/indexed_db_leveldb_coding_unittest.cc b/content/browser/indexed_db/indexed_db_leveldb_coding_unittest.cc
index 9f3be06e..7d4f3b2 100644
--- a/content/browser/indexed_db/indexed_db_leveldb_coding_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_leveldb_coding_unittest.cc
@@ -852,9 +852,11 @@
 
     EXPECT_TRUE(key_a.IsLessThan(key_b));
 
-    std::string encoded_a = EncodeSortableIDBKey(key_a);
+    std::string encoded_a;
+    EncodeSortableIDBKey(key_a, &encoded_a);
     EXPECT_TRUE(encoded_a.size());
-    std::string encoded_b = EncodeSortableIDBKey(key_b);
+    std::string encoded_b;
+    EncodeSortableIDBKey(key_b, &encoded_b);
     EXPECT_TRUE(encoded_b.size());
 
     auto sqlite_compare = [](const std::string& a, const std::string& b) {
@@ -874,7 +876,8 @@
   }
   // Also test decoding by treating all test cases as one massive array key.
   const IndexedDBKey all_keys_key(std::move(keys_vec));
-  std::string encoded = EncodeSortableIDBKey(all_keys_key);
+  std::string encoded;
+  EncodeSortableIDBKey(all_keys_key, &encoded);
   IndexedDBKey decoded_value = DecodeSortableIDBKey(encoded);
   ASSERT_TRUE(decoded_value.IsValid());
   EXPECT_TRUE(all_keys_key.Equals(decoded_value))
@@ -934,11 +937,13 @@
       SCOPED_TRACE(testing::Message()
                    << "Comparing " << value_a << " and " << value_b);
 
-      std::string encoded_a = EncodeSortableIDBKey(
-          IndexedDBKey(value_a, blink::mojom::IDBKeyType::Number));
+      std::string encoded_a;
+      EncodeSortableIDBKey(
+          IndexedDBKey(value_a, blink::mojom::IDBKeyType::Number), &encoded_a);
       EXPECT_TRUE(encoded_a.size());
-      std::string encoded_b = EncodeSortableIDBKey(
-          IndexedDBKey(value_b, blink::mojom::IDBKeyType::Number));
+      std::string encoded_b;
+      EncodeSortableIDBKey(
+          IndexedDBKey(value_b, blink::mojom::IDBKeyType::Number), &encoded_b);
       EXPECT_TRUE(encoded_b.size());
       EXPECT_EQ(encoded_a.size(), encoded_b.size());
 
@@ -959,7 +964,8 @@
 
   for (double value : values) {
     const IndexedDBKey key(value, blink::mojom::IDBKeyType::Number);
-    std::string encoded = EncodeSortableIDBKey(key);
+    std::string encoded;
+    EncodeSortableIDBKey(key, &encoded);
     IndexedDBKey decoded_value = DecodeSortableIDBKey(encoded);
     ASSERT_TRUE(decoded_value.IsValid());
     EXPECT_TRUE(key.Equals(decoded_value))
diff --git a/content/browser/indexed_db/instance/backing_store.h b/content/browser/indexed_db/instance/backing_store.h
index cad6561..8519190 100644
--- a/content/browser/indexed_db/instance/backing_store.h
+++ b/content/browser/indexed_db/instance/backing_store.h
@@ -214,12 +214,13 @@
     // keys are valid, advances the cursor to the row for `key` or `key` and
     // `primary_key`. Returns true on success, or false if no eligible row was
     // found. Returns an error if there was a DB error.
-    virtual StatusOr<bool> Continue() = 0;
     virtual StatusOr<bool> Continue(const blink::IndexedDBKey& key,
                                     const blink::IndexedDBKey& primary_key) = 0;
     virtual StatusOr<bool> Advance(uint32_t count) = 0;
     // Clone may return a nullptr if cloning fails for any reason.
     virtual std::unique_ptr<Cursor> Clone() const = 0;
+
+    StatusOr<bool> Continue() { return Continue({}, {}); }
   };
 
   virtual ~BackingStore() = default;
diff --git a/content/browser/indexed_db/instance/leveldb/backing_store.cc b/content/browser/indexed_db/instance/leveldb/backing_store.cc
index d02ba75..bf102b3 100644
--- a/content/browser/indexed_db/instance/leveldb/backing_store.cc
+++ b/content/browser/indexed_db/instance/leveldb/backing_store.cc
@@ -3247,7 +3247,7 @@
 
 StatusOr<bool> BackingStore::Cursor::Advance(uint32_t count) {
   while (count--) {
-    StatusOr<bool> result = Continue();
+    StatusOr<bool> result = indexed_db::BackingStore::Cursor::Continue();
     if (!result.has_value()) {
       return base::unexpected(result.error());
     }
@@ -3259,10 +3259,6 @@
   return true;
 }
 
-StatusOr<bool> BackingStore::Cursor::Continue() {
-  return Continue({}, {});
-}
-
 StatusOr<bool> BackingStore::Cursor::Continue(const IndexedDBKey& key,
                                               const IndexedDBKey& primary_key) {
   return Continue(key, primary_key, SEEK);
diff --git a/content/browser/indexed_db/instance/leveldb/backing_store.h b/content/browser/indexed_db/instance/leveldb/backing_store.h
index eef58b36..98ddfea 100644
--- a/content/browser/indexed_db/instance/leveldb/backing_store.h
+++ b/content/browser/indexed_db/instance/leveldb/backing_store.h
@@ -365,7 +365,6 @@
     const blink::IndexedDBKey& GetKey() const override;
     const blink::IndexedDBKey& GetPrimaryKey() const override;
     blink::IndexedDBKey TakeKey() && override;
-    StatusOr<bool> Continue() override;
     StatusOr<bool> Continue(const blink::IndexedDBKey& key,
                             const blink::IndexedDBKey& primary_key) override;
     StatusOr<bool> Advance(uint32_t count) override;
diff --git a/content/browser/indexed_db/instance/record.cc b/content/browser/indexed_db/instance/record.cc
deleted file mode 100644
index 409745a..0000000
--- a/content/browser/indexed_db/instance/record.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/indexed_db/instance/record.h"
-
-#include <utility>
-
-#include "base/notreached.h"
-
-namespace content::indexed_db {
-
-ObjectStoreRecord::ObjectStoreRecord(blink::IndexedDBKey key,
-                                     IndexedDBValue value)
-    : key_(std::move(key)), value_(std::move(value)) {}
-
-ObjectStoreRecord::~ObjectStoreRecord() = default;
-
-blink::IndexedDBKey& ObjectStoreRecord::key() {
-  return key_;
-}
-
-blink::IndexedDBKey& ObjectStoreRecord::primary_key() {
-  return key_;
-}
-
-IndexedDBValue& ObjectStoreRecord::value() {
-  return value_;
-}
-
-ObjectStoreKeyOnlyRecord::ObjectStoreKeyOnlyRecord(blink::IndexedDBKey key)
-    : ObjectStoreRecord(std::move(key), /*value=*/{}) {}
-
-ObjectStoreKeyOnlyRecord::~ObjectStoreKeyOnlyRecord() = default;
-
-IndexedDBValue& ObjectStoreKeyOnlyRecord::value() {
-  NOTREACHED();
-}
-
-}  // namespace content::indexed_db
diff --git a/content/browser/indexed_db/instance/record.h b/content/browser/indexed_db/instance/record.h
deleted file mode 100644
index 6956401f..0000000
--- a/content/browser/indexed_db/instance/record.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_INDEXED_DB_INSTANCE_RECORD_H_
-#define CONTENT_BROWSER_INDEXED_DB_INSTANCE_RECORD_H_
-
-#include "content/browser/indexed_db/indexed_db_value.h"
-#include "third_party/blink/public/common/indexeddb/indexeddb_key.h"
-
-namespace content::indexed_db {
-
-// Base class for an IndexedDB record.
-class Record {
- public:
-  virtual ~Record() = default;
-
-  virtual blink::IndexedDBKey& key() = 0;
-  virtual blink::IndexedDBKey& primary_key() = 0;
-  virtual IndexedDBValue& value() = 0;
-};
-
-// An object store record has a key and value, with `primary_key()` being the
-// key itself.
-class ObjectStoreRecord : public Record {
- public:
-  ObjectStoreRecord(blink::IndexedDBKey key, IndexedDBValue value);
-  ~ObjectStoreRecord() override;
-
-  blink::IndexedDBKey& key() override;
-  blink::IndexedDBKey& primary_key() override;
-  IndexedDBValue& value() override;
-
- private:
-  blink::IndexedDBKey key_;
-  IndexedDBValue value_;
-};
-
-// It is an error to call `value()` on this type of record.
-class ObjectStoreKeyOnlyRecord : public ObjectStoreRecord {
- public:
-  explicit ObjectStoreKeyOnlyRecord(blink::IndexedDBKey key);
-  ~ObjectStoreKeyOnlyRecord() override;
-
-  IndexedDBValue& value() override;
-};
-
-}  // namespace content::indexed_db
-
-#endif  // CONTENT_BROWSER_INDEXED_DB_INSTANCE_RECORD_H_
diff --git a/content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.cc b/content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.cc
deleted file mode 100644
index b1bfda1c..0000000
--- a/content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/types/expected.h"
-#include "content/browser/indexed_db/instance/record.h"
-#include "content/browser/indexed_db/instance/sqlite/record_iterator.h"
-#include "content/browser/indexed_db/status.h"
-
-namespace content::indexed_db::sqlite {
-
-content::indexed_db::sqlite::BackingStoreCursorImpl::BackingStoreCursorImpl(
-    std::unique_ptr<RecordIterator> iterator,
-    std::unique_ptr<Record> initial_record)
-    : iterator_(std::move(iterator)),
-      current_record_(std::move(initial_record)) {}
-
-BackingStoreCursorImpl::~BackingStoreCursorImpl() = default;
-
-const blink::IndexedDBKey& BackingStoreCursorImpl::GetKey() const {
-  return current_record_->key();
-}
-
-blink::IndexedDBKey BackingStoreCursorImpl::TakeKey() && {
-  return std::move(current_record_->key());
-}
-
-const blink::IndexedDBKey& BackingStoreCursorImpl::GetPrimaryKey() const {
-  return current_record_->primary_key();
-}
-
-IndexedDBValue& BackingStoreCursorImpl::GetValue() {
-  return current_record_->value();
-}
-
-std::unique_ptr<BackingStore::Cursor> BackingStoreCursorImpl::Clone() const {
-  // This is needed by `Cursor::PrefetchIterationOperation()`.
-  // TODO(crbug.com/419208481): Implement prefetch without using `Clone()`.
-  return nullptr;
-}
-
-StatusOr<bool> BackingStoreCursorImpl::Continue() {
-  return Advance(1);
-}
-
-StatusOr<bool> BackingStoreCursorImpl::Continue(
-    const blink::IndexedDBKey& key,
-    const blink::IndexedDBKey& primary_key) {
-  return iterator_->Iterate(key, primary_key)
-      .transform([this](std::unique_ptr<Record> new_record) {
-        current_record_ = std::move(new_record);
-        return current_record_ != nullptr;
-      });
-}
-
-StatusOr<bool> BackingStoreCursorImpl::Advance(uint32_t count) {
-  return iterator_->Iterate(count).transform(
-      [this](std::unique_ptr<Record> new_record) {
-        current_record_ = std::move(new_record);
-        return current_record_ != nullptr;
-      });
-}
-
-}  // namespace content::indexed_db::sqlite
diff --git a/content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.h b/content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.h
deleted file mode 100644
index 4f136e6..0000000
--- a/content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_BACKING_STORE_CURSOR_IMPL_H_
-#define CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_BACKING_STORE_CURSOR_IMPL_H_
-
-#include <memory>
-
-#include "base/types/pass_key.h"
-#include "content/browser/indexed_db/instance/backing_store.h"
-
-namespace content::indexed_db {
-class Record;
-
-namespace sqlite {
-class RecordIterator;
-
-class BackingStoreCursorImpl : public BackingStore::Cursor {
- public:
-  using PassKey = base::PassKey<BackingStoreCursorImpl>;
-
-  BackingStoreCursorImpl(std::unique_ptr<RecordIterator> iterator,
-                         std::unique_ptr<Record> initial_record);
-  ~BackingStoreCursorImpl() override;
-
-  // BackingStore::Cursor:
-  const blink::IndexedDBKey& GetKey() const override;
-  blink::IndexedDBKey TakeKey() && override;
-  const blink::IndexedDBKey& GetPrimaryKey() const override;
-  IndexedDBValue& GetValue() override;
-  std::unique_ptr<Cursor> Clone() const override;
-  StatusOr<bool> Continue() override;
-  StatusOr<bool> Continue(const blink::IndexedDBKey& key,
-                          const blink::IndexedDBKey& primary_key) override;
-  StatusOr<bool> Advance(uint32_t count) override;
-
- private:
-  std::unique_ptr<RecordIterator> iterator_;
-  std::unique_ptr<Record> current_record_;
-};
-
-}  // namespace sqlite
-}  // namespace content::indexed_db
-
-#endif  // CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_BACKING_STORE_CURSOR_IMPL_H_
diff --git a/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc b/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc
index 9faf1f4..fde8437f 100644
--- a/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc
+++ b/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc
@@ -188,18 +188,18 @@
 BackingStoreTransactionImpl::OpenObjectStoreKeyCursor(
     int64_t object_store_id,
     const blink::IndexedDBKeyRange& key_range,
-    blink::mojom::IDBCursorDirection direction) {
-  return db_->OpenObjectStoreCursor(PassKey(), object_store_id, key_range,
-                                    direction, /*key_only=*/true);
+    blink::mojom::IDBCursorDirection) {
+  NOTIMPLEMENTED();
+  return base::unexpected(Status::InvalidArgument("Not implemented"));
 }
 
 StatusOr<std::unique_ptr<indexed_db::BackingStore::Cursor>>
 BackingStoreTransactionImpl::OpenObjectStoreCursor(
     int64_t object_store_id,
     const blink::IndexedDBKeyRange& key_range,
-    blink::mojom::IDBCursorDirection direction) {
-  return db_->OpenObjectStoreCursor(PassKey(), object_store_id, key_range,
-                                    direction, /*key_only=*/false);
+    blink::mojom::IDBCursorDirection) {
+  NOTIMPLEMENTED();
+  return base::unexpected(Status::InvalidArgument("Not implemented"));
 }
 
 StatusOr<std::unique_ptr<indexed_db::BackingStore::Cursor>>
diff --git a/content/browser/indexed_db/instance/sqlite/database_connection.cc b/content/browser/indexed_db/instance/sqlite/database_connection.cc
index 11228b63f..effa745 100644
--- a/content/browser/indexed_db/instance/sqlite/database_connection.cc
+++ b/content/browser/indexed_db/instance/sqlite/database_connection.cc
@@ -9,7 +9,6 @@
 #include <utility>
 
 #include "base/check.h"
-#include "base/functional/callback.h"
 #include "base/memory/ptr_util.h"
 #include "base/notimplemented.h"
 #include "base/notreached.h"
@@ -19,10 +18,7 @@
 #include "base/types/expected.h"
 #include "content/browser/indexed_db/indexed_db_value.h"
 #include "content/browser/indexed_db/instance/backing_store.h"
-#include "content/browser/indexed_db/instance/record.h"
-#include "content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.h"
 #include "content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.h"
-#include "content/browser/indexed_db/instance/sqlite/record_iterator.h"
 #include "content/browser/indexed_db/status.h"
 #include "sql/database.h"
 #include "sql/meta_table.h"
@@ -174,113 +170,6 @@
   return metadata;
 }
 
-// Returns a `RecordIterator` and the initial `Record` for the range of object
-// store records determined by the parameters. Returns nullptrs if the range is
-// empty or an error if one occurs.
-StatusOr<std::pair<std::unique_ptr<RecordIterator>, std::unique_ptr<Record>>>
-CreateObjectStoreRecordIterator(sql::Database* db,
-                                int64_t object_store_id,
-                                const blink::IndexedDBKeyRange& key_range,
-                                bool ascending_order,
-                                bool key_only) {
-  std::vector<std::string_view> query_pieces{
-      "SELECT ", key_only ? "key" : "key, value",
-      " FROM records WHERE object_store_id = @object_store_id"};
-  if (key_range.lower().IsValid()) {
-    query_pieces.push_back(key_range.lower_open() ? " AND key > @lower"
-                                                  : " AND key >= @lower");
-  }
-  if (key_range.upper().IsValid()) {
-    query_pieces.push_back(key_range.upper_open() ? " AND key < @upper"
-                                                  : " AND key <= @upper");
-  }
-  if (ascending_order) {
-    query_pieces.push_back(
-        " AND (@is_first_seek = 1 OR key > @position)"
-        " AND (@target_key IS NULL OR key >= @target_key)"
-        " ORDER BY key ASC");
-  } else {
-    query_pieces.push_back(
-        " AND (@is_first_seek = 1 OR key < @position)"
-        " AND (@target_key IS NULL OR key <= @target_key)"
-        " ORDER BY key DESC");
-  }
-  // LIMIT is needed to use OFFSET. A negative LIMIT implies no limit on the
-  // number of rows returned:
-  // https://www.sqlite.org/lang_select.html#the_limit_clause.
-  query_pieces.push_back(" LIMIT -1 OFFSET @offset");
-
-  auto statement = std::make_unique<sql::Statement>(
-      db->GetReadonlyStatement(base::StrCat(query_pieces)));
-  int param_index = 0;
-  statement->BindInt64(param_index++, object_store_id);
-  if (key_range.lower().IsValid()) {
-    statement->BindBlob(param_index++, EncodeSortableIDBKey(key_range.lower()));
-  }
-  if (key_range.upper().IsValid()) {
-    statement->BindBlob(param_index++, EncodeSortableIDBKey(key_range.upper()));
-  }
-  int is_first_seek_index = param_index++;
-  int position_index = param_index++;
-  int target_key_index = param_index++;
-  int offset_index = param_index++;
-
-  RecordIterator::BindCallback bind_parameters = base::BindRepeating(
-      [](int is_first_seek_index, int position_index, int target_key_index,
-         int offset_index, sql::Statement& statement,
-         const std::string& position, const blink::IndexedDBKey& target_key,
-         const blink::IndexedDBKey& _, uint32_t offset) {
-        statement.BindBool(is_first_seek_index, false);
-        statement.BindBlob(position_index, position);
-        if (target_key.IsValid()) {
-          statement.BindBlob(target_key_index,
-                             EncodeSortableIDBKey(target_key));
-        } else {
-          statement.BindNull(target_key_index);
-        }
-        statement.BindInt64(offset_index, offset);
-      },
-      is_first_seek_index, position_index, target_key_index, offset_index);
-
-  RecordIterator::ReadCallback read_row = base::BindRepeating(
-      [](bool key_only, sql::Statement& statement)
-          -> StatusOr<RecordIterator::PositionAndRecord> {
-        std::string position;
-        TRANSIENT_CHECK(statement.ColumnBlobAsString(0, &position));
-        blink::IndexedDBKey key = DecodeSortableIDBKey(position);
-        if (key_only) {
-          return std::make_pair(
-              std::move(position),
-              std::make_unique<ObjectStoreKeyOnlyRecord>(std::move(key)));
-        }
-        IndexedDBValue value;
-        TRANSIENT_CHECK(statement.ColumnBlobAsVector(1, &value.bits));
-        return std::make_pair(std::move(position),
-                              std::make_unique<ObjectStoreRecord>(
-                                  std::move(key), std::move(value)));
-      },
-      key_only);
-
-  // Attempt to find the initial record in the range.
-  statement->BindBool(is_first_seek_index, true);
-  statement->BindNull(position_index);
-  statement->BindNull(target_key_index);
-  statement->BindInt(offset_index, 0);
-  if (!statement->Step()) {
-    TRANSIENT_CHECK(statement->Succeeded());
-    // Empty range.
-    return std::make_pair(nullptr, nullptr);
-  }
-  return read_row.Run(*statement)
-      .transform([&](RecordIterator::PositionAndRecord result) {
-        return std::make_pair(
-            std::make_unique<RecordIterator>(
-                std::move(statement), std::move(bind_parameters),
-                std::move(read_row), std::move(result.first)),
-            std::move(result.second));
-      });
-}
-
 }  // namespace
 
 // static
@@ -473,8 +362,10 @@
       db_->GetCachedStatement(SQL_FROM_HERE,
                               "SELECT row_id FROM records "
                               "WHERE object_store_id = ? AND key = ?"));
+  std::string encoded_key;
+  EncodeSortableIDBKey(key, &encoded_key);
   statement.BindInt64(0, object_store_id);
-  statement.BindBlob(1, EncodeSortableIDBKey(key));
+  statement.BindBlob(1, std::move(encoded_key));
   if (statement.Step()) {
     return BackingStore::RecordIdentifier{statement.ColumnInt64(0)};
   }
@@ -490,8 +381,10 @@
       db_->GetCachedStatement(SQL_FROM_HERE,
                               "SELECT value FROM records "
                               "WHERE object_store_id = ? AND key = ?"));
+  std::string encoded_key;
+  EncodeSortableIDBKey(key, &encoded_key);
   statement.BindInt64(0, object_store_id);
-  statement.BindBlob(1, EncodeSortableIDBKey(key));
+  statement.BindBlob(1, std::move(encoded_key));
   if (statement.Step()) {
     IndexedDBValue value;
     TRANSIENT_CHECK(statement.ColumnBlobAsVector(0, &value.bits));
@@ -511,7 +404,9 @@
       "INSERT OR REPLACE INTO records "
       "(object_store_id, key, value) VALUES (?, ?, ?)"));
   statement.BindInt64(0, object_store_id);
-  statement.BindBlob(1, EncodeSortableIDBKey(key));
+  std::string encoded_key;
+  EncodeSortableIDBKey(key, &encoded_key);
+  statement.BindBlob(1, std::move(encoded_key));
   statement.BindBlob(2, std::move(value.bits));
   TRANSIENT_CHECK(statement.Run());
   return BackingStore::RecordIdentifier{db_->GetLastInsertRowId()};
@@ -523,13 +418,19 @@
     blink::IndexedDBKeyRange key_range) {
   std::vector<std::string_view> query_pieces{
       "SELECT COUNT() FROM records WHERE object_store_id = ?"};
+  std::string lower_encoded;
+  std::string upper_encoded;
   if (key_range.lower().IsValid()) {
-    query_pieces.push_back(key_range.lower_open() ? " AND key > ?"
-                                                  : " AND key >= ?");
+    EncodeSortableIDBKey(key_range.lower(), &lower_encoded);
+    query_pieces.insert(
+        query_pieces.end(),
+        {" AND key ", key_range.lower_open() ? ">" : ">=", " ?"});
   }
   if (key_range.upper().IsValid()) {
-    query_pieces.push_back(key_range.upper_open() ? " AND key < ?"
-                                                  : " AND key <= ?");
+    EncodeSortableIDBKey(key_range.upper(), &upper_encoded);
+    query_pieces.insert(
+        query_pieces.end(),
+        {" AND key ", key_range.upper_open() ? "<" : "<=", " ?"});
   }
 
   // TODO(crbug.com/40253999): Evaluate performance benefit of using
@@ -538,36 +439,14 @@
       db_->GetReadonlyStatement(base::StrCat(query_pieces)));
   int param_index = 0;
   statement.BindInt64(param_index++, object_store_id);
-  if (key_range.lower().IsValid()) {
-    statement.BindBlob(param_index++, EncodeSortableIDBKey(key_range.lower()));
+  if (!lower_encoded.empty()) {
+    statement.BindBlob(param_index++, lower_encoded);
   }
-  if (key_range.upper().IsValid()) {
-    statement.BindBlob(param_index++, EncodeSortableIDBKey(key_range.upper()));
+  if (!upper_encoded.empty()) {
+    statement.BindBlob(param_index++, upper_encoded);
   }
   TRANSIENT_CHECK(statement.Step());
   return statement.ColumnInt(0);
 }
 
-StatusOr<std::unique_ptr<BackingStore::Cursor>>
-DatabaseConnection::OpenObjectStoreCursor(
-    base::PassKey<BackingStoreTransactionImpl>,
-    int64_t object_store_id,
-    const blink::IndexedDBKeyRange& key_range,
-    blink::mojom::IDBCursorDirection direction,
-    bool key_only) {
-  bool ascending_order =
-      (direction == blink::mojom::IDBCursorDirection::Next ||
-       direction == blink::mojom::IDBCursorDirection::NextNoDuplicate);
-  return CreateObjectStoreRecordIterator(db_.get(), object_store_id, key_range,
-                                         ascending_order, key_only)
-      .transform([](std::pair<std::unique_ptr<RecordIterator>,
-                              std::unique_ptr<Record>> result) {
-        return result.first
-                   ? std::make_unique<BackingStoreCursorImpl>(
-                         std::move(result.first), std::move(result.second))
-                   // Empty range.
-                   : nullptr;
-      });
-}
-
 }  // namespace content::indexed_db::sqlite
diff --git a/content/browser/indexed_db/instance/sqlite/database_connection.h b/content/browser/indexed_db/instance/sqlite/database_connection.h
index 211e989f..baab3d5 100644
--- a/content/browser/indexed_db/instance/sqlite/database_connection.h
+++ b/content/browser/indexed_db/instance/sqlite/database_connection.h
@@ -111,13 +111,6 @@
       int64_t object_store_id,
       blink::IndexedDBKeyRange key_range);
 
-  StatusOr<std::unique_ptr<BackingStore::Cursor>> OpenObjectStoreCursor(
-      base::PassKey<BackingStoreTransactionImpl>,
-      int64_t object_store_id,
-      const blink::IndexedDBKeyRange& key_range,
-      blink::mojom::IDBCursorDirection direction,
-      bool key_only);
-
  private:
   DatabaseConnection(std::unique_ptr<sql::Database> db,
                      std::unique_ptr<sql::MetaTable> meta_table,
diff --git a/content/browser/indexed_db/instance/sqlite/record_iterator.cc b/content/browser/indexed_db/instance/sqlite/record_iterator.cc
deleted file mode 100644
index ea8c2ea..0000000
--- a/content/browser/indexed_db/instance/sqlite/record_iterator.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/indexed_db/instance/sqlite/record_iterator.h"
-
-#include <memory>
-#include <optional>
-#include <string>
-#include <utility>
-
-#include "base/check.h"
-#include "base/functional/callback.h"
-#include "base/types/expected.h"
-#include "content/browser/indexed_db/instance/record.h"
-#include "content/browser/indexed_db/status.h"
-#include "sql/statement.h"
-#include "third_party/blink/public/common/indexeddb/indexeddb_key.h"
-
-// TODO(crbug.com/40253999): Remove after handling all error cases.
-#define TRANSIENT_CHECK(condition) CHECK(condition)
-
-namespace content::indexed_db::sqlite {
-
-RecordIterator::RecordIterator(std::unique_ptr<sql::Statement> statement,
-                               BindCallback bind_parameters,
-                               ReadCallback read_row,
-                               std::string initial_position)
-    : statement_(std::move(statement)),
-      bind_parameters_(std::move(bind_parameters)),
-      read_row_(std::move(read_row)),
-      current_position_(std::move(initial_position)) {}
-
-RecordIterator::~RecordIterator() = default;
-
-StatusOr<std::unique_ptr<Record>> RecordIterator::Iterate(
-    const blink::IndexedDBKey& key,
-    const blink::IndexedDBKey& primary_key) {
-  statement_->Reset(/*clear_bound_vars=*/false);
-  bind_parameters_.Run(*statement_, *current_position_, key, primary_key,
-                       /*offset=*/0);
-  if (!statement_->Step()) {
-    TRANSIENT_CHECK(statement_->Succeeded());
-    // End of range.
-    current_position_.reset();
-    return nullptr;
-  }
-  return read_row_.Run(*statement_).transform([this](PositionAndRecord result) {
-    current_position_ = std::move(result.first);
-    return std::move(result.second);
-  });
-}
-
-StatusOr<std::unique_ptr<Record>> RecordIterator::Iterate(uint32_t count) {
-  TRANSIENT_CHECK(count > 0);
-
-  // TODO(crbug.com/419208481): Implement a fast path where `statement_` is
-  // stepped without being reset when no record has changed in the range.
-  statement_->Reset(/*clear_bound_vars=*/false);
-
-  // Iterate count times => offset by (i.e., skip) [count - 1] rows.
-  bind_parameters_.Run(*statement_, *current_position_, /*key=*/{},
-                       /*primary_key=*/{},
-                       /*offset=*/count - 1);
-  if (!statement_->Step()) {
-    TRANSIENT_CHECK(statement_->Succeeded());
-    // End of range.
-    current_position_.reset();
-    return nullptr;
-  }
-  return read_row_.Run(*statement_).transform([this](PositionAndRecord result) {
-    current_position_ = std::move(result.first);
-    return std::move(result.second);
-  });
-}
-
-}  // namespace content::indexed_db::sqlite
diff --git a/content/browser/indexed_db/instance/sqlite/record_iterator.h b/content/browser/indexed_db/instance/sqlite/record_iterator.h
deleted file mode 100644
index f0cf89e..0000000
--- a/content/browser/indexed_db/instance/sqlite/record_iterator.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_RECORD_ITERATOR_H_
-#define CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_RECORD_ITERATOR_H_
-
-#include <memory>
-#include <optional>
-#include <string>
-#include <utility>
-
-#include "base/functional/callback.h"
-#include "content/browser/indexed_db/status.h"
-
-namespace blink {
-class IndexedDBKey;
-}  // namespace blink
-
-namespace sql {
-class Statement;
-}
-
-namespace content::indexed_db {
-class Record;
-
-namespace sqlite {
-
-// Iterates over a non-empty range of object store/index records, maintaining
-// the position in the range and emitting `Record`s.
-class RecordIterator {
- public:
-  using PositionAndRecord = std::pair<std::string, std::unique_ptr<Record>>;
-  using BindCallback = base::RepeatingCallback<void(
-      sql::Statement& statement,
-      const std::string& position,
-      const blink::IndexedDBKey& target_key,
-      const blink::IndexedDBKey& target_primary_key,
-      uint32_t offset)>;
-  using ReadCallback = base::RepeatingCallback<StatusOr<PositionAndRecord>(
-      sql::Statement& statement)>;
-
-  RecordIterator(std::unique_ptr<sql::Statement> statement,
-                 BindCallback bind_parameters,
-                 ReadCallback read_row,
-                 std::string initial_position);
-
-  ~RecordIterator();
-
-  // Iterates from the current position until the target `key` and `primary_key`
-  // are reached. Use when at least one of these is valid.
-  StatusOr<std::unique_ptr<Record>> Iterate(
-      const blink::IndexedDBKey& key,
-      const blink::IndexedDBKey& primary_key);
-
-  // Iterates `count` times from the current position.
-  StatusOr<std::unique_ptr<Record>> Iterate(uint32_t count);
-
- private:
-  // The parsed and bound statement that embeds the SQL query for this iterator.
-  // Because the records contained in the range can change between `Iterate()`
-  // calls, the query needs to be typically re-executed every time. The query
-  // itself is immutable for the duration of `this`, however, and contains a mix
-  // of fixed and variable bound parameters. To avoid re-parsing the query and
-  // rebinding the fixed parameters every time, hold on to the prepared
-  // statement and rebind only the variable parameters as needed.
-  std::unique_ptr<sql::Statement> statement_;
-
-  // Callback to bind variable parameters to the statement.
-  BindCallback bind_parameters_;
-
-  // Callback to read the position and `Record` corresponding to the current row
-  // of the statement.
-  ReadCallback read_row_;
-
-  // Opaque value tracking the position in the range. Typically, this is the
-  // encoded key from the current record. Null when and only when `this` has
-  // iterated past the end of its range.
-  std::optional<std::string> current_position_;
-};
-
-}  // namespace sqlite
-}  // namespace content::indexed_db
-
-#endif  // CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_RECORD_ITERATOR_H_
diff --git a/content/browser/navigation_browsertest.cc b/content/browser/navigation_browsertest.cc
index a588237..bdbbee5 100644
--- a/content/browser/navigation_browsertest.cc
+++ b/content/browser/navigation_browsertest.cc
@@ -1640,7 +1640,14 @@
 // when history.pushState() and history.back() are called in a loop.
 // Failing to do so causes the browser to become unresponsive.
 // See https://crbug.com/882238
-IN_PROC_BROWSER_TEST_F(NavigationBrowserTest, IPCFlood_GoToEntryAtOffset) {
+// TODO(crbug.com/379844650): Disabled on Linux sanitizer bots due to flakiness.
+#if BUILDFLAG(IS_LINUX) && defined(ADDRESS_SANITIZER)
+#define MAYBE_IPCFlood_GoToEntryAtOffset DISABLED_IPCFlood_GoToEntryAtOffset
+#else
+#define MAYBE_IPCFlood_GoToEntryAtOffset IPCFlood_GoToEntryAtOffset
+#endif
+IN_PROC_BROWSER_TEST_F(NavigationBrowserTest,
+                       MAYBE_IPCFlood_GoToEntryAtOffset) {
   GURL url(embedded_test_server()->GetURL("/title1.html"));
   EXPECT_TRUE(NavigateToURL(shell(), url));
 
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
index 89ab26a0..8cb65267 100644
--- a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
@@ -760,7 +760,7 @@
     }
 
     @Override
-    public void onUpdateContainerView(ViewGroup view) {
+    public void onUpdateContainerView(@Nullable ViewGroup view) {
         // When the ContainerView is updated, we must update the |mView| variable and remove all
         // previous references to it. We clear the AccessibilityEventDispatcher queue, which may
         // have posted Runnable(s) to the old view. We also clear the AccessibilityNodeInfo cache
@@ -768,6 +768,7 @@
         // do not want to delete |this| because the object is (largely) not ContainerView dependent.
         mEventDispatcher.clearQueue();
         mNodeInfoCache.clear();
+        assumeNonNull(view);
         mView = view;
     }
 
@@ -1444,13 +1445,8 @@
     @Override
     public void restoreFocus() {
         if (isAccessibilityEnabled() && mLastAccessibilityFocusId != View.NO_ID) {
-            if (ContentFeatureList.sAccessibilityDeprecateJavaNodeCacheOptimizeScroll.getValue()) {
-                scrollToMakeNodeVisible(mLastAccessibilityFocusId);
-                moveAccessibilityFocusToId(mLastAccessibilityFocusId);
-            } else {
-                moveAccessibilityFocusToId(mLastAccessibilityFocusId);
-                scrollToMakeNodeVisible(mLastAccessibilityFocusId);
-            }
+            moveAccessibilityFocusToId(mLastAccessibilityFocusId);
+            scrollToMakeNodeVisible(mLastAccessibilityFocusId);
         }
     }
 
@@ -1501,13 +1497,8 @@
             WebContentsAccessibilityImplJni.get().setSequentialFocusStartingPoint(mNativeObj, id);
         }
 
-        if (ContentFeatureList.sAccessibilityDeprecateJavaNodeCacheOptimizeScroll.getValue()) {
-            scrollToMakeNodeVisible(mAccessibilityFocusId);
-            moveAccessibilityFocusToId(id);
-        } else {
-            moveAccessibilityFocusToId(id);
-            scrollToMakeNodeVisible(mAccessibilityFocusId);
-        }
+        moveAccessibilityFocusToId(id);
+        scrollToMakeNodeVisible(mAccessibilityFocusId);
         return true;
     }
 
@@ -1699,7 +1690,6 @@
             mDelegate.scrollToMakeNodeVisible(getAbsolutePositionForNode(virtualViewId));
         } else {
             mPendingScrollToMakeNodeVisible = true;
-            mHistogramRecorder.updateTimeOfScrollToMakeVisible();
             WebContentsAccessibilityImplJni.get()
                     .scrollToMakeNodeVisible(mNativeObj, virtualViewId);
         }
@@ -2028,7 +2018,6 @@
         sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_SCROLLED);
         if (mPendingScrollToMakeNodeVisible) {
             sendAccessibilityEvent(id, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
-            mHistogramRecorder.recordTimeOfScrollToMakeVisible();
             mPendingScrollToMakeNodeVisible = false;
         }
     }
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/SelectPopup.java b/content/public/android/java/src/org/chromium/content/browser/input/SelectPopup.java
index 5682567..c8a4315 100644
--- a/content/public/android/java/src/org/chromium/content/browser/input/SelectPopup.java
+++ b/content/public/android/java/src/org/chromium/content/browser/input/SelectPopup.java
@@ -4,7 +4,6 @@
 
 package org.chromium.content.browser.input;
 
-import static org.chromium.build.NullUtil.assumeNonNull;
 
 import android.content.Context;
 import android.view.View;
@@ -53,7 +52,7 @@
     }
 
     private final WebContentsImpl mWebContents;
-    private View mContainerView;
+    private @Nullable View mContainerView;
     private @Nullable Ui mPopupView;
     private long mNativeSelectPopup;
     private long mNativeSelectPopupSourceFrame;
@@ -90,7 +89,7 @@
         mWebContents = (WebContentsImpl) webContents;
         ViewAndroidDelegate viewDelegate = mWebContents.getViewAndroidDelegate();
         assert viewDelegate != null;
-        mContainerView = assumeNonNull(viewDelegate.getContainerView());
+        mContainerView = viewDelegate.getContainerView();
         viewDelegate.addObserver(this);
         PopupController.register(mWebContents, this);
         WindowEventObserverManager.from(mWebContents).addObserver(this);
@@ -113,7 +112,7 @@
     // ViewAndroidDelegate.ContainerViewObserver
 
     @Override
-    public void onUpdateContainerView(ViewGroup view) {
+    public void onUpdateContainerView(@Nullable ViewGroup view) {
         mContainerView = view;
         hide();
     }
@@ -144,7 +143,9 @@
             boolean multiple,
             int[] selectedIndices,
             boolean rightAligned) {
-        if (mContainerView.getParent() == null || mContainerView.getVisibility() != View.VISIBLE) {
+        if (mContainerView == null
+                || mContainerView.getParent() == null
+                || mContainerView.getVisibility() != View.VISIBLE) {
             mNativeSelectPopupSourceFrame = nativeSelectPopupSourceFrame;
             selectMenuItems(null);
             return;
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java
index bf33d37..40c689a 100644
--- a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java
@@ -383,7 +383,7 @@
     // ViewAndroidDelegate.ContainerViewObserver
 
     @Override
-    public void onUpdateContainerView(ViewGroup containerView) {
+    public void onUpdateContainerView(@Nullable ViewGroup containerView) {
         // Cleans up action mode before switching to a new container view.
         if (isActionModeValid()) finishActionMode();
         mUnselectAllOnDismiss = true;
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
index 88455a1..ea6c872 100644
--- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
@@ -223,7 +223,7 @@
     public void setDelegates(
             String productVersion,
             ViewAndroidDelegate viewDelegate,
-            InternalAccessDelegate accessDelegate,
+            @Nullable InternalAccessDelegate accessDelegate,
             @Nullable WindowAndroid windowAndroid,
             InternalsHolder internalsHolder) {
         assert internalsHolder != null;
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java b/content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java
index 4cf80059..7225a0c 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java
@@ -605,7 +605,7 @@
      * @param additionalNavigationParams Additional navigation params associated with the load.
      */
     public void setAdditionalNavigationParams(
-            AdditionalNavigationParams additionalNavigationParams) {
+            @Nullable AdditionalNavigationParams additionalNavigationParams) {
         mAdditionalNavigationParams = additionalNavigationParams;
     }
 
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
index 454a896..1af0ee6 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
@@ -82,10 +82,9 @@
     }
 
     /**
-     *
      * Initialize various content objects of {@link WebContents} lifetime.
      *
-     * Note: This method is more of to set the {@link ViewAndroidDelegate} and {@link
+     * <p>Note: This method is more of to set the {@link ViewAndroidDelegate} and {@link
      * ViewEventSink.InternalAccessDelegate}, most of the embedder should only call this once during
      * the whole lifecycle of the {@link WebContents}, but it is safe to call it multiple times.
      *
@@ -98,7 +97,7 @@
     void setDelegates(
             String productVersion,
             ViewAndroidDelegate viewDelegate,
-            ViewEventSink.InternalAccessDelegate accessDelegate,
+            ViewEventSink.@Nullable InternalAccessDelegate accessDelegate,
             @Nullable WindowAndroid windowAndroid,
             InternalsHolder internalsHolder);
 
diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h
index f58a8706..7a2d251b 100644
--- a/content/public/renderer/content_renderer_client.h
+++ b/content/public/renderer/content_renderer_client.h
@@ -381,11 +381,11 @@
       const GURL& service_worker_scope,
       const GURL& script_url) {}
 
-  // Notifies that a service work is about to prepare for script evaluation.
+  // Notifies that the main script of a service worker is about to evaluate.
   // This function is called from the worker thread.
   // |context_proxy| is valid until
   // WillDestroyServiceWorkerContextOnWorkerThread() is called.
-  virtual void WillPrepareForEvaluationOnWorkerThread(
+  virtual void WillEvaluateServiceWorkerOnWorkerThread(
       blink::WebServiceWorkerContextProxy* context_proxy,
       v8::Local<v8::Context> v8_context,
       int64_t service_worker_version_id,
@@ -393,9 +393,6 @@
       const GURL& script_url,
       const blink::ServiceWorkerToken& service_worker_token) {}
 
-  // Notifies that the main script of a service worker is about to evaluate.
-  virtual void WillEvaluateServiceWorkerOnWorkerThread() {}
-
   // Notifies that a service worker context has finished executing its top-level
   // JavaScript. This function is called from the worker thread.
   virtual void DidStartServiceWorkerContextOnWorkerThread(
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index 1afd40c..eff9f90 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -313,14 +313,6 @@
           proxy_, service_worker_scope_, script_url_);
 }
 
-void ServiceWorkerContextClient::WillPrepareForEvaluation(
-    v8::Local<v8::Context> v8_context) {
-  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
-  GetContentClient()->renderer()->WillPrepareForEvaluationOnWorkerThread(
-      proxy_, v8_context, service_worker_version_id_, service_worker_scope_,
-      script_url_, service_worker_token_);
-}
-
 void ServiceWorkerContextClient::WillEvaluateScript(
     v8::Local<v8::Context> v8_context) {
   DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
@@ -339,7 +331,9 @@
   instance_host_->OnScriptEvaluationStart();
 
   DCHECK(proxy_);
-  GetContentClient()->renderer()->WillEvaluateServiceWorkerOnWorkerThread();
+  GetContentClient()->renderer()->WillEvaluateServiceWorkerOnWorkerThread(
+      proxy_, v8_context, service_worker_version_id_, service_worker_scope_,
+      script_url_, service_worker_token_);
 }
 
 void ServiceWorkerContextClient::DidEvaluateScript(bool success) {
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h
index 5e964a9..ecff6ff7 100644
--- a/content/renderer/service_worker/service_worker_context_client.h
+++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -166,7 +166,6 @@
   void WorkerContextStarted(
       blink::WebServiceWorkerContextProxy* proxy,
       scoped_refptr<base::SequencedTaskRunner> worker_task_runner) override;
-  void WillPrepareForEvaluation(v8::Local<v8::Context> v8_context) override;
   void WillEvaluateScript(v8::Local<v8::Context> v8_context) override;
   void DidEvaluateScript(bool success) override;
   void WillInitializeWorkerContext() override;
diff --git a/content/test/content_test_bundle_data.filelist b/content/test/content_test_bundle_data.filelist
index c7471b8..17a803f7 100644
--- a/content/test/content_test_bundle_data.filelist
+++ b/content/test/content_test_bundle_data.filelist
@@ -806,6 +806,13 @@
 data/accessibility/aria/aria-flowto-target-id-change-expected-blink.txt
 data/accessibility/aria/aria-flowto-target-id-change.html
 data/accessibility/aria/aria-flowto.html
+data/accessibility/aria/aria-focusable-menu-expected-android-external.txt
+data/accessibility/aria/aria-focusable-menu-expected-android.txt
+data/accessibility/aria/aria-focusable-menu-expected-auralinux.txt
+data/accessibility/aria/aria-focusable-menu-expected-blink.txt
+data/accessibility/aria/aria-focusable-menu-expected-mac.txt
+data/accessibility/aria/aria-focusable-menu-expected-win.txt
+data/accessibility/aria/aria-focusable-menu.html
 data/accessibility/aria/aria-focusable-subwidget-not-editable-expected-win.txt
 data/accessibility/aria/aria-focusable-subwidget-not-editable.html
 data/accessibility/aria/aria-form-expected-android-assist-data.txt
@@ -1154,13 +1161,6 @@
 data/accessibility/aria/aria-menu-expected-mac.txt
 data/accessibility/aria/aria-menu-expected-win.txt
 data/accessibility/aria/aria-menu.html
-data/accessibility/aria/aria-focusable-menu-expected-android-external.txt
-data/accessibility/aria/aria-focusable-menu-expected-android.txt
-data/accessibility/aria/aria-focusable-menu-expected-auralinux.txt
-data/accessibility/aria/aria-focusable-menu-expected-blink.txt
-data/accessibility/aria/aria-focusable-menu-expected-mac.txt
-data/accessibility/aria/aria-focusable-menu-expected-win.txt
-data/accessibility/aria/aria-focusable-menu.html
 data/accessibility/aria/aria-menubar-expected-android-assist-data.txt
 data/accessibility/aria/aria-menubar-expected-android-external.txt
 data/accessibility/aria/aria-menubar-expected-android.txt
@@ -1303,9 +1303,9 @@
 data/accessibility/aria/aria-orientation-expected-win.txt
 data/accessibility/aria/aria-orientation.html
 data/accessibility/aria/aria-owns-crash-2-expected-blink.txt
-data/accessibility/aria/aria-owns-crash-2.html
+data/accessibility/crash/aria-owns-crash-2.html
 data/accessibility/aria/aria-owns-crash-expected-blink.txt
-data/accessibility/aria/aria-owns-crash.html
+data/accessibility/crash/aria-owns-crash.html
 data/accessibility/aria/aria-owns-expected-android-assist-data.txt
 data/accessibility/aria/aria-owns-expected-android-external.txt
 data/accessibility/aria/aria-owns-expected-android.txt
@@ -2098,7 +2098,7 @@
 data/accessibility/css/list-marker-styles-custom-expected-win.txt
 data/accessibility/css/list-marker-styles-custom.html
 data/accessibility/css/marker-crash-expected-blink.txt
-data/accessibility/css/marker-crash.html
+data/accessibility/crash/marker-crash.html
 data/accessibility/css/marker-hyphens-expected-blink.txt
 data/accessibility/css/marker-hyphens.html
 data/accessibility/css/next-on-line-check-failure-expected-blink.txt
@@ -2669,8 +2669,10 @@
 data/accessibility/event/immediate-refresh-expected-auralinux.txt
 data/accessibility/event/immediate-refresh.html
 data/accessibility/event/individual-nodes-become-ignored-but-included-expected-auralinux.txt
+data/accessibility/event/individual-nodes-become-ignored-but-included-expected-mac.txt
 data/accessibility/event/individual-nodes-become-ignored-but-included.html
 data/accessibility/event/individual-nodes-become-ignored-expected-auralinux.txt
+data/accessibility/event/individual-nodes-become-ignored-expected-mac.txt
 data/accessibility/event/individual-nodes-become-ignored.html
 data/accessibility/event/inner-html-change-expected-android.txt
 data/accessibility/event/inner-html-change-expected-uia-win.txt
@@ -3011,7 +3013,7 @@
 data/accessibility/event/visibility-hidden-changed-expected-auralinux.txt
 data/accessibility/event/visibility-hidden-changed-expected-uia-win.txt
 data/accessibility/event/visibility-hidden-changed.html
-data/accessibility/form-controls/aria-owns-child-and-hidden-descendant-crash.html
+data/accessibility/crash/aria-owns-child-and-hidden-descendant-crash.html
 data/accessibility/form-controls/bdo-table-cell.html
 data/accessibility/form-controls/contenteditable-descendants-expected-android.txt
 data/accessibility/form-controls/contenteditable-descendants-expected-blink.txt
@@ -3021,7 +3023,7 @@
 data/accessibility/form-controls/img-form.html
 data/accessibility/form-controls/img-map-pseudo.html
 data/accessibility/form-controls/map-inside-map.html
-data/accessibility/form-controls/progress-meter-crash.html
+data/accessibility/crash/progress-meter-crash.html
 data/accessibility/form-controls/role-group-expected-android.txt
 data/accessibility/form-controls/role-group-expected-blink.txt
 data/accessibility/form-controls/role-group.html
@@ -3147,7 +3149,7 @@
 data/accessibility/html/area-alone-expected-blink.txt
 data/accessibility/html/area-alone.html
 data/accessibility/html/area-crash-expected-blink.txt
-data/accessibility/html/area-crash.html
+data/accessibility/crash/area-crash.html
 data/accessibility/html/area-expected-android-assist-data.txt
 data/accessibility/html/area-expected-android-external.txt
 data/accessibility/html/area-expected-android.txt
@@ -3158,7 +3160,7 @@
 data/accessibility/html/area-expected-uia-win.txt
 data/accessibility/html/area-expected-win.txt
 data/accessibility/html/area-serialization-crash-expected-blink.txt
-data/accessibility/html/area-serialization-crash.html
+data/accessibility/crash/area-serialization-crash.html
 data/accessibility/html/area-with-aria-owns-expected-blink.txt
 data/accessibility/html/area-with-aria-owns.html
 data/accessibility/html/area.html
@@ -3662,7 +3664,7 @@
 data/accessibility/html/del.html
 data/accessibility/html/delete-selection-crash-expected-blink.txt
 data/accessibility/html/delete-selection-crash-expected-win.txt
-data/accessibility/html/delete-selection-crash.html
+data/accessibility/crash/delete-selection-crash.html
 data/accessibility/html/design-mode-expected-blink.txt
 data/accessibility/html/design-mode.html
 data/accessibility/html/details-expected-android-assist-data.txt
@@ -3944,7 +3946,7 @@
 data/accessibility/html/hgroup-expected-blink.txt
 data/accessibility/html/hgroup.html
 data/accessibility/html/hidden-named-slot-no-subtree-crash-expected-blink.txt
-data/accessibility/html/hidden-named-slot-no-subtree-crash.html
+data/accessibility/crash/hidden-named-slot-no-subtree-crash.html
 data/accessibility/html/hr-expected-android-assist-data.txt
 data/accessibility/html/hr-expected-android-external.txt
 data/accessibility/html/hr-expected-android.txt
@@ -4920,7 +4922,7 @@
 data/accessibility/html/node-changed-crash-in-editable-text-expected-mac.txt
 data/accessibility/html/node-changed-crash-in-editable-text-expected-uia-win.txt
 data/accessibility/html/node-changed-crash-in-editable-text-expected-win.txt
-data/accessibility/html/node-changed-crash-in-editable-text.html
+data/accessibility/crash/node-changed-crash-in-editable-text.html
 data/accessibility/html/noscript-expected-android.txt
 data/accessibility/html/noscript-expected-auralinux.txt
 data/accessibility/html/noscript-expected-fuchsia.txt
@@ -5119,7 +5121,7 @@
 data/accessibility/html/relevant-space-expected-blink.txt
 data/accessibility/html/relevant-space.html
 data/accessibility/html/reparent-crash-expected-blink.txt
-data/accessibility/html/reparent-crash.html
+data/accessibility/crash/reparent-crash.html
 data/accessibility/html/replace-data-expected-blink.txt
 data/accessibility/html/replace-data.html
 data/accessibility/html/replaced-node-across-trees-expected-android-assist-data.txt
@@ -6167,7 +6169,7 @@
 data/accessibility/regression/aria-hidden-tabindex-change-expected-blink.txt
 data/accessibility/regression/aria-hidden-tabindex-change.html
 data/accessibility/regression/aria-owns-from-textarea.html
-data/accessibility/regression/aria-owns-reparent-above-other-change-crash.html
+data/accessibility/crash/aria-owns-reparent-above-other-change-crash.html
 data/accessibility/regression/aria-pressed-changes-button-role-expected-blink.txt
 data/accessibility/regression/aria-pressed-changes-button-role.html
 data/accessibility/regression/clear-children-while-computing-name-expected-blink.txt
@@ -6190,7 +6192,7 @@
 data/accessibility/regression/hidden-table.html
 data/accessibility/regression/iframe-navigation.html
 data/accessibility/regression/ignored-crash-expected-blink.txt
-data/accessibility/regression/ignored-crash.html
+data/accessibility/crash/ignored-crash.html
 data/accessibility/regression/inner1.html
 data/accessibility/regression/inner2.html
 data/accessibility/regression/language-changed-on-html-expected-blink.txt
@@ -6203,9 +6205,9 @@
 data/accessibility/regression/progress-with-background-exposes-values.html
 data/accessibility/regression/reentrant-add-children.html
 data/accessibility/regression/relation-points-to-invalid-nodes-crash-expected-blink.txt
-data/accessibility/regression/relation-points-to-invalid-nodes-crash.html
+data/accessibility/crash/relation-points-to-invalid-nodes-crash.html
 data/accessibility/regression/reload-selection-crash-expected-blink.txt
-data/accessibility/regression/reload-selection-crash.html
+data/accessibility/crash/reload-selection-crash.html
 data/accessibility/regression/remove-aria-owner-expected-auralinux.txt
 data/accessibility/regression/remove-aria-owner-expected-blink.txt
 data/accessibility/regression/remove-aria-owner.html
@@ -6224,13 +6226,13 @@
 data/accessibility/regression/reused-map-move-image.html
 data/accessibility/regression/reused-map.html
 data/accessibility/regression/root-becomes-leaf.html
-data/accessibility/regression/select-expand-many-options-crash.html
+data/accessibility/crash/select-expand-many-options-crash.html
 data/accessibility/regression/slot-creation-crash-expected-blink.txt
-data/accessibility/regression/slot-creation-crash.html
+data/accessibility/crash/slot-creation-crash.html
 data/accessibility/regression/title-in-shadow-expected-blink.txt
 data/accessibility/regression/title-in-shadow.html
 data/accessibility/regression/workplace.jpg
-data/accessibility/regression/xml-in-iframe-crash.html
+data/accessibility/crash/xml-in-iframe-crash.html
 data/accessibility/relations/ignore-duplicate-relation-ids-expected-auralinux.txt
 data/accessibility/relations/ignore-duplicate-relation-ids-expected-win.txt
 data/accessibility/relations/ignore-duplicate-relation-ids.html
diff --git a/content/test/data/accessibility/PRESUBMIT.py b/content/test/data/accessibility/PRESUBMIT.py
index b506f78d..eaa2b09 100644
--- a/content/test/data/accessibility/PRESUBMIT.py
+++ b/content/test/data/accessibility/PRESUBMIT.py
@@ -10,13 +10,15 @@
 When adding/modify an accessibility test, the following rules apply:
 
 1.  If [name].html file exists, then at least one [name]-expected*.txt file must also exist,
-    and vice-versa.
+    and vice-versa, excluding crash related tests.
 
     This is not enforced for the /html/frame/ and /aria/frames/ directories, which
     contain .html files referenced by other .html files and don't have their own expectations.
 
     Note: This is not enforced for the /mac/ and /win/ directories (see TODOs).
     Note: This looks for files within a CL, not in the repo, which may cause false positives (see TODOs).
+    Note: Crash related tests have "crash" in the html file name and should be placed under /crash/ folder
+    without any corresponding expectations.
     See: CheckAccessibilityHtmlExpectationsPair
 
 2.  Every txt file must be suffixed with one of the following:
@@ -134,7 +136,6 @@
 #                      as the other expectation file requirements are met.
 # TODO(accessibility): Fix Test #7 - [Maybe] This test should consider matching against more platforms.
 #
-# TODO(accessibility): Create rules (and sub-directory) for crash tests, or add expectations for them.
 # TODO(accessibility): Create rules (and sub-directory) for android-only tests, or add expectations for them.
 # TODO(accessibility): Combine the /frame(s)/ directories, and/or give them consistent naming.
 # TODO(accessibility): Investigate and determine rules for remaining folders (e.g. /mathml/, /form-controls/)
@@ -557,6 +558,25 @@
 
     # Check HTML files for corresponding expectations
     for name, html_path in html_files.items():
+        # Crash related HTMLs do not have expectations files but need to be placed in the right folder
+        is_crash_test = "-crash" in name
+        is_in_crash_dir = "content/test/data/accessibility/crash/" in html_path
+
+        if is_crash_test:
+            if not is_in_crash_dir:
+                problems.append(
+                    f"{html_path} (has the name suggesting crash test but is not in "
+                    f"'content/test/data/accessibility/crash/' directory)"
+                )
+            # We skip the expectation file check for crash related tests
+            continue
+        elif is_in_crash_dir:
+            # Non-crash tests should not be placed in crash folder
+            problems.append(
+                f"{html_path} (is in 'content/test/data/accessibility/crash/' directory "
+                f"but the name suggests it is not a crash test)"
+            )
+            continue
         hasMatch = False
         for key, _ in txt_files.items():
             if name in key:
@@ -567,6 +587,15 @@
 
     # Check expectation files for corresponding HTML
     for name, txt_path in txt_files.items():
+        # Crash related HTMLs do not have expectations files and should raise warning if they are found
+        is_crash_test = "-crash" in name
+        is_in_crash_dir = "content/test/data/accessibility/crash/" in txt_path
+
+        if is_crash_test and is_in_crash_dir:
+            problems.append(
+                f"Unexpected crash related expectation file found: {txt_path}"
+            )
+            continue
         hasMatch = False
         for key, _ in html_files.items():
             if key in name:
@@ -578,8 +607,10 @@
     if problems:
         return [
             output_api.PresubmitPromptWarning(
-                "HTML accessibility test files must have a corresponding"
-                "\nexpectation file (and vice-versa). Note this may be a"
+                "HTML accessibility test files, excluding crash related"
+                "\ntests, must have a corresponding expectation file"
+                "\n(and vice-versa). Crash tests should be placed in"
+                "\nthe separate crash folders. Note this may be a"
                 "\nfalse positive if the html file already existed."
                 "\nProblems found:\n",
                 problems,
diff --git a/content/test/data/accessibility/PRESUBMIT_test.py b/content/test/data/accessibility/PRESUBMIT_test.py
index 21adbff..fbe5190 100755
--- a/content/test/data/accessibility/PRESUBMIT_test.py
+++ b/content/test/data/accessibility/PRESUBMIT_test.py
@@ -784,6 +784,75 @@
         results = PRESUBMIT.CheckFrameHtmlFilesDontHaveExpectations(mock_input_api, MockOutputApi())
         self.assertEqual(0, len(results))
 
+class CheckAccessibilityCrashRelatedTest(unittest.TestCase):
+
+    # Test no warning if crash related test HTML is placed in the crash folder
+    def testCrashHtmlCorrectlyHandled(self):
+        mock_input_api = MockInputApi()
+        mock_input_api.files = [
+            MockFile("content/test/data/accessibility/crash/page-crash.html", [])
+        ]
+        results = PRESUBMIT.CheckAccessibilityHtmlExpectationsPair(mock_input_api, MockOutputApi())
+        self.assertEqual(0, len(results))
+
+    # Test warning raised if crash related test HTML is placed in the wrong folder
+    def testCrashHtmlWrongFolder(self):
+        mock_input_api = MockInputApi()
+        mock_input_api.files = [
+            MockFile("content/test/data/accessibility/html/page-crash.html", [])
+        ]
+        results = PRESUBMIT.CheckAccessibilityHtmlExpectationsPair(mock_input_api, MockOutputApi())
+        self.assertEqual(1, len(results),
+            "Expected one PresubmitError object for crash related warning." +
+            f"Found {len(results)}: {results}")
+        self.assertEqual(1, len(results[0].items),
+            "Expected 1 warning item for crash related warning." +
+            f"Found {len(results[0].items)}: {results[0].items}")
+        self.assertIn("page-crash.html", results[0].items[0])
+        self.assertIn("has the name suggesting crash test but is not in", results[0].items[0])
+        self.assertIn("'content/test/data/accessibility/crash/' directory)", results[0].items[0])
+
+    # Test warning raised if non-crash related test HTML is placed in the crash folder
+    def testNonCrashHtmlInCrashFolder(self):
+        mock_input_api = MockInputApi()
+        mock_input_api.files = [
+            MockFile("content/test/data/accessibility/crash/normal-test.html", [])
+        ]
+        results = PRESUBMIT.CheckAccessibilityHtmlExpectationsPair(mock_input_api, MockOutputApi())
+        self.assertEqual(1, len(results),
+            "Expected one PresubmitError object for crash related warning." +
+            f"Found {len(results)}: {results}")
+        self.assertEqual(1, len(results[0].items),
+            "Expected 1 warning item for crash related warning." +
+            f"Found {len(results[0].items)}: {results[0].items}")
+        self.assertIn("normal-test.html", results[0].items[0])
+        self.assertIn("is in 'content/test/data/accessibility/crash/' directory", results[0].items[0])
+        self.assertIn("but the name suggests it is not a crash test)", results[0].items[0])
+
+    # Test warning raised if crash expectation file is found
+    def testCrashTxtFileFound(self):
+        mock_input_api = MockInputApi()
+        mock_input_api.files = [
+            MockFile("content/test/data/accessibility/crash/page-crash-expected-android.txt", [])
+        ]
+        results = PRESUBMIT.CheckAccessibilityHtmlExpectationsPair(mock_input_api, MockOutputApi())
+        self.assertEqual(1, len(results),
+            "Expected one PresubmitError object for crash related warning." +
+            f"Found {len(results)}: {results}")
+        self.assertEqual(1, len(results[0].items),
+            "Expected 1 warning item for crash related warning." +
+            f"Found {len(results[0].items)}: {results[0].items}")
+        self.assertIn("page-crash-expected-android.txt", results[0].items[0])
+        self.assertIn("Unexpected crash related expectation file found:", results[0].items[0])
+
+    # Test crash files outside the //content/test/data/accessibility directory are not relevant
+    def testCrashNonMatchingFiles(self):
+        mock_input_api = MockInputApi()
+        mock_input_api.files = [
+            MockFile("content/test/data/crash/page-crash.html", [])
+        ]
+        results = PRESUBMIT.CheckAccessibilityHtmlExpectationsPair(mock_input_api, MockOutputApi())
+        self.assertEqual(0, len(results))
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/content/test/data/accessibility/html/area-crash.html b/content/test/data/accessibility/crash/area-crash.html
similarity index 100%
rename from content/test/data/accessibility/html/area-crash.html
rename to content/test/data/accessibility/crash/area-crash.html
diff --git a/content/test/data/accessibility/html/area-serialization-crash.html b/content/test/data/accessibility/crash/area-serialization-crash.html
similarity index 100%
rename from content/test/data/accessibility/html/area-serialization-crash.html
rename to content/test/data/accessibility/crash/area-serialization-crash.html
diff --git a/content/test/data/accessibility/form-controls/aria-owns-child-and-hidden-descendant-crash.html b/content/test/data/accessibility/crash/aria-owns-child-and-hidden-descendant-crash.html
similarity index 100%
rename from content/test/data/accessibility/form-controls/aria-owns-child-and-hidden-descendant-crash.html
rename to content/test/data/accessibility/crash/aria-owns-child-and-hidden-descendant-crash.html
diff --git a/content/test/data/accessibility/aria/aria-owns-crash-2.html b/content/test/data/accessibility/crash/aria-owns-crash-2.html
similarity index 100%
rename from content/test/data/accessibility/aria/aria-owns-crash-2.html
rename to content/test/data/accessibility/crash/aria-owns-crash-2.html
diff --git a/content/test/data/accessibility/aria/aria-owns-crash.html b/content/test/data/accessibility/crash/aria-owns-crash.html
similarity index 100%
rename from content/test/data/accessibility/aria/aria-owns-crash.html
rename to content/test/data/accessibility/crash/aria-owns-crash.html
diff --git a/content/test/data/accessibility/regression/aria-owns-reparent-above-other-change-crash.html b/content/test/data/accessibility/crash/aria-owns-reparent-above-other-change-crash.html
similarity index 100%
rename from content/test/data/accessibility/regression/aria-owns-reparent-above-other-change-crash.html
rename to content/test/data/accessibility/crash/aria-owns-reparent-above-other-change-crash.html
diff --git a/content/test/data/accessibility/html/delete-selection-crash.html b/content/test/data/accessibility/crash/delete-selection-crash.html
similarity index 100%
rename from content/test/data/accessibility/html/delete-selection-crash.html
rename to content/test/data/accessibility/crash/delete-selection-crash.html
diff --git a/content/test/data/accessibility/html/hidden-named-slot-no-subtree-crash.html b/content/test/data/accessibility/crash/hidden-named-slot-no-subtree-crash.html
similarity index 100%
rename from content/test/data/accessibility/html/hidden-named-slot-no-subtree-crash.html
rename to content/test/data/accessibility/crash/hidden-named-slot-no-subtree-crash.html
diff --git a/content/test/data/accessibility/regression/ignored-crash.html b/content/test/data/accessibility/crash/ignored-crash.html
similarity index 100%
rename from content/test/data/accessibility/regression/ignored-crash.html
rename to content/test/data/accessibility/crash/ignored-crash.html
diff --git a/content/test/data/accessibility/css/marker-crash.html b/content/test/data/accessibility/crash/marker-crash.html
similarity index 100%
rename from content/test/data/accessibility/css/marker-crash.html
rename to content/test/data/accessibility/crash/marker-crash.html
diff --git a/content/test/data/accessibility/html/node-changed-crash-in-editable-text.html b/content/test/data/accessibility/crash/node-changed-crash-in-editable-text.html
similarity index 100%
rename from content/test/data/accessibility/html/node-changed-crash-in-editable-text.html
rename to content/test/data/accessibility/crash/node-changed-crash-in-editable-text.html
diff --git a/content/test/data/accessibility/form-controls/progress-meter-crash.html b/content/test/data/accessibility/crash/progress-meter-crash.html
similarity index 100%
rename from content/test/data/accessibility/form-controls/progress-meter-crash.html
rename to content/test/data/accessibility/crash/progress-meter-crash.html
diff --git a/content/test/data/accessibility/regression/relation-points-to-invalid-nodes-crash.html b/content/test/data/accessibility/crash/relation-points-to-invalid-nodes-crash.html
similarity index 100%
rename from content/test/data/accessibility/regression/relation-points-to-invalid-nodes-crash.html
rename to content/test/data/accessibility/crash/relation-points-to-invalid-nodes-crash.html
diff --git a/content/test/data/accessibility/regression/reload-selection-crash.html b/content/test/data/accessibility/crash/reload-selection-crash.html
similarity index 100%
rename from content/test/data/accessibility/regression/reload-selection-crash.html
rename to content/test/data/accessibility/crash/reload-selection-crash.html
diff --git a/content/test/data/accessibility/html/reparent-crash.html b/content/test/data/accessibility/crash/reparent-crash.html
similarity index 100%
rename from content/test/data/accessibility/html/reparent-crash.html
rename to content/test/data/accessibility/crash/reparent-crash.html
diff --git a/content/test/data/accessibility/regression/select-expand-many-options-crash.html b/content/test/data/accessibility/crash/select-expand-many-options-crash.html
similarity index 100%
rename from content/test/data/accessibility/regression/select-expand-many-options-crash.html
rename to content/test/data/accessibility/crash/select-expand-many-options-crash.html
diff --git a/content/test/data/accessibility/regression/slot-creation-crash.html b/content/test/data/accessibility/crash/slot-creation-crash.html
similarity index 100%
rename from content/test/data/accessibility/regression/slot-creation-crash.html
rename to content/test/data/accessibility/crash/slot-creation-crash.html
diff --git a/content/test/data/accessibility/regression/xml-in-iframe-crash.html b/content/test/data/accessibility/crash/xml-in-iframe-crash.html
similarity index 100%
rename from content/test/data/accessibility/regression/xml-in-iframe-crash.html
rename to content/test/data/accessibility/crash/xml-in-iframe-crash.html
diff --git a/content/test/data/accessibility/event/aria-selected-changed-new-subtree-expected-mac.txt b/content/test/data/accessibility/event/aria-selected-changed-new-subtree-expected-mac.txt
index 28aa54e..3a24c6e 100644
--- a/content/test/data/accessibility/event/aria-selected-changed-new-subtree-expected-mac.txt
+++ b/content/test/data/accessibility/event/aria-selected-changed-new-subtree-expected-mac.txt
@@ -1,7 +1,6 @@
 AXSelectedRowsChanged on AXTable
 AXTitleChanged on AXRow AXTitle='Grid, GridCell1 Grid, GridCell2 Grid, GridCell3'
 === Start Continuation ===
-AXSelectedChildrenChanged on AXMenu
 AXValueChanged on AXPopUpButton AXValue='Select, Option3'
 === Start Continuation ===
-AXSelectedChildrenChanged on AXList
+AXSelectedChildrenChanged on AXList
\ No newline at end of file
diff --git a/content/test/data/accessibility/event/individual-nodes-become-ignored-but-included-expected-mac.txt b/content/test/data/accessibility/event/individual-nodes-become-ignored-but-included-expected-mac.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/content/test/data/accessibility/event/individual-nodes-become-ignored-but-included-expected-mac.txt
diff --git a/content/test/data/accessibility/event/individual-nodes-become-ignored-expected-mac.txt b/content/test/data/accessibility/event/individual-nodes-become-ignored-expected-mac.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/content/test/data/accessibility/event/individual-nodes-become-ignored-expected-mac.txt
diff --git a/content/test/data/accessibility/event/individual-nodes-become-ignored.html b/content/test/data/accessibility/event/individual-nodes-become-ignored.html
index 36b84c3c..1400d00d 100644
--- a/content/test/data/accessibility/event/individual-nodes-become-ignored.html
+++ b/content/test/data/accessibility/event/individual-nodes-become-ignored.html
@@ -14,8 +14,7 @@
     </div>
     <script>
       function go() {
-        // Setting the role to "none" makes the node ignored, while the lang
-        // attribute makes it "ignored but included in tree".
+        // Setting the role to "none" makes the node ignored.
         document.querySelector('#child1').role = 'none';
         document.querySelector('#child2').role = 'none';
         document.querySelector('#grandchild2').role = 'none';
diff --git a/content/test/data/accessibility/event/menulist-collapse-expected-mac.txt b/content/test/data/accessibility/event/menulist-collapse-expected-mac.txt
index fcc4000..fa62d975 100644
--- a/content/test/data/accessibility/event/menulist-collapse-expected-mac.txt
+++ b/content/test/data/accessibility/event/menulist-collapse-expected-mac.txt
@@ -1,4 +1,3 @@
 AXFocusedUIElementChanged on AXPopUpButton AXValue='Apple'
 === Start Continuation ===
-AXSelectedChildrenChanged on AXMenu
 AXValueChanged on AXPopUpButton
diff --git a/content/test/data/accessibility/event/menulist-collapse-next-expected-mac.txt b/content/test/data/accessibility/event/menulist-collapse-next-expected-mac.txt
index 0c3bcb2..741a1c2 100644
--- a/content/test/data/accessibility/event/menulist-collapse-next-expected-mac.txt
+++ b/content/test/data/accessibility/event/menulist-collapse-next-expected-mac.txt
@@ -1,4 +1,3 @@
 AXFocusedUIElementChanged on AXPopUpButton AXValue='Apple'
 === Start Continuation ===
-AXSelectedChildrenChanged on AXMenu
 AXValueChanged on AXPopUpButton AXValue='Orange'
diff --git a/content/test/data/accessibility/event/menulist-custom-expand-collapse-expected-mac.txt b/content/test/data/accessibility/event/menulist-custom-expand-collapse-expected-mac.txt
index 602d085..bff6b53 100644
--- a/content/test/data/accessibility/event/menulist-custom-expand-collapse-expected-mac.txt
+++ b/content/test/data/accessibility/event/menulist-custom-expand-collapse-expected-mac.txt
@@ -1,3 +1,3 @@
 AXExpandedChanged on AXPopUpButton AXDescription='Fruit' AXValue='^'
 AXFocusedUIElementChanged on AXMenuItem AXValue='Apple'
-AXMenuItemSelected on AXMenuItem AXValue='Apple'
+AXMenuItemSelected on AXMenuItem AXValue='Apple'
\ No newline at end of file
diff --git a/content/test/data/accessibility/event/menulist-custom-next-expected-mac.txt b/content/test/data/accessibility/event/menulist-custom-next-expected-mac.txt
index 08ac28e..9563112c 100644
--- a/content/test/data/accessibility/event/menulist-custom-next-expected-mac.txt
+++ b/content/test/data/accessibility/event/menulist-custom-next-expected-mac.txt
@@ -2,4 +2,4 @@
 AXFocusedUIElementChanged on AXMenuItem AXValue='Apple'
 AXMenuItemSelected on AXMenuItem AXValue='Orange'
 AXSelectedChildrenChanged on AXMenu
-AXValueChanged on AXPopUpButton AXDescription='Fruit' AXValue='Orange'
+AXValueChanged on AXPopUpButton AXDescription='Fruit' AXValue='Orange'
\ No newline at end of file
diff --git a/content/test/data/accessibility/event/select-selected-add-remove-expected-mac.txt b/content/test/data/accessibility/event/select-selected-add-remove-expected-mac.txt
index 86da05a..ef172db 100644
--- a/content/test/data/accessibility/event/select-selected-add-remove-expected-mac.txt
+++ b/content/test/data/accessibility/event/select-selected-add-remove-expected-mac.txt
@@ -6,7 +6,6 @@
 === Start Continuation ===
 AXSelectedChildrenChanged on AXList AXDescription='Combo2'
 === Start Continuation ===
-AXSelectedChildrenChanged on AXMenu
 AXValueChanged on AXPopUpButton AXDescription='Combo3' AXValue='Option8'
 === Start Continuation ===
 AXSelectedChildrenChanged on AXList AXDescription='Combo4'
diff --git a/content/test/data/accessibility/html/commandfor-api-popover-expected-auralinux.txt b/content/test/data/accessibility/html/commandfor-api-popover-expected-auralinux.txt
index ac78b02d..d0bf04a 100644
--- a/content/test/data/accessibility/html/commandfor-api-popover-expected-auralinux.txt
+++ b/content/test/data/accessibility/html/commandfor-api-popover-expected-auralinux.txt
@@ -1,49 +1,49 @@
 [document web]
 ++[section]
+++++[push button] name='d1 button - outside & next - show-popover'
+++++[push button] name='d1 button - outside - hide-popover'
 ++++[push button] name='d1 button - outside - toggle-popover'
 ++++[push button] name='d1 button - outside - unrelated action'
 ++++[push button] name='d1 button - outside - custom action'
-++++[push button] name='d1 button - outside - toggle-popover'
-++++[push button] name='d1 button - outside & next - show-popover'
+++++[push button] name='d2 button - outside & next - show-popover' expanded details=[panel] details-from:command-for details-roles:popover
+++++[push button] name='d2 button - outside - hide-popover' expanded details=[panel] details-from:command-for details-roles:popover
 ++++[push button] name='d2 button - outside - toggle-popover' expanded details=[panel] details-from:command-for details-roles:popover
 ++++[push button] name='d2 button - outside - unrelated action'
 ++++[push button] name='d2 button - outside - custom action'
-++++[push button] name='d2 button - outside - toggle-popover' expanded details=[panel] details-from:command-for details-roles:popover
-++++[push button] name='d2 button - outside & next - show-popover' expanded
-++++[panel] details-for=[push button,push button]
+++++[panel] details-for=[push button,push button,push button]
 ++++++[push button] name='d2 button - inside - show-popover'
 ++++++[push button] name='d2 button - inside - hide-popover'
 ++++++[push button] name='d2 button - inside - toggle-popover'
 ++++++[push button] name='d2 button - inside - related action'
 ++++++[push button] name='d2 button - inside - custom action'
+++++[push button] name='d3 button - outside & next - show-popover' expanded details=[panel] details-from:command-for details-roles:popover
+++++[push button] name='d3 button - outside - hide-popover' expanded details=[panel] details-from:command-for details-roles:popover
 ++++[push button] name='d3 button - outside - toggle-popover' expanded details=[panel] details-from:command-for details-roles:popover
 ++++[push button] name='d3 button - outside - unrelated action'
 ++++[push button] name='d3 button - outside - custom action'
-++++[push button] name='d3 button - outside - toggle-popover' expanded details=[panel] details-from:command-for details-roles:popover
-++++[push button] name='d3 button - outside & next - show-popover' expanded
-++++[panel] details-for=[push button,push button]
+++++[panel] details-for=[push button,push button,push button]
 ++++++[push button] name='d3 button - inside - show-popover'
 ++++++[push button] name='d3 button - inside - hide-popover'
 ++++++[push button] name='d3 button - inside - toggle-popover'
 ++++++[push button] name='d3 button - inside - related action'
 ++++++[push button] name='d3 button - inside - custom action'
+++++[push button] name='d4 button - outside & next - show-popover'
+++++[push button] name='d4 button - outside - hide-popover'
 ++++[push button] name='d4 button - outside - toggle-popover'
 ++++[push button] name='d4 button - outside - unrelated action'
 ++++[push button] name='d4 button - outside - custom action'
-++++[push button] name='d4 button - outside - toggle-popover'
-++++[push button] name='d4 button - outside & next - show-popover'
+++++[push button] name='d5 button - outside & next - show-popover'
+++++[push button] name='d5 button - outside - hide-popover'
 ++++[push button] name='d5 button - outside - toggle-popover'
 ++++[push button] name='d5 button - outside - unrelated action'
 ++++[push button] name='d5 button - outside - custom action'
-++++[push button] name='d5 button - outside - toggle-popover'
-++++[push button] name='d5 button - outside & next - show-popover'
-++++[push button] name='d1 button - outside - unrelated action'
-++++[push button] name='d1 button - outside - custom action'
-++++[push button] name='d1 button - outside - hide-popover'
 ++++[push button] name='d1 button - outside & next - show-popover'
+++++[push button] name='d1 button - outside - hide-popover'
 ++++[push button] name='d1 button - outside - toggle-popover'
 ++++[push button] name='d1 button - outside - unrelated action'
 ++++[push button] name='d1 button - outside - custom action'
-++++[push button] name='d1 button - outside - toggle-popover'
 ++++[push button] name='d1 button - outside & next - show-popover'
 ++++[push button] name='d1 button - outside - hide-popover'
+++++[push button] name='d1 button - outside - toggle-popover'
+++++[push button] name='d1 button - outside - unrelated action'
+++++[push button] name='d1 button - outside - custom action'
diff --git a/content/test/data/accessibility/html/commandfor-api-popover-expected-blink.txt b/content/test/data/accessibility/html/commandfor-api-popover-expected-blink.txt
index a2363c9..6cfd466 100644
--- a/content/test/data/accessibility/html/commandfor-api-popover-expected-blink.txt
+++ b/content/test/data/accessibility/html/commandfor-api-popover-expected-blink.txt
@@ -1,6 +1,12 @@
 rootWebArea
 ++genericContainer ignored
 ++++genericContainer
+++++++button collapsed name='d1 button - outside & next - show-popover'
+++++++++staticText name='d1 button - outside & next - show-popover'
+++++++++++inlineTextBox name='d1 button - outside & next - show-popover'
+++++++button collapsed name='d1 button - outside - hide-popover'
+++++++++staticText name='d1 button - outside - hide-popover'
+++++++++++inlineTextBox name='d1 button - outside - hide-popover'
 ++++++button collapsed name='d1 button - outside - toggle-popover'
 ++++++++staticText name='d1 button - outside - toggle-popover'
 ++++++++++inlineTextBox name='d1 button - outside - toggle-popover'
@@ -10,12 +16,12 @@
 ++++++button name='d1 button - outside - custom action'
 ++++++++staticText name='d1 button - outside - custom action'
 ++++++++++inlineTextBox name='d1 button - outside - custom action'
-++++++button collapsed name='d1 button - outside - toggle-popover'
-++++++++staticText name='d1 button - outside - toggle-popover'
-++++++++++inlineTextBox name='d1 button - outside - toggle-popover'
-++++++button collapsed name='d1 button - outside & next - show-popover'
-++++++++staticText name='d1 button - outside & next - show-popover'
-++++++++++inlineTextBox name='d1 button - outside & next - show-popover'
+++++++button expanded name='d2 button - outside & next - show-popover' detailsIds=group
+++++++++staticText name='d2 button - outside & next - show-popover'
+++++++++++inlineTextBox name='d2 button - outside & next - show-popover'
+++++++button expanded name='d2 button - outside - hide-popover' detailsIds=group
+++++++++staticText name='d2 button - outside - hide-popover'
+++++++++++inlineTextBox name='d2 button - outside - hide-popover'
 ++++++button expanded name='d2 button - outside - toggle-popover' detailsIds=group
 ++++++++staticText name='d2 button - outside - toggle-popover'
 ++++++++++inlineTextBox name='d2 button - outside - toggle-popover'
@@ -25,12 +31,6 @@
 ++++++button name='d2 button - outside - custom action'
 ++++++++staticText name='d2 button - outside - custom action'
 ++++++++++inlineTextBox name='d2 button - outside - custom action'
-++++++button expanded name='d2 button - outside - toggle-popover' detailsIds=group
-++++++++staticText name='d2 button - outside - toggle-popover'
-++++++++++inlineTextBox name='d2 button - outside - toggle-popover'
-++++++button expanded name='d2 button - outside & next - show-popover'
-++++++++staticText name='d2 button - outside & next - show-popover'
-++++++++++inlineTextBox name='d2 button - outside & next - show-popover'
 ++++++group ispopup=auto
 ++++++++button name='d2 button - inside - show-popover'
 ++++++++++staticText name='d2 button - inside - show-popover'
@@ -47,6 +47,12 @@
 ++++++++button name='d2 button - inside - custom action'
 ++++++++++staticText name='d2 button - inside - custom action'
 ++++++++++++inlineTextBox name='d2 button - inside - custom action'
+++++++button expanded name='d3 button - outside & next - show-popover' detailsIds=group
+++++++++staticText name='d3 button - outside & next - show-popover'
+++++++++++inlineTextBox name='d3 button - outside & next - show-popover'
+++++++button expanded name='d3 button - outside - hide-popover' detailsIds=group
+++++++++staticText name='d3 button - outside - hide-popover'
+++++++++++inlineTextBox name='d3 button - outside - hide-popover'
 ++++++button expanded name='d3 button - outside - toggle-popover' detailsIds=group
 ++++++++staticText name='d3 button - outside - toggle-popover'
 ++++++++++inlineTextBox name='d3 button - outside - toggle-popover'
@@ -56,12 +62,6 @@
 ++++++button name='d3 button - outside - custom action'
 ++++++++staticText name='d3 button - outside - custom action'
 ++++++++++inlineTextBox name='d3 button - outside - custom action'
-++++++button expanded name='d3 button - outside - toggle-popover' detailsIds=group
-++++++++staticText name='d3 button - outside - toggle-popover'
-++++++++++inlineTextBox name='d3 button - outside - toggle-popover'
-++++++button expanded name='d3 button - outside & next - show-popover'
-++++++++staticText name='d3 button - outside & next - show-popover'
-++++++++++inlineTextBox name='d3 button - outside & next - show-popover'
 ++++++group ispopup=manual
 ++++++++button name='d3 button - inside - show-popover'
 ++++++++++staticText name='d3 button - inside - show-popover'
@@ -78,6 +78,12 @@
 ++++++++button name='d3 button - inside - custom action'
 ++++++++++staticText name='d3 button - inside - custom action'
 ++++++++++++inlineTextBox name='d3 button - inside - custom action'
+++++++button name='d4 button - outside & next - show-popover'
+++++++++staticText name='d4 button - outside & next - show-popover'
+++++++++++inlineTextBox name='d4 button - outside & next - show-popover'
+++++++button name='d4 button - outside - hide-popover'
+++++++++staticText name='d4 button - outside - hide-popover'
+++++++++++inlineTextBox name='d4 button - outside - hide-popover'
 ++++++button name='d4 button - outside - toggle-popover'
 ++++++++staticText name='d4 button - outside - toggle-popover'
 ++++++++++inlineTextBox name='d4 button - outside - toggle-popover'
@@ -87,12 +93,12 @@
 ++++++button name='d4 button - outside - custom action'
 ++++++++staticText name='d4 button - outside - custom action'
 ++++++++++inlineTextBox name='d4 button - outside - custom action'
-++++++button name='d4 button - outside - toggle-popover'
-++++++++staticText name='d4 button - outside - toggle-popover'
-++++++++++inlineTextBox name='d4 button - outside - toggle-popover'
-++++++button name='d4 button - outside & next - show-popover'
-++++++++staticText name='d4 button - outside & next - show-popover'
-++++++++++inlineTextBox name='d4 button - outside & next - show-popover'
+++++++button collapsed name='d5 button - outside & next - show-popover'
+++++++++staticText name='d5 button - outside & next - show-popover'
+++++++++++inlineTextBox name='d5 button - outside & next - show-popover'
+++++++button collapsed name='d5 button - outside - hide-popover'
+++++++++staticText name='d5 button - outside - hide-popover'
+++++++++++inlineTextBox name='d5 button - outside - hide-popover'
 ++++++button collapsed name='d5 button - outside - toggle-popover'
 ++++++++staticText name='d5 button - outside - toggle-popover'
 ++++++++++inlineTextBox name='d5 button - outside - toggle-popover'
@@ -102,24 +108,12 @@
 ++++++button name='d5 button - outside - custom action'
 ++++++++staticText name='d5 button - outside - custom action'
 ++++++++++inlineTextBox name='d5 button - outside - custom action'
-++++++button collapsed name='d5 button - outside - toggle-popover'
-++++++++staticText name='d5 button - outside - toggle-popover'
-++++++++++inlineTextBox name='d5 button - outside - toggle-popover'
-++++++button collapsed name='d5 button - outside & next - show-popover'
-++++++++staticText name='d5 button - outside & next - show-popover'
-++++++++++inlineTextBox name='d5 button - outside & next - show-popover'
-++++++button name='d1 button - outside - unrelated action'
-++++++++staticText name='d1 button - outside - unrelated action'
-++++++++++inlineTextBox name='d1 button - outside - unrelated action'
-++++++button name='d1 button - outside - custom action'
-++++++++staticText name='d1 button - outside - custom action'
-++++++++++inlineTextBox name='d1 button - outside - custom action'
-++++++button collapsed name='d1 button - outside - hide-popover'
-++++++++staticText name='d1 button - outside - hide-popover'
-++++++++++inlineTextBox name='d1 button - outside - hide-popover'
 ++++++button collapsed name='d1 button - outside & next - show-popover'
 ++++++++staticText name='d1 button - outside & next - show-popover'
 ++++++++++inlineTextBox name='d1 button - outside & next - show-popover'
+++++++button collapsed name='d1 button - outside - hide-popover'
+++++++++staticText name='d1 button - outside - hide-popover'
+++++++++++inlineTextBox name='d1 button - outside - hide-popover'
 ++++++button collapsed name='d1 button - outside - toggle-popover'
 ++++++++staticText name='d1 button - outside - toggle-popover'
 ++++++++++inlineTextBox name='d1 button - outside - toggle-popover'
@@ -129,12 +123,18 @@
 ++++++button name='d1 button - outside - custom action'
 ++++++++staticText name='d1 button - outside - custom action'
 ++++++++++inlineTextBox name='d1 button - outside - custom action'
-++++++button collapsed name='d1 button - outside - toggle-popover'
-++++++++staticText name='d1 button - outside - toggle-popover'
-++++++++++inlineTextBox name='d1 button - outside - toggle-popover'
 ++++++button collapsed name='d1 button - outside & next - show-popover'
 ++++++++staticText name='d1 button - outside & next - show-popover'
 ++++++++++inlineTextBox name='d1 button - outside & next - show-popover'
 ++++++button collapsed name='d1 button - outside - hide-popover'
 ++++++++staticText name='d1 button - outside - hide-popover'
 ++++++++++inlineTextBox name='d1 button - outside - hide-popover'
+++++++button collapsed name='d1 button - outside - toggle-popover'
+++++++++staticText name='d1 button - outside - toggle-popover'
+++++++++++inlineTextBox name='d1 button - outside - toggle-popover'
+++++++button name='d1 button - outside - unrelated action'
+++++++++staticText name='d1 button - outside - unrelated action'
+++++++++++inlineTextBox name='d1 button - outside - unrelated action'
+++++++button name='d1 button - outside - custom action'
+++++++++staticText name='d1 button - outside - custom action'
+++++++++++inlineTextBox name='d1 button - outside - custom action'
diff --git a/content/test/data/accessibility/html/commandfor-api-popover-expected-mac.txt b/content/test/data/accessibility/html/commandfor-api-popover-expected-mac.txt
index d729ef4e..823e342e 100644
--- a/content/test/data/accessibility/html/commandfor-api-popover-expected-mac.txt
+++ b/content/test/data/accessibility/html/commandfor-api-popover-expected-mac.txt
@@ -1,49 +1,49 @@
 AXWebArea
 ++AXGroup
+++++AXButton AXExpanded=0 AXTitle='d1 button - outside & next - show-popover'
+++++AXButton AXExpanded=0 AXTitle='d1 button - outside - hide-popover'
 ++++AXButton AXExpanded=0 AXTitle='d1 button - outside - toggle-popover'
 ++++AXButton AXTitle='d1 button - outside - unrelated action'
 ++++AXButton AXTitle='d1 button - outside - custom action'
-++++AXButton AXExpanded=0 AXTitle='d1 button - outside - toggle-popover'
-++++AXButton AXExpanded=0 AXTitle='d1 button - outside & next - show-popover'
+++++AXButton AXExpanded=1 AXTitle='d2 button - outside & next - show-popover'
+++++AXButton AXExpanded=1 AXTitle='d2 button - outside - hide-popover'
 ++++AXButton AXExpanded=1 AXTitle='d2 button - outside - toggle-popover'
 ++++AXButton AXTitle='d2 button - outside - unrelated action'
 ++++AXButton AXTitle='d2 button - outside - custom action'
-++++AXButton AXExpanded=1 AXTitle='d2 button - outside - toggle-popover'
-++++AXButton AXExpanded=1 AXTitle='d2 button - outside & next - show-popover'
 ++++AXGroup AXSubrole=AXApplicationGroup
 ++++++AXButton AXTitle='d2 button - inside - show-popover'
 ++++++AXButton AXTitle='d2 button - inside - hide-popover'
 ++++++AXButton AXTitle='d2 button - inside - toggle-popover'
 ++++++AXButton AXTitle='d2 button - inside - related action'
 ++++++AXButton AXTitle='d2 button - inside - custom action'
+++++AXButton AXExpanded=1 AXTitle='d3 button - outside & next - show-popover'
+++++AXButton AXExpanded=1 AXTitle='d3 button - outside - hide-popover'
 ++++AXButton AXExpanded=1 AXTitle='d3 button - outside - toggle-popover'
 ++++AXButton AXTitle='d3 button - outside - unrelated action'
 ++++AXButton AXTitle='d3 button - outside - custom action'
-++++AXButton AXExpanded=1 AXTitle='d3 button - outside - toggle-popover'
-++++AXButton AXExpanded=1 AXTitle='d3 button - outside & next - show-popover'
 ++++AXGroup AXSubrole=AXApplicationGroup
 ++++++AXButton AXTitle='d3 button - inside - show-popover'
 ++++++AXButton AXTitle='d3 button - inside - hide-popover'
 ++++++AXButton AXTitle='d3 button - inside - toggle-popover'
 ++++++AXButton AXTitle='d3 button - inside - related action'
 ++++++AXButton AXTitle='d3 button - inside - custom action'
+++++AXButton AXTitle='d4 button - outside & next - show-popover'
+++++AXButton AXTitle='d4 button - outside - hide-popover'
 ++++AXButton AXTitle='d4 button - outside - toggle-popover'
 ++++AXButton AXTitle='d4 button - outside - unrelated action'
 ++++AXButton AXTitle='d4 button - outside - custom action'
-++++AXButton AXTitle='d4 button - outside - toggle-popover'
-++++AXButton AXTitle='d4 button - outside & next - show-popover'
+++++AXButton AXExpanded=0 AXTitle='d5 button - outside & next - show-popover'
+++++AXButton AXExpanded=0 AXTitle='d5 button - outside - hide-popover'
 ++++AXButton AXExpanded=0 AXTitle='d5 button - outside - toggle-popover'
 ++++AXButton AXTitle='d5 button - outside - unrelated action'
 ++++AXButton AXTitle='d5 button - outside - custom action'
-++++AXButton AXExpanded=0 AXTitle='d5 button - outside - toggle-popover'
-++++AXButton AXExpanded=0 AXTitle='d5 button - outside & next - show-popover'
-++++AXButton AXTitle='d1 button - outside - unrelated action'
-++++AXButton AXTitle='d1 button - outside - custom action'
-++++AXButton AXExpanded=0 AXTitle='d1 button - outside - hide-popover'
 ++++AXButton AXExpanded=0 AXTitle='d1 button - outside & next - show-popover'
+++++AXButton AXExpanded=0 AXTitle='d1 button - outside - hide-popover'
 ++++AXButton AXExpanded=0 AXTitle='d1 button - outside - toggle-popover'
 ++++AXButton AXTitle='d1 button - outside - unrelated action'
 ++++AXButton AXTitle='d1 button - outside - custom action'
-++++AXButton AXExpanded=0 AXTitle='d1 button - outside - toggle-popover'
 ++++AXButton AXExpanded=0 AXTitle='d1 button - outside & next - show-popover'
 ++++AXButton AXExpanded=0 AXTitle='d1 button - outside - hide-popover'
+++++AXButton AXExpanded=0 AXTitle='d1 button - outside - toggle-popover'
+++++AXButton AXTitle='d1 button - outside - unrelated action'
+++++AXButton AXTitle='d1 button - outside - custom action'
diff --git a/content/test/data/accessibility/html/commandfor-api-popover-expected-uia-win.txt b/content/test/data/accessibility/html/commandfor-api-popover-expected-uia-win.txt
index 849878d..e2bb14de 100644
--- a/content/test/data/accessibility/html/commandfor-api-popover-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/commandfor-api-popover-expected-uia-win.txt
@@ -1,49 +1,49 @@
 Document
 ++Group IsControlElement=false
+++++Button Name='d1 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
+++++Button Name='d1 button - outside - hide-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
 ++++Button Name='d1 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
 ++++Button Name='d1 button - outside - unrelated action'
 ++++Button Name='d1 button - outside - custom action'
-++++Button Name='d1 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
-++++Button Name='d1 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
+++++Button Name='d2 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Expanded'
+++++Button Name='d2 button - outside - hide-popover' ExpandCollapse.ExpandCollapseState='Expanded'
 ++++Button Name='d2 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Expanded'
 ++++Button Name='d2 button - outside - unrelated action'
 ++++Button Name='d2 button - outside - custom action'
-++++Button Name='d2 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Expanded'
-++++Button Name='d2 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Expanded'
 ++++Group IsControlElement=false
 ++++++Button Name='d2 button - inside - show-popover'
 ++++++Button Name='d2 button - inside - hide-popover'
 ++++++Button Name='d2 button - inside - toggle-popover'
 ++++++Button Name='d2 button - inside - related action'
 ++++++Button Name='d2 button - inside - custom action'
+++++Button Name='d3 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Expanded'
+++++Button Name='d3 button - outside - hide-popover' ExpandCollapse.ExpandCollapseState='Expanded'
 ++++Button Name='d3 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Expanded'
 ++++Button Name='d3 button - outside - unrelated action'
 ++++Button Name='d3 button - outside - custom action'
-++++Button Name='d3 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Expanded'
-++++Button Name='d3 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Expanded'
 ++++Group IsControlElement=false
 ++++++Button Name='d3 button - inside - show-popover'
 ++++++Button Name='d3 button - inside - hide-popover'
 ++++++Button Name='d3 button - inside - toggle-popover'
 ++++++Button Name='d3 button - inside - related action'
 ++++++Button Name='d3 button - inside - custom action'
+++++Button Name='d4 button - outside & next - show-popover'
+++++Button Name='d4 button - outside - hide-popover'
 ++++Button Name='d4 button - outside - toggle-popover'
 ++++Button Name='d4 button - outside - unrelated action'
 ++++Button Name='d4 button - outside - custom action'
-++++Button Name='d4 button - outside - toggle-popover'
-++++Button Name='d4 button - outside & next - show-popover'
+++++Button Name='d5 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
+++++Button Name='d5 button - outside - hide-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
 ++++Button Name='d5 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
 ++++Button Name='d5 button - outside - unrelated action'
 ++++Button Name='d5 button - outside - custom action'
-++++Button Name='d5 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
-++++Button Name='d5 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
-++++Button Name='d1 button - outside - unrelated action'
-++++Button Name='d1 button - outside - custom action'
-++++Button Name='d1 button - outside - hide-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
 ++++Button Name='d1 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
+++++Button Name='d1 button - outside - hide-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
 ++++Button Name='d1 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
 ++++Button Name='d1 button - outside - unrelated action'
 ++++Button Name='d1 button - outside - custom action'
-++++Button Name='d1 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
 ++++Button Name='d1 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
 ++++Button Name='d1 button - outside - hide-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
+++++Button Name='d1 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Collapsed'
+++++Button Name='d1 button - outside - unrelated action'
+++++Button Name='d1 button - outside - custom action'
diff --git a/content/test/data/accessibility/html/commandfor-api-popover-expected-win.txt b/content/test/data/accessibility/html/commandfor-api-popover-expected-win.txt
index 4899f7b..0eb27f6 100644
--- a/content/test/data/accessibility/html/commandfor-api-popover-expected-win.txt
+++ b/content/test/data/accessibility/html/commandfor-api-popover-expected-win.txt
@@ -1,49 +1,49 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
 ++IA2_ROLE_SECTION
+++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside & next - show-popover' COLLAPSED FOCUSABLE
+++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - hide-popover' COLLAPSED FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - toggle-popover' COLLAPSED FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - unrelated action' FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - custom action' FOCUSABLE
-++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - toggle-popover' COLLAPSED FOCUSABLE
-++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside & next - show-popover' COLLAPSED FOCUSABLE
+++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - outside & next - show-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover
+++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - outside - hide-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover
 ++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - outside - toggle-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover
 ++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - outside - unrelated action' FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - outside - custom action' FOCUSABLE
-++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - outside - toggle-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover
-++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - outside & next - show-popover' EXPANDED FOCUSABLE
 ++++ROLE_SYSTEM_GROUPING ispopup:auto
 ++++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - inside - show-popover' FOCUSABLE
 ++++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - inside - hide-popover' FOCUSABLE
 ++++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - inside - toggle-popover' FOCUSABLE
 ++++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - inside - related action' FOCUSABLE
 ++++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - inside - custom action' FOCUSABLE
+++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - outside & next - show-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover
+++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - outside - hide-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover
 ++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - outside - toggle-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover
 ++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - outside - unrelated action' FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - outside - custom action' FOCUSABLE
-++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - outside - toggle-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover
-++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - outside & next - show-popover' EXPANDED FOCUSABLE
 ++++ROLE_SYSTEM_GROUPING ispopup:manual
 ++++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - inside - show-popover' FOCUSABLE
 ++++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - inside - hide-popover' FOCUSABLE
 ++++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - inside - toggle-popover' FOCUSABLE
 ++++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - inside - related action' FOCUSABLE
 ++++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - inside - custom action' FOCUSABLE
+++++ROLE_SYSTEM_PUSHBUTTON name='d4 button - outside & next - show-popover' FOCUSABLE
+++++ROLE_SYSTEM_PUSHBUTTON name='d4 button - outside - hide-popover' FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d4 button - outside - toggle-popover' FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d4 button - outside - unrelated action' FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d4 button - outside - custom action' FOCUSABLE
-++++ROLE_SYSTEM_PUSHBUTTON name='d4 button - outside - toggle-popover' FOCUSABLE
-++++ROLE_SYSTEM_PUSHBUTTON name='d4 button - outside & next - show-popover' FOCUSABLE
+++++ROLE_SYSTEM_PUSHBUTTON name='d5 button - outside & next - show-popover' COLLAPSED FOCUSABLE
+++++ROLE_SYSTEM_PUSHBUTTON name='d5 button - outside - hide-popover' COLLAPSED FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d5 button - outside - toggle-popover' COLLAPSED FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d5 button - outside - unrelated action' FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d5 button - outside - custom action' FOCUSABLE
-++++ROLE_SYSTEM_PUSHBUTTON name='d5 button - outside - toggle-popover' COLLAPSED FOCUSABLE
-++++ROLE_SYSTEM_PUSHBUTTON name='d5 button - outside & next - show-popover' COLLAPSED FOCUSABLE
-++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - unrelated action' FOCUSABLE
-++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - custom action' FOCUSABLE
-++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - hide-popover' COLLAPSED FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside & next - show-popover' COLLAPSED FOCUSABLE
+++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - hide-popover' COLLAPSED FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - toggle-popover' COLLAPSED FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - unrelated action' FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - custom action' FOCUSABLE
-++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - toggle-popover' COLLAPSED FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside & next - show-popover' COLLAPSED FOCUSABLE
 ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - hide-popover' COLLAPSED FOCUSABLE
+++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - toggle-popover' COLLAPSED FOCUSABLE
+++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - unrelated action' FOCUSABLE
+++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - custom action' FOCUSABLE
diff --git a/content/test/data/accessibility/html/commandfor-api-popover.html b/content/test/data/accessibility/html/commandfor-api-popover.html
index ed62bb62..7fcc26f 100644
--- a/content/test/data/accessibility/html/commandfor-api-popover.html
+++ b/content/test/data/accessibility/html/commandfor-api-popover.html
@@ -12,11 +12,11 @@
 -->
 
 <!-- Closed popover -->
+<button commandfor="d1" command="show-popover">d1 button - outside & next - show-popover</button>
+<button commandfor="d1" command="hide-popover">d1 button - outside - hide-popover</button>
 <button commandfor="d1" command="toggle-popover">d1 button - outside - toggle-popover</button>
 <button commandfor="d1" command="close">d1 button - outside - unrelated action</button>
 <button commandfor="d1" command="--frobulate">d1 button - outside - custom action</button>
-<button commandfor="d1" command="toggle-popover">d1 button - outside - toggle-popover</button>
-<button commandfor="d1" command="show-popover">d1 button - outside & next - show-popover</button>
 <div id="d1" popover>
   <button commandfor="d1" command="show-popover">d1 button - inside - show-popover</button>
   <button commandfor="d1" command="hide-popover">d1 button - inside - hide-popover</button>
@@ -26,11 +26,11 @@
 </div>
 
 <!-- Opened popover -->
+<button commandfor="d2" command="show-popover">d2 button - outside & next - show-popover</button>
+<button commandfor="d2" command="hide-popover">d2 button - outside - hide-popover</button>
 <button commandfor="d2" command="toggle-popover">d2 button - outside - toggle-popover</button>
 <button commandfor="d2" command="close">d2 button - outside - unrelated action</button>
 <button commandfor="d2" command="--frobulate">d2 button - outside - custom action</button>
-<button commandfor="d2" command="toggle-popover">d2 button - outside - toggle-popover</button>
-<button commandfor="d2" command="show-popover">d2 button - outside & next - show-popover</button>
 <div id="d2" popover>
   <button commandfor="d2" command="show-popover">d2 button - inside - show-popover</button>
   <button commandfor="d2" command="hide-popover">d2 button - inside - hide-popover</button>
@@ -40,11 +40,11 @@
 </div>
 
 <!-- Opened manual popover -->
+<button commandfor="d3" command="show-popover">d3 button - outside & next - show-popover</button>
+<button commandfor="d3" command="hide-popover">d3 button - outside - hide-popover</button>
 <button commandfor="d3" command="toggle-popover">d3 button - outside - toggle-popover</button>
 <button commandfor="d3" command="close">d3 button - outside - unrelated action</button>
 <button commandfor="d3" command="--frobulate">d3 button - outside - custom action</button>
-<button commandfor="d3" command="toggle-popover">d3 button - outside - toggle-popover</button>
-<button commandfor="d3" command="show-popover">d3 button - outside & next - show-popover</button>
 <div id="d3" popover="manual">
   <button commandfor="d3" command="show-popover">d3 button - inside - show-popover</button>
   <button commandfor="d3" command="hide-popover">d3 button - inside - hide-popover</button>
@@ -54,18 +54,18 @@
 </div>
 
 <!-- Non-existent popover -->
+<button commandfor="d4" command="show-popover">d4 button - outside & next - show-popover</button>
+<button commandfor="d4" command="hide-popover">d4 button - outside - hide-popover</button>
 <button commandfor="d4" command="toggle-popover">d4 button - outside - toggle-popover</button>
 <button commandfor="d4" command="close">d4 button - outside - unrelated action</button>
 <button commandfor="d4" command="--frobulate">d4 button - outside - custom action</button>
-<button commandfor="d4" command="toggle-popover">d4 button - outside - toggle-popover</button>
-<button commandfor="d4" command="show-popover">d4 button - outside & next - show-popover</button>
 
 <!-- Hide Popover -->
+<button commandfor="d5" command="show-popover">d5 button - outside & next - show-popover</button>
+<button commandfor="d5" command="hide-popover">d5 button - outside - hide-popover</button>
 <button commandfor="d5" command="toggle-popover">d5 button - outside - toggle-popover</button>
 <button commandfor="d5" command="close">d5 button - outside - unrelated action</button>
 <button commandfor="d5" command="--frobulate">d5 button - outside - custom action</button>
-<button commandfor="d5" command="toggle-popover">d5 button - outside - toggle-popover</button>
-<button commandfor="d5" command="show-popover">d5 button - outside & next - show-popover</button>
 <div popover id="d5">
   <button commandfor="d5" command="show-popover">d5 button - inside - show-popover</button>
   <button commandfor="d5" command="hide-popover">d5 button - inside - hide-popover</button>
@@ -75,11 +75,11 @@
 </div>
 
 <!-- Closed popover with toggle as next -->
+<button commandfor="d6" command="show-popover">d1 button - outside & next - show-popover</button>
+<button commandfor="d6" command="hide-popover">d1 button - outside - hide-popover</button>
+<button commandfor="d6" command="toggle-popover">d1 button - outside - toggle-popover</button>
 <button commandfor="d6" command="close">d1 button - outside - unrelated action</button>
 <button commandfor="d6" command="--frobulate">d1 button - outside - custom action</button>
-<button commandfor="d6" command="hide-popover">d1 button - outside - hide-popover</button>
-<button commandfor="d6" command="show-popover">d1 button - outside & next - show-popover</button>
-<button commandfor="d6" command="toggle-popover">d1 button - outside - toggle-popover</button>
 <div id="d6" popover>
   <button commandfor="d6" command="show-popover">d1 button - inside - show-popover</button>
   <button commandfor="d6" command="hide-popover">d1 button - inside - hide-popover</button>
@@ -89,11 +89,11 @@
 </div>
 
 <!-- Closed popover with hide as next -->
-<button commandfor="d6" command="close">d1 button - outside - unrelated action</button>
-<button commandfor="d6" command="--frobulate">d1 button - outside - custom action</button>
-<button commandfor="d6" command="toggle-popover">d1 button - outside - toggle-popover</button>
 <button commandfor="d6" command="show-popover">d1 button - outside & next - show-popover</button>
 <button commandfor="d6" command="hide-popover">d1 button - outside - hide-popover</button>
+<button commandfor="d6" command="toggle-popover">d1 button - outside - toggle-popover</button>
+<button commandfor="d6" command="close">d1 button - outside - unrelated action</button>
+<button commandfor="d6" command="--frobulate">d1 button - outside - custom action</button>
 <div id="d6" popover>
   <button commandfor="d6" command="show-popover">d1 button - inside - show-popover</button>
   <button commandfor="d6" command="hide-popover">d1 button - inside - hide-popover</button>
diff --git a/content/test/data/gpu/pixel_video_test.js b/content/test/data/gpu/pixel_video_test.js
index 96f22e1..cf0d1ff3 100644
--- a/content/test/data/gpu/pixel_video_test.js
+++ b/content/test/data/gpu/pixel_video_test.js
@@ -61,7 +61,7 @@
   getParametersTesting();
 
   video.onerror = e => {
-    logOutput(`Video playback error occurred: ${e.message}`);
+    logOutput(`Video playback error occurred: ${video.error.message}`);
     abort = true;
     domAutomationController.send('FAIL');
   };
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
index 4922471f..ccae9d5 100644
--- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -513,6 +513,13 @@
 crbug.com/421948893 [ android android-corsola ] Pixel_Video_MP4_Rounded_Corner [ Failure ]
 crbug.com/422226030 [ android android-corsola ] Pixel_Video_HEVC [ Failure ]
 
+# Flaky on Mac Intel
+crbug.com/417899571 [ mac intel-0x3e9b angle-metal ] Pixel_VideoStreamFrom2DAlphaCanvas_DisableReadbackFromTexture [ Failure ]
+crbug.com/417899571 [ mac intel-0x3e9b angle-metal ] Pixel_VideoStreamFrom2DCanvas [ Failure ]
+crbug.com/417899571 [ mac intel-0x3e9b angle-metal ] Pixel_VideoStreamFromWebGLCanvas [ Failure ]
+crbug.com/417899571 [ mac intel-0x3e9b angle-metal ] Pixel_VideoStreamFromWebGLCanvas_OneCopy [ Failure ]
+crbug.com/417899571 [ mac intel-0x3e9b angle-metal ] Pixel_VideoStreamFromWebGLCanvas_TwoCopy_Accelerated [ Failure ]
+
 #######################################################################
 # Automated Entries After This Point - Do Not Manually Add Below Here #
 #######################################################################
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
index 89eaf36e..ae29812 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -728,6 +728,8 @@
 crbug.com/658724 [ angle-opengl intel mac ] deqp/functional/gles3/framebufferblit/rect_03.html [ Failure ]
 crbug.com/658724 [ angle-opengl intel mac ] deqp/functional/gles3/framebufferblit/rect_04.html [ Failure ]
 crbug.com/1334684 [ mac intel angle-metal ] deqp/functional/gles3/shaderbuiltinvar.html [ Failure ]
+crbug.com/425369464 [ mac intel angle-metal ] conformance2/textures/image_bitmap_from_video/tex-2d-r32f-red-float.html [ Failure ]
+crbug.com/425369464 [ mac intel angle-metal ] conformance2/textures/video/tex-3d-r11f_g11f_b10f-rgb-float.html [ Failure ]
 
 crbug.com/angleproject/5222 [ mac passthrough angle-opengl intel ] conformance2/textures/misc/tex-unpack-params.html [ Failure ]
 crbug.com/angleproject/5226 [ mac passthrough angle-opengl intel ] deqp/functional/gles3/texturespecification/basic_copyteximage2d.html [ Failure ]
diff --git a/content/web_test/renderer/test_plugin.cc b/content/web_test/renderer/test_plugin.cc
index f52f006..960ab55 100644
--- a/content/web_test/renderer/test_plugin.cc
+++ b/content/web_test/renderer/test_plugin.cc
@@ -307,6 +307,7 @@
     // display compositor later.
     shared_image_ = sii->CreateSharedImage(
         {viz::SinglePlaneFormat::kRGBA_8888, rect_.size(), gfx::ColorSpace(),
+         kBottomLeft_GrSurfaceOrigin, kPremul_SkAlphaType,
          gpu::SHARED_IMAGE_USAGE_GLES2_WRITE |
              gpu::SHARED_IMAGE_USAGE_DISPLAY_READ,
          "TestLabel"},
@@ -336,6 +337,7 @@
     shared_image_ =
         shared_image_interface_->CreateSharedImageForSoftwareCompositor(
             {format, rect_.size(), gfx::ColorSpace(),
+             kBottomLeft_GrSurfaceOrigin, kPremul_SkAlphaType,
              gpu::SHARED_IMAGE_USAGE_CPU_WRITE_ONLY, "TestPluginSharedBitmap"});
     sync_token_ = shared_image_interface_->GenVerifiedSyncToken();
 
@@ -368,27 +370,16 @@
     viz::ReleaseCallback* release_callback) {
   if (!content_changed_)
     return false;
-  gfx::Size size(rect_.size());
 
-  if (shared_image_ && !gl_) {
-    *resource = viz::TransferableResource::MakeSoftwareSharedImage(
-        shared_image_, sync_token_, shared_image_->size(),
-        viz::SinglePlaneFormat::kBGRA_8888,
-        viz::TransferableResource::ResourceSource::kCanvas);
-    *release_callback =
-        base::BindOnce(&ReleaseSharedImage, std::move(shared_image_));
-    sync_token_ = gpu::SyncToken();
-  } else if (shared_image_) {
-    *resource = viz::TransferableResource::MakeGpu(
-        shared_image_, GL_TEXTURE_2D, sync_token_, size,
-        viz::SinglePlaneFormat::kRGBA_8888, false /* is_overlay_candidate */);
-    // We pass ownership of the shared image to the callback.
-    *release_callback = base::BindOnce(&ReleaseSharedImage,
-                                       std::exchange(shared_image_, nullptr));
-    sync_token_ = gpu::SyncToken();
-  }
-  resource->origin = kBottomLeft_GrSurfaceOrigin;
-  resource->size = size;
+  *resource = viz::TransferableResource::Make(
+      shared_image_, viz::TransferableResource::ResourceSource::kCanvas,
+      sync_token_);
+  // We pass ownership of the shared image to the callback.
+  *release_callback = base::BindOnce(&ReleaseSharedImage,
+                                     std::exchange(shared_image_, nullptr));
+
+  sync_token_ = gpu::SyncToken();
+
   content_changed_ = false;
   return true;
 }
diff --git a/crypto/PLAN.md b/crypto/PLAN.md
new file mode 100644
index 0000000..d47cd67
--- /dev/null
+++ b/crypto/PLAN.md
@@ -0,0 +1,196 @@
+# //crypto plan
+
+This doc outlines what the current maintainers of //crypto are doing with this
+directory and why. If you feel like pitching in with any of these tasks, please
+do. All of them are happening across the entire //crypto directory, tracked by
+bugs in [Chromium > Internals > Crypto](https://issues.chromium.org/issues?q=status:open%20componentid:1768937&s=created_time:desc)
+and by the overall [tend to //crypto bug](https://issues.chromium.org/issues/367888389).
+
+If you have questions that aren't answered here, or would just like to help out,
+visit [#security in slack](https://app.slack.com/client/T039UTRBS/CGK7KLZD4).
+
+## Use Spans & Arrays When Possible
+
+Convert functions that use (pointer, length) pairs to functions that use spans.
+Also, favor return types that indicate that the contained data is bytes rather
+than text, use fixed-size types when possible, and favor returning values rather
+than using out parameters.
+
+In general, crypto functions accept and return bytes, so for inputs:
+
+* `base::span<const uint8_t, N>` for fixed-size inputs
+* `base::span<const uint8_t>` for variably-sized inputs
+* `std::string_view` overloads if there are many callers that need to pass text
+  in directly
+
+And for outputs:
+
+* Returning `std::array<uint8_t, N>` for fixed-size outputs
+* Returning `std::vector<uint8_t>` for variably-sized outputs
+
+If an out parameter is needed, `std::span<uint8_t, N>` or `std::span<uint8_t>`
+should be used, but generally you can avoid these.
+
+If a function can fail (eg, decryption for an AEAD) but also needs to return a
+value, it should return a `std::optional<std::array<uint8_t, N>>` or `
+std::optional<std::vector<uint8_t>>` so that callers can't fail to check the
+result. Don't return a success/failure bool and use an out parameter.
+
+In all cases, never use (pointer, length) in //crypto APIs - there are always
+better choices.
+
+## Reduce Heap Allocations
+
+As a general rule, let callers pass in spans of raw bytes, and return
+std::arrays when returning new values, which gives the caller the most control
+over allocation behavior. Let callers that need long-lived copies of return
+values make those copies themselves.
+
+Also, avoid factory functions that return `unique_ptr<T>` unless you really need
+the caller to have a separate heap-allocated object - prefer factory functions
+that return a `T` directly, or a `std::optional<T>` if creation has to be
+fallible.
+
+## Prefer Statelessness
+
+For API design, prefer a free function over an object - don't have an object
+unless the operations being done actually are stateful (eg, a streaming hash /
+encryption API) or have expensive setup work that shouldn't be repeated (eg,
+parsing an ASN.1 structure). Also, prefer objects that just hold state and are
+used by free functions over adding methods to those objects.
+
+For example, instead of:
+
+```
+class RSAEncryptor {
+ public:
+  RSAEncryptor();
+  bool ImportKey(base::span<const uint8_t> key);
+  void GenerateKey(size_t length);
+
+  std::vector<uint8_t> EncryptPKCS1v15(base::span<const uint8_t> message);
+  std::vector<uint8_t> EncryptOAEP(base::span<const uint8_t> message, ...);
+ private:
+  bssl::ScopedEVP_PKEY key_;
+};
+```
+
+prefer something like:
+
+```
+class RSAKey {
+ public:
+  // Note that these are both static, so these are both also basically free
+  // functions.
+  static RSAKey Generate(size_t length);
+  static std::optional<RSAKey> Import(base::span<const uint8_t> key);
+ private:
+  RSAKey();
+  bssl::ScopedEVP_PKEY key_;
+};
+
+std::vector<uint8_t> EncryptPKCS1v15(const RSAKey& key,
+                                     base::span<const uint8_t> message);
+std::vector<uint8_t> EncryptOAEP(const RSAKey& key,
+                                 base::span<const uint8_t> message,
+                                 ...);
+```
+
+Since places that need to handle cryptographic state are far more common than
+places that need to do cryptographic operations, it's helpful to separate the
+state from the operations like this. In some cases, the operations are actually
+in a separate header file (eg [crypto/keypair.h](keypair.h) vs
+[crypto/sign.h](sign.h).
+
+## Don't Handle OOM Conditions
+
+Older //crypto APIs often tolerate `nullptr` returns from BoringSSL, even in
+situations where these can only happen as a result of lack of memory. To
+tolerate that, the //crypto APIs were made "fallible" in that they themselves
+could return `nullptr` or `false` or otherwise fail to do what they were
+supposed to.
+
+In production chromium code, BoringSSL can never return an OOM failure: OOMs
+cause an orderly runtime crash in the memory allocator. That means that any OOM
+return is a can't-happen case in //crypto, and we should `CHECK()` that they
+never happen (in case `nullptr` gets returned from some other reason, which
+might indicate a bug on our part).
+
+That means that old code which looks like this:
+
+```
+  bssl::UniquePtr<RSA> rsa_key(RSA_new());
+  bssl::UniquePtr<BIGNUM> bn(BN_new());
+  if (!rsa_key.get() || !bn.get() || !BN_set_word(bn.get(), 65537L))
+    return nullptr;
+```
+
+would instead just be:
+
+```
+  bssl::UniquePtr<RSA> rsa_key(RSA_new());
+  bssl::UniquePtr<BIGNUM> bn(BN_new());
+
+  CHECK(rsa_key.get());
+  CHECK(bn.get());
+  CHECK(BN_set_word(bn.get(), 65537L));
+```
+
+with the result that, from the caller's perspective, generating an RSA key now
+cannot fail. That simplifies client code a lot.
+
+## Don't Support Obsolete Crypto
+
+In general, //crypto should not expose broken or obsolete mechanisms to callers.
+Unfortunately Chromium is sometimes required to use these mechanisms anyway for
+compatibility; when we do have to add them, prefer to put them in
+//crypto/obsolete with explicit restrictions on who can use them. See for
+example [crypto/obsolete/md5.h](obsolete/md5.h).
+
+Right now we consider these mechanisms obsolete, but they are still used in some
+places in the codebase:
+
+* MD5
+* SHA-1
+* RSA with key lengths less than 2048
+
+## Be Explicit About What Primitives Are Used
+
+Don't build an API like:
+
+```
+std::vector<uint8_t> SecureHash(base::span<const uint8_t> input);
+```
+
+This might seem appealing at first because it looks like it might allow us to
+upgrade the hash function callers are using without changing call sites, but in
+practice, you will have to implement it with a specific underlying hash
+function. Once you do that, callers who actually do require *specifically that
+hash function* will begin calling your wrapper function instead, thus forcing
+you never to switch hash functions anyway. At the //crypto layer, it's better to
+instead just expose:
+
+```
+std::array<uint8_t, ...> Sha256(base::span<const uint8_t> input);
+std::array<uint8_t, ...> Sha512(base::span<const uint8_t> input);
+```
+
+... and so on, and force callers to explicitly specify what they want. Leave
+opinionated wrappers like the hypothetical `SecureHash` to higher layers.
+
+## Write Unit Tests
+
+Some of the older //crypto code has few or no tests. When you're adding a new
+API, try to write thorough test cases for it. Using existing known-answer tests
+is best - often the relevant spec will include these, and you can be very
+confident that they are correct.
+
+If your API is too difficult to unit-test, it is probably poorly designed and
+you should rethink it.
+
+Also, you can reasonably assume the underlying BoringSSL primitive works
+correctly, so it's not necessary to write tests asserting that BoringSSL itself
+rejects invalid inputs / etc (although it is fine to write tests for the failure
+behavior of //crypto APIs). In general one or two known-answer tests are
+sufficient to ensure that data is being passed into and out of BoringSSL
+correctly.
diff --git a/crypto/README.md b/crypto/README.md
new file mode 100644
index 0000000..9d18d6a3
--- /dev/null
+++ b/crypto/README.md
@@ -0,0 +1,15 @@
+# //crypto README
+
+This directory contains implementations of crypto primitives for use in
+Chromium. Most of these are either:
+
+* Wrappers around platform-specific APIs (DPAPI, libsecret, etc), so that code
+  elsewhere in Chromium can use cross-platform abstractions, or
+* Wrappers around BoringSSL APIs that use Chromium-native types like base::span
+  and similar
+
+There is very little actual cryptographic code in //crypto - it is mostly
+wrappers.
+
+This directory is actively being refactored as of 2025-06. See
+[PLAN.md](PLAN.md).
diff --git a/device/fido/fido_discovery_factory.h b/device/fido/fido_discovery_factory.h
index a1ea2ca..efa9e4c 100644
--- a/device/fido/fido_discovery_factory.h
+++ b/device/fido/fido_discovery_factory.h
@@ -15,7 +15,6 @@
 #include "base/containers/span.h"
 #include "base/memory/raw_ptr.h"
 #include "build/build_config.h"
-#include "components/sync/protocol/webauthn_credential_specifics.pb.h"
 #include "device/fido/cable/cable_discovery_data.h"
 #include "device/fido/cable/v2_constants.h"
 #include "device/fido/ctap_get_assertion_request.h"
diff --git a/docs/adding_to_third_party.md b/docs/adding_to_third_party.md
index 4453757..db5663d 100644
--- a/docs/adding_to_third_party.md
+++ b/docs/adding_to_third_party.md
@@ -71,6 +71,13 @@
 as existing, will it be easy for another developer to understand which should be
 used where? Will you commit to consolidating uses in Chromium and remove the
 alternative libraries?
+* Is the library memory safe? If not, is there an alternative library
+available that is memory safe and meets Chromium's needs?
+  * You will be responsible for [owning the library](#add-owners), which
+    includes updating it for security and stability fixes. For C/C++, this is
+    your responsibility.  For [Rust](#rust), minor version updates are regularly
+    handled by a rotation, so you are only responsible for major version updates
+    (and minor version updates which result in `gnrt` or Chromium CQ failures).
 * For desktop (Win/Mac/Linux/ChromeOS), does the dependency introduce closed
 source components (e.g., binaries, WASM binaries, obfuscated code)? If yes,
 please reach out to Chrome ATLs.
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc
index a984cf8c..2bcc217 100644
--- a/extensions/renderer/dispatcher.cc
+++ b/extensions/renderer/dispatcher.cc
@@ -81,7 +81,6 @@
 #include "extensions/renderer/module_system.h"
 #include "extensions/renderer/native_extension_bindings_system.h"
 #include "extensions/renderer/renderer_extension_registry.h"
-#include "extensions/renderer/renderer_frame_context_data.h"
 #include "extensions/renderer/safe_builtins.h"
 #include "extensions/renderer/script_context.h"
 #include "extensions/renderer/script_context_set.h"
@@ -603,7 +602,7 @@
   }
 }
 
-void Dispatcher::WillPrepareForEvaluationOnWorkerThread(
+void Dispatcher::WillEvaluateServiceWorkerOnWorkerThread(
     blink::WebServiceWorkerContextProxy* context_proxy,
     v8::Local<v8::Context> v8_context,
     int64_t service_worker_version_id,
@@ -731,6 +730,7 @@
   RequireGuestViewModules(context);
 #endif
 
+  WorkerThreadDispatcher::GetServiceWorkerData()->Init();
   g_worker_script_context_set.Get().Insert(base::WrapUnique(context));
 
   const base::TimeDelta elapsed = base::TimeTicks::Now() - start_time;
@@ -739,22 +739,6 @@
   service_worker_context_state = ServiceWorkerContextState::kInitialized;
 }
 
-void Dispatcher::WillEvaluateServiceWorkerOnWorkerThread() {
-  const int thread_id = content::WorkerThread::GetCurrentId();
-  CHECK_NE(thread_id, kMainThreadId);
-
-  // `WillPrepareForEvaluationOnWorkerThread` should have run and updated
-  // `service_worker_context_state`.
-  CHECK_NE(service_worker_context_state,
-           extensions::ServiceWorkerContextState::kDefault);
-
-  if (service_worker_context_state != ServiceWorkerContextState::kInitialized) {
-    return;
-  }
-
-  WorkerThreadDispatcher::GetServiceWorkerData()->Init();
-}
-
 void Dispatcher::WillReleaseScriptContext(
     blink::WebLocalFrame* frame,
     const v8::Local<v8::Context>& v8_context,
diff --git a/extensions/renderer/dispatcher.h b/extensions/renderer/dispatcher.h
index dad2104..9d4c74b7 100644
--- a/extensions/renderer/dispatcher.h
+++ b/extensions/renderer/dispatcher.h
@@ -144,12 +144,12 @@
       const GURL& service_worker_scope,
       const GURL& script_url);
 
-  // This is called before a service worker prepares script engine for
-  // evaluation.
+  // This is called immediately before a service worker evaluates the
+  // toplevel script. This method installs extension API bindings.
   //
   // Runs on a different thread and should only use thread-safe member
   // variables.
-  void WillPrepareForEvaluationOnWorkerThread(
+  void WillEvaluateServiceWorkerOnWorkerThread(
       blink::WebServiceWorkerContextProxy* context_proxy,
       v8::Local<v8::Context> v8_context,
       int64_t service_worker_version_id,
@@ -157,13 +157,6 @@
       const GURL& script_url,
       const blink::ServiceWorkerToken& service_worker_token);
 
-  // This is called immediately before a service worker evaluates the
-  // toplevel script. This method installs extension API bindings.
-  //
-  // Runs on a different thread and should only use thread-safe member
-  // variables.
-  void WillEvaluateServiceWorkerOnWorkerThread();
-
   void WillReleaseScriptContext(blink::WebLocalFrame* frame,
                                 const v8::Local<v8::Context>& context,
                                 int32_t world_id);
diff --git a/extensions/renderer/module_system.cc b/extensions/renderer/module_system.cc
index b4bee1e..66eb37b 100644
--- a/extensions/renderer/module_system.cc
+++ b/extensions/renderer/module_system.cc
@@ -198,9 +198,9 @@
     CHECK(GetPrivate(global, kModuleSystem, &dummy_value));
   }
 
-  if (context_->context_type() == mojom::ContextType::kPrivilegedExtension &&
-      ContextNeedsMojoBindings(context_) &&
-      blink::WebV8Features::IsSupported(context->v8_context())) {
+  if (context_->GetRenderFrame() &&
+      context_->context_type() == mojom::ContextType::kPrivilegedExtension &&
+      !context_->IsForServiceWorker() && ContextNeedsMojoBindings(context_)) {
     // Valid enablement code path, so need to ensure MojoJS is allowed for the
     // process before attempting to enable it.
     blink::WebV8Features::AllowMojoJSForProcess();
diff --git a/infra/config/generated/builder-owners/clank-engprod@google.com.txt b/infra/config/generated/builder-owners/clank-engprod@google.com.txt
index b44b163f1..497155f 100644
--- a/infra/config/generated/builder-owners/clank-engprod@google.com.txt
+++ b/infra/config/generated/builder-owners/clank-engprod@google.com.txt
@@ -28,6 +28,7 @@
 ci/android-15-x64-fyi-rel
 ci/android-15-x64-rel
 ci/android-16-x64-fyi-rel
+ci/android-16-x64-rel
 ci/android-archive-rel
 ci/android-arm64-proguard-rel
 ci/android-bfcache-rel
@@ -64,6 +65,7 @@
 try/android-15-x64-fyi-rel
 try/android-15-x64-rel
 try/android-16-x64-fyi-rel
+try/android-16-x64-rel
 try/android-clobber-rel
 try/android-desktop-15-x64-fyi-rel
 try/android-desktop-15-x64-rel
diff --git a/infra/config/generated/builders/ci/Mac Builder Next/targets/chromium.fyi.json b/infra/config/generated/builders/ci/Mac Builder Next/targets/chromium.fyi.json
index 31d3fb2..4bfb18e 100644
--- a/infra/config/generated/builders/ci/Mac Builder Next/targets/chromium.fyi.json
+++ b/infra/config/generated/builders/ci/Mac Builder Next/targets/chromium.fyi.json
@@ -12,7 +12,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -27,7 +27,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -42,7 +42,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -58,7 +58,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -73,7 +73,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -88,7 +88,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -103,7 +103,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -118,7 +118,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -141,7 +141,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -156,7 +156,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -171,7 +171,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -186,7 +186,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 25
@@ -205,7 +205,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -220,7 +220,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -235,7 +235,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -250,7 +250,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -265,7 +265,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -280,7 +280,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -295,7 +295,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 3
@@ -311,7 +311,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 8
@@ -327,7 +327,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -343,7 +343,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -358,7 +358,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -373,7 +373,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -388,7 +388,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -403,7 +403,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -418,7 +418,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -434,7 +434,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -449,7 +449,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -464,7 +464,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -479,7 +479,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -494,7 +494,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -509,7 +509,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -524,7 +524,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -539,7 +539,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -554,7 +554,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -569,7 +569,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -584,7 +584,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -599,7 +599,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -614,7 +614,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -629,7 +629,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -644,7 +644,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 7
@@ -660,7 +660,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -675,7 +675,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -691,7 +691,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -706,7 +706,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -721,7 +721,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -736,7 +736,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -751,7 +751,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -766,7 +766,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -781,7 +781,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -796,7 +796,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -811,7 +811,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -826,7 +826,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -841,7 +841,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -856,7 +856,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -871,7 +871,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -886,7 +886,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -901,7 +901,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -916,7 +916,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -931,7 +931,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -946,7 +946,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -961,7 +961,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -976,7 +976,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -991,7 +991,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1006,7 +1006,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1021,7 +1021,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 3
@@ -1037,7 +1037,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1052,7 +1052,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1067,7 +1067,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1082,7 +1082,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1097,7 +1097,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1112,7 +1112,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1127,7 +1127,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1142,7 +1142,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1157,7 +1157,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1172,7 +1172,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1187,7 +1187,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1202,7 +1202,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1225,7 +1225,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1246,7 +1246,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1261,7 +1261,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1282,7 +1282,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1301,7 +1301,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1320,7 +1320,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1338,7 +1338,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1353,7 +1353,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1371,7 +1371,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1389,7 +1389,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1411,7 +1411,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -1435,7 +1435,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -1458,7 +1458,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
diff --git a/infra/config/generated/builders/ci/android-16-x64-fyi-rel/targets/chromium.android.fyi.json b/infra/config/generated/builders/ci/android-16-x64-fyi-rel/targets/chromium.android.fyi.json
index a6a1369..9de9a9e 100644
--- a/infra/config/generated/builders/ci/android-16-x64-fyi-rel/targets/chromium.android.fyi.json
+++ b/infra/config/generated/builders/ci/android-16-x64-fyi-rel/targets/chromium.android.fyi.json
@@ -3,3292 +3,6 @@
     "gtest_tests": [
       {
         "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "absl_hardening_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "absl_hardening_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "absl_hardening_tests",
-        "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "android_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "android_browsertests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 4
-        },
-        "test": "android_browsertests",
-        "test_id_prefix": "ninja://chrome/test:android_browsertests/"
-      },
-      {
-        "args": [
-          "--disable-field-trial-config",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "ci_only": true,
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "android_browsertests_no_fieldtrial"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "android_browsertests_no_fieldtrial",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test": "android_browsertests",
-        "test_id_prefix": "ninja://chrome/test:android_browsertests/"
-      },
-      {
-        "args": [
-          "--test-launcher-batch-limit=1",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "android_sync_integration_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "android_sync_integration_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "android_sync_integration_tests",
-        "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "android_webview_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "android_webview_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "android_webview_unittests",
-        "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/"
-      },
-      {
-        "args": [
-          "-v",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "angle_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "angle_unittests",
-        "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "base_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "base_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "base_unittests",
-        "test_id_prefix": "ninja://base:base_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "blink_common_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "blink_common_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_common_unittests",
-        "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "blink_heap_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "blink_heap_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_heap_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/"
-      },
-      {
-        "args": [
-          "--git-revision=${got_revision}",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "blink_platform_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "blink_platform_unittests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_platform_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "boringssl_crypto_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "boringssl_crypto_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "boringssl_crypto_tests",
-        "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "boringssl_ssl_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "boringssl_ssl_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "boringssl_ssl_tests",
-        "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/"
-      },
-      {
-        "args": [
-          "--gtest_filter=-*UsingRealWebcam*",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "capture_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "capture_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "capture_unittests",
-        "test_id_prefix": "ninja://media/capture:capture_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "cast_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "cast_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cast_unittests",
-        "test_id_prefix": "ninja://media/cast:cast_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "cc_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "cc_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cc_unittests",
-        "test_id_prefix": "ninja://cc:cc_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "ci_only": true,
-        "description": "Run with android_36_google_apis_x64",
-        "experiment_percentage": 100,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "chrome_public_apk_profile_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "chrome_public_apk_profile_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chrome_public_apk_baseline_profile_generator",
-        "test_id_prefix": "ninja://chrome/test/android:chrome_public_apk_baseline_profile_generator/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "chrome_public_smoke_test"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "chrome_public_smoke_test",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chrome_public_smoke_test",
-        "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/"
-      },
-      {
-        "args": [
-          "--git-revision=${got_revision}",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "chrome_public_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "chrome_public_test_apk",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 20
-        },
-        "test": "chrome_public_test_apk",
-        "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/"
-      },
-      {
-        "args": [
-          "--git-revision=${got_revision}",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "chrome_public_unit_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "chrome_public_unit_test_apk",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 4
-        },
-        "test": "chrome_public_unit_test_apk",
-        "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "components_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "components_browsertests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "components_browsertests",
-        "test_id_prefix": "ninja://components:components_browsertests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "components_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "components_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 6
-        },
-        "test": "components_unittests",
-        "test_id_prefix": "ninja://components:components_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_16.content_browsertests.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "content_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "content_browsertests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 30
-        },
-        "test": "content_browsertests",
-        "test_id_prefix": "ninja://content/test:content_browsertests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.content_shell_test_apk.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "content_shell_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "content_shell_test_apk",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test": "content_shell_test_apk",
-        "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "content_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "content_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test": "content_unittests",
-        "test_id_prefix": "ninja://content/test:content_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "crashpad_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "crashpad_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "crashpad_tests",
-        "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "crypto_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "crypto_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "crypto_unittests",
-        "test_id_prefix": "ninja://crypto:crypto_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "device_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "device_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "device_unittests",
-        "test_id_prefix": "ninja://device:device_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "display_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "display_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "display_unittests",
-        "test_id_prefix": "ninja://ui/display:display_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "ci_only": true,
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "env_chromium_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "env_chromium_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "env_chromium_unittests",
-        "test_id_prefix": "ninja://third_party/leveldatabase:env_chromium_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "events_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "events_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "events_unittests",
-        "test_id_prefix": "ninja://ui/events:events_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "fuzzing_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "fuzzing_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "fuzzing_unittests",
-        "test_id_prefix": "ninja://testing/libfuzzer/tests:fuzzing_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gcm_unit_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gcm_unit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gcm_unit_tests",
-        "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gfx_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gfx_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gfx_unittests",
-        "test_id_prefix": "ninja://ui/gfx:gfx_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gin_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gin_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gin_unittests",
-        "test_id_prefix": "ninja://gin:gin_unittests/"
-      },
-      {
-        "args": [
-          "--use-cmd-decoder=validating",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gl_tests_validating"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gl_tests_validating",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gl_tests",
-        "test_id_prefix": "ninja://gpu:gl_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gl_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gl_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gl_unittests",
-        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "google_apis_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "google_apis_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "google_apis_unittests",
-        "test_id_prefix": "ninja://google_apis:google_apis_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gpu_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gpu_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gpu_unittests",
-        "test_id_prefix": "ninja://gpu:gpu_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gwp_asan_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gwp_asan_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gwp_asan_unittests",
-        "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "ipc_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "ipc_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ipc_tests",
-        "test_id_prefix": "ninja://ipc:ipc_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "jni_zero_sample_apk_test"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "jni_zero_sample_apk_test",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "jni_zero_sample_apk_test",
-        "test_id_prefix": "ninja://third_party/jni_zero/sample:jni_zero_sample_apk_test/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "latency_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "latency_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "latency_unittests",
-        "test_id_prefix": "ninja://ui/latency:latency_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "ci_only": true,
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "leveldb_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "leveldb_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "leveldb_unittests",
-        "test_id_prefix": "ninja://third_party/leveldatabase:leveldb_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "libjingle_xmpp_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "libjingle_xmpp_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "libjingle_xmpp_unittests",
-        "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "liburlpattern_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "liburlpattern_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "liburlpattern_unittests",
-        "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "media_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "media_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_unittests",
-        "test_id_prefix": "ninja://media:media_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "midi_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "midi_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "midi_unittests",
-        "test_id_prefix": "ninja://media/midi:midi_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "minidump_uploader_test"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "minidump_uploader_test",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "minidump_uploader_test",
-        "test_id_prefix": "ninja://components/minidump_uploader:minidump_uploader_test/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "mojo_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "mojo_test_apk",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "mojo_test_apk",
-        "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "mojo_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "mojo_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "mojo_unittests",
-        "test_id_prefix": "ninja://mojo:mojo_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "net_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "net_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test": "net_unittests",
-        "test_id_prefix": "ninja://net:net_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gtest_filter=-ScopedDirTest.CloseOutOfScope",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "perfetto_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "perfetto_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "perfetto_unittests",
-        "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "sandbox_linux_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "sandbox_linux_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sandbox_linux_unittests",
-        "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "services_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "services_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "services_unittests",
-        "test_id_prefix": "ninja://services:services_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "shell_dialogs_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "shell_dialogs_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "shell_dialogs_unittests",
-        "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "skia_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "skia_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "skia_unittests",
-        "test_id_prefix": "ninja://skia:skia_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "sql_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "sql_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sql_unittests",
-        "test_id_prefix": "ninja://sql:sql_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "storage_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "storage_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "storage_unittests",
-        "test_id_prefix": "ninja://storage:storage_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "system_webview_shell_layout_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "system_webview_shell_layout_test_apk",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "system_webview_shell_layout_test_apk",
-        "test_id_prefix": "ninja://android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "trichrome_chrome_bundle_smoke_test"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "trichrome_chrome_bundle_smoke_test",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "trichrome_chrome_bundle_smoke_test",
-        "test_id_prefix": "ninja://chrome/android:trichrome_chrome_bundle_smoke_test/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "ui_android_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "ui_android_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_android_unittests",
-        "test_id_prefix": "ninja://ui/android:ui_android_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "ui_base_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "ui_base_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_base_unittests",
-        "test_id_prefix": "ninja://ui/base:ui_base_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "ui_touch_selection_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "ui_touch_selection_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_touch_selection_unittests",
-        "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "unit_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "unit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "unit_tests",
-        "test_id_prefix": "ninja://chrome/test:unit_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "url_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "url_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "url_unittests",
-        "test_id_prefix": "ninja://url:url_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "video_encode_accelerator_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "video_encode_accelerator_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "video_encode_accelerator_tests",
-        "test_id_prefix": "ninja://media/gpu/test:video_encode_accelerator_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "viz_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "viz_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "viz_unittests",
-        "test_id_prefix": "ninja://components/viz:viz_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "webkit_unit_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "webkit_unit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 6
-        },
-        "test": "blink_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/"
-      },
-      {
-        "args": [
-          "--webview-process-mode=multiple",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "webview_instrumentation_test_apk_multiple_process_mode"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "webview_instrumentation_test_apk_multiple_process_mode",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test": "webview_instrumentation_test_apk",
-        "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/"
-      },
-      {
-        "args": [
           "--store-tombstones",
           "--emulator-debug-tags=all",
           "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
@@ -3460,147 +174,6 @@
         },
         "test": "webview_trichrome_64_cts_tests",
         "test_id_prefix": "ninja://android_webview/test:webview_trichrome_64_cts_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "webview_ui_test_app_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "webview_ui_test_app_test_apk",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "webview_ui_test_app_test_apk",
-        "test_id_prefix": "ninja://android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "wtf_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "wtf_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "wtf_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "zlib_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "zlib_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "zlib_unittests",
-        "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/ci/android-16-x64-rel/gn-args.json b/infra/config/generated/builders/ci/android-16-x64-rel/gn-args.json
new file mode 100644
index 0000000..382c163
--- /dev/null
+++ b/infra/config/generated/builders/ci/android-16-x64-rel/gn-args.json
@@ -0,0 +1,20 @@
+{
+  "gn_args": {
+    "android_static_analysis": "off",
+    "dcheck_always_on": false,
+    "debuggable_apks": false,
+    "ffmpeg_branding": "Chrome",
+    "is_component_build": false,
+    "is_debug": false,
+    "proprietary_codecs": true,
+    "strip_debug_info": true,
+    "symbol_level": 1,
+    "system_webview_package_name": "com.google.android.webview.debug",
+    "system_webview_shell_package_name": "org.chromium.my_webview_shell",
+    "target_cpu": "x64",
+    "target_os": "android",
+    "use_reclient": false,
+    "use_remoteexec": true,
+    "use_siso": true
+  }
+}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-16-x64-rel/properties.json b/infra/config/generated/builders/ci/android-16-x64-rel/properties.json
new file mode 100644
index 0000000..0f1fe45
--- /dev/null
+++ b/infra/config/generated/builders/ci/android-16-x64-rel/properties.json
@@ -0,0 +1,81 @@
+{
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "additional_exclusions": [
+        "infra/config/generated/builders/ci/android-16-x64-rel/gn-args.json"
+      ],
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "android-16-x64-rel",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-android-archive",
+              "builder_group": "chromium.android",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_android_config": {
+                "config": "base_config"
+              },
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "main_builder",
+                "target_arch": "intel",
+                "target_bits": 64,
+                "target_platform": "android"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "android"
+                ],
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "android-16-x64-rel",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "android-16-x64-rel",
+          "group": "tryserver.chromium.android"
+        }
+      ],
+      "retry_failed_shards": true,
+      "retry_invalid_shards": true,
+      "targets_spec_directory": "src/infra/config/generated/builders/ci/android-16-x64-rel/targets"
+    }
+  },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_monitoring": true,
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "metrics_project": "chromium-reclient-metrics",
+    "project": "rbe-chromium-trusted",
+    "remote_jobs": 500
+  },
+  "$recipe_engine/resultdb/test_presentation": {
+    "column_keys": [],
+    "grouping_keys": [
+      "status",
+      "v.test_suite"
+    ]
+  },
+  "builder_group": "chromium.android",
+  "recipe": "chromium"
+}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-16-x64-rel/shadow-properties.json b/infra/config/generated/builders/ci/android-16-x64-rel/shadow-properties.json
new file mode 100644
index 0000000..dc0a10e9
--- /dev/null
+++ b/infra/config/generated/builders/ci/android-16-x64-rel/shadow-properties.json
@@ -0,0 +1,14 @@
+{
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_monitoring": true,
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "metrics_project": "chromium-reclient-metrics",
+    "project": "rbe-chromium-untrusted",
+    "remote_jobs": 500
+  }
+}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-16-x64-rel/targets/chromium.android.json b/infra/config/generated/builders/ci/android-16-x64-rel/targets/chromium.android.json
new file mode 100644
index 0000000..36da7e5
--- /dev/null
+++ b/infra/config/generated/builders/ci/android-16-x64-rel/targets/chromium.android.json
@@ -0,0 +1,3361 @@
+{
+  "android-16-x64-rel": {
+    "gtest_tests": [
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "absl_hardening_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "absl_hardening_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "absl_hardening_tests",
+        "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "android_browsertests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "android_browsertests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 4
+        },
+        "test": "android_browsertests",
+        "test_id_prefix": "ninja://chrome/test:android_browsertests/"
+      },
+      {
+        "args": [
+          "--disable-field-trial-config",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "ci_only": true,
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "android_browsertests_no_fieldtrial"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "android_browsertests_no_fieldtrial",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "android_browsertests",
+        "test_id_prefix": "ninja://chrome/test:android_browsertests/"
+      },
+      {
+        "args": [
+          "--test-launcher-batch-limit=1",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "android_sync_integration_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "android_sync_integration_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_sync_integration_tests",
+        "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "android_webview_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "android_webview_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_webview_unittests",
+        "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/"
+      },
+      {
+        "args": [
+          "-v",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "angle_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_unittests",
+        "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "base_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "base_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "base_unittests",
+        "test_id_prefix": "ninja://base:base_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "blink_common_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "blink_common_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "blink_common_unittests",
+        "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "blink_heap_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "blink_heap_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "blink_heap_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/"
+      },
+      {
+        "args": [
+          "--git-revision=${got_revision}",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "blink_platform_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "blink_platform_unittests",
+        "precommit_args": [
+          "--gerrit-issue=${patch_issue}",
+          "--gerrit-patchset=${patch_set}",
+          "--buildbucket-id=${buildbucket_build_id}"
+        ],
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "blink_platform_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "boringssl_crypto_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "boringssl_crypto_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "boringssl_crypto_tests",
+        "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "boringssl_ssl_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "boringssl_ssl_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "boringssl_ssl_tests",
+        "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/"
+      },
+      {
+        "args": [
+          "--gtest_filter=-*UsingRealWebcam*",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "capture_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "capture_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "capture_unittests",
+        "test_id_prefix": "ninja://media/capture:capture_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "cast_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "cast_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "cast_unittests",
+        "test_id_prefix": "ninja://media/cast:cast_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "cc_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "cc_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "cc_unittests",
+        "test_id_prefix": "ninja://cc:cc_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "ci_only": true,
+        "description": "Run with android_36_google_apis_x64",
+        "experiment_percentage": 100,
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "chrome_public_apk_profile_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "chrome_public_apk_profile_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "chrome_public_apk_baseline_profile_generator",
+        "test_id_prefix": "ninja://chrome/test/android:chrome_public_apk_baseline_profile_generator/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "chrome_public_smoke_test"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "chrome_public_smoke_test",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "chrome_public_smoke_test",
+        "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/"
+      },
+      {
+        "args": [
+          "--git-revision=${got_revision}",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "chrome_public_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "chrome_public_test_apk",
+        "precommit_args": [
+          "--gerrit-issue=${patch_issue}",
+          "--gerrit-patchset=${patch_set}",
+          "--buildbucket-id=${buildbucket_build_id}"
+        ],
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 20
+        },
+        "test": "chrome_public_test_apk",
+        "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/"
+      },
+      {
+        "args": [
+          "--git-revision=${got_revision}",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "chrome_public_unit_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "chrome_public_unit_test_apk",
+        "precommit_args": [
+          "--gerrit-issue=${patch_issue}",
+          "--gerrit-patchset=${patch_set}",
+          "--buildbucket-id=${buildbucket_build_id}"
+        ],
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 4
+        },
+        "test": "chrome_public_unit_test_apk",
+        "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "components_browsertests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "components_browsertests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "components_browsertests",
+        "test_id_prefix": "ninja://components:components_browsertests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "components_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "components_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 6
+        },
+        "test": "components_unittests",
+        "test_id_prefix": "ninja://components:components_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_16.content_browsertests.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "content_browsertests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "content_browsertests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 30
+        },
+        "test": "content_browsertests",
+        "test_id_prefix": "ninja://content/test:content_browsertests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.content_shell_test_apk.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "content_shell_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "content_shell_test_apk",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "content_shell_test_apk",
+        "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "content_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "content_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "content_unittests",
+        "test_id_prefix": "ninja://content/test:content_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "crashpad_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "crashpad_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "crashpad_tests",
+        "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "crypto_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "crypto_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "crypto_unittests",
+        "test_id_prefix": "ninja://crypto:crypto_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "device_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "device_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "device_unittests",
+        "test_id_prefix": "ninja://device:device_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "display_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "display_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "display_unittests",
+        "test_id_prefix": "ninja://ui/display:display_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "ci_only": true,
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "env_chromium_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "env_chromium_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "env_chromium_unittests",
+        "test_id_prefix": "ninja://third_party/leveldatabase:env_chromium_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "events_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "events_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "events_unittests",
+        "test_id_prefix": "ninja://ui/events:events_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "fuzzing_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "fuzzing_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "fuzzing_unittests",
+        "test_id_prefix": "ninja://testing/libfuzzer/tests:fuzzing_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gcm_unit_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "gcm_unit_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gcm_unit_tests",
+        "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gfx_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "gfx_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gfx_unittests",
+        "test_id_prefix": "ninja://ui/gfx:gfx_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gin_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "gin_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gin_unittests",
+        "test_id_prefix": "ninja://gin:gin_unittests/"
+      },
+      {
+        "args": [
+          "--use-cmd-decoder=validating",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gl_tests_validating"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gl_tests",
+        "test_id_prefix": "ninja://gpu:gl_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gl_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "gl_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gl_unittests",
+        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "google_apis_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "google_apis_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "google_apis_unittests",
+        "test_id_prefix": "ninja://google_apis:google_apis_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gpu_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "gpu_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gpu_unittests",
+        "test_id_prefix": "ninja://gpu:gpu_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gwp_asan_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "gwp_asan_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gwp_asan_unittests",
+        "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "ipc_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "ipc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ipc_tests",
+        "test_id_prefix": "ninja://ipc:ipc_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "jni_zero_sample_apk_test"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "jni_zero_sample_apk_test",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "jni_zero_sample_apk_test",
+        "test_id_prefix": "ninja://third_party/jni_zero/sample:jni_zero_sample_apk_test/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "latency_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "latency_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "latency_unittests",
+        "test_id_prefix": "ninja://ui/latency:latency_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "ci_only": true,
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "leveldb_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "leveldb_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "leveldb_unittests",
+        "test_id_prefix": "ninja://third_party/leveldatabase:leveldb_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "libjingle_xmpp_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "libjingle_xmpp_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "libjingle_xmpp_unittests",
+        "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "liburlpattern_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "liburlpattern_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "liburlpattern_unittests",
+        "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "media_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "media_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "media_unittests",
+        "test_id_prefix": "ninja://media:media_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "midi_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "midi_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "midi_unittests",
+        "test_id_prefix": "ninja://media/midi:midi_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "minidump_uploader_test"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "minidump_uploader_test",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "minidump_uploader_test",
+        "test_id_prefix": "ninja://components/minidump_uploader:minidump_uploader_test/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "mojo_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "mojo_test_apk",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "mojo_test_apk",
+        "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "mojo_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "mojo_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "mojo_unittests",
+        "test_id_prefix": "ninja://mojo:mojo_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "net_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "net_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "net_unittests",
+        "test_id_prefix": "ninja://net:net_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gtest_filter=-ScopedDirTest.CloseOutOfScope",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "perfetto_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "perfetto_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "perfetto_unittests",
+        "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "sandbox_linux_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "sandbox_linux_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "sandbox_linux_unittests",
+        "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "services_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "services_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "services_unittests",
+        "test_id_prefix": "ninja://services:services_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "shell_dialogs_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "shell_dialogs_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "shell_dialogs_unittests",
+        "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "skia_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "skia_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "skia_unittests",
+        "test_id_prefix": "ninja://skia:skia_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "sql_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "sql_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "sql_unittests",
+        "test_id_prefix": "ninja://sql:sql_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "storage_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "storage_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "storage_unittests",
+        "test_id_prefix": "ninja://storage:storage_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "system_webview_shell_layout_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "system_webview_shell_layout_test_apk",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "system_webview_shell_layout_test_apk",
+        "test_id_prefix": "ninja://android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "trichrome_chrome_bundle_smoke_test"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "trichrome_chrome_bundle_smoke_test",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "trichrome_chrome_bundle_smoke_test",
+        "test_id_prefix": "ninja://chrome/android:trichrome_chrome_bundle_smoke_test/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "ui_android_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "ui_android_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ui_android_unittests",
+        "test_id_prefix": "ninja://ui/android:ui_android_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "ui_base_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "ui_base_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ui_base_unittests",
+        "test_id_prefix": "ninja://ui/base:ui_base_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "ui_touch_selection_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "ui_touch_selection_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ui_touch_selection_unittests",
+        "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "unit_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "unit_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "unit_tests",
+        "test_id_prefix": "ninja://chrome/test:unit_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "url_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "url_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "url_unittests",
+        "test_id_prefix": "ninja://url:url_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "video_encode_accelerator_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "video_encode_accelerator_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "video_encode_accelerator_tests",
+        "test_id_prefix": "ninja://media/gpu/test:video_encode_accelerator_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "viz_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "viz_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "viz_unittests",
+        "test_id_prefix": "ninja://components/viz:viz_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "webkit_unit_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "webkit_unit_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 6
+        },
+        "test": "blink_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/"
+      },
+      {
+        "args": [
+          "--webview-process-mode=multiple",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "webview_instrumentation_test_apk_multiple_process_mode"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "webview_instrumentation_test_apk_multiple_process_mode",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 12
+        },
+        "test": "webview_instrumentation_test_apk",
+        "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "webview_ui_test_app_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "webview_ui_test_app_test_apk",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "webview_ui_test_app_test_apk",
+        "test_id_prefix": "ninja://android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "wtf_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "wtf_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "wtf_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "zlib_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "zlib_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "zlib_unittests",
+        "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/"
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/infra/config/generated/builders/gn_args_locations.json b/infra/config/generated/builders/gn_args_locations.json
index 70edb45..f531c0a 100644
--- a/infra/config/generated/builders/gn_args_locations.json
+++ b/infra/config/generated/builders/gn_args_locations.json
@@ -43,6 +43,7 @@
     "android-15-tablet-landscape-x64-rel": "ci/android-15-tablet-landscape-x64-rel/gn-args.json",
     "android-15-tablet-x64-rel": "ci/android-15-tablet-x64-rel/gn-args.json",
     "android-15-x64-rel": "ci/android-15-x64-rel/gn-args.json",
+    "android-16-x64-rel": "ci/android-16-x64-rel/gn-args.json",
     "android-arm64-proguard-rel": "ci/android-arm64-proguard-rel/gn-args.json",
     "android-bfcache-rel": "ci/android-bfcache-rel/gn-args.json",
     "android-binary-size-generator": "ci/android-binary-size-generator/gn-args.json",
@@ -550,6 +551,7 @@
     "android-15-x64-fyi-rel": "try/android-15-x64-fyi-rel/gn-args.json",
     "android-15-x64-rel": "try/android-15-x64-rel/gn-args.json",
     "android-16-x64-fyi-rel": "try/android-16-x64-fyi-rel/gn-args.json",
+    "android-16-x64-rel": "try/android-16-x64-rel/gn-args.json",
     "android-arm-compile-dbg": "try/android-arm-compile-dbg/gn-args.json",
     "android-arm64-rel": "try/android-arm64-rel/gn-args.json",
     "android-bfcache-rel": "try/android-bfcache-rel/gn-args.json",
diff --git a/infra/config/generated/builders/try/android-16-x64-fyi-rel/targets/chromium.android.fyi.json b/infra/config/generated/builders/try/android-16-x64-fyi-rel/targets/chromium.android.fyi.json
index a6a1369..9de9a9e 100644
--- a/infra/config/generated/builders/try/android-16-x64-fyi-rel/targets/chromium.android.fyi.json
+++ b/infra/config/generated/builders/try/android-16-x64-fyi-rel/targets/chromium.android.fyi.json
@@ -3,3292 +3,6 @@
     "gtest_tests": [
       {
         "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "absl_hardening_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "absl_hardening_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "absl_hardening_tests",
-        "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "android_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "android_browsertests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 4
-        },
-        "test": "android_browsertests",
-        "test_id_prefix": "ninja://chrome/test:android_browsertests/"
-      },
-      {
-        "args": [
-          "--disable-field-trial-config",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "ci_only": true,
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "android_browsertests_no_fieldtrial"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "android_browsertests_no_fieldtrial",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test": "android_browsertests",
-        "test_id_prefix": "ninja://chrome/test:android_browsertests/"
-      },
-      {
-        "args": [
-          "--test-launcher-batch-limit=1",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "android_sync_integration_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "android_sync_integration_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "android_sync_integration_tests",
-        "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "android_webview_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "android_webview_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "android_webview_unittests",
-        "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/"
-      },
-      {
-        "args": [
-          "-v",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "angle_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "angle_unittests",
-        "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "base_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "base_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "base_unittests",
-        "test_id_prefix": "ninja://base:base_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "blink_common_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "blink_common_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_common_unittests",
-        "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "blink_heap_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "blink_heap_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_heap_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/"
-      },
-      {
-        "args": [
-          "--git-revision=${got_revision}",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "blink_platform_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "blink_platform_unittests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_platform_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "boringssl_crypto_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "boringssl_crypto_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "boringssl_crypto_tests",
-        "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "boringssl_ssl_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "boringssl_ssl_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "boringssl_ssl_tests",
-        "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/"
-      },
-      {
-        "args": [
-          "--gtest_filter=-*UsingRealWebcam*",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "capture_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "capture_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "capture_unittests",
-        "test_id_prefix": "ninja://media/capture:capture_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "cast_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "cast_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cast_unittests",
-        "test_id_prefix": "ninja://media/cast:cast_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "cc_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "cc_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cc_unittests",
-        "test_id_prefix": "ninja://cc:cc_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "ci_only": true,
-        "description": "Run with android_36_google_apis_x64",
-        "experiment_percentage": 100,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "chrome_public_apk_profile_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "chrome_public_apk_profile_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chrome_public_apk_baseline_profile_generator",
-        "test_id_prefix": "ninja://chrome/test/android:chrome_public_apk_baseline_profile_generator/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "chrome_public_smoke_test"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "chrome_public_smoke_test",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chrome_public_smoke_test",
-        "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/"
-      },
-      {
-        "args": [
-          "--git-revision=${got_revision}",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "chrome_public_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "chrome_public_test_apk",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 20
-        },
-        "test": "chrome_public_test_apk",
-        "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/"
-      },
-      {
-        "args": [
-          "--git-revision=${got_revision}",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "chrome_public_unit_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "chrome_public_unit_test_apk",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 4
-        },
-        "test": "chrome_public_unit_test_apk",
-        "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "components_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "components_browsertests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "components_browsertests",
-        "test_id_prefix": "ninja://components:components_browsertests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "components_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "components_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 6
-        },
-        "test": "components_unittests",
-        "test_id_prefix": "ninja://components:components_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_16.content_browsertests.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "content_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "content_browsertests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 30
-        },
-        "test": "content_browsertests",
-        "test_id_prefix": "ninja://content/test:content_browsertests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.content_shell_test_apk.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "content_shell_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "content_shell_test_apk",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test": "content_shell_test_apk",
-        "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "content_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "content_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test": "content_unittests",
-        "test_id_prefix": "ninja://content/test:content_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "crashpad_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "crashpad_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "crashpad_tests",
-        "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "crypto_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "crypto_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "crypto_unittests",
-        "test_id_prefix": "ninja://crypto:crypto_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "device_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "device_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "device_unittests",
-        "test_id_prefix": "ninja://device:device_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "display_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "display_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "display_unittests",
-        "test_id_prefix": "ninja://ui/display:display_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "ci_only": true,
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "env_chromium_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "env_chromium_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "env_chromium_unittests",
-        "test_id_prefix": "ninja://third_party/leveldatabase:env_chromium_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "events_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "events_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "events_unittests",
-        "test_id_prefix": "ninja://ui/events:events_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "fuzzing_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "fuzzing_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "fuzzing_unittests",
-        "test_id_prefix": "ninja://testing/libfuzzer/tests:fuzzing_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gcm_unit_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gcm_unit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gcm_unit_tests",
-        "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gfx_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gfx_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gfx_unittests",
-        "test_id_prefix": "ninja://ui/gfx:gfx_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gin_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gin_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gin_unittests",
-        "test_id_prefix": "ninja://gin:gin_unittests/"
-      },
-      {
-        "args": [
-          "--use-cmd-decoder=validating",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gl_tests_validating"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gl_tests_validating",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gl_tests",
-        "test_id_prefix": "ninja://gpu:gl_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gl_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gl_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gl_unittests",
-        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "google_apis_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "google_apis_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "google_apis_unittests",
-        "test_id_prefix": "ninja://google_apis:google_apis_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gpu_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gpu_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gpu_unittests",
-        "test_id_prefix": "ninja://gpu:gpu_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gwp_asan_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gwp_asan_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gwp_asan_unittests",
-        "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "ipc_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "ipc_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ipc_tests",
-        "test_id_prefix": "ninja://ipc:ipc_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "jni_zero_sample_apk_test"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "jni_zero_sample_apk_test",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "jni_zero_sample_apk_test",
-        "test_id_prefix": "ninja://third_party/jni_zero/sample:jni_zero_sample_apk_test/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "latency_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "latency_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "latency_unittests",
-        "test_id_prefix": "ninja://ui/latency:latency_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "ci_only": true,
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "leveldb_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "leveldb_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "leveldb_unittests",
-        "test_id_prefix": "ninja://third_party/leveldatabase:leveldb_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "libjingle_xmpp_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "libjingle_xmpp_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "libjingle_xmpp_unittests",
-        "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "liburlpattern_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "liburlpattern_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "liburlpattern_unittests",
-        "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "media_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "media_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_unittests",
-        "test_id_prefix": "ninja://media:media_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "midi_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "midi_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "midi_unittests",
-        "test_id_prefix": "ninja://media/midi:midi_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "minidump_uploader_test"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "minidump_uploader_test",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "minidump_uploader_test",
-        "test_id_prefix": "ninja://components/minidump_uploader:minidump_uploader_test/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "mojo_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "mojo_test_apk",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "mojo_test_apk",
-        "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "mojo_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "mojo_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "mojo_unittests",
-        "test_id_prefix": "ninja://mojo:mojo_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "net_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "net_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test": "net_unittests",
-        "test_id_prefix": "ninja://net:net_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gtest_filter=-ScopedDirTest.CloseOutOfScope",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "perfetto_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "perfetto_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "perfetto_unittests",
-        "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "sandbox_linux_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "sandbox_linux_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sandbox_linux_unittests",
-        "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "services_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "services_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "services_unittests",
-        "test_id_prefix": "ninja://services:services_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "shell_dialogs_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "shell_dialogs_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "shell_dialogs_unittests",
-        "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "skia_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "skia_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "skia_unittests",
-        "test_id_prefix": "ninja://skia:skia_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "sql_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "sql_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sql_unittests",
-        "test_id_prefix": "ninja://sql:sql_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "storage_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "storage_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "storage_unittests",
-        "test_id_prefix": "ninja://storage:storage_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "system_webview_shell_layout_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "system_webview_shell_layout_test_apk",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "system_webview_shell_layout_test_apk",
-        "test_id_prefix": "ninja://android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "trichrome_chrome_bundle_smoke_test"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "trichrome_chrome_bundle_smoke_test",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "trichrome_chrome_bundle_smoke_test",
-        "test_id_prefix": "ninja://chrome/android:trichrome_chrome_bundle_smoke_test/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "ui_android_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "ui_android_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_android_unittests",
-        "test_id_prefix": "ninja://ui/android:ui_android_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "ui_base_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "ui_base_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_base_unittests",
-        "test_id_prefix": "ninja://ui/base:ui_base_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "ui_touch_selection_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "ui_touch_selection_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_touch_selection_unittests",
-        "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "unit_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "unit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "unit_tests",
-        "test_id_prefix": "ninja://chrome/test:unit_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "url_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "url_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "url_unittests",
-        "test_id_prefix": "ninja://url:url_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "video_encode_accelerator_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "video_encode_accelerator_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "video_encode_accelerator_tests",
-        "test_id_prefix": "ninja://media/gpu/test:video_encode_accelerator_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "viz_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "viz_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "viz_unittests",
-        "test_id_prefix": "ninja://components/viz:viz_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "webkit_unit_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "webkit_unit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 6
-        },
-        "test": "blink_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/"
-      },
-      {
-        "args": [
-          "--webview-process-mode=multiple",
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "webview_instrumentation_test_apk_multiple_process_mode"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "webview_instrumentation_test_apk_multiple_process_mode",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test": "webview_instrumentation_test_apk",
-        "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/"
-      },
-      {
-        "args": [
           "--store-tombstones",
           "--emulator-debug-tags=all",
           "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
@@ -3460,147 +174,6 @@
         },
         "test": "webview_trichrome_64_cts_tests",
         "test_id_prefix": "ninja://android_webview/test:webview_trichrome_64_cts_tests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "webview_ui_test_app_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "webview_ui_test_app_test_apk",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "webview_ui_test_app_test_apk",
-        "test_id_prefix": "ninja://android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "wtf_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "wtf_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "wtf_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/"
-      },
-      {
-        "args": [
-          "--emulator-debug-tags=all",
-          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "description": "Run with android_36_google_apis_x64",
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "zlib_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "zlib_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "android_36_google_apis_x64",
-              "path": ".android_emulator/android_36_google_apis_x64"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "android_36_google_apis_x64"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "zlib_unittests",
-        "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/"
       }
     ]
   }
diff --git a/infra/config/generated/builders/try/android-16-x64-rel/gn-args.json b/infra/config/generated/builders/try/android-16-x64-rel/gn-args.json
new file mode 100644
index 0000000..00384776
--- /dev/null
+++ b/infra/config/generated/builders/try/android-16-x64-rel/gn-args.json
@@ -0,0 +1,20 @@
+{
+  "gn_args": {
+    "android_static_analysis": "off",
+    "dcheck_always_on": true,
+    "debuggable_apks": false,
+    "ffmpeg_branding": "Chrome",
+    "is_component_build": false,
+    "is_debug": false,
+    "proprietary_codecs": true,
+    "strip_debug_info": true,
+    "symbol_level": 0,
+    "system_webview_package_name": "com.google.android.webview.debug",
+    "system_webview_shell_package_name": "org.chromium.my_webview_shell",
+    "target_cpu": "x64",
+    "target_os": "android",
+    "use_reclient": false,
+    "use_remoteexec": true,
+    "use_siso": true
+  }
+}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-16-x64-rel/properties.json b/infra/config/generated/builders/try/android-16-x64-rel/properties.json
new file mode 100644
index 0000000..6cb781e
--- /dev/null
+++ b/infra/config/generated/builders/try/android-16-x64-rel/properties.json
@@ -0,0 +1,75 @@
+{
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "additional_exclusions": [
+        "infra/config/generated/builders/try/android-16-x64-rel/gn-args.json"
+      ],
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "android-16-x64-rel",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-android-archive",
+              "builder_group": "chromium.android",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_android_config": {
+                "config": "base_config"
+              },
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "main_builder",
+                "target_arch": "intel",
+                "target_bits": 64,
+                "target_platform": "android"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "android"
+                ],
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "android-16-x64-rel",
+          "project": "chromium"
+        }
+      ],
+      "targets_spec_directory": "src/infra/config/generated/builders/try/android-16-x64-rel/targets"
+    }
+  },
+  "$build/siso": {
+    "configs": [
+      "builder",
+      "remote-link"
+    ],
+    "enable_cloud_monitoring": true,
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "metrics_project": "chromium-reclient-metrics",
+    "output_local_strategy": "greedy",
+    "project": "rbe-chromium-untrusted",
+    "remote_jobs": 150
+  },
+  "$recipe_engine/resultdb/test_presentation": {
+    "column_keys": [],
+    "grouping_keys": [
+      "status",
+      "v.test_suite"
+    ]
+  },
+  "builder_group": "tryserver.chromium.android",
+  "recipe": "chromium_trybot"
+}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-16-x64-rel/targets/chromium.android.json b/infra/config/generated/builders/try/android-16-x64-rel/targets/chromium.android.json
new file mode 100644
index 0000000..36da7e5
--- /dev/null
+++ b/infra/config/generated/builders/try/android-16-x64-rel/targets/chromium.android.json
@@ -0,0 +1,3361 @@
+{
+  "android-16-x64-rel": {
+    "gtest_tests": [
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "absl_hardening_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "absl_hardening_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "absl_hardening_tests",
+        "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "android_browsertests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "android_browsertests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 4
+        },
+        "test": "android_browsertests",
+        "test_id_prefix": "ninja://chrome/test:android_browsertests/"
+      },
+      {
+        "args": [
+          "--disable-field-trial-config",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "ci_only": true,
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "android_browsertests_no_fieldtrial"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "android_browsertests_no_fieldtrial",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "android_browsertests",
+        "test_id_prefix": "ninja://chrome/test:android_browsertests/"
+      },
+      {
+        "args": [
+          "--test-launcher-batch-limit=1",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "android_sync_integration_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "android_sync_integration_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_sync_integration_tests",
+        "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "android_webview_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "android_webview_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "android_webview_unittests",
+        "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/"
+      },
+      {
+        "args": [
+          "-v",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "angle_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_unittests",
+        "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "base_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "base_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "base_unittests",
+        "test_id_prefix": "ninja://base:base_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "blink_common_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "blink_common_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "blink_common_unittests",
+        "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "blink_heap_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "blink_heap_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "blink_heap_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/"
+      },
+      {
+        "args": [
+          "--git-revision=${got_revision}",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "blink_platform_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "blink_platform_unittests",
+        "precommit_args": [
+          "--gerrit-issue=${patch_issue}",
+          "--gerrit-patchset=${patch_set}",
+          "--buildbucket-id=${buildbucket_build_id}"
+        ],
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "blink_platform_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "boringssl_crypto_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "boringssl_crypto_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "boringssl_crypto_tests",
+        "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "boringssl_ssl_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "boringssl_ssl_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "boringssl_ssl_tests",
+        "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/"
+      },
+      {
+        "args": [
+          "--gtest_filter=-*UsingRealWebcam*",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "capture_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "capture_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "capture_unittests",
+        "test_id_prefix": "ninja://media/capture:capture_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "cast_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "cast_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "cast_unittests",
+        "test_id_prefix": "ninja://media/cast:cast_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "cc_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "cc_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "cc_unittests",
+        "test_id_prefix": "ninja://cc:cc_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "ci_only": true,
+        "description": "Run with android_36_google_apis_x64",
+        "experiment_percentage": 100,
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "chrome_public_apk_profile_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "chrome_public_apk_profile_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "chrome_public_apk_baseline_profile_generator",
+        "test_id_prefix": "ninja://chrome/test/android:chrome_public_apk_baseline_profile_generator/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "chrome_public_smoke_test"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "chrome_public_smoke_test",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "chrome_public_smoke_test",
+        "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/"
+      },
+      {
+        "args": [
+          "--git-revision=${got_revision}",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "chrome_public_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "chrome_public_test_apk",
+        "precommit_args": [
+          "--gerrit-issue=${patch_issue}",
+          "--gerrit-patchset=${patch_set}",
+          "--buildbucket-id=${buildbucket_build_id}"
+        ],
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 20
+        },
+        "test": "chrome_public_test_apk",
+        "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/"
+      },
+      {
+        "args": [
+          "--git-revision=${got_revision}",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "chrome_public_unit_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "chrome_public_unit_test_apk",
+        "precommit_args": [
+          "--gerrit-issue=${patch_issue}",
+          "--gerrit-patchset=${patch_set}",
+          "--buildbucket-id=${buildbucket_build_id}"
+        ],
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 4
+        },
+        "test": "chrome_public_unit_test_apk",
+        "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "components_browsertests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "components_browsertests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "components_browsertests",
+        "test_id_prefix": "ninja://components:components_browsertests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "components_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "components_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 6
+        },
+        "test": "components_unittests",
+        "test_id_prefix": "ninja://components:components_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_16.content_browsertests.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "content_browsertests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "content_browsertests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 30
+        },
+        "test": "content_browsertests",
+        "test_id_prefix": "ninja://content/test:content_browsertests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.content_shell_test_apk.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "content_shell_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "content_shell_test_apk",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "content_shell_test_apk",
+        "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "content_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "content_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "content_unittests",
+        "test_id_prefix": "ninja://content/test:content_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "crashpad_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "crashpad_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "crashpad_tests",
+        "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "crypto_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "crypto_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "crypto_unittests",
+        "test_id_prefix": "ninja://crypto:crypto_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "device_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "device_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "device_unittests",
+        "test_id_prefix": "ninja://device:device_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "display_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "display_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "display_unittests",
+        "test_id_prefix": "ninja://ui/display:display_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "ci_only": true,
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "env_chromium_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "env_chromium_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "env_chromium_unittests",
+        "test_id_prefix": "ninja://third_party/leveldatabase:env_chromium_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "events_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "events_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "events_unittests",
+        "test_id_prefix": "ninja://ui/events:events_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "fuzzing_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "fuzzing_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "fuzzing_unittests",
+        "test_id_prefix": "ninja://testing/libfuzzer/tests:fuzzing_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gcm_unit_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "gcm_unit_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gcm_unit_tests",
+        "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gfx_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "gfx_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gfx_unittests",
+        "test_id_prefix": "ninja://ui/gfx:gfx_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gin_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "gin_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gin_unittests",
+        "test_id_prefix": "ninja://gin:gin_unittests/"
+      },
+      {
+        "args": [
+          "--use-cmd-decoder=validating",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gl_tests_validating"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "gl_tests_validating",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gl_tests",
+        "test_id_prefix": "ninja://gpu:gl_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gl_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "gl_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gl_unittests",
+        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "google_apis_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "google_apis_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "google_apis_unittests",
+        "test_id_prefix": "ninja://google_apis:google_apis_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gpu_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "gpu_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gpu_unittests",
+        "test_id_prefix": "ninja://gpu:gpu_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "gwp_asan_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "gwp_asan_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gwp_asan_unittests",
+        "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "ipc_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "ipc_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ipc_tests",
+        "test_id_prefix": "ninja://ipc:ipc_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "jni_zero_sample_apk_test"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "jni_zero_sample_apk_test",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "jni_zero_sample_apk_test",
+        "test_id_prefix": "ninja://third_party/jni_zero/sample:jni_zero_sample_apk_test/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "latency_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "latency_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "latency_unittests",
+        "test_id_prefix": "ninja://ui/latency:latency_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "ci_only": true,
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "leveldb_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "leveldb_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "leveldb_unittests",
+        "test_id_prefix": "ninja://third_party/leveldatabase:leveldb_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "libjingle_xmpp_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "libjingle_xmpp_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "libjingle_xmpp_unittests",
+        "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "liburlpattern_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "liburlpattern_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "liburlpattern_unittests",
+        "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "media_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "media_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "media_unittests",
+        "test_id_prefix": "ninja://media:media_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "midi_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "midi_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "midi_unittests",
+        "test_id_prefix": "ninja://media/midi:midi_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "minidump_uploader_test"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "minidump_uploader_test",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "minidump_uploader_test",
+        "test_id_prefix": "ninja://components/minidump_uploader:minidump_uploader_test/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "mojo_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "mojo_test_apk",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "mojo_test_apk",
+        "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "mojo_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "mojo_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "mojo_unittests",
+        "test_id_prefix": "ninja://mojo:mojo_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "net_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "net_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "net_unittests",
+        "test_id_prefix": "ninja://net:net_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gtest_filter=-ScopedDirTest.CloseOutOfScope",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "perfetto_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "perfetto_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "perfetto_unittests",
+        "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "sandbox_linux_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "sandbox_linux_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "sandbox_linux_unittests",
+        "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "services_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "services_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "services_unittests",
+        "test_id_prefix": "ninja://services:services_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "shell_dialogs_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "shell_dialogs_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "shell_dialogs_unittests",
+        "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "skia_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "skia_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "skia_unittests",
+        "test_id_prefix": "ninja://skia:skia_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "sql_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "sql_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "sql_unittests",
+        "test_id_prefix": "ninja://sql:sql_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "storage_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "storage_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "storage_unittests",
+        "test_id_prefix": "ninja://storage:storage_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "system_webview_shell_layout_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "system_webview_shell_layout_test_apk",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "system_webview_shell_layout_test_apk",
+        "test_id_prefix": "ninja://android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "trichrome_chrome_bundle_smoke_test"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "trichrome_chrome_bundle_smoke_test",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "trichrome_chrome_bundle_smoke_test",
+        "test_id_prefix": "ninja://chrome/android:trichrome_chrome_bundle_smoke_test/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "ui_android_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "ui_android_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ui_android_unittests",
+        "test_id_prefix": "ninja://ui/android:ui_android_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "ui_base_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "ui_base_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ui_base_unittests",
+        "test_id_prefix": "ninja://ui/base:ui_base_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "ui_touch_selection_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "ui_touch_selection_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ui_touch_selection_unittests",
+        "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "unit_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "unit_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "unit_tests",
+        "test_id_prefix": "ninja://chrome/test:unit_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "url_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "url_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "url_unittests",
+        "test_id_prefix": "ninja://url:url_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "video_encode_accelerator_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "video_encode_accelerator_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "video_encode_accelerator_tests",
+        "test_id_prefix": "ninja://media/gpu/test:video_encode_accelerator_tests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "viz_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "viz_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "viz_unittests",
+        "test_id_prefix": "ninja://components/viz:viz_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "webkit_unit_tests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "webkit_unit_tests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 6
+        },
+        "test": "blink_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/"
+      },
+      {
+        "args": [
+          "--webview-process-mode=multiple",
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "webview_instrumentation_test_apk_multiple_process_mode"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "webview_instrumentation_test_apk_multiple_process_mode",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 12
+        },
+        "test": "webview_instrumentation_test_apk",
+        "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "webview_ui_test_app_test_apk"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "webview_ui_test_app_test_apk",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "webview_ui_test_app_test_apk",
+        "test_id_prefix": "ninja://android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "wtf_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "wtf_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "wtf_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/"
+      },
+      {
+        "args": [
+          "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
+        ],
+        "description": "Run with android_36_google_apis_x64",
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "zlib_unittests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "zlib_unittests",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "dimensions": {
+            "cores": "8",
+            "cpu": "x86-64",
+            "device_os": null,
+            "device_type": null,
+            "os": "Ubuntu-22.04",
+            "pool": "chromium.tests.avd"
+          },
+          "named_caches": [
+            {
+              "name": "android_36_google_apis_x64",
+              "path": ".android_emulator/android_36_google_apis_x64"
+            }
+          ],
+          "optional_dimensions": {
+            "60": {
+              "caches": "android_36_google_apis_x64"
+            }
+          },
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "zlib_unittests",
+        "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/"
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/mac-builder-next/targets/chromium.fyi.json b/infra/config/generated/builders/try/mac-builder-next/targets/chromium.fyi.json
index 31d3fb2..4bfb18e 100644
--- a/infra/config/generated/builders/try/mac-builder-next/targets/chromium.fyi.json
+++ b/infra/config/generated/builders/try/mac-builder-next/targets/chromium.fyi.json
@@ -12,7 +12,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -27,7 +27,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -42,7 +42,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -58,7 +58,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -73,7 +73,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -88,7 +88,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -103,7 +103,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -118,7 +118,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -141,7 +141,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -156,7 +156,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -171,7 +171,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -186,7 +186,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 25
@@ -205,7 +205,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -220,7 +220,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -235,7 +235,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -250,7 +250,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -265,7 +265,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -280,7 +280,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -295,7 +295,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 3
@@ -311,7 +311,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 8
@@ -327,7 +327,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -343,7 +343,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -358,7 +358,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -373,7 +373,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -388,7 +388,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -403,7 +403,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -418,7 +418,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -434,7 +434,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -449,7 +449,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -464,7 +464,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -479,7 +479,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -494,7 +494,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -509,7 +509,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -524,7 +524,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -539,7 +539,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -554,7 +554,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -569,7 +569,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -584,7 +584,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -599,7 +599,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -614,7 +614,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -629,7 +629,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -644,7 +644,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 7
@@ -660,7 +660,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -675,7 +675,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -691,7 +691,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -706,7 +706,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -721,7 +721,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -736,7 +736,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -751,7 +751,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -766,7 +766,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -781,7 +781,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -796,7 +796,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -811,7 +811,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -826,7 +826,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -841,7 +841,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -856,7 +856,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -871,7 +871,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -886,7 +886,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -901,7 +901,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -916,7 +916,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -931,7 +931,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -946,7 +946,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -961,7 +961,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -976,7 +976,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -991,7 +991,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1006,7 +1006,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1021,7 +1021,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 3
@@ -1037,7 +1037,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1052,7 +1052,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1067,7 +1067,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1082,7 +1082,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1097,7 +1097,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1112,7 +1112,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1127,7 +1127,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1142,7 +1142,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1157,7 +1157,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1172,7 +1172,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1187,7 +1187,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1202,7 +1202,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1225,7 +1225,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1246,7 +1246,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1261,7 +1261,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1282,7 +1282,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1301,7 +1301,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1320,7 +1320,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1338,7 +1338,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1353,7 +1353,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1371,7 +1371,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
@@ -1389,7 +1389,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1411,7 +1411,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -1435,7 +1435,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -1458,7 +1458,7 @@
         "swarming": {
           "dimensions": {
             "cpu": "arm64",
-            "os": "Mac-15.5"
+            "os": "Mac-26"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
diff --git a/infra/config/generated/health-specs/health-specs.json b/infra/config/generated/health-specs/health-specs.json
index 3894ca36..42ed2087 100644
--- a/infra/config/generated/health-specs/health-specs.json
+++ b/infra/config/generated/health-specs/health-specs.json
@@ -6657,6 +6657,27 @@
           }
         ]
       },
+      "android-16-x64-rel": {
+        "contact_team_email": "clank-engprod@google.com",
+        "problem_specs": [
+          {
+            "name": "Unhealthy",
+            "period_days": 7,
+            "score": 5,
+            "thresholds": {
+              "_default": "_default"
+            }
+          },
+          {
+            "name": "Low Value",
+            "period_days": 90,
+            "score": 1,
+            "thresholds": {
+              "_default": "_default"
+            }
+          }
+        ]
+      },
       "android-androidx-packager": {
         "contact_team_email": "clank-build@google.com",
         "problem_specs": [
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg
index 92587132..4d378662 100644
--- a/infra/config/generated/luci/commit-queue.cfg
+++ b/infra/config/generated/luci/commit-queue.cfg
@@ -922,6 +922,11 @@
         disable_reuse_footers: "Include-Ci-Only-Tests"
       }
       builders {
+        name: "chromium/try/android-16-x64-rel"
+        includable_only: true
+        disable_reuse_footers: "Include-Ci-Only-Tests"
+      }
+      builders {
         name: "chromium/try/android-angle-chromium-try"
         includable_only: true
         disable_reuse_footers: "Include-Ci-Only-Tests"
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 3350fba..138f94f 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -22778,7 +22778,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:Mac Builder Next"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-15"
+      dimensions: "os:Mac-15|Mac-26"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -37522,6 +37522,117 @@
       }
     }
     builders {
+      name: "android-16-x64-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "free_space:standard"
+      dimensions: "os:Ubuntu-22.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      exe {
+        cipd_package: "infra/chromium/bootstrapper/${platform}"
+        cipd_version: "latest"
+        cmd: "bootstrapper"
+      }
+      properties:
+        '{'
+        '  "$bootstrap/exe": {'
+        '    "exe": {'
+        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
+        '      "cipd_version": "refs/heads/main",'
+        '      "cmd": ['
+        '        "luciexe"'
+        '      ]'
+        '    }'
+        '  },'
+        '  "$bootstrap/properties": {'
+        '    "properties_file": "infra/config/generated/builders/ci/android-16-x64-rel/properties.json",'
+        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-16-x64-rel/shadow-properties.json",'
+        '    "top_level_project": {'
+        '      "ref": "refs/heads/main",'
+        '      "repo": {'
+        '        "host": "chromium.googlesource.com",'
+        '        "project": "chromium/src"'
+        '      }'
+        '    }'
+        '  },'
+        '  "builder_group": "chromium.android",'
+        '  "led_builder_is_bootstrapped": true,'
+        '  "recipe": "chromium"'
+        '}'
+      execution_timeout_secs: 14400
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experiments {
+        key: "chromium.use_per_builder_build_dir_name"
+        value: 100
+      }
+      experiments {
+        key: "luci.recipes.use_python3"
+        value: 100
+      }
+      resultdb {
+        enable: true
+        bq_exports {
+          project: "chrome-luci-data"
+          dataset: "chromium"
+          table: "ci_test_results"
+          test_results {}
+        }
+        bq_exports {
+          project: "chrome-luci-data"
+          dataset: "chromium"
+          table: "gpu_ci_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
+            }
+          }
+        }
+        bq_exports {
+          project: "chrome-luci-data"
+          dataset: "chromium"
+          table: "blink_web_tests_ci_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
+            }
+          }
+        }
+        history_options {
+          use_invocation_timestamp: true
+        }
+      }
+      description_html: "Run chromium tests on Android 16 emulators.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-16-x64-rel\">android-16-x64-rel</a></li></ul><br/>Builder owner: <a href=mailto:clank-engprod@google.com>clank-engprod@google.com</a>"
+      shadow_builder_adjustments {
+        service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+        pool: "luci.chromium.try"
+        dimensions: "free_space:"
+        dimensions: "pool:luci.chromium.try"
+      }
+      contact_team_email: "clank-engprod@google.com"
+      custom_metric_definitions {
+        name: "/chrome/infra/browser/builds/cached_count"
+        predicates: "has(build.output.properties.is_cached)"
+        predicates: "string(build.output.properties.is_cached) == \"true\""
+      }
+      custom_metric_definitions {
+        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
+        predicates: "has(build.output.properties.ran_tests_retry_shard)"
+      }
+      custom_metric_definitions {
+        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
+        predicates: "has(build.output.properties.ran_tests_without_patch)"
+      }
+      custom_metric_definitions {
+        name: "/chrome/infra/browser/builds/uncached_count"
+        predicates: "has(build.output.properties.is_cached)"
+        predicates: "string(build.output.properties.is_cached) == \"false\""
+      }
+    }
+    builders {
       name: "android-androidx-packager"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
@@ -50747,7 +50858,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios18-beta-simulator"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-15"
+      dimensions: "os:Mac-15|Mac-26"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -50860,7 +50971,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios18-sdk-device"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-15"
+      dimensions: "os:Mac-15|Mac-26"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -50974,7 +51085,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios18-sdk-simulator"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-15"
+      dimensions: "os:Mac-15|Mac-26"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -51087,7 +51198,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios26-beta-simulator"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-15"
+      dimensions: "os:Mac-15|Mac-26"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -51200,7 +51311,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios26-sdk-simulator"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-15"
+      dimensions: "os:Mac-15|Mac-26"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -61716,7 +61827,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-osxbeta-rel"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-15"
+      dimensions: "os:Mac-15|Mac-26"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -78059,6 +78170,118 @@
       }
     }
     builders {
+      name: "android-16-x64-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "free_space:standard"
+      dimensions: "os:Ubuntu-22.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      exe {
+        cipd_package: "infra/chromium/bootstrapper/${platform}"
+        cipd_version: "latest"
+        cmd: "bootstrapper"
+      }
+      properties:
+        '{'
+        '  "$bootstrap/exe": {'
+        '    "exe": {'
+        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
+        '      "cipd_version": "refs/heads/main",'
+        '      "cmd": ['
+        '        "luciexe"'
+        '      ]'
+        '    }'
+        '  },'
+        '  "$bootstrap/properties": {'
+        '    "properties_file": "infra/config/generated/builders/try/android-16-x64-rel/properties.json",'
+        '    "top_level_project": {'
+        '      "ref": "refs/heads/main",'
+        '      "repo": {'
+        '        "host": "chromium.googlesource.com",'
+        '        "project": "chromium/src"'
+        '      }'
+        '    }'
+        '  },'
+        '  "builder_group": "tryserver.chromium.android",'
+        '  "led_builder_is_bootstrapped": true,'
+        '  "recipe": "chromium_trybot"'
+        '}'
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      grace_period {
+        seconds: 120
+      }
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experiments {
+        key: "chromium.use_per_builder_build_dir_name"
+        value: 100
+      }
+      experiments {
+        key: "luci.buildbucket.canary_software"
+        value: 5
+      }
+      experiments {
+        key: "luci.recipes.use_python3"
+        value: 100
+      }
+      resultdb {
+        enable: true
+        bq_exports {
+          project: "chrome-luci-data"
+          dataset: "chromium"
+          table: "try_test_results"
+          test_results {}
+        }
+        bq_exports {
+          project: "chrome-luci-data"
+          dataset: "chromium"
+          table: "gpu_try_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
+            }
+          }
+        }
+        bq_exports {
+          project: "chrome-luci-data"
+          dataset: "chromium"
+          table: "blink_web_tests_try_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
+            }
+          }
+        }
+        history_options {
+          use_invocation_timestamp: true
+        }
+      }
+      description_html: "Run Chromium tests on Android 16 emulator.<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-16-x64-rel\">android-16-x64-rel</a></li></ul><br/>Builder owner: <a href=mailto:clank-engprod@google.com>clank-engprod@google.com</a>"
+      contact_team_email: "clank-engprod@google.com"
+      custom_metric_definitions {
+        name: "/chrome/infra/browser/builds/cached_count"
+        predicates: "has(build.output.properties.is_cached)"
+        predicates: "string(build.output.properties.is_cached) == \"true\""
+      }
+      custom_metric_definitions {
+        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
+        predicates: "has(build.output.properties.ran_tests_retry_shard)"
+      }
+      custom_metric_definitions {
+        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
+        predicates: "has(build.output.properties.ran_tests_without_patch)"
+      }
+      custom_metric_definitions {
+        name: "/chrome/infra/browser/builds/uncached_count"
+        predicates: "has(build.output.properties.is_cached)"
+        predicates: "string(build.output.properties.is_cached) == \"false\""
+      }
+    }
+    builders {
       name: "android-angle-chromium-try"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:android-angle-chromium-try"
@@ -114992,7 +115215,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-builder-next"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-15"
+      dimensions: "os:Mac-15|Mac-26"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
@@ -116315,7 +116538,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-osxbeta-rel"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-15"
+      dimensions: "os:Mac-15|Mac-26"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg
index 396045ae..71120ef 100644
--- a/infra/config/generated/luci/luci-milo.cfg
+++ b/infra/config/generated/luci/luci-milo.cfg
@@ -8894,6 +8894,11 @@
     short_name: "and64rel"
   }
   builders {
+    name: "buildbucket/luci.chromium.ci/android-16-x64-rel"
+    category: "emulator|x64|rel"
+    short_name: "16"
+  }
+  builders {
     name: "buildbucket/luci.chromium.ci/android-14-arm64-rel"
     category: "on_cq"
     short_name: "14"
@@ -26165,6 +26170,9 @@
     name: "buildbucket/luci.chromium.try/android-16-x64-fyi-rel"
   }
   builders {
+    name: "buildbucket/luci.chromium.try/android-16-x64-rel"
+  }
+  builders {
     name: "buildbucket/luci.chromium.try/android-angle-chromium-try"
   }
   builders {
@@ -27700,6 +27708,9 @@
     name: "buildbucket/luci.chromium.try/android-16-x64-fyi-rel"
   }
   builders {
+    name: "buildbucket/luci.chromium.try/android-16-x64-rel"
+  }
+  builders {
     name: "buildbucket/luci.chromium.try/android-arm-compile-dbg"
   }
   builders {
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg
index 034b855..8d35b6f 100644
--- a/infra/config/generated/luci/luci-scheduler.cfg
+++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -3145,6 +3145,15 @@
   }
 }
 job {
+  id: "android-16-x64-rel"
+  realm: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "android-16-x64-rel"
+  }
+}
+job {
   id: "android-androidx-packager"
   realm: "ci"
   schedule: "0 7,14,22 * * * *"
@@ -6395,6 +6404,7 @@
   triggers: "android-15-x64-fyi-rel"
   triggers: "android-15-x64-rel"
   triggers: "android-16-x64-fyi-rel"
+  triggers: "android-16-x64-rel"
   triggers: "android-angle-chromium-arm64-builder"
   triggers: "android-annotator-rel"
   triggers: "android-archive-rel"
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star
index 8c33feb5..099ed23 100644
--- a/infra/config/lib/builders.star
+++ b/infra/config/lib/builders.star
@@ -88,7 +88,7 @@
     MAC_14 = os_enum(os_category.MAC, "Mac-14"),
     MAC_DEFAULT = os_enum(os_category.MAC, "Mac-15"),
     MAC_ANY = os_enum(os_category.MAC, "Mac"),
-    MAC_BETA = os_enum(os_category.MAC, "Mac-15"),
+    MAC_BETA = os_enum(os_category.MAC, "Mac-15|Mac-26"),
     WINDOWS_10 = os_enum(os_category.WINDOWS, "Windows-10"),
     # TODO(crbug.com/41492657): remove after slow compile issue resolved.
     WINDOWS_10_1909 = os_enum(os_category.WINDOWS, "Windows-10-18363"),
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
index b55e283..2a52883 100644
--- a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
@@ -1271,60 +1271,6 @@
             "x86-64",
         ],
         per_test_modifications = {
-            "base_unittests": targets.mixin(
-                args = [
-                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter",
-                ],
-            ),
-            "content_browsertests": targets.mixin(
-                args = [
-                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_16.content_browsertests.filter",
-                ],
-                swarming = targets.swarming(
-                    shards = 30,
-                ),
-            ),
-            "content_shell_test_apk": targets.mixin(
-                args = [
-                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.content_shell_test_apk.filter",
-                ],
-            ),
-            "content_unittests": targets.mixin(
-                args = [
-                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter",
-                ],
-            ),
-            "gl_tests_validating": targets.mixin(
-                args = [
-                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter",
-                ],
-            ),
-            "gwp_asan_unittests": targets.mixin(
-                args = [
-                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter",
-                ],
-            ),
-            "media_unittests": targets.mixin(
-                args = [
-                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter",
-                ],
-            ),
-            "perfetto_unittests": targets.mixin(
-                args = [
-                    # TODO(crbug.com/40201873): Fix the failed test
-                    "--gtest_filter=-ScopedDirTest.CloseOutOfScope",
-                ],
-            ),
-            "unit_tests": targets.mixin(
-                args = [
-                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter",
-                ],
-            ),
-            "webview_instrumentation_test_apk_multiple_process_mode": targets.mixin(
-                swarming = targets.swarming(
-                    shards = 12,
-                ),
-            ),
         },
     ),
     targets_settings = targets.settings(
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star
index c068b67..5a7c6887 100644
--- a/infra/config/subprojects/chromium/ci/chromium.android.star
+++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -4456,6 +4456,128 @@
 )
 
 ci.builder(
+    name = "android-16-x64-rel",
+    # TODO(crbug.com/424231911): Enable when green.
+    # branch_selector = branches.selector.ANDROID_BRANCHES,
+    description_html = "Run chromium tests on Android 16 emulators.",
+    builder_spec = builder_config.builder_spec(
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+            apply_configs = [
+                "android",
+            ],
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "main_builder",
+            apply_configs = [
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_arch = builder_config.target_arch.INTEL,
+            target_bits = 64,
+            target_platform = builder_config.target_platform.ANDROID,
+        ),
+        android_config = builder_config.android_config(
+            config = "base_config",
+        ),
+        build_gs_bucket = "chromium-android-archive",
+    ),
+    gn_args = gn_args.config(
+        configs = [
+            "android_builder",
+            "release_builder",
+            "remoteexec",
+            "minimal_symbols",
+            "x64",
+            "strip_debug_info",
+            "android_fastbuild",
+            "webview_trichrome",
+            "webview_shell",
+        ],
+    ),
+    targets = targets.bundle(
+        targets = [
+            "android_16_emulator_gtests",
+        ],
+        mixins = [
+            "16-x64-emulator",
+            "emulator-8-cores",
+            "has_native_resultdb_integration",
+            "linux-jammy",
+            "x86-64",
+        ],
+        per_test_modifications = {
+            "base_unittests": targets.mixin(
+                args = [
+                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter",
+                ],
+            ),
+            "content_browsertests": targets.mixin(
+                args = [
+                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_16.content_browsertests.filter",
+                ],
+                swarming = targets.swarming(
+                    shards = 30,
+                ),
+            ),
+            "content_shell_test_apk": targets.mixin(
+                args = [
+                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.content_shell_test_apk.filter",
+                ],
+            ),
+            "content_unittests": targets.mixin(
+                args = [
+                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter",
+                ],
+            ),
+            "gl_tests_validating": targets.mixin(
+                args = [
+                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter",
+                ],
+            ),
+            "gwp_asan_unittests": targets.mixin(
+                args = [
+                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter",
+                ],
+            ),
+            "media_unittests": targets.mixin(
+                args = [
+                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter",
+                ],
+            ),
+            "perfetto_unittests": targets.mixin(
+                args = [
+                    # TODO(crbug.com/40201873): Fix the failed test
+                    "--gtest_filter=-ScopedDirTest.CloseOutOfScope",
+                ],
+            ),
+            "unit_tests": targets.mixin(
+                args = [
+                    "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter",
+                ],
+            ),
+            "webview_instrumentation_test_apk_multiple_process_mode": targets.mixin(
+                swarming = targets.swarming(
+                    shards = 12,
+                ),
+            ),
+        },
+    ),
+    targets_settings = targets.settings(
+        os_type = targets.os_type.ANDROID,
+    ),
+    gardener_rotations = args.ignore_default(None),
+    # TODO(crbug.com/424231911): Enable when green.
+    tree_closing = False,
+    console_view_entry = consoles.console_view_entry(
+        category = "emulator|x64|rel",
+        short_name = "16",
+    ),
+    contact_team_email = "clank-engprod@google.com",
+    execution_timeout = 4 * time.hour,
+)
+
+ci.builder(
     name = "android-webview-13-x64-hostside-rel",
     branch_selector = branches.selector.ANDROID_BRANCHES,
     description_html = (
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star
index c0183b0..a9e9a3a 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -2050,7 +2050,7 @@
             "all",
         ],
         mixins = [
-            "mac_beta_arm64",
+            "mac_26_arm64",
         ],
         per_test_modifications = {
             "browser_tests": targets.mixin(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
index a8d35ab..f356731 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -372,6 +372,24 @@
 )
 
 try_.builder(
+    name = "android-16-x64-rel",
+    # TODO(crbug.com/424231911): Enable when green.
+    # branch_selector = branches.selector.ANDROID_BRANCHES,
+    description_html = "Run Chromium tests on Android 16 emulator.",
+    mirrors = [
+        "ci/android-16-x64-rel",
+    ],
+    gn_args = gn_args.config(
+        configs = [
+            "ci/android-16-x64-rel",
+            "release_try_builder",
+        ],
+    ),
+    contact_team_email = "clank-engprod@google.com",
+    siso_remote_jobs = siso.remote_jobs.LOW_JOBS_FOR_CQ,
+)
+
+try_.builder(
     name = "android-16-x64-fyi-rel",
     mirrors = [
         "ci/android-16-x64-fyi-rel",
diff --git a/infra/config/targets/bundles.star b/infra/config/targets/bundles.star
index 36f3b7f3..332eb68 100644
--- a/infra/config/targets/bundles.star
+++ b/infra/config/targets/bundles.star
@@ -291,19 +291,6 @@
 targets.bundle(
     name = "android_16_emulator_fyi_gtests",
     targets = [
-        "android_specific_chromium_gtests",  # Already includes gl_gtests.
-        "chromium_gtests",
-        "android_emulator_specific_chrome_public_tests",
-        "android_trichrome_smoke_tests",
-        "android_smoke_tests",
-        "chrome_profile_generator_tests",
-        "chromium_gtests_for_devices_with_graphical_output",
-        "fieldtrial_android_tests",
-        "jni_zero_sample_apk_test",
-        "minidump_uploader_test",
-        "linux_flavor_specific_chromium_gtests",
-        "system_webview_shell_instrumentation_tests",  # Not an experimental test
-        "webview_ui_instrumentation_tests",
         targets.bundle(
             targets = "webview_trichrome_64_cts_tests_suite",
             variants = [
@@ -316,6 +303,25 @@
 )
 
 targets.bundle(
+    name = "android_16_emulator_gtests",
+    targets = [
+        "android_specific_chromium_gtests",  # Already includes gl_gtests.
+        "chrome_profile_generator_tests",
+        "chromium_gtests",
+        "android_emulator_specific_chrome_public_tests",
+        "android_trichrome_smoke_tests",
+        "android_smoke_tests",
+        "chromium_gtests_for_devices_with_graphical_output",
+        "fieldtrial_android_tests",
+        "jni_zero_sample_apk_test",
+        "linux_flavor_specific_chromium_gtests",
+        "minidump_uploader_test",
+        "system_webview_shell_instrumentation_tests",  # Not an experimental test
+        "webview_ui_instrumentation_tests",
+    ],
+)
+
+targets.bundle(
     name = "android_ar_gtests",
     targets = [
         "monochrome_public_test_ar_apk",
diff --git a/infra/config/targets/mixins.star b/infra/config/targets/mixins.star
index 9fc27ef..2e6835f 100644
--- a/infra/config/targets/mixins.star
+++ b/infra/config/targets/mixins.star
@@ -1693,6 +1693,17 @@
 )
 
 targets.mixin(
+    name = "mac_26_arm64",
+    generate_pyl_entry = False,
+    swarming = targets.swarming(
+        dimensions = {
+            "cpu": "arm64",
+            "os": "Mac-26",
+        },
+    ),
+)
+
+targets.mixin(
     name = "mac_15_x64",
     # All references have been moved to starlark
     generate_pyl_entry = False,
diff --git a/infra/scripts/sizes.py b/infra/scripts/sizes.py
index 83bd8a28..b56029f 100755
--- a/infra/scripts/sizes.py
+++ b/infra/scripts/sizes.py
@@ -56,17 +56,16 @@
 
 
 def get_linux_stripped_size(filename):
-  EU_STRIP_NAME = 'eu-strip'
   # Assumes |filename| is in out/Release
-  # build/linux/bin/eu-strip'
   src_dir = os.path.dirname(os.path.dirname(os.path.dirname(filename)))
-  eu_strip_path = os.path.join(src_dir, 'build', 'linux', 'bin', EU_STRIP_NAME)
-  if (platform.architecture()[0] == '64bit' or
-      not os.path.exists(eu_strip_path)):
-    eu_strip_path = EU_STRIP_NAME
+  llvm_strip_path = os.path.join(src_dir, 'third_party', 'llvm-build',
+                                 'Release+Asserts', 'bin', 'llvm-strip')
 
   with tempfile.NamedTemporaryFile() as stripped_file:
-    strip_cmd = [eu_strip_path, '-o', stripped_file.name, filename]
+    strip_cmd = [
+        llvm_strip_path, '--strip-unneeded', '--strip-debug', '-o',
+        stripped_file.name, filename
+    ]
     result = 0
     result, _ = run_process(result, strip_cmd)
     if result != 0:
diff --git a/internal b/internal
index 1352cfb..0e4d05a 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit 1352cfbc23726d06daa6dc8320c8eea7da7ce099
+Subproject commit 0e4d05ade90a328d85fdf0516544ba6491b6ec35
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 1baac97..af66d2a 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -3071,6 +3071,21 @@
       <message name="IDS_IOS_INTENTS_URL_PARAMETER" desc="The URL the user would like to pass as input parameter to Shortcuts that require a URL as input [iOS only].">
         URL
       </message>
+      <message name="IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_BUBBLE_TEXT" desc="The text for the IPH bubble in interactive lens overlay promo in the First Run Experience.">
+        Try circling or tapping the picture to search
+      </message>
+      <message name="IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SKIP_BUTTON" desc="The text for the button that allows users to skip the interactive lens overlay promo in the First Run Experience.">
+        Skip
+      </message>
+      <message name="IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_START_BROWSING_BUTTON" desc="The text for the button that allows users to start browsing after the interactive lens overlay promo in the First Run Experience.">
+        Start browsing
+      </message>
+      <message name="IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SUBTITLE" desc="The subtitle for the interactive lens overlay promo in the First Run Experience.">
+        You can now open Google Lens from your address bar and search anything you see
+      </message>
+      <message name="IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_TITLE" desc="The title for the interactive lens overlay promo in the First Run Experience.">
+        Search anything on your screen
+      </message>
       <message name="IDS_IOS_IPH_BUBBLE_GOT_IT" desc="Label of a button that appears in an in-product help Tip. Pressing this button will dismiss the last Tip.">
         Got it
       </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_BUBBLE_TEXT.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_BUBBLE_TEXT.png.sha1
new file mode 100644
index 0000000..b8c57b9
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_BUBBLE_TEXT.png.sha1
@@ -0,0 +1 @@
+e9b63cb2a2417d7e5158c6faff120ca30fc10243
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SKIP_BUTTON.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SKIP_BUTTON.png.sha1
new file mode 100644
index 0000000..b8c57b9
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SKIP_BUTTON.png.sha1
@@ -0,0 +1 @@
+e9b63cb2a2417d7e5158c6faff120ca30fc10243
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_START_BROWSING_BUTTON.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_START_BROWSING_BUTTON.png.sha1
new file mode 100644
index 0000000..aa4971f
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_START_BROWSING_BUTTON.png.sha1
@@ -0,0 +1 @@
+58748e4ae4045f640754f999ad4a9c6c3645059e
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SUBTITLE.png.sha1
new file mode 100644
index 0000000..b8c57b9
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SUBTITLE.png.sha1
@@ -0,0 +1 @@
+e9b63cb2a2417d7e5158c6faff120ca30fc10243
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_TITLE.png.sha1
new file mode 100644
index 0000000..b8c57b9
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_TITLE.png.sha1
@@ -0,0 +1 @@
+e9b63cb2a2417d7e5158c6faff120ca30fc10243
\ No newline at end of file
diff --git a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/virtual_card_enrollment_bottom_sheet_egtest.mm b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/virtual_card_enrollment_bottom_sheet_egtest.mm
index 3fa0b0f..7f4ef505 100644
--- a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/virtual_card_enrollment_bottom_sheet_egtest.mm
+++ b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/virtual_card_enrollment_bottom_sheet_egtest.mm
@@ -143,6 +143,9 @@
                                  forRequest:kGetSaveCardDetailsUrl
                               withErrorCode:net::HTTP_OK];
 
+  // Wait for the web view to appear.
+  [ChromeEarlGrey
+      waitForUIElementToAppearWithMatcher:chrome_test_util::WebViewMatcher()];
   // Fill the form.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()]
       performAction:chrome_test_util::TapWebElementWithId(kFillFormId)];
diff --git a/ios/chrome/browser/first_run/ui_bundled/DEPS b/ios/chrome/browser/first_run/ui_bundled/DEPS
index f008d5fe..9e7a03aaa 100644
--- a/ios/chrome/browser/first_run/ui_bundled/DEPS
+++ b/ios/chrome/browser/first_run/ui_bundled/DEPS
@@ -26,6 +26,7 @@
   "+ios/chrome/browser/settings/ui_bundled/elements",
   "+ios/chrome/browser/authentication/ui_bundled/continuation.h",
   "+ios/chrome/browser/passwords/model/features.h",
+  "+ios/chrome/browser/bubble/ui_bundled",
 ]
 
 specific_include_rules = {
diff --git a/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/BUILD.gn b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/BUILD.gn
index 0c18489..75b2d48 100644
--- a/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/BUILD.gn
+++ b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/BUILD.gn
@@ -10,6 +10,7 @@
   deps = [
     "//base",
     "//ios/chrome/browser/first_run/ui_bundled:screen_delegate",
+    "//ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui",
     "//ios/chrome/browser/shared/coordinator/chrome_coordinator",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/interactive_lens_promo_coordinator.mm b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/interactive_lens_promo_coordinator.mm
index 57bc35e..4e075e3 100644
--- a/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/interactive_lens_promo_coordinator.mm
+++ b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/interactive_lens_promo_coordinator.mm
@@ -4,9 +4,19 @@
 
 #import "ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/interactive_lens_promo_coordinator.h"
 
+#import "base/check.h"
 #import "ios/chrome/browser/first_run/ui_bundled/first_run_screen_delegate.h"
+#import "ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.h"
 
-@implementation InteractiveLensPromoCoordinator
+@interface InteractiveLensPromoCoordinator () <InteractiveLensPromoDelegate>
+@end
+
+@implementation InteractiveLensPromoCoordinator {
+  // View controller for the Interactive Lens promo screen.
+  InteractiveLensOverlayPromoViewController* _promoViewController;
+  // Container view controller for the Lens view.
+  UIViewController* _lensContainerViewController;
+}
 
 @synthesize baseNavigationController = _baseNavigationController;
 
@@ -24,12 +34,31 @@
 
 - (void)start {
   [super start];
-  // TODO(crbug.com/416480202): Present screen.
+  // TODO(crbug.com/416480202): Trigger the Lens UI presentation with
+  // `_lensContainerViewController` as the base view controller before
+  // presenting `_promoViewController`.
+  _lensContainerViewController = [[UIViewController alloc] init];
+  _promoViewController = [[InteractiveLensOverlayPromoViewController alloc]
+      initWithLensView:_lensContainerViewController.view];
+  _promoViewController.delegate = self;
+  _promoViewController.modalInPresentation = YES;
+  BOOL animated = self.baseNavigationController.topViewController != nil;
+  [self.baseNavigationController setViewControllers:@[ _promoViewController ]
+                                           animated:animated];
 }
 
 - (void)stop {
   self.firstRunDelegate = nil;
+  _lensContainerViewController = nil;
+  _promoViewController = nil;
   [super stop];
 }
 
+#pragma mark - InteractiveLensPromoDelegate
+
+- (void)didTapContinueButton {
+  CHECK(self.firstRunDelegate);
+  [self.firstRunDelegate screenWillFinishPresenting];
+}
+
 @end
diff --git a/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/BUILD.gn b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/BUILD.gn
new file mode 100644
index 0000000..6b6848d
--- /dev/null
+++ b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/BUILD.gn
@@ -0,0 +1,23 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("ui") {
+  sources = [
+    "interactive_lens_overlay_promo_view_controller.h",
+    "interactive_lens_overlay_promo_view_controller.mm",
+  ]
+  deps = [
+    "//base",
+    "//ios/chrome/app/strings",
+    "//ios/chrome/browser/bubble/ui_bundled:bubble_view",
+    "//ios/chrome/browser/bubble/ui_bundled:constants",
+    "//ios/chrome/common/ui/colors",
+    "//ios/chrome/common/ui/elements",
+    "//ios/chrome/common/ui/promo_style",
+    "//ios/chrome/common/ui/promo_style:utils",
+    "//ios/chrome/common/ui/util",
+    "//ui/base",
+  ]
+  frameworks = [ "UIKit.framework" ]
+}
diff --git a/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.h b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.h
new file mode 100644
index 0000000..23ebc8c
--- /dev/null
+++ b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.h
@@ -0,0 +1,39 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_INTERACTIVE_LENS_UI_INTERACTIVE_LENS_OVERLAY_PROMO_VIEW_CONTROLLER_H_
+#define IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_INTERACTIVE_LENS_UI_INTERACTIVE_LENS_OVERLAY_PROMO_VIEW_CONTROLLER_H_
+
+#import <UIKit/UIKit.h>
+
+#import "ios/chrome/common/ui/promo_style/promo_style_view_controller.h"
+
+// Delegate for actions on the Interactive Lens screen.
+@protocol InteractiveLensPromoDelegate <NSObject>
+
+// Called when the user tapped on the "continue" button.
+- (void)didTapContinueButton;
+
+@end
+
+// View controller for the Interactive Lens screen in the First Run Experience.
+@interface InteractiveLensOverlayPromoViewController : UIViewController
+
+// Delegate for actions on the Interactive Lens screen.
+@property(nonatomic, weak) id<InteractiveLensPromoDelegate> delegate;
+
+// Designated initializer for this view controller. `lensView` is view for the
+// interactive Lens Overlay.
+- (instancetype)initWithLensView:(UIView*)lensView NS_DESIGNATED_INITIALIZER;
+
+- (instancetype)initWithNibName:(NSString*)nibNameOrNil
+                         bundle:(NSBundle*)nibBundleOrNil NS_UNAVAILABLE;
+
+- (instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_INTERACTIVE_LENS_UI_INTERACTIVE_LENS_OVERLAY_PROMO_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.mm b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.mm
new file mode 100644
index 0000000..cfb0ec08
--- /dev/null
+++ b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.mm
@@ -0,0 +1,312 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.h"
+
+#import "ios/chrome/browser/bubble/ui_bundled/bubble_constants.h"
+#import "ios/chrome/browser/bubble/ui_bundled/bubble_view.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/elements/gradient_view.h"
+#import "ios/chrome/common/ui/promo_style/utils.h"
+#import "ios/chrome/common/ui/util/button_util.h"
+#import "ios/chrome/common/ui/util/constraints_ui_util.h"
+#import "ios/chrome/common/ui/util/pointer_interaction_util.h"
+#import "ios/chrome/grit/ios_strings.h"
+#import "ui/base/l10n/l10n_util.h"
+
+namespace {
+// Margins for the Lens view.
+const CGFloat kLensViewTopMargin = 40.0;
+const CGFloat kLensViewHorizontalMargin = 20.0;
+// Height multipliers for the Lens view.
+const CGFloat kLensViewMinHeightMultiplier = 0.4;
+const CGFloat kLensViewMaxHeightMultiplier = 1.45;
+// Corner radius for the top two corners of the Lens view.
+const CGFloat kLensViewCornerRadius = 30.0;
+// Top margin for tip bubble.
+const CGFloat kBubbleViewTopMargin = 10.0;
+// Height constant for the bubble view.
+const CGFloat kBubbleViewHeightConstant = 70.0;
+// Top margin for scroll view.
+const CGFloat kScrollViewTopMargin = 45.0;
+// Minimum height for the footer view.
+const CGFloat kMinFooterHeight = 100.0;
+}  // namespace
+
+@implementation InteractiveLensOverlayPromoViewController {
+  // View for the tip bubble.
+  BubbleView* _bubbleView;
+  // View for the interactive Lens instance.
+  UIView* _lensView;
+  // Scroll view containing the screen's title and subtitle.
+  UIScrollView* _textScrollView;
+}
+
+- (instancetype)initWithLensView:(UIView*)lensView {
+  self = [super initWithNibName:nil bundle:nil];
+  if (self) {
+    _lensView = lensView;
+  }
+  return self;
+}
+
+#pragma mark - UIViewController
+
+- (void)viewDidLoad {
+  [super viewDidLoad];
+
+  UIView* view = self.view;
+  view.backgroundColor = [UIColor colorNamed:kPrimaryBackgroundColor];
+  UILayoutGuide* widthLayoutGuide = AddPromoStyleWidthLayoutGuide(view);
+
+  // Add a gradient to the background.
+  GradientView* gradientView = [[GradientView alloc]
+      initWithTopColor:[UIColor colorNamed:kPrimaryBackgroundColor]
+           bottomColor:[UIColor colorNamed:kSecondaryBackgroundColor]];
+  gradientView.translatesAutoresizingMaskIntoConstraints = NO;
+  [view addSubview:gradientView];
+  AddSameConstraints(gradientView, view);
+
+  // Create and constrain the scroll view containing the title and subtitle. The
+  // content will only be scrollable after the Lens view has first compressed as
+  // much as it can.
+  _textScrollView = [self textScrollView];
+  [view addSubview:_textScrollView];
+  [NSLayoutConstraint activateConstraints:@[
+    [_textScrollView.topAnchor
+        constraintEqualToAnchor:view.safeAreaLayoutGuide.topAnchor
+                       constant:kScrollViewTopMargin],
+    [_textScrollView.leadingAnchor
+        constraintEqualToAnchor:widthLayoutGuide.leadingAnchor],
+    [_textScrollView.trailingAnchor
+        constraintEqualToAnchor:widthLayoutGuide.trailingAnchor],
+  ]];
+  NSLayoutConstraint* heightConstraint = [_textScrollView.heightAnchor
+      constraintEqualToAnchor:_textScrollView.contentLayoutGuide.heightAnchor];
+  // UILayoutPriorityDefaultHigh is the default priority for content
+  // compression. Setting this lower avoids compressing the content of the
+  // scroll view.
+  heightConstraint.priority = UILayoutPriorityDefaultHigh - 1;
+  heightConstraint.active = YES;
+
+  // Create and constrain the footer view containing the action button.
+  UIView* footerContainerView = [self footerContainerView];
+  [view addSubview:footerContainerView];
+  AddSameConstraintsToSides(
+      footerContainerView, view,
+      LayoutSides::kLeading | LayoutSides::kTrailing | LayoutSides::kBottom);
+  [NSLayoutConstraint activateConstraints:@[
+    [footerContainerView.heightAnchor
+        constraintGreaterThanOrEqualToConstant:kMinFooterHeight],
+  ]];
+
+  // Add and constrain the Lens view.
+  [view addSubview:_lensView];
+  _lensView.translatesAutoresizingMaskIntoConstraints = NO;
+  _lensView.layer.cornerRadius = kLensViewCornerRadius;
+  _lensView.layer.masksToBounds = YES;
+  _lensView.layer.maskedCorners =
+      kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner;
+  [NSLayoutConstraint activateConstraints:@[
+    // The Lens view has both a minimum possible height (relative to the height
+    // of its superview) and a maximum possible height (relative to the height
+    // of the Lens overlay image asset).
+    [_lensView.heightAnchor
+        constraintGreaterThanOrEqualToAnchor:view.heightAnchor
+                                  multiplier:kLensViewMinHeightMultiplier],
+    [_lensView.heightAnchor
+        constraintLessThanOrEqualToAnchor:_lensView.widthAnchor
+                               multiplier:kLensViewMaxHeightMultiplier],
+    [_lensView.leadingAnchor
+        constraintEqualToAnchor:widthLayoutGuide.leadingAnchor
+                       constant:kLensViewHorizontalMargin],
+    [_lensView.trailingAnchor
+        constraintEqualToAnchor:widthLayoutGuide.trailingAnchor
+                       constant:-kLensViewHorizontalMargin],
+    [_lensView.bottomAnchor
+        constraintEqualToAnchor:footerContainerView.topAnchor],
+    [_lensView.topAnchor
+        constraintGreaterThanOrEqualToAnchor:_textScrollView.bottomAnchor
+                                    constant:kLensViewTopMargin],
+  ]];
+
+  // Create and constrain the bubble view so that it is pinned to the Lens view
+  // and always below the title/subtitle.
+  _bubbleView = [self bubbleView];
+  [view addSubview:_bubbleView];
+  [NSLayoutConstraint activateConstraints:@[
+    [_bubbleView.centerXAnchor constraintEqualToAnchor:view.centerXAnchor],
+    [_bubbleView.leadingAnchor
+        constraintEqualToAnchor:view.safeAreaLayoutGuide.leadingAnchor],
+    [_bubbleView.trailingAnchor
+        constraintEqualToAnchor:view.safeAreaLayoutGuide.trailingAnchor],
+    [_bubbleView.bottomAnchor
+        constraintEqualToAnchor:_lensView.topAnchor
+                       constant:kBubbleViewHeightConstant],
+    [_bubbleView.topAnchor
+        constraintGreaterThanOrEqualToAnchor:_textScrollView.bottomAnchor
+                                    constant:kBubbleViewTopMargin],
+  ]];
+
+  [self startBubbleAnimation];
+}
+
+- (void)viewDidAppear:(BOOL)animated {
+  [super viewDidAppear:animated];
+  [_textScrollView flashScrollIndicators];
+}
+
+#pragma mark - Private
+
+// Creates and returns a scroll view containing the title and subtitle texts.
+- (UIScrollView*)textScrollView {
+  UILabel* titleLabel = [[UILabel alloc] init];
+  titleLabel.numberOfLines = 0;
+  titleLabel.font = GetFRETitleFont(GetTitleLabelFontTextStyle(self));
+  titleLabel.textColor = [UIColor colorNamed:kTextPrimaryColor];
+  titleLabel.text =
+      l10n_util::GetNSString(IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_TITLE);
+  titleLabel.textAlignment = NSTextAlignmentCenter;
+  titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
+  titleLabel.adjustsFontForContentSizeCategory = YES;
+  titleLabel.accessibilityTraits |= UIAccessibilityTraitHeader;
+
+  UILabel* subtitleLabel = [[UILabel alloc] init];
+  subtitleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
+  subtitleLabel.numberOfLines = 0;
+  subtitleLabel.textColor = [UIColor colorNamed:kGrey800Color];
+  subtitleLabel.text =
+      l10n_util::GetNSString(IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SUBTITLE);
+  subtitleLabel.textAlignment = NSTextAlignmentCenter;
+  subtitleLabel.translatesAutoresizingMaskIntoConstraints = NO;
+  subtitleLabel.adjustsFontForContentSizeCategory = YES;
+
+  UIStackView* textStack = [[UIStackView alloc]
+      initWithArrangedSubviews:@[ titleLabel, subtitleLabel ]];
+  textStack.axis = UILayoutConstraintAxisVertical;
+  textStack.alignment = UIStackViewAlignmentCenter;
+  textStack.spacing = 10.0;
+  textStack.translatesAutoresizingMaskIntoConstraints = NO;
+
+  UIScrollView* scrollView = [[UIScrollView alloc] init];
+  scrollView.translatesAutoresizingMaskIntoConstraints = NO;
+  scrollView.showsVerticalScrollIndicator = YES;
+  [scrollView addSubview:textStack];
+
+  [NSLayoutConstraint activateConstraints:@[
+    [textStack.topAnchor
+        constraintEqualToAnchor:scrollView.contentLayoutGuide.topAnchor],
+    [textStack.bottomAnchor
+        constraintEqualToAnchor:scrollView.contentLayoutGuide.bottomAnchor],
+    [textStack.widthAnchor
+        constraintEqualToAnchor:scrollView.frameLayoutGuide.widthAnchor],
+    [textStack.centerXAnchor constraintEqualToAnchor:scrollView.centerXAnchor],
+  ]];
+
+  return scrollView;
+}
+
+// Creates and returns the tip bubble view.
+- (BubbleView*)bubbleView {
+  BubbleView* bubbleView = [[BubbleView alloc]
+        initWithText:l10n_util::GetNSString(
+                         IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_BUBBLE_TEXT)
+      arrowDirection:BubbleArrowDirectionDown
+           alignment:BubbleAlignmentCenter];
+  bubbleView.translatesAutoresizingMaskIntoConstraints = NO;
+
+  return bubbleView;
+}
+
+// Starts the animation for the tip bubble view.
+- (void)startBubbleAnimation {
+  CGFloat originalY = _bubbleView.frame.origin.y;
+  CGFloat floatHeight = 18.0;
+
+  __weak __typeof(_bubbleView) weakBubbleView = _bubbleView;
+  [UIView animateWithDuration:1.5
+                        delay:0.0
+                      options:UIViewAnimationOptionAutoreverse |
+                              UIViewAnimationOptionRepeat |
+                              UIViewAnimationOptionCurveEaseInOut
+                   animations:^{
+                     CGRect frame = weakBubbleView.frame;
+                     frame.origin.y = originalY - floatHeight;
+                     weakBubbleView.frame = frame;
+                   }
+                   completion:nil];
+}
+
+// Creates and returns the footer container view, which holds the action button
+// and a separator line.
+- (UIView*)footerContainerView {
+  UIView* footerContainerView = [[UIView alloc] init];
+  footerContainerView.translatesAutoresizingMaskIntoConstraints = NO;
+  footerContainerView.backgroundColor = [UIColor whiteColor];
+
+  UIView* separatorLine = [[UIView alloc] init];
+  separatorLine.translatesAutoresizingMaskIntoConstraints = NO;
+  separatorLine.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1.0];
+  [footerContainerView addSubview:separatorLine];
+
+  [NSLayoutConstraint activateConstraints:@[
+    [separatorLine.topAnchor
+        constraintEqualToAnchor:footerContainerView.topAnchor],
+    [separatorLine.leadingAnchor
+        constraintEqualToAnchor:footerContainerView.leadingAnchor],
+    [separatorLine.trailingAnchor
+        constraintEqualToAnchor:footerContainerView.trailingAnchor],
+    [separatorLine.heightAnchor constraintEqualToConstant:1.0]
+  ]];
+
+  UIButton* button = [self buttonView];
+  [footerContainerView addSubview:button];
+
+  [NSLayoutConstraint activateConstraints:@[
+    [button.centerXAnchor
+        constraintEqualToAnchor:footerContainerView.centerXAnchor],
+    [button.centerYAnchor
+        constraintEqualToAnchor:footerContainerView.centerYAnchor
+                       constant:-5],
+  ]];
+
+  return footerContainerView;
+}
+
+// Creates and returns the action button.
+- (UIButton*)buttonView {
+  UIButton* button = [UIButton buttonWithType:UIButtonTypeSystem];
+  NSString* buttonTitle = l10n_util::GetNSString(
+      IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SKIP_BUTTON);
+  UIButtonConfiguration* buttonConfiguration =
+      [UIButtonConfiguration plainButtonConfiguration];
+  buttonConfiguration.title = buttonTitle;
+  buttonConfiguration.background.backgroundColor = [UIColor clearColor];
+  buttonConfiguration.baseForegroundColor = [UIColor colorNamed:kBlueColor];
+  buttonConfiguration.contentInsets = NSDirectionalEdgeInsetsMake(
+      kButtonVerticalInsets, 0, kButtonVerticalInsets, 0);
+  UIFont* font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
+  NSDictionary* attributes = @{NSFontAttributeName : font};
+  NSMutableAttributedString* string =
+      [[NSMutableAttributedString alloc] initWithString:buttonTitle];
+  [string addAttributes:attributes range:NSMakeRange(0, string.length)];
+  buttonConfiguration.attributedTitle = string;
+  buttonConfiguration.titleLineBreakMode = NSLineBreakByTruncatingTail;
+  button.configuration = buttonConfiguration;
+  button.translatesAutoresizingMaskIntoConstraints = NO;
+  button.titleLabel.adjustsFontForContentSizeCategory = YES;
+  button.pointerInteractionEnabled = YES;
+  button.pointerStyleProvider = CreateOpaqueButtonPointerStyleProvider();
+  [button addTarget:self
+                action:@selector(buttonTapped)
+      forControlEvents:UIControlEventTouchUpInside];
+  return button;
+}
+
+// Handles taps on the action button.
+- (void)buttonTapped {
+  [self.delegate didTapContinueButton];
+}
+
+@end
diff --git a/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.h b/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.h
index e3c5e82..d1397be4 100644
--- a/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.h
+++ b/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.h
@@ -10,12 +10,33 @@
 
 #import "ios/chrome/browser/shared/coordinator/chrome_coordinator/chrome_coordinator.h"
 
+@class HomeCustomizationBackgroundPhotoPickerCoordinator;
+
+// Protocol for handling selected images from the photo picker.
+@protocol HomeCustomizationBackgroundPhotoPickerCoordinatorDelegate <NSObject>
+
+// Called when the user successfully selects and frames an image.
+- (void)photoPickerCoordinator:
+            (HomeCustomizationBackgroundPhotoPickerCoordinator*)coordinator
+                didSelectImage:(UIImage*)image;
+
+// Called when the user cancels the photo selection process.
+- (void)photoPickerCoordinatorDidCancel:
+    (HomeCustomizationBackgroundPhotoPickerCoordinator*)coordinator;
+
+@end
+
 // Coordinator that handles photo selection from the device's photo library.
 // This coordinator manages the PHPickerViewController and handles selected
 // images.
-@interface PHPickerCoordinator
+@interface HomeCustomizationBackgroundPhotoPickerCoordinator
     : ChromeCoordinator <PHPickerViewControllerDelegate>
 
+// Delegate to handle the final selected and framed image.
+@property(nonatomic, weak)
+    id<HomeCustomizationBackgroundPhotoPickerCoordinatorDelegate>
+        delegate;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_HOME_CUSTOMIZATION_COORDINATOR_HOME_CUSTOMIZATION_BACKGROUND_PHOTO_PICKER_COORDINATOR_H_
diff --git a/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.mm b/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.mm
index df05f6f8..3c9e4aa 100644
--- a/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.mm
+++ b/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.mm
@@ -5,12 +5,21 @@
 #import "ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.h"
 
 #import "base/check.h"
-#import "ios/chrome/browser/home_customization/ui/home_customization_background_photo_library_picker_view_controller.h"
+#import "ios/chrome/browser/home_customization/ui/home_customization_background_photo_framing_view_controller.h"
 #import "ios/chrome/browser/shared/model/browser/browser.h"
+#import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h"
 #import "ios/chrome/grit/ios_strings.h"
+#import "ios/public/provider/chrome/browser/ui_utils/ui_utils_api.h"
 #import "ui/base/l10n/l10n_util_mac.h"
 
-@implementation PHPickerCoordinator
+@interface HomeCustomizationBackgroundPhotoPickerCoordinator () <
+    HomeCustomizationImageFramingViewControllerDelegate>
+@end
+
+@implementation HomeCustomizationBackgroundPhotoPickerCoordinator {
+  // Strong reference to the framing view controller while it's being presented.
+  HomeCustomizationImageFramingViewController* _framingViewController;
+}
 
 - (void)start {
   [self presentPhotoPicker];
@@ -21,6 +30,9 @@
   if (self.baseViewController.presentedViewController) {
     [self.baseViewController dismissViewControllerAnimated:NO completion:nil];
   }
+
+  _framingViewController = nil;
+
   [super stop];
 }
 
@@ -66,14 +78,70 @@
                              });
                            }
                          }];
+  } else {
+    // User cancelled without selecting an image.
+    [self.delegate photoPickerCoordinatorDidCancel:self];
   }
 }
 
 #pragma mark - Private
 
-// Handles the selected image and presents the cropping view.
+// Handles the selected image and presents the framing view.
 - (void)handleSelectedImage:(UIImage*)image {
-  // TODO(crbug.com/415060566): Present cropping interface.
+  // Create the logo vendor
+  id<LogoVendor> logoVendor = ios::provider::CreateLogoVendor(
+      self.browser, self.browser->GetWebStateList()->GetActiveWebState());
+
+  // Create the framing view controller with both image and logo vendor
+  _framingViewController = [[HomeCustomizationImageFramingViewController alloc]
+      initWithImage:image
+         logoVendor:logoVendor];
+
+  // Set the delegate to handle the framed image.
+  _framingViewController.delegate = self;
+
+  _framingViewController.modalPresentationStyle =
+      UIModalPresentationOverFullScreen;
+  _framingViewController.modalTransitionStyle =
+      UIModalTransitionStyleCrossDissolve;
+
+  // Present the framing interface.
+  [self.baseViewController presentViewController:_framingViewController
+                                        animated:YES
+                                      completion:nil];
+}
+
+#pragma mark - HomeCustomizationImageFramingViewControllerDelegate
+
+- (void)imageFramingViewController:
+            (HomeCustomizationImageFramingViewController*)controller
+                didFinishWithImage:(UIImage*)framedImage {
+  // Dismiss the framing view controller.
+  __weak __typeof(self) weakSelf = self;
+  [controller dismissViewControllerAnimated:YES
+                                 completion:^{
+                                   // Pass the framed image to the delegate.
+                                   [weakSelf.delegate
+                                       photoPickerCoordinator:weakSelf
+                                               didSelectImage:framedImage];
+                                 }];
+
+  _framingViewController = nil;
+}
+
+- (void)imageFramingViewControllerDidCancel:
+    (HomeCustomizationImageFramingViewController*)controller {
+  // Dismiss the framing view controller.
+  __weak __typeof(self) weakSelf = self;
+  [controller
+      dismissViewControllerAnimated:YES
+                         completion:^{
+                           // Notify delegate of cancellation.
+                           [weakSelf.delegate
+                               photoPickerCoordinatorDidCancel:weakSelf];
+                         }];
+
+  _framingViewController = nil;
 }
 
 @end
diff --git a/ios/chrome/browser/home_customization/coordinator/home_customization_background_picker_action_sheet_coordinator.mm b/ios/chrome/browser/home_customization/coordinator/home_customization_background_picker_action_sheet_coordinator.mm
index 4c5eaf7..82d3dfb 100644
--- a/ios/chrome/browser/home_customization/coordinator/home_customization_background_picker_action_sheet_coordinator.mm
+++ b/ios/chrome/browser/home_customization/coordinator/home_customization_background_picker_action_sheet_coordinator.mm
@@ -52,7 +52,7 @@
       _backgroundPresetGalleryPickerMediator;
 
   // The coordinator for the photo picker.
-  PHPickerCoordinator* _photoPickerCoordinator;
+  HomeCustomizationBackgroundPhotoPickerCoordinator* _photoPickerCoordinator;
 
   // The main view controller presented by the base view controller.
   UIViewController* _mainViewController;
@@ -251,9 +251,10 @@
 // from the device's photo library.
 - (void)presentPhotoLibraryPicker {
   // Create and start the photo picker coordinator
-  _photoPickerCoordinator = [[PHPickerCoordinator alloc]
-      initWithBaseViewController:self.baseViewController
-                         browser:self.browser];
+  _photoPickerCoordinator =
+      [[HomeCustomizationBackgroundPhotoPickerCoordinator alloc]
+          initWithBaseViewController:self.baseViewController
+                             browser:self.browser];
   [_photoPickerCoordinator start];
 }
 
diff --git a/ios/chrome/browser/home_customization/ui/BUILD.gn b/ios/chrome/browser/home_customization/ui/BUILD.gn
index d2a5b2b..0a6a120 100644
--- a/ios/chrome/browser/home_customization/ui/BUILD.gn
+++ b/ios/chrome/browser/home_customization/ui/BUILD.gn
@@ -10,6 +10,8 @@
     "home_customization_background_color_picker_mutator.h",
     "home_customization_background_color_picker_view_controller.h",
     "home_customization_background_color_picker_view_controller.mm",
+    "home_customization_background_photo_framing_view_controller.h",
+    "home_customization_background_photo_framing_view_controller.mm",
     "home_customization_background_photo_library_picker_view_controller.h",
     "home_customization_background_photo_library_picker_view_controller.mm",
     "home_customization_background_picker_action_sheet_mutator.h",
diff --git a/ios/chrome/browser/home_customization/ui/home_customization_background_photo_framing_view_controller.h b/ios/chrome/browser/home_customization/ui/home_customization_background_photo_framing_view_controller.h
new file mode 100644
index 0000000..518cc6e
--- /dev/null
+++ b/ios/chrome/browser/home_customization/ui/home_customization_background_photo_framing_view_controller.h
@@ -0,0 +1,47 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_HOME_CUSTOMIZATION_UI_HOME_CUSTOMIZATION_BACKGROUND_PHOTO_FRAMING_VIEW_CONTROLLER_H_
+#define IOS_CHROME_BROWSER_HOME_CUSTOMIZATION_UI_HOME_CUSTOMIZATION_BACKGROUND_PHOTO_FRAMING_VIEW_CONTROLLER_H_
+
+#import <UIKit/UIKit.h>
+
+@protocol LogoVendor;
+@class HomeCustomizationImageFramingViewController;
+
+// Protocol for handling framing results.
+@protocol HomeCustomizationImageFramingViewControllerDelegate <NSObject>
+// Called when the user finishes framing with a resulting image.
+- (void)imageFramingViewController:
+            (HomeCustomizationImageFramingViewController*)controller
+                didFinishWithImage:(UIImage*)framedImage;
+
+// Called when the user cancels the framing operation.
+- (void)imageFramingViewControllerDidCancel:
+    (HomeCustomizationImageFramingViewController*)controller;
+@end
+
+// View controller that provides a full-screen image framing interface.
+@interface HomeCustomizationImageFramingViewController : UIViewController
+
+// Delegate to receive framing results.
+@property(nonatomic, weak)
+    id<HomeCustomizationImageFramingViewControllerDelegate>
+        delegate;
+
+// Initialize with an image to frame and a logo vendor for displaying the Google
+// logo.
+- (instancetype)initWithImage:(UIImage*)image
+                   logoVendor:(id<LogoVendor>)logoVendor
+    NS_DESIGNATED_INITIALIZER;
+
+// Unavailable initializers.
+- (instancetype)init NS_UNAVAILABLE;
+- (instancetype)initWithNibName:(NSString*)nibNameOrNil
+                         bundle:(NSBundle*)nibBundleOrNil NS_UNAVAILABLE;
+- (instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_HOME_CUSTOMIZATION_UI_HOME_CUSTOMIZATION_BACKGROUND_PHOTO_FRAMING_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/home_customization/ui/home_customization_background_photo_framing_view_controller.mm b/ios/chrome/browser/home_customization/ui/home_customization_background_photo_framing_view_controller.mm
new file mode 100644
index 0000000..8335cac5
--- /dev/null
+++ b/ios/chrome/browser/home_customization/ui/home_customization_background_photo_framing_view_controller.mm
@@ -0,0 +1,344 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/home_customization/ui/home_customization_background_photo_framing_view_controller.h"
+
+#import "base/check.h"
+#import "ios/chrome/browser/ntp/ui_bundled/logo_vendor.h"
+#import "ios/chrome/browser/shared/ui/symbols/symbols.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/util/constraints_ui_util.h"
+#import "ios/chrome/grit/ios_strings.h"
+#import "ui/base/l10n/l10n_util_mac.h"
+
+namespace {
+// Constants for UI layout.
+const CGFloat kButtonHeight = 50.0;
+const CGFloat kButtonCornerRadius = 8.0;
+const CGFloat kButtonSpacing = 12.0;
+const CGFloat kContentPadding = 16.0;
+const CGFloat kTopSpacingHeight = 5.0;
+const CGFloat kOmniboxHeight = 50.0;
+const CGFloat kOmniboxRadius = 22.5;
+const CGFloat kPinchIconSize = 18.0;
+const CGFloat kMaximumZoomScale = 5.0;
+const CGFloat kSectionSpacing = 24.0;
+const CGFloat kBottomHSpacingHeight = 5.0;
+const CGFloat kLogoContainerWidth = 120.0;
+const CGFloat kLogoContainerHeight = 40.0;
+const CGFloat kCenterStackSpacing = 4.0;
+}  // namespace
+
+@interface HomeCustomizationImageFramingViewController () <
+    UIScrollViewDelegate> {
+  // The original image to be framed.
+  UIImage* _originalImage;
+  // Logo vendor for displaying Google logo/doodle.
+  id<LogoVendor> _logoVendor;
+  // Image view displaying the image.
+  UIImageView* _imageView;
+  // Bottom section container.
+  UIView* _bottomSection;
+  // Scroll view for zooming and panning.
+  UIScrollView* _scrollView;
+}
+
+@end
+
+@implementation HomeCustomizationImageFramingViewController
+
+#pragma mark - Initialization
+
+- (instancetype)initWithImage:(UIImage*)image
+                   logoVendor:(id<LogoVendor>)logoVendor {
+  CHECK(image);
+  CHECK(logoVendor);
+  self = [super initWithNibName:nil bundle:nil];
+  if (self) {
+    _originalImage = image;
+    _logoVendor = logoVendor;
+    // Set fullscreen presentation.
+    self.modalPresentationStyle = UIModalPresentationOverFullScreen;
+  }
+  return self;
+}
+
+#pragma mark - UIViewController
+
+- (void)viewDidLoad {
+  [super viewDidLoad];
+
+  self.view.backgroundColor = [UIColor colorNamed:kTextPrimaryColor];
+
+  [self setupScrollView];
+  [self setupImageView];
+  [self setupTopSection];
+  [self setupBottomSection];
+  [self setupCenterContainer];
+}
+
+- (void)viewDidAppear:(BOOL)animated {
+  [super viewDidAppear:animated];
+  [self updateMinimumZoomScale];
+  [self centerImageView];
+}
+
+- (void)viewWillTransitionToSize:(CGSize)size
+       withTransitionCoordinator:
+           (id<UIViewControllerTransitionCoordinator>)coordinator {
+  [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
+
+  __weak __typeof(self) weakSelf = self;
+  [coordinator
+      animateAlongsideTransition:nil
+                      completion:^(
+                          id<UIViewControllerTransitionCoordinatorContext>
+                              context) {
+                        [weakSelf updateMinimumZoomScale];
+                        [weakSelf centerImageView];
+                      }];
+}
+
+#pragma mark - UIScrollViewDelegate
+
+- (UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView {
+  return _imageView;
+}
+
+- (void)scrollViewDidZoom:(UIScrollView*)scrollView {
+  [self centerImageView];
+}
+
+#pragma mark - Private
+
+// Sets up the scroll view for image zooming and panning.
+- (void)setupScrollView {
+  _scrollView = [[UIScrollView alloc] init];
+  _scrollView.translatesAutoresizingMaskIntoConstraints = NO;
+  _scrollView.delegate = self;
+  _scrollView.showsVerticalScrollIndicator = NO;
+  _scrollView.showsHorizontalScrollIndicator = NO;
+  _scrollView.decelerationRate = UIScrollViewDecelerationRateFast;
+  _scrollView.minimumZoomScale = 1.0;
+  _scrollView.maximumZoomScale = kMaximumZoomScale;
+  _scrollView.contentInsetAdjustmentBehavior =
+      UIScrollViewContentInsetAdjustmentNever;
+  [self.view addSubview:_scrollView];
+
+  // Pin scroll view to view edges.
+  AddSameConstraints(_scrollView, self.view);
+}
+
+// Configures the image view and adds it to the scroll view.
+- (void)setupImageView {
+  _imageView = [[UIImageView alloc] initWithImage:_originalImage];
+  _imageView.contentMode = UIViewContentModeScaleAspectFit;
+  [_scrollView addSubview:_imageView];
+
+  _scrollView.contentSize = _imageView.frame.size;
+}
+
+// Creates the top section with logo and omnibox.
+- (void)setupTopSection {
+  // Top section container.
+  UIStackView* topSection = [[UIStackView alloc] init];
+  topSection.axis = UILayoutConstraintAxisVertical;
+  topSection.alignment = UIStackViewAlignmentCenter;
+  topSection.spacing = kSectionSpacing;
+  topSection.translatesAutoresizingMaskIntoConstraints = NO;
+  [self.view addSubview:topSection];
+
+  // Add logo vendor view.
+  if (_logoVendor) {
+    // Get logo view and configure it.
+    UIView* logoView = _logoVendor.view;
+    logoView.translatesAutoresizingMaskIntoConstraints = NO;
+    _logoVendor.showingLogo = YES;
+    _logoVendor.usesMonochromeLogo = YES;
+    logoView.tintColor = [UIColor colorNamed:kSolidWhiteColor];
+    [topSection addArrangedSubview:logoView];
+
+    [NSLayoutConstraint activateConstraints:@[
+      [logoView.widthAnchor constraintEqualToConstant:kLogoContainerWidth],
+      [logoView.heightAnchor constraintEqualToConstant:kLogoContainerHeight]
+    ]];
+  }
+
+  // Omnibox view.
+  UIView* omniboxView = [[UIView alloc] init];
+  omniboxView.backgroundColor = [UIColor whiteColor];
+  omniboxView.layer.cornerRadius = kOmniboxRadius;
+  omniboxView.translatesAutoresizingMaskIntoConstraints = NO;
+  [topSection addArrangedSubview:omniboxView];
+
+  [NSLayoutConstraint activateConstraints:@[
+    // Top section container.
+    [topSection.topAnchor
+        constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor
+                       constant:kContentPadding + kTopSpacingHeight +
+                                kSectionSpacing],
+    [topSection.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor
+                                             constant:kContentPadding],
+    [topSection.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor
+                                              constant:-kContentPadding],
+
+    // Omnibox view.
+    [omniboxView.widthAnchor constraintEqualToAnchor:topSection.widthAnchor],
+    [omniboxView.heightAnchor constraintEqualToConstant:kOmniboxHeight]
+  ]];
+}
+
+// Creates the bottom section with save and cancel buttons.
+- (void)setupBottomSection {
+  // Bottom section container using stack view.
+  _bottomSection = [[UIStackView alloc] init];
+  UIStackView* bottomStack = (UIStackView*)_bottomSection;
+  bottomStack.axis = UILayoutConstraintAxisVertical;
+  bottomStack.alignment = UIStackViewAlignmentFill;
+  bottomStack.spacing = kButtonSpacing;
+  bottomStack.translatesAutoresizingMaskIntoConstraints = NO;
+  [self.view addSubview:_bottomSection];
+
+  // Save button.
+  UIButtonConfiguration* saveConfig =
+      [UIButtonConfiguration filledButtonConfiguration];
+  saveConfig.title = l10n_util::GetNSString(
+      IDS_IOS_HOME_CUSTOMIZATION_BACKGROUND_FRAMING_VIEW_SAVE_BUTTON_LABEL);
+  saveConfig.baseBackgroundColor = [UIColor colorNamed:kBlueColor];
+  saveConfig.baseForegroundColor = [UIColor colorNamed:kSolidWhiteColor];
+  saveConfig.cornerStyle = UIButtonConfigurationCornerStyleFixed;
+  saveConfig.background.cornerRadius = kButtonCornerRadius;
+
+  UIButton* saveButton = [UIButton buttonWithConfiguration:saveConfig
+                                             primaryAction:nil];
+  saveButton.translatesAutoresizingMaskIntoConstraints = NO;
+  [saveButton addTarget:self
+                 action:@selector(saveButtonTapped)
+       forControlEvents:UIControlEventTouchUpInside];
+  [bottomStack addArrangedSubview:saveButton];
+
+  // Cancel button.
+  UIButtonConfiguration* cancelConfig =
+      [UIButtonConfiguration filledButtonConfiguration];
+  cancelConfig.title = l10n_util::GetNSString(
+      IDS_IOS_HOME_CUSTOMIZATION_BACKGROUND_FRAMING_VIEW_CANCEL_BUTTON_LABEL);
+  cancelConfig.baseBackgroundColor = [UIColor colorNamed:kSolidWhiteColor];
+  cancelConfig.baseForegroundColor = [UIColor colorNamed:kBlueColor];
+  cancelConfig.cornerStyle = UIButtonConfigurationCornerStyleFixed;
+  cancelConfig.background.cornerRadius = kButtonCornerRadius;
+
+  UIButton* cancelButton = [UIButton buttonWithConfiguration:cancelConfig
+                                               primaryAction:nil];
+  cancelButton.translatesAutoresizingMaskIntoConstraints = NO;
+  [cancelButton addTarget:self
+                   action:@selector(cancelButtonTapped)
+         forControlEvents:UIControlEventTouchUpInside];
+  [bottomStack addArrangedSubview:cancelButton];
+
+  // Constraints for stack view and button heights.
+  [NSLayoutConstraint activateConstraints:@[
+    // Bottom section container.
+    [_bottomSection.bottomAnchor
+        constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor
+                       constant:-(kContentPadding + kBottomHSpacingHeight +
+                                  kButtonSpacing)],
+    [_bottomSection.leadingAnchor
+        constraintEqualToAnchor:self.view.leadingAnchor
+                       constant:kContentPadding],
+    [_bottomSection.trailingAnchor
+        constraintEqualToAnchor:self.view.trailingAnchor
+                       constant:-kContentPadding],
+
+    // Button heights.
+    [saveButton.heightAnchor constraintEqualToConstant:kButtonHeight],
+    [cancelButton.heightAnchor constraintEqualToConstant:kButtonHeight]
+  ]];
+}
+
+// Creates the center container with pinch instruction.
+- (void)setupCenterContainer {
+  // Center container for pinch instruction using horizontal stack view.
+  UIStackView* centerContainer = [[UIStackView alloc] init];
+  centerContainer.alignment = UIStackViewAlignmentCenter;
+  centerContainer.spacing = kCenterStackSpacing;
+  centerContainer.translatesAutoresizingMaskIntoConstraints = NO;
+  [self.view addSubview:centerContainer];
+
+  // Pinch icon.
+  UIImage* pinchIcon = DefaultSymbolWithPointSize(kCropSymbol, kPinchIconSize);
+  UIImageView* pinchIconView = [[UIImageView alloc] initWithImage:pinchIcon];
+  pinchIconView.tintColor = [UIColor colorNamed:kSolidWhiteColor];
+  pinchIconView.contentMode = UIViewContentModeScaleAspectFit;
+  pinchIconView.translatesAutoresizingMaskIntoConstraints = NO;
+  [centerContainer addArrangedSubview:pinchIconView];
+
+  // Add size constraints for the icon.
+  [NSLayoutConstraint activateConstraints:@[
+    [pinchIconView.widthAnchor constraintEqualToConstant:kPinchIconSize],
+    [pinchIconView.heightAnchor constraintEqualToConstant:kPinchIconSize]
+  ]];
+
+  // Pinch label.
+  UILabel* pinchLabel = [[UILabel alloc] init];
+  // Temp string till UX confirms the final string to use here.
+  // TODO(crbug.com/415061276: remove temp string when final string is
+  // available.
+  pinchLabel.text = @"Foo: Pinch to crop";
+  pinchLabel.textColor = [UIColor colorNamed:kSolidWhiteColor];
+  pinchLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote];
+  pinchLabel.translatesAutoresizingMaskIntoConstraints = NO;
+  [centerContainer addArrangedSubview:pinchLabel];
+
+  // Set up constraints for center container.
+  [NSLayoutConstraint activateConstraints:@[
+    [centerContainer.centerXAnchor
+        constraintEqualToAnchor:self.view.centerXAnchor],
+    [centerContainer.bottomAnchor
+        constraintEqualToAnchor:_bottomSection.topAnchor
+                       constant:-kContentPadding]
+  ]];
+}
+
+// Updates the minimum zoom scale to fill the screen.
+- (void)updateMinimumZoomScale {
+  CGSize scrollViewSize = _scrollView.bounds.size;
+  CGSize imageSize = _originalImage.size;
+
+  // Calculate the scale needed to fill the screen.
+  CGFloat widthScale = scrollViewSize.width / imageSize.width;
+  CGFloat heightScale = scrollViewSize.height / imageSize.height;
+  CGFloat minimumScale = MAX(widthScale, heightScale);
+
+  _scrollView.minimumZoomScale = minimumScale;
+  _scrollView.zoomScale = minimumScale;
+}
+
+// Centers the image view within the scroll view bounds.
+- (void)centerImageView {
+  CGSize scrollViewSize = _scrollView.bounds.size;
+  CGSize contentSize = _scrollView.contentSize;
+
+  CGFloat offsetX = (scrollViewSize.width > contentSize.width)
+                        ? (scrollViewSize.width - contentSize.width) * 0.5
+                        : 0;
+  CGFloat offsetY = (scrollViewSize.height > contentSize.height)
+                        ? (scrollViewSize.height - contentSize.height) * 0.5
+                        : 0;
+
+  _imageView.center = CGPointMake(contentSize.width * 0.5 + offsetX,
+                                  contentSize.height * 0.5 + offsetY);
+}
+
+// Handles cancel button tap and notifies delegate.
+- (void)cancelButtonTapped {
+  [self.delegate imageFramingViewControllerDidCancel:self];
+}
+
+// Handles save button tap functionality.
+- (void)saveButtonTapped {
+  // TODO(crbug.com/421925583): Implement save button and integrate with
+  // services.
+}
+
+@end
diff --git a/ios/chrome/browser/main/ui_bundled/BUILD.gn b/ios/chrome/browser/main/ui_bundled/BUILD.gn
index d7027103..20197d31 100644
--- a/ios/chrome/browser/main/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/main/ui_bundled/BUILD.gn
@@ -153,6 +153,7 @@
     "//ios/chrome/browser/signin/model:authentication_service_factory",
     "//ios/chrome/browser/signin/model:fake_system_identity",
     "//ios/chrome/browser/signin/model:fake_system_identity_manager",
+    "//ios/chrome/browser/signin/model:signin_util",
     "//ios/chrome/browser/signin/model:test_support",
     "//ios/chrome/browser/sync/model",
     "//ios/chrome/browser/tabs/model/inactive_tabs:features",
diff --git a/ios/chrome/browser/main/ui_bundled/default_browser_promo_scene_agent_unittest.mm b/ios/chrome/browser/main/ui_bundled/default_browser_promo_scene_agent_unittest.mm
index 80d6fcdb..5eefe714 100644
--- a/ios/chrome/browser/main/ui_bundled/default_browser_promo_scene_agent_unittest.mm
+++ b/ios/chrome/browser/main/ui_bundled/default_browser_promo_scene_agent_unittest.mm
@@ -31,6 +31,7 @@
 #import "ios/chrome/browser/signin/model/fake_authentication_service_delegate.h"
 #import "ios/chrome/browser/signin/model/fake_system_identity.h"
 #import "ios/chrome/browser/signin/model/fake_system_identity_manager.h"
+#import "ios/chrome/browser/signin/model/signin_util.h"
 #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h"
 #import "ios/chrome/test/testing_application_context.h"
 #import "ios/web/public/test/web_task_environment.h"
@@ -98,6 +99,12 @@
     agent_ = [[DefaultBrowserPromoSceneAgent alloc] init];
     agent_.sceneState = scene_state_;
     agent_.promosManager = promos_manager_.get();
+
+    base::RunLoop run_loop;
+    // Call IsFirstSessionAfterDeviceRestore() explicitly to make sure sentinel
+    // files related to backup/restore are fully created before the test begins.
+    IsFirstSessionAfterDeviceRestore(run_loop.QuitClosure());
+    run_loop.Run();
   }
 
   void TearDown() override {
@@ -108,6 +115,7 @@
     scene_state_ = nil;
     profile_.reset();
     ClearDefaultBrowserPromoData();
+    ResetDeviceRestoreDataForTesting();
   }
 
   void SignIn() {
@@ -124,6 +132,8 @@
     [[NSUserDefaults standardUserDefaults]
         setBool:YES
          forKey:@"SimulatePostDeviceRestore"];
+
+    ResetDeviceRestoreDataForTesting();
   }
 
   void VerifyPromoRegistration(std::set<promos_manager::Promo> promos) {
@@ -253,11 +263,7 @@
 
 // Tests that the Post Restore Default Browser Promo is registered when the
 // conditions are met.
-// TODO(crbug.com/417431030): disabled because it fails after fixing the UaF
-// caused by bad interaction between FakeSceneState and TestProfileIOS. It
-// should be fixed and re-enabled.
-TEST_F(DefaultBrowserPromoSceneAgentTest,
-       DISABLED_TestPromoRegistrationPostRestore) {
+TEST_F(DefaultBrowserPromoSceneAgentTest, TestPromoRegistrationPostRestore) {
   SimulatePostDeviceRestore();
   TestingApplicationContext::GetGlobal()->SetLastShutdownClean(true);
   LogOpenHTTPURLFromExternalURL();
diff --git a/ios/chrome/browser/omnibox/model/BUILD.gn b/ios/chrome/browser/omnibox/model/BUILD.gn
index 43c91941..c2e1881 100644
--- a/ios/chrome/browser/omnibox/model/BUILD.gn
+++ b/ios/chrome/browser/omnibox/model/BUILD.gn
@@ -45,6 +45,8 @@
     "//ios/chrome/browser/search_engines/model",
     "//ios/chrome/browser/shared/model/profile",
     "//ios/chrome/browser/shared/model/profile:profile_keyed_service_factory",
+    "//ios/chrome/browser/shared/ui/symbols",
+    "//ios/chrome/common/ui/favicon",
     "//rlz/buildflags",
     "//ui/base",
   ]
@@ -215,10 +217,12 @@
     "omnibox_pedal_annotator_unittest.mm",
     "omnibox_view_ios_unittest.mm",
     "pedal_section_extractor_unittest.mm",
+    "placeholder_service_unittest.mm",
   ]
   deps = [
     ":model",
     ":omnibox_pedal_swift",
+    ":placeholder_service",
     ":swift_dependencies",
     ":test_support",
     ":ui_bundled_interface",
@@ -235,17 +239,22 @@
     "//components/search_engines",
     "//components/search_engines:test_support",
     "//ios/chrome/browser/autocomplete/model",
+    "//ios/chrome/browser/favicon/model:test_support",
     "//ios/chrome/browser/location_bar/model:test_support",
     "//ios/chrome/browser/search_engines/model:template_url_service_factory",
     "//ios/chrome/browser/shared/model/prefs:browser_prefs",
     "//ios/chrome/browser/shared/model/prefs:pref_names",
     "//ios/chrome/browser/shared/model/profile/test",
+    "//ios/chrome/browser/shared/ui/symbols",
+    "//ios/chrome/common/ui/favicon",
+    "//ios/chrome/common/ui/favicon:favicon_constants",
     "//ios/chrome/test:test_support",
     "//ios/testing:nserror_support",
     "//ios/web/public/test",
     "//testing/gmock",
     "//testing/gtest",
     "//third_party/ocmock",
+    "//ui/base:test_support",
     "//ui/gfx:test_support",
   ]
 }
diff --git a/ios/chrome/browser/omnibox/model/placeholder_service.h b/ios/chrome/browser/omnibox/model/placeholder_service.h
index aae22be..fa74ff46 100644
--- a/ios/chrome/browser/omnibox/model/placeholder_service.h
+++ b/ios/chrome/browser/omnibox/model/placeholder_service.h
@@ -7,13 +7,16 @@
 
 #import <UIKit/UIKit.h>
 
+#import "base/functional/callback.h"
 #import "base/memory/raw_ptr.h"
 #import "base/observer_list.h"
 #import "base/task/cancelable_task_tracker.h"
 #import "components/keyed_service/core/keyed_service.h"
+#import "components/search_engines/template_url_id.h"
 #import "components/search_engines/template_url_service_observer.h"
 
 class FaviconLoader;
+class TemplateURL;
 class TemplateURLService;
 
 #include "base/observer_list_types.h"
@@ -59,7 +62,15 @@
   void AddObserver(PlaceholderServiceObserver* observer);
   void RemoveObserver(PlaceholderServiceObserver* observer);
 
-  UIImage* GetCurrentDefaultSearchEngineFavicon();
+  using PlaceholderImageCallback = base::RepeatingCallback<void(UIImage*)>;
+  // Requests the icon for the current default search engine at the given
+  // `icon_point_size`. If the icon is available synchronously, the callback
+  // will be called immediately with the cached icon. Otherwise, the callback
+  // will be called with a placeholder icon first, and then updated with the
+  // real icon once it's available. The callback will not be updated if the
+  // default search engine changes during the fetch.
+  void FetchDefaultSearchEngineIcon(CGFloat icon_point_size,
+                                    PlaceholderImageCallback callback);
   NSString* GetCurrentPlaceholderText();
   NSString* GetCurrentSearchOnlyPlaceholderText();
 
@@ -67,9 +78,31 @@
   void OnTemplateURLServiceChanged() override;
 
  private:
+  // Retrieves a bundled icon (e.g., Google icon) for the given `template_url`
+  // and `icon_point_size`, if available. Returns nil otherwise.
+  UIImage* GetBundledIconForTemplateURL(const TemplateURL* template_url,
+                                        CGFloat icon_point_size);
+
+  // Called when an icon has been successfully fetched or retrieved for a
+  // `template_url_id` at a specific `icon_point_size`. Caches the icon and
+  // notifies relevant callbacks.
+  void OnIconReceivedForTemplateURL(TemplateURLID template_url_id,
+                                    CGFloat icon_point_size,
+                                    UIImage* icon);
+
+  // Initiates a fetch for the icon of the given `template_url` at the specified
+  // `icon_point_size`.
+  void PerformIconFetch(const TemplateURL* template_url,
+                        CGFloat icon_point_size);
+
   raw_ptr<FaviconLoader> favicon_loader_;
   raw_ptr<TemplateURLService> template_url_service_;
   base::ObserverList<PlaceholderServiceObserver> model_observers_;
+  // Cache for fetched/bundled icons. Keyed by icon size.
+  NSCache<NSNumber*, UIImage*>* icon_cache_;
+  // Map of icon sizes to a list of callbacks awaiting an icon of that size.
+  // This is cleared when default search engine changes.
+  std::map<CGFloat, std::vector<PlaceholderImageCallback>> icon_callbacks_;
 
   base::WeakPtrFactory<PlaceholderService> weak_ptr_factory_{this};
 };
diff --git a/ios/chrome/browser/omnibox/model/placeholder_service.mm b/ios/chrome/browser/omnibox/model/placeholder_service.mm
index 5d26df3c..095527ba 100644
--- a/ios/chrome/browser/omnibox/model/placeholder_service.mm
+++ b/ios/chrome/browser/omnibox/model/placeholder_service.mm
@@ -6,9 +6,12 @@
 
 #import "base/strings/sys_string_conversions.h"
 #import "components/omnibox/common/omnibox_features.h"
+#import "components/search_engines/template_url.h"
 #import "components/search_engines/template_url_service.h"
 #import "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/favicon/model/favicon_loader.h"
+#import "ios/chrome/browser/shared/ui/symbols/symbols.h"
+#import "ios/chrome/common/ui/favicon/favicon_attributes.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ui/base/l10n/l10n_util.h"
 #import "ui/base/l10n/l10n_util_mac.h"
@@ -16,20 +19,64 @@
 PlaceholderService::PlaceholderService(FaviconLoader* favicon_loader,
                                        TemplateURLService* template_url_service)
     : favicon_loader_(favicon_loader),
-      template_url_service_(template_url_service) {
+      template_url_service_(template_url_service),
+      icon_callbacks_() {
   template_url_service->AddObserver(this);
+  icon_cache_ = [[NSCache alloc] init];
 }
 
 PlaceholderService::~PlaceholderService() {
   for (auto& observer : model_observers_) {
     observer.OnPlaceholderServiceShuttingDown();
   }
-
   template_url_service_->RemoveObserver(this);
+  icon_cache_ = nil;
 }
 
-UIImage* PlaceholderService::GetCurrentDefaultSearchEngineFavicon() {
-  return nil;
+void PlaceholderService::FetchDefaultSearchEngineIcon(
+    CGFloat icon_point_size,
+    PlaceholderImageCallback callback) {
+  // Return the cached image if there is one.
+  UIImage* cached_icon = [icon_cache_ objectForKey:@(icon_point_size)];
+  if (cached_icon) {
+    if (callback) {
+      callback.Run(cached_icon);
+    }
+    return;
+  }
+
+  // Return the placeholder icon if there is no default search provider.
+  UIImage* placeholder_icon =
+      DefaultSymbolWithPointSize(kSearchSymbol, icon_point_size);
+  const TemplateURL* default_provider =
+      template_url_service_ ? template_url_service_->GetDefaultSearchProvider()
+                            : nullptr;
+  if (!default_provider) {
+    if (callback) {
+      callback.Run(placeholder_icon);
+    }
+    return;
+  }
+
+  // Return the bundled icon if there is one. Also cache it.
+  UIImage* bundled_icon =
+      GetBundledIconForTemplateURL(default_provider, icon_point_size);
+  if (bundled_icon) {
+    [icon_cache_ setObject:bundled_icon forKey:@(icon_point_size)];
+    if (callback) {
+      callback.Run(bundled_icon);
+    }
+    return;
+  }
+
+  // Set a placeholder before fetching the icon.
+  if (callback) {
+    callback.Run(placeholder_icon);
+  }
+  // The original `callback` is moved and will be invoked when the fetch
+  // completes.
+  icon_callbacks_[icon_point_size].push_back(std::move(callback));
+  PerformIconFetch(default_provider, icon_point_size);
 }
 
 NSString* PlaceholderService::GetCurrentPlaceholderText() {
@@ -77,8 +124,93 @@
 #pragma mark - TemplateURLServiceObserver
 
 void PlaceholderService::OnTemplateURLServiceChanged() {
+  [icon_cache_ removeAllObjects];
+  icon_callbacks_.clear();
   for (auto& observer : model_observers_) {
     observer.OnPlaceholderTextChanged();
     observer.OnPlaceholderImageChanged();
   }
 }
+
+#pragma mark - Private
+
+UIImage* PlaceholderService::GetBundledIconForTemplateURL(
+    const TemplateURL* template_url,
+    CGFloat icon_point_size) {
+  CHECK(template_url);
+  CHECK(template_url_service_);
+
+  // Google bundled icon.
+  if (template_url->GetEngineType(template_url_service_->search_terms_data()) ==
+      SEARCH_ENGINE_GOOGLE) {
+#if BUILDFLAG(IOS_USE_BRANDED_SYMBOLS)
+    return MakeSymbolMulticolor(
+        CustomSymbolWithPointSize(kGoogleIconSymbol, icon_point_size));
+#endif
+  }
+  return nil;
+}
+
+void PlaceholderService::OnIconReceivedForTemplateURL(
+    TemplateURLID template_url_id,
+    CGFloat icon_point_size,
+    UIImage* icon) {
+  if (icon && template_url_service_ &&
+      template_url_service_->GetDefaultSearchProvider()->id() ==
+          template_url_id &&
+      ![icon_cache_ objectForKey:@(icon_point_size)]) {
+    [icon_cache_ setObject:icon forKey:@(icon_point_size)];
+
+    if (icon_callbacks_.contains(icon_point_size)) {
+      std::vector<PlaceholderImageCallback> callbacks =
+          std::move(icon_callbacks_[icon_point_size]);
+      icon_callbacks_.erase(icon_point_size);
+      for (PlaceholderImageCallback& callback : callbacks) {
+        if (callback) {
+          std::move(callback).Run(icon);
+        }
+      }
+    }
+  }
+}
+
+void PlaceholderService::PerformIconFetch(const TemplateURL* template_url,
+                                          CGFloat icon_point_size) {
+  if (!favicon_loader_) {
+    return;
+  }
+
+  auto favicon_completion = base::CallbackToBlock(base::BindRepeating(
+      [](base::WeakPtr<PlaceholderService> weak_self,
+         TemplateURLID template_url_id, CGFloat icon_point_size,
+         FaviconAttributes* favicon_result) {
+        if (!favicon_result.faviconImage || favicon_result.usesDefaultImage) {
+          return;
+        }
+        UIImage* favicon = favicon_result.faviconImage;
+        if (weak_self) {
+          weak_self->OnIconReceivedForTemplateURL(template_url_id,
+                                                  icon_point_size, favicon);
+        }
+      },
+      AsWeakPtr(), template_url->id(), icon_point_size));
+
+  // Prepopulated search engines don't have a favicon URL, so the favicon is
+  // loaded with an empty query search page URL.
+  if (template_url->prepopulate_id() != 0) {
+    // Fake up a page URL for favicons of prepopulated search engines, since
+    // favicons may be fetched from Google server which doesn't suppoprt icon
+    // URL.
+    std::string empty_page_url = template_url->url_ref().ReplaceSearchTerms(
+        TemplateURLRef::SearchTermsArgs(std::u16string()),
+        template_url_service_->search_terms_data());
+    favicon_loader_->FaviconForPageUrl(
+        GURL(empty_page_url), icon_point_size, icon_point_size,
+        /*fallback_to_google_server=*/YES, favicon_completion);
+  } else {
+    // Download the favicon.
+    favicon_loader_->FaviconForIconUrl(template_url->favicon_url(),
+                                       icon_point_size, icon_point_size,
+                                       favicon_completion);
+  }
+}
diff --git a/ios/chrome/browser/omnibox/model/placeholder_service_unittest.mm b/ios/chrome/browser/omnibox/model/placeholder_service_unittest.mm
new file mode 100644
index 0000000..a877095
--- /dev/null
+++ b/ios/chrome/browser/omnibox/model/placeholder_service_unittest.mm
@@ -0,0 +1,263 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/omnibox/model/placeholder_service.h"
+
+#import "base/functional/bind.h"
+#import "base/functional/callback_helpers.h"
+#import "base/run_loop.h"
+#import "base/strings/utf_string_conversions.h"
+#import "base/test/task_environment.h"
+#import "build/branding_buildflags.h"
+#import "components/search_engines/search_engines_test_environment.h"
+#import "components/search_engines/template_url.h"
+#import "components/search_engines/template_url_data.h"
+#import "components/search_engines/template_url_service.h"
+#import "ios/chrome/browser/favicon/model/mock_favicon_loader.h"
+#import "ios/chrome/browser/shared/ui/symbols/symbols.h"
+#import "ios/chrome/common/ui/favicon/favicon_attributes.h"
+#import "ios/chrome/common/ui/favicon/favicon_constants.h"
+#import "ios/web/public/test/web_task_environment.h"
+#import "testing/gmock/include/gmock/gmock.h"
+#import "testing/gtest/include/gtest/gtest.h"
+#import "testing/platform_test.h"
+#import "third_party/ocmock/gtest_support.h"
+#import "ui/base/test/ios/ui_image_test_utils.h"
+#import "ui/gfx/image/image.h"
+
+using ::testing::_;
+using ::testing::Invoke;
+using ::testing::Return;
+using ::testing::SaveArg;
+using ::ui::test::uiimage_utils::UIImagesAreEqual;
+
+namespace {
+
+// Whether the image is the placeholder image used in the `placeholder_service`.
+bool IsPlaceholderImage(UIImage* image, CGFloat image_point_size) {
+  UIImage* placeholder_image =
+      DefaultSymbolWithPointSize(kSearchSymbol, image_point_size);
+  return UIImagesAreEqual(placeholder_image, image);
+}
+
+// Test fixture for PlaceholderService.
+class PlaceholderServiceTest : public PlatformTest {
+ protected:
+  PlaceholderServiceTest()
+      : search_engines_test_environment_(),
+        mock_favicon_loader_(
+            std::make_unique<::testing::StrictMock<MockFaviconLoader>>()),
+        placeholder_service_(mock_favicon_loader_.get(),
+                             &template_url_service()) {
+    // Set up a default search provider.
+    TemplateURLData data;
+    data.SetShortName(u"TestEngine");
+    data.SetKeyword(u"test");
+    data.SetURL("http://test.com/search?q={searchTerms}");
+    data.favicon_url = GURL("http://test.com/favicon.ico");
+    default_search_provider_ =
+        template_url_service().Add(std::make_unique<TemplateURL>(data));
+    template_url_service().SetUserSelectedDefaultSearchProvider(
+        default_search_provider_);
+  }
+
+  void TearDown() override {
+    placeholder_service_.Shutdown();
+    PlatformTest::TearDown();
+  }
+
+  TemplateURLService& template_url_service() {
+    return *search_engines_test_environment_.template_url_service();
+  }
+
+  // Helper to create a UIImage from an SF Symbol for testing.
+  UIImage* CreateTestSymbolImage(CGFloat size = 16.0) {
+    return DefaultSymbolWithPointSize(kInfoCircleSymbol, size);
+  }
+
+  base::test::TaskEnvironment task_environment_;
+  search_engines::SearchEnginesTestEnvironment search_engines_test_environment_;
+  std::unique_ptr<MockFaviconLoader> mock_favicon_loader_;
+  PlaceholderService placeholder_service_;
+  raw_ptr<TemplateURL> default_search_provider_;
+};
+
+// Test that a bundled icon is returned for Google.
+TEST_F(PlaceholderServiceTest, TestFetchingBundledIcon) {
+#if BUILDFLAG(IOS_USE_BRANDED_SYMBOLS)
+  const CGFloat icon_size = kDesiredSmallFaviconSizePt;
+  TemplateURLData google_data;
+  google_data.SetShortName(u"Google");
+  google_data.SetKeyword(u"google.com");
+  google_data.SetURL("https://www.google.com/search?q={searchTerms}");
+  google_data.prepopulate_id = 1;  // Indicates Google
+  template_url_service().SetUserSelectedDefaultSearchProvider(
+      template_url_service().Add(std::make_unique<TemplateURL>(google_data)));
+
+  __block UIImage* received_icon_final = nil;
+  __block int callback_count = 0;
+  __block std::unique_ptr<base::RunLoop> run_loop =
+      std::make_unique<base::RunLoop>();
+
+  EXPECT_CALL(*mock_favicon_loader_, FaviconForPageUrl(_, _, _, _, _)).Times(0);
+  EXPECT_CALL(*mock_favicon_loader_, FaviconForIconUrl(_, _, _, _)).Times(0);
+
+  placeholder_service_.FetchDefaultSearchEngineIcon(
+      icon_size, base::BindRepeating(^(UIImage* icon) {
+        callback_count++;
+        if (!IsPlaceholderImage(icon, icon_size)) {
+          received_icon_final = icon;
+          run_loop->Quit();
+        }
+        run_loop->QuitWhenIdle();
+      }));
+  run_loop->Run();
+
+  ASSERT_NE(received_icon_final, nil);
+  UIImage* expected_bundled_icon = MakeSymbolMulticolor(
+      CustomSymbolWithPointSize(kGoogleIconSymbol, icon_size));
+  EXPECT_TRUE(UIImagesAreEqual(received_icon_final, expected_bundled_icon));
+  // Callback is invoked once with bundled icon.
+  EXPECT_EQ(callback_count, 1);
+#endif
+}
+
+// Test fetching an icon using FaviconLoader for a non-prepopulated DSE.
+TEST_F(PlaceholderServiceTest, TestFetchingIconFromFaviconLoader) {
+  const CGFloat icon_size = kDesiredMediumFaviconSizePt;
+  UIImage* fetched_image = CreateTestSymbolImage(icon_size);
+  FaviconAttributes* fetched_attributes =
+      [FaviconAttributes attributesWithImage:fetched_image];
+
+  FaviconLoader::FaviconAttributesCompletionBlock favicon_callback_block;
+  EXPECT_CALL(*mock_favicon_loader_,
+              FaviconForIconUrl(GURL("http://test.com/favicon.ico"), icon_size,
+                                icon_size, _))
+      .WillOnce(SaveArg<3>(&favicon_callback_block));
+
+  __block UIImage* received_icon_final = nil;
+  __block int callback_count = 0;
+  __block std::unique_ptr<base::RunLoop> run_loop =
+      std::make_unique<base::RunLoop>();
+  placeholder_service_.FetchDefaultSearchEngineIcon(
+      icon_size, base::BindRepeating(^(UIImage* icon) {
+        callback_count++;
+        if (callback_count == 1) {
+          EXPECT_TRUE(IsPlaceholderImage(icon, icon_size));
+        } else if (callback_count == 2) {
+          received_icon_final = icon;
+          run_loop->Quit();
+        }
+        run_loop->QuitWhenIdle();
+      }));
+
+  EXPECT_EQ(callback_count, 1);
+  ASSERT_TRUE(favicon_callback_block);
+
+  favicon_callback_block(fetched_attributes);
+  run_loop->Run();
+
+  EXPECT_EQ(received_icon_final, fetched_image);
+  EXPECT_EQ(callback_count, 2);
+}
+
+// Test that callback is not called if DSE changes during fetch,
+// but future calls for the new DSE work.
+TEST_F(PlaceholderServiceTest, TestDSESwitchesDuringFetch) {
+  const CGFloat icon_size = kDesiredSmallFaviconSizePt;
+
+  // DSE1 is `default_search_provider_` with favicon
+  // "http://test.com/favicon.ico"
+  UIImage* dse1_fetched_image = CreateTestSymbolImage(icon_size);
+  FaviconAttributes* dse1_fetched_attributes =
+      [FaviconAttributes attributesWithImage:dse1_fetched_image];
+
+  FaviconLoader::FaviconAttributesCompletionBlock dse1_favicon_callback_block;
+  EXPECT_CALL(*mock_favicon_loader_,
+              FaviconForIconUrl(GURL("http://test.com/favicon.ico"), icon_size,
+                                icon_size, _))
+      .WillOnce(SaveArg<3>(&dse1_favicon_callback_block));
+
+  __block UIImage* received_icon_dse1_final = nil;
+  __block int callback_dse1_count = 0;
+
+  // 1. Initial fetch for DSE1
+  placeholder_service_.FetchDefaultSearchEngineIcon(
+      icon_size, base::BindRepeating(^(UIImage* icon) {
+        callback_dse1_count++;
+        if (!IsPlaceholderImage(icon, icon_size)) {
+          received_icon_dse1_final = icon;
+        }
+      }));
+
+  // Should have received placeholder for DSE1
+  EXPECT_EQ(callback_dse1_count, 1);
+  ASSERT_TRUE(dse1_favicon_callback_block);
+
+  // 2. Set up DSE2
+  TemplateURLData data_dse2;
+  data_dse2.SetShortName(u"TestEngine2");
+  data_dse2.SetKeyword(u"test2");
+  data_dse2.SetURL("http://test2.com/search?q={searchTerms}");
+  data_dse2.favicon_url = GURL("http://test2.com/favicon.ico");
+  TemplateURL* dse2 =
+      template_url_service().Add(std::make_unique<TemplateURL>(data_dse2));
+
+  UIImage* dse2_fetched_image =
+      CreateTestSymbolImage(icon_size);  // Can be same image for simplicity
+  FaviconAttributes* dse2_fetched_attributes =
+      [FaviconAttributes attributesWithImage:dse2_fetched_image];
+  ;
+
+  // 3. Change DSE to DSE2 *before* DSE1 icon fetch completes
+  template_url_service().SetUserSelectedDefaultSearchProvider(dse2);
+  // TODO(crbug.com/424382890): Change is not propagated, remove this line when
+  // the bug is fixed.
+  placeholder_service_.OnTemplateURLServiceChanged();
+
+  // 4. Complete DSE1 icon fetch (which should now be ignored)
+  dse1_favicon_callback_block(dse1_fetched_attributes);
+
+  // 5. Future call to fetch for new DSE (DSE2)
+  FaviconLoader::FaviconAttributesCompletionBlock dse2_favicon_callback_block;
+  EXPECT_CALL(*mock_favicon_loader_,
+              FaviconForIconUrl(GURL("http://test2.com/favicon.ico"), icon_size,
+                                icon_size, _))
+      .WillOnce(SaveArg<3>(&dse2_favicon_callback_block));
+
+  __block UIImage* received_icon_dse2_final = nil;
+  __block int callback_dse2_count = 0;
+  __block std::unique_ptr<base::RunLoop> run_loop =
+      std::make_unique<base::RunLoop>();
+  placeholder_service_.FetchDefaultSearchEngineIcon(
+      icon_size, base::BindRepeating(^(UIImage* icon) {
+        callback_dse2_count++;
+        if (callback_dse2_count == 1) {
+          EXPECT_TRUE(IsPlaceholderImage(icon, icon_size));
+        } else if (callback_dse2_count == 2) {
+          received_icon_dse2_final = icon;
+          run_loop->Quit();
+        }
+        run_loop->QuitWhenIdle();
+      }));
+
+  // Should have received placeholder for DSE2
+  EXPECT_EQ(callback_dse2_count, 1);
+  ASSERT_TRUE(dse2_favicon_callback_block);
+
+  // 6. Complete DSE2 icon fetch
+  dse2_favicon_callback_block(dse2_fetched_attributes);
+  run_loop->Run();
+
+  // Callback for DSE1 should NOT have been called with the fetched icon
+  EXPECT_EQ(callback_dse1_count, 1);         // Still 1, only placeholder
+  EXPECT_EQ(received_icon_dse1_final, nil);  // Final icon not received for DSE1
+
+  // Callback for DSE2 should have been called with placeholder and then fetched
+  // icon
+  EXPECT_EQ(received_icon_dse2_final, dse2_fetched_image);
+  EXPECT_EQ(callback_dse2_count, 2);
+}
+
+}  // namespace
diff --git a/ios/chrome/browser/reminder_notifications/model/BUILD.gn b/ios/chrome/browser/reminder_notifications/model/BUILD.gn
index ce153399..5d6e723 100644
--- a/ios/chrome/browser/reminder_notifications/model/BUILD.gn
+++ b/ios/chrome/browser/reminder_notifications/model/BUILD.gn
@@ -18,13 +18,13 @@
     "//ios/chrome/browser/reminder_notifications/coordinator",
     "//ios/chrome/browser/shared/model/browser",
     "//ios/chrome/browser/shared/model/prefs:pref_names",
-    "//ios/chrome/browser/shared/model/profile",
     "//ios/chrome/browser/shared/model/web_state_list",
     "//ios/chrome/browser/shared/public/features",
     "//ios/web/public",
     "//net",
     "//ui/base",
     "//ui/gfx",
+    "//url",
   ]
   frameworks = [
     "Foundation.framework",
@@ -46,10 +46,14 @@
     "//ios/chrome/browser/push_notification/model:constants",
     "//ios/chrome/browser/push_notification/model:push_notification_client",
     "//ios/chrome/browser/reminder_notifications/coordinator",
+    "//ios/chrome/browser/shared/coordinator/scene:scene_state_header",
     "//ios/chrome/browser/shared/model/application_context",
+    "//ios/chrome/browser/shared/model/browser",
+    "//ios/chrome/browser/shared/model/browser/test:test_support",
     "//ios/chrome/browser/shared/model/prefs:browser_prefs",
     "//ios/chrome/browser/shared/model/prefs:pref_names",
     "//ios/chrome/browser/shared/model/profile/test",
+    "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/test:test_support",
     "//ios/testing:block_swizzler",
diff --git a/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.h b/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.h
index 3c83543..e28734d 100644
--- a/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.h
+++ b/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.h
@@ -31,11 +31,6 @@
   std::optional<UIBackgroundFetchResult> HandleNotificationReception(
       NSDictionary<NSString*, id>* notification) override;
   NSArray<UNNotificationCategory*>* RegisterActionableNotifications() override;
-  void OnSceneActiveForegroundBrowserReady() override;
-
-  // Called when the scene becomes "active foreground" and the browser is
-  // ready. The closure will be called when all async operations are done.
-  void OnSceneActiveForegroundBrowserReady(base::OnceClosure closure);
 
  private:
   // Returns true if the client is permitted to schedule notifications.
@@ -47,6 +42,15 @@
   // Called when the relevant permissions Pref changes.
   void OnPermissionsPrefChanged();
 
+  // Schedules new reminder notifications based on the current reminder data in
+  // Prefs.
+  void ScheduleNewReminders();
+
+  // Schedules new reminder notifications if they don't already exist in the
+  // notification center.
+  void ScheduleNewRemindersIfNeeded(
+      NSArray<UNNotificationRequest*>* pending_requests);
+
   // Cancels all pending reminder notifications.
   void CancelAllNotifications(base::OnceClosure completion_handler);
 
@@ -56,15 +60,16 @@
       base::OnceClosure completion_handler,
       NSArray<UNNotificationRequest*>* requests);
 
-  // Schedules all notifications based on the current state of Prefs.
-  void ScheduleNotificationsFromPrefs();
-
   // Schedules a single reminder notification for `reminder_url` using
   // `reminder_details`.
   void ScheduleNotification(const GURL& reminder_url,
                             const base::Value::Dict& reminder_details,
                             std::string_view profile_name);
 
+  // Called upon completion of scheduling a single notification. Removes the
+  // corresponding Pref entry for `scheduled_url` if scheduling was successful.
+  void OnNotificationScheduled(const GURL& scheduled_url, NSError* error);
+
   // Used to assert that asynchronous callback are invoked on the correct
   // sequence.
   SEQUENCE_CHECKER(sequence_checker_);
diff --git a/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.mm b/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.mm
index 7a873b1..f72670c 100644
--- a/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.mm
+++ b/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.mm
@@ -16,6 +16,7 @@
 #import "base/values.h"
 #import "components/prefs/pref_change_registrar.h"
 #import "components/prefs/pref_service.h"
+#import "components/prefs/scoped_user_pref_update.h"
 #import "ios/chrome/browser/push_notification/model/constants.h"
 #import "ios/chrome/browser/reminder_notifications/coordinator/reminder_notifications_mediator.h"
 #import "ios/chrome/browser/reminder_notifications/model/reminder_notification_builder.h"
@@ -52,15 +53,39 @@
 
 bool ReminderNotificationClient::CanHandleNotification(
     UNNotification* notification) {
-  // TODO(crbug.com/390432325): Handle reminder notification interactions.
-  return false;
+  return [notification.request.identifier
+      hasPrefix:kReminderNotificationsIdentifierPrefix];
 }
 
 bool ReminderNotificationClient::HandleNotificationInteraction(
     UNNotificationResponse* response) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  // TODO(crbug.com/390432325): Handle reminder notification interactions.
-  return false;
+
+  if (!CanHandleNotification(response.notification)) {
+    return false;
+  }
+
+  NSDictionary* user_info = response.notification.request.content.userInfo;
+  NSString* url_string = user_info[@"url"];
+
+  if (!url_string || url_string.length == 0) {
+    // TODO(crbug.com/390432325): Consider adding UMA logs for missing URL.
+    return false;
+  }
+
+  GURL url(base::SysNSStringToUTF8(url_string));
+
+  if (!url.is_valid()) {
+    // TODO(crbug.com/390432325): Consider adding UMA logs for invalid URL.
+    return false;
+  }
+
+  // TODO(crbug.com/422449238): Consider adding UMA logs for interaction
+  // handling.
+
+  LoadUrlInNewTab(url);
+
+  return true;
 }
 
 std::optional<UIBackgroundFetchResult>
@@ -75,18 +100,6 @@
   return @[];
 }
 
-void ReminderNotificationClient::OnSceneActiveForegroundBrowserReady() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  OnSceneActiveForegroundBrowserReady(base::DoNothing());
-}
-
-void ReminderNotificationClient::OnSceneActiveForegroundBrowserReady(
-    base::OnceClosure closure) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  // TODO(crbug.com/390432325): Handle reminder notification interactions.
-  std::move(closure).Run();
-}
-
 bool ReminderNotificationClient::IsPermitted() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
@@ -101,22 +114,19 @@
 void ReminderNotificationClient::OnReminderDataPrefChanged() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  // Schedule notifications based on Pref changes. Cancel existing notifications
-  // first, then schedule new ones based on current prefs.
-  CancelAllNotifications(base::BindOnce(
-      &ReminderNotificationClient::ScheduleNotificationsFromPrefs,
-      weak_ptr_factory_.GetWeakPtr()));
+  ScheduleNewReminders();
 }
 
 void ReminderNotificationClient::OnPermissionsPrefChanged() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  // When permissions changes, re-evaluate scheduling.
-  // Cancel existing notifications first, then attempt to reschedule.
-  // `ScheduleNotificationsFromPrefs()` will check the new permission state.
-  CancelAllNotifications(base::BindOnce(
-      &ReminderNotificationClient::ScheduleNotificationsFromPrefs,
-      weak_ptr_factory_.GetWeakPtr()));
+  if (!IsPermitted()) {
+    CancelAllNotifications(base::DoNothing());
+
+    return;
+  }
+
+  ScheduleNewReminders();
 }
 
 void ReminderNotificationClient::CancelAllNotifications(
@@ -154,52 +164,6 @@
   std::move(completion_handler).Run();
 }
 
-void ReminderNotificationClient::ScheduleNotificationsFromPrefs() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  // Do not schedule notifications if not permitted.
-  if (!IsPermitted()) {
-    return;
-  }
-
-  ProfileIOS* current_profile = GetProfile();
-
-  PrefService* prefs = current_profile->GetPrefs();
-
-  const base::Value::Dict& reminders =
-      prefs->GetDict(prefs::kReminderNotifications);
-
-  if (reminders.empty()) {
-    // TODO(crbug.com/422449238): Consider adding UMA/logging for this failure
-    // case.
-    return;
-  }
-
-  for (auto it : reminders) {
-    const std::string& url = it.first;
-    const base::Value& details = it.second;
-
-    GURL reminder_url(url);
-
-    if (!reminder_url.is_valid()) {
-      // TODO(crbug.com/422449238): Consider adding UMA/logging for this failure
-      // case.
-      continue;
-    }
-
-    const base::Value::Dict* reminder_details = details.GetIfDict();
-
-    if (!reminder_details) {
-      // TODO(crbug.com/422449238): Consider adding UMA/logging for this failure
-      // case.
-      continue;
-    }
-
-    ScheduleNotification(reminder_url, *reminder_details,
-                         current_profile->GetProfileName());
-  }
-}
-
 void ReminderNotificationClient::ScheduleNotification(
     const GURL& reminder_url,
     const base::Value::Dict& reminder_details,
@@ -247,5 +211,103 @@
 
   ScheduledNotificationRequest request = [builder buildRequest];
 
-  ScheduleProfileNotification(request, base::DoNothing(), profile_name);
+  ScheduleProfileNotification(
+      request,
+      base::BindOnce(&ReminderNotificationClient::OnNotificationScheduled,
+                     weak_ptr_factory_.GetWeakPtr(), reminder_url),
+      profile_name);
+}
+
+void ReminderNotificationClient::OnNotificationScheduled(
+    const GURL& scheduled_url,
+    NSError* error) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  if (error) {
+    // TODO(crbug.com/422449238): Consider adding UMA for scheduling failures.
+    return;
+  }
+
+  ProfileIOS* current_profile = GetProfile();
+
+  if (!current_profile) {
+    // Profile might have been destroyed before the callback ran.
+
+    // TODO(crbug.com/422449238): Consider adding UMA for scheduling failures.
+
+    return;
+  }
+
+  PrefService* prefs = current_profile->GetPrefs();
+
+  ScopedDictPrefUpdate update(prefs, prefs::kReminderNotifications);
+
+  update->Remove(scheduled_url.spec());
+
+  // TODO(crbug.com/422449238): Consider adding UMA for successful removal.
+}
+
+void ReminderNotificationClient::ScheduleNewReminders() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  if (!IsPermitted()) {
+    return;
+  }
+
+  auto completion_block = base::CallbackToBlock(base::BindPostTask(
+      base::SequencedTaskRunner::GetCurrentDefault(),
+      base::BindOnce(&ReminderNotificationClient::ScheduleNewRemindersIfNeeded,
+                     weak_ptr_factory_.GetWeakPtr())));
+
+  [[UNUserNotificationCenter currentNotificationCenter]
+      getPendingNotificationRequestsWithCompletionHandler:completion_block];
+}
+
+void ReminderNotificationClient::ScheduleNewRemindersIfNeeded(
+    NSArray<UNNotificationRequest*>* pending_requests) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  ProfileIOS* current_profile = GetProfile();
+  if (!current_profile || !IsPermitted()) {
+    return;
+  }
+
+  PrefService* prefs = current_profile->GetPrefs();
+  const base::Value::Dict& reminders_in_prefs =
+      prefs->GetDict(prefs::kReminderNotifications);
+  if (reminders_in_prefs.empty()) {
+    return;
+  }
+
+  // Build a set of pending URLs for quick lookup.
+  std::set<std::string> pending_urls;
+  for (UNNotificationRequest* request in pending_requests) {
+    if (![request.identifier
+            hasPrefix:kReminderNotificationsIdentifierPrefix]) {
+      continue;
+    }
+
+    NSString* url = request.content.userInfo[@"url"];
+    pending_urls.insert(base::SysNSStringToUTF8(url));
+  }
+
+  // Iterate through reminders in prefs and schedule notifications only for URLs
+  // that exist in prefs but not in the notification center.
+  for (const auto [key, value] : reminders_in_prefs) {
+    GURL url(key);
+
+    if (!url.is_valid()) {
+      continue;
+    }
+
+    std::string url_string = url.spec();
+
+    if (pending_urls.find(url_string) == pending_urls.end()) {
+      const base::Value::Dict* details = value.GetIfDict();
+
+      if (details) {
+        ScheduleNotification(url, *details, current_profile->GetProfileName());
+      }
+    }
+  }
 }
diff --git a/ios/chrome/browser/reminder_notifications/model/reminder_notification_client_unittests.mm b/ios/chrome/browser/reminder_notifications/model/reminder_notification_client_unittests.mm
index 552d2bc0..94d6f74c 100644
--- a/ios/chrome/browser/reminder_notifications/model/reminder_notification_client_unittests.mm
+++ b/ios/chrome/browser/reminder_notifications/model/reminder_notification_client_unittests.mm
@@ -8,6 +8,7 @@
 
 #import "base/apple/foundation_util.h"
 #import "base/json/values_util.h"
+#import "base/strings/sys_string_conversions.h"
 #import "base/test/scoped_feature_list.h"
 #import "base/test/task_environment.h"
 #import "components/pref_registry/pref_registry_syncable.h"
@@ -18,10 +19,17 @@
 #import "ios/chrome/browser/push_notification/model/push_notification_client.h"
 #import "ios/chrome/browser/reminder_notifications/coordinator/reminder_notifications_mediator.h"
 #import "ios/chrome/browser/reminder_notifications/model/reminder_notification_builder.h"
+#import "ios/chrome/browser/shared/coordinator/scene/scene_state.h"
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
+#import "ios/chrome/browser/shared/model/browser/browser_list.h"
+#import "ios/chrome/browser/shared/model/browser/browser_list_factory.h"
+#import "ios/chrome/browser/shared/model/browser/test/test_browser.h"
 #import "ios/chrome/browser/shared/model/prefs/browser_prefs.h"
 #import "ios/chrome/browser/shared/model/prefs/pref_names.h"
 #import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h"
+#import "ios/chrome/browser/shared/public/commands/application_commands.h"
+#import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
+#import "ios/chrome/browser/shared/public/commands/open_new_tab_command.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h"
@@ -44,6 +52,13 @@
     builder.SetPrefService(CreatePrefService());
     profile_ = std::move(builder).Build();
 
+    mock_scene_state_ = OCMClassMock([SceneState class]);
+    OCMStub([mock_scene_state_ activationLevel])
+        .andReturn(SceneActivationLevelForegroundActive);
+    browser_ = std::make_unique<TestBrowser>(profile_.get(), mock_scene_state_);
+    BrowserListFactory::GetForProfile(profile_.get())
+        ->AddBrowser(browser_.get());
+
     client_ = std::make_unique<ReminderNotificationClient>(profile_.get());
   }
 
@@ -57,6 +72,14 @@
     return prefs;
   }
 
+  // Creates a mock command handler for a given protocol and starts dispatching.
+  id MockHandler(Protocol* protocol) {
+    id mock_handler = OCMProtocolMock(protocol);
+    [browser_->GetCommandDispatcher() startDispatchingToTarget:mock_handler
+                                                   forProtocol:protocol];
+    return mock_handler;
+  }
+
   // Sets up a mock notification center, so notification requests can be
   // tested.
   void SetupMockNotificationCenter() {
@@ -111,7 +134,6 @@
   void SetReminderPrefs(const base::Value::Dict& reminders) {
     profile_->GetPrefs()->SetDict(prefs::kReminderNotifications,
                                   reminders.Clone());
-    task_environment_.RunUntilIdle();
   }
 
   // Helper to set the reminder permission.
@@ -119,7 +141,6 @@
     ScopedDictPrefUpdate update(profile_->GetPrefs(),
                                 prefs::kFeaturePushNotificationPermissions);
     update->Set(kReminderNotificationKey, enabled);
-    task_environment_.RunUntilIdle();
   }
 
   web::WebTaskEnvironment task_environment_{
@@ -131,6 +152,8 @@
   std::unique_ptr<ReminderNotificationClient> client_;
   id mock_notification_center_;
   std::unique_ptr<ScopedBlockSwizzler> notification_center_swizzler_;
+  id mock_scene_state_;
+  std::unique_ptr<TestBrowser> browser_;
 };
 
 #pragma mark - Test cases
@@ -171,6 +194,7 @@
   StubGetPendingRequests(nil);
   ExpectAddNotificationRequest(url);
   SetReminderPrefs(reminders);
+  task_environment_.RunUntilIdle();
   EXPECT_OCMOCK_VERIFY(mock_notification_center_);
 }
 
@@ -198,6 +222,7 @@
   ExpectAddNotificationRequest(url1);
   ExpectAddNotificationRequest(url2);
   SetReminderPrefs(reminders);
+  task_environment_.RunUntilIdle();
   EXPECT_OCMOCK_VERIFY(mock_notification_center_);
 }
 
@@ -219,3 +244,158 @@
   SetReminderPrefs(reminders);
   EXPECT_OCMOCK_VERIFY(mock_notification_center_);
 }
+
+// Tests that handling a notification interaction with a valid URL eventually
+// dispatches a command to open that URL in a new tab.
+TEST_F(ReminderNotificationClientTest, HandleInteractionOpensUrlInNewTab) {
+  GURL url_to_open("https://www.chromium.org/reminders");
+
+  id mock_application_handler = MockHandler(@protocol(ApplicationCommands));
+
+  OCMExpect([mock_application_handler
+      openURLInNewTab:[OCMArg checkWithBlock:^BOOL(OpenNewTabCommand* command) {
+        EXPECT_EQ(command.URL, url_to_open);
+        EXPECT_EQ(command.inIncognito, NO);
+        EXPECT_EQ(command.inBackground, NO);
+        return YES;
+      }]]);
+
+  id mock_response = OCMClassMock([UNNotificationResponse class]);
+  id mock_notification = OCMClassMock([UNNotification class]);
+  id mock_request = OCMClassMock([UNNotificationRequest class]);
+  id mock_content = OCMClassMock([UNNotificationContent class]);
+
+  OCMStub([mock_response notification]).andReturn(mock_notification);
+  OCMStub([mock_notification request]).andReturn(mock_request);
+  OCMStub([mock_request content]).andReturn(mock_content);
+  OCMStub([mock_request identifier])
+      .andReturn(kReminderNotificationsIdentifierPrefix);
+  OCMStub([mock_content userInfo]).andReturn(@{
+    @"url" : base::SysUTF8ToNSString(url_to_open.spec())
+  });
+
+  ASSERT_TRUE(client_->HandleNotificationInteraction(mock_response));
+
+  client_->OnSceneActiveForegroundBrowserReady();
+
+  task_environment_.RunUntilIdle();
+
+  EXPECT_OCMOCK_VERIFY(mock_application_handler);
+}
+
+// Test scheduling a single notification from Prefs and verifies Prefs removal.
+TEST_F(ReminderNotificationClientTest, OneReminderInPrefsHasPrefRemoved) {
+  SetupMockNotificationCenter();
+  SetReminderPermission(true);
+  GURL url("http://example.com/page1");
+  base::Time reminder_time = base::Time::Now() + base::Minutes(10);
+  base::Value::Dict reminder_details;
+  reminder_details.Set(kReminderNotificationsTimeKey,
+                       base::TimeToValue(reminder_time));
+  base::Value::Dict reminders;
+  reminders.Set(url.spec(), std::move(reminder_details));
+
+  StubGetPendingRequests(nil);
+  ExpectAddNotificationRequest(url);
+
+  // Set the prefs, which will trigger the scheduling logic.
+  SetReminderPrefs(reminders);
+
+  // Verify the pref is initially set.
+  EXPECT_TRUE(profile_->GetPrefs()
+                  ->GetDict(prefs::kReminderNotifications)
+                  .contains(url.spec()));
+
+  // Run pending tasks to allow the notification scheduling and its
+  // completion handler (which removes the pref) to execute.
+  task_environment_.RunUntilIdle();
+
+  // Verify the mock and that the pref has been removed.
+  EXPECT_OCMOCK_VERIFY(mock_notification_center_);
+  const base::Value::Dict& final_reminders =
+      profile_->GetPrefs()->GetDict(prefs::kReminderNotifications);
+  EXPECT_FALSE(final_reminders.contains(url.spec()));
+  EXPECT_TRUE(final_reminders.empty());
+}
+
+// Test scheduling multiple notifications from Prefs and verifies Prefs removal.
+TEST_F(ReminderNotificationClientTest,
+       MultipleRemindersInPrefsHavePrefsRemoved) {
+  SetupMockNotificationCenter();
+  SetReminderPermission(true);
+  GURL url1("http://example.com/page1");
+  GURL url2("http://example.org/anotherpage");
+  base::Time reminder_time1 = base::Time::Now() + base::Minutes(10);
+  base::Time reminder_time2 = base::Time::Now() + base::Minutes(20);
+
+  base::Value::Dict details1;
+  details1.Set(kReminderNotificationsTimeKey,
+               base::TimeToValue(reminder_time1));
+  base::Value::Dict details2;
+  details2.Set(kReminderNotificationsTimeKey,
+               base::TimeToValue(reminder_time2));
+
+  base::Value::Dict reminders;
+  reminders.Set(url1.spec(), std::move(details1));
+  reminders.Set(url2.spec(), std::move(details2));
+
+  StubGetPendingRequests(nil);
+  ExpectAddNotificationRequest(url1);
+  ExpectAddNotificationRequest(url2);
+
+  // Set the prefs, triggering scheduling.
+  SetReminderPrefs(reminders);
+
+  // Verify prefs are initially set.
+  EXPECT_TRUE(profile_->GetPrefs()
+                  ->GetDict(prefs::kReminderNotifications)
+                  .contains(url1.spec()));
+  EXPECT_TRUE(profile_->GetPrefs()
+                  ->GetDict(prefs::kReminderNotifications)
+                  .contains(url2.spec()));
+
+  // Run pending tasks.
+  task_environment_.RunUntilIdle();
+
+  // Verify mocks and pref removal.
+  EXPECT_OCMOCK_VERIFY(mock_notification_center_);
+  const base::Value::Dict& final_reminders =
+      profile_->GetPrefs()->GetDict(prefs::kReminderNotifications);
+  EXPECT_FALSE(final_reminders.contains(url1.spec()));
+  EXPECT_FALSE(final_reminders.contains(url2.spec()));
+  EXPECT_TRUE(final_reminders.empty());
+}
+
+// Tests that the client doesn't reschedule a reminder that is already pending
+// in the notification center.
+TEST_F(ReminderNotificationClientTest, DoesNotReschedulePendingReminder) {
+  SetupMockNotificationCenter();
+  SetReminderPermission(true);
+  GURL url("http://example.com/page1");
+  base::Time reminder_time = base::Time::Now() + base::Minutes(10);
+
+  UNMutableNotificationContent* content =
+      [[UNMutableNotificationContent alloc] init];
+  content.userInfo = @{@"url" : [net::NSURLWithGURL(url) absoluteString]};
+  UNNotificationRequest* pending_request =
+      [UNNotificationRequest requestWithIdentifier:@"reminder_existing_123"
+                                           content:content
+                                           trigger:nil];
+  StubGetPendingRequests(@[ pending_request ]);
+
+  base::Value::Dict reminder_details;
+  reminder_details.Set(kReminderNotificationsTimeKey,
+                       base::TimeToValue(reminder_time));
+  base::Value::Dict reminders;
+  reminders.Set(url.spec(), std::move(reminder_details));
+  SetReminderPrefs(reminders);
+
+  OCMReject([mock_notification_center_ addNotificationRequest:[OCMArg any]
+                                        withCompletionHandler:[OCMArg any]]);
+  task_environment_.RunUntilIdle();
+  EXPECT_OCMOCK_VERIFY(mock_notification_center_);
+
+  EXPECT_TRUE(profile_->GetPrefs()
+                  ->GetDict(prefs::kReminderNotifications)
+                  .contains(url.spec()));
+}
diff --git a/ios/chrome/browser/shared/ui/symbols/symbol_names.h b/ios/chrome/browser/shared/ui/symbols/symbol_names.h
index 90d1945..cdbd118 100644
--- a/ios/chrome/browser/shared/ui/symbols/symbol_names.h
+++ b/ios/chrome/browser/shared/ui/symbols/symbol_names.h
@@ -75,6 +75,7 @@
 extern NSString* const kLanguageSymbol;
 extern NSString* const kLocationSymbol;
 extern NSString* const kPasswordSymbol;
+extern NSString* const kCropSymbol;
 #if !BUILDFLAG(IS_IOS_MACCATALYST)
 extern NSString* const kMulticolorPasswordSymbol;
 #endif  // BUILDFLAG(IS_IOS_MACCATALYST)
diff --git a/ios/chrome/browser/shared/ui/symbols/symbol_names.mm b/ios/chrome/browser/shared/ui/symbols/symbol_names.mm
index 05844ef..758ad38 100644
--- a/ios/chrome/browser/shared/ui/symbols/symbol_names.mm
+++ b/ios/chrome/browser/shared/ui/symbols/symbol_names.mm
@@ -81,6 +81,7 @@
 NSString* const kLanguageSymbol = @"language";
 NSString* const kLocationSymbol = @"location";
 NSString* const kPasswordSymbol = @"password";
+NSString* const kCropSymbol = @"crop";
 #if !BUILDFLAG(IS_IOS_MACCATALYST)
 NSString* const kMulticolorPasswordSymbol = @"multicolor_password";
 #endif  // BUILDFLAG(IS_IOS_MACCATALYST)
diff --git a/ios/chrome/browser/snapshots/model/snapshot_tab_helper.mm b/ios/chrome/browser/snapshots/model/snapshot_tab_helper.mm
index 85199037..e86059cf 100644
--- a/ios/chrome/browser/snapshots/model/snapshot_tab_helper.mm
+++ b/ios/chrome/browser/snapshots/model/snapshot_tab_helper.mm
@@ -113,13 +113,20 @@
 void SnapshotTabHelper::UpdateSnapshotWithCallback(void (^callback)(UIImage*)) {
   was_loading_during_last_snapshot_ = web_state_->IsLoading();
 
+  // `wrapped_callback` is possibly called multiple times as a completion
+  // handler in `takeSnapshotWithConfiguration:completionHandler:`.
+  __block void (^block_callback)(UIImage*) = callback;
   base::TimeTicks start_time = base::TimeTicks::Now();
   void (^wrapped_callback)(UIImage*) = ^(UIImage* image) {
     base::TimeTicks end_time = base::TimeTicks::Now();
     base::UmaHistogramTimes("IOS.Snapshots.UpdateSnapshotTime",
                             end_time - start_time);
-    if (callback) {
-      callback(image);
+
+    if (block_callback) {
+      block_callback(image);
+      // Nullify the callback to ensure that the original callback is called
+      // only once.
+      block_callback = nil;
     }
   };
 
diff --git a/ios/chrome/browser/webui/ui_bundled/crashes_ui.cc b/ios/chrome/browser/webui/ui_bundled/crashes_ui.cc
index 6d088be6..b22dfa6 100644
--- a/ios/chrome/browser/webui/ui_bundled/crashes_ui.cc
+++ b/ios/chrome/browser/webui/ui_bundled/crashes_ui.cc
@@ -131,7 +131,7 @@
     return;
   }
 
-  std::string local_id = args[0].GetString();
+  const std::string& local_id = args[0].GetString();
   upload_list_->RequestSingleUploadAsync(local_id);
 }
 
diff --git a/ios/chrome/browser/webui/ui_bundled/omaha_ui.mm b/ios/chrome/browser/webui/ui_bundled/omaha_ui.mm
index dc599751..d0de7e9 100644
--- a/ios/chrome/browser/webui/ui_bundled/omaha_ui.mm
+++ b/ios/chrome/browser/webui/ui_bundled/omaha_ui.mm
@@ -73,7 +73,7 @@
 void OmahaDOMHandler::HandleRequestDebugInformation(
     const base::Value::List& args) {
   CHECK_EQ(1u, args.size());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
 
   OmahaService::GetDebugInformation(
       base::BindOnce(&OmahaDOMHandler::OnDebugInformationAvailable,
diff --git a/ios/chrome/browser/webui/ui_bundled/on_device_llm_internals_ui.mm b/ios/chrome/browser/webui/ui_bundled/on_device_llm_internals_ui.mm
index 543eaa5..f59778ec 100644
--- a/ios/chrome/browser/webui/ui_bundled/on_device_llm_internals_ui.mm
+++ b/ios/chrome/browser/webui/ui_bundled/on_device_llm_internals_ui.mm
@@ -125,7 +125,7 @@
     return;
   }
 
-  std::string input = args[0].GetString();
+  const std::string& input = args[0].GetString();
   VLOG(1) << "Init LLM and generate response...";
   VLOG(1) << "query: " << input;
 
diff --git a/ios/chrome/browser/webui/ui_bundled/policy/policy_ui_handler.mm b/ios/chrome/browser/webui/ui_bundled/policy/policy_ui_handler.mm
index 2218772..00012ad 100644
--- a/ios/chrome/browser/webui/ui_bundled/policy/policy_ui_handler.mm
+++ b/ios/chrome/browser/webui/ui_bundled/policy/policy_ui_handler.mm
@@ -208,7 +208,7 @@
 void PolicyUIHandler::HandleUploadReport(const base::Value::List& args) {
   upload_report_count_ += 1;
   DCHECK_EQ(1u, args.size());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
   auto* report_scheduler = GetApplicationContext()
                                ->GetBrowserPolicyConnector()
                                ->chrome_browser_cloud_management_controller()
@@ -224,7 +224,7 @@
 
 void PolicyUIHandler::HandleSetLocalTestPolicies(
     const base::Value::List& args) {
-  std::string json_policies_string = args[1].GetString();
+  const std::string& json_policies_string = args[1].GetString();
 
   if (!PolicyUI::ShouldLoadTestPage(ProfileIOS::FromWebUIIOS(web_ui()))) {
     web_ui()->ResolveJavascriptCallback(args[0], true);
@@ -260,7 +260,7 @@
 
 void PolicyUIHandler::HandleRestartBrowser(const base::Value::List& args) {
   CHECK(args.size() == 2);
-  std::string policies = args[1].GetString();
+  const std::string& policies = args[1].GetString();
 
   // Set policies to preference
   PrefService* prefs = GetApplicationContext()->GetLocalState();
diff --git a/ios/chrome/browser/webui/ui_bundled/profile_internals/profile_internals_handler.mm b/ios/chrome/browser/webui/ui_bundled/profile_internals/profile_internals_handler.mm
index 8cea44e..ac067a8 100644
--- a/ios/chrome/browser/webui/ui_bundled/profile_internals/profile_internals_handler.mm
+++ b/ios/chrome/browser/webui/ui_bundled/profile_internals/profile_internals_handler.mm
@@ -93,7 +93,7 @@
 void ProfileInternalsHandler::HandleGetProfilesList(
     const base::Value::List& args) {
   CHECK_EQ(1u, args.size());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
 
   ProfileIOS* profile = ProfileIOS::FromWebUIIOS(web_ui());
   web_ui()->ResolveJavascriptCallback(callback_id, GetProfilesList(profile));
diff --git a/ios/chrome/browser/webui/ui_bundled/signin_internals_ui_ios.cc b/ios/chrome/browser/webui/ui_bundled/signin_internals_ui_ios.cc
index 8923c55..71fbbfa 100644
--- a/ios/chrome/browser/webui/ui_bundled/signin_internals_ui_ios.cc
+++ b/ios/chrome/browser/webui/ui_bundled/signin_internals_ui_ios.cc
@@ -62,7 +62,8 @@
 void SignInInternalsHandlerIOS::HandleGetSignInInfo(
     const base::Value::List& args) {
   CHECK_GE(args.size(), 1u);
-  std::string callback_id = args[0].GetString();  // CHECKs if non-string.
+  // CHECKs if non-string.
+  const std::string& callback_id = args[0].GetString();
   base::Value callback(callback_id);
   base::Value success(true);
 
diff --git a/ios/chrome/browser/webui/ui_bundled/version_handler.cc b/ios/chrome/browser/webui/ui_bundled/version_handler.cc
index 725384e..830e88b 100644
--- a/ios/chrome/browser/webui/ui_bundled/version_handler.cc
+++ b/ios/chrome/browser/webui/ui_bundled/version_handler.cc
@@ -26,7 +26,7 @@
 void VersionHandler::HandleRequestVariationInfo(const base::Value::List& args) {
   // Respond with the variations info immediately.
   CHECK_EQ(2U, args.size());
-  std::string callback_id = args[0].GetString();
+  const std::string& callback_id = args[0].GetString();
   const bool return_raw_variations_cmd = args[1].GetBool();
 
   base::Value::Dict response;
diff --git a/ios/web/public/ui/crw_web_view_proxy.h b/ios/web/public/ui/crw_web_view_proxy.h
index 916edb6..a4b9ec5 100644
--- a/ios/web/public/ui/crw_web_view_proxy.h
+++ b/ios/web/public/ui/crw_web_view_proxy.h
@@ -40,6 +40,9 @@
 // back-forward list navigations.
 @property(nonatomic) BOOL allowsBackForwardNavigationGestures;
 
+// Whether or not long pressing a link in the web view renders a link preview.
+@property(nonatomic) BOOL allowsLinkPreview;
+
 // Returns the webview's gesture recognizers.
 @property(nonatomic, readonly) NSArray* gestureRecognizers;
 
diff --git a/ios/web/web_state/ui/crw_web_controller.h b/ios/web/web_state/ui/crw_web_controller.h
index 8a4cac2..77c75e65 100644
--- a/ios/web/web_state/ui/crw_web_controller.h
+++ b/ios/web/web_state/ui/crw_web_controller.h
@@ -80,6 +80,9 @@
 // back-forward list navigations.
 @property(nonatomic) BOOL allowsBackForwardNavigationGestures;
 
+// Whether or not long pressing a link in the web view renders a link preview.
+@property(nonatomic) BOOL allowsLinkPreview;
+
 // Whether the WebController should attempt to keep the render process alive.
 @property(nonatomic, assign, getter=shouldKeepRenderProcessAlive)
     BOOL keepsRenderProcessAlive;
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index 8a09931..0e48751 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -221,6 +221,7 @@
     _webUsageEnabled = YES;
 
     _allowsBackForwardNavigationGestures = YES;
+    _allowsLinkPreview = YES;
 
     DCHECK(_webStateImpl);
     // Content area is lazily instantiated.
@@ -328,6 +329,14 @@
       allowsBackForwardNavigationGestures;
 }
 
+- (void)setAllowsLinkPreview:(BOOL)allowsLinkPreview {
+  // Store it to an instance variable as well as
+  // self.webView.allowsLinkPreview because self.webView may be nil. When
+  // self.webView is nil, it will be set later in -setWebView:.
+  _allowsLinkPreview = allowsLinkPreview;
+  self.webView.allowsLinkPreview = allowsLinkPreview;
+}
+
 #pragma mark - Private properties accessors
 
 - (void)setWebView:(WKWebView*)webView {
@@ -373,6 +382,7 @@
 
     _webView.allowsBackForwardNavigationGestures =
         _allowsBackForwardNavigationGestures;
+    _webView.allowsLinkPreview = _allowsLinkPreview;
   }
   self.webViewNavigationObserver.webView = _webView;
 
@@ -1163,6 +1173,9 @@
     _webView.allowsBackForwardNavigationGestures =
         _allowsBackForwardNavigationGestures;
   }
+  if (_webView.allowsLinkPreview != _allowsLinkPreview) {
+    _webView.allowsLinkPreview = _allowsLinkPreview;
+  }
 
   BOOL success = !context || !context->GetError();
   [self loadCompleteWithSuccess:success forContext:context];
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm
index 1cf0aaa..26e5b78 100644
--- a/ios/web/web_state/ui/crw_web_controller_unittest.mm
+++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -212,6 +212,9 @@
     OCMStub([result allowsBackForwardNavigationGestures]);
     OCMStub([result setAllowsBackForwardNavigationGestures:NO]);
     OCMStub([result setAllowsBackForwardNavigationGestures:YES]);
+    OCMStub([result allowsLinkPreview]);
+    OCMStub([result setAllowsLinkPreview:NO]);
+    OCMStub([result setAllowsLinkPreview:YES]);
     OCMStub([result isLoading]);
     OCMStub([result stopLoading]);
     OCMStub([result removeFromSuperview]);
@@ -271,6 +274,13 @@
   EXPECT_FALSE(web_controller().allowsBackForwardNavigationGestures);
 }
 
+// Tests allowsLinkPreview default value and negating this property.
+TEST_F(CRWWebControllerTest, SetAllowsLinkPreview) {
+  EXPECT_TRUE(web_controller().allowsLinkPreview);
+  web_controller().allowsLinkPreview = NO;
+  EXPECT_FALSE(web_controller().allowsLinkPreview);
+}
+
 // Tests that a web view is created after calling -[ensureWebViewCreated] and
 // check its user agent.
 TEST_F(CRWWebControllerTest, WebViewCreatedAfterEnsureWebViewCreated) {
diff --git a/ios/web/web_state/ui/crw_web_view_proxy_impl.mm b/ios/web/web_state/ui/crw_web_view_proxy_impl.mm
index ee8111a..ad01e2dd 100644
--- a/ios/web/web_state/ui/crw_web_view_proxy_impl.mm
+++ b/ios/web/web_state/ui/crw_web_view_proxy_impl.mm
@@ -101,6 +101,14 @@
       allowsBackForwardNavigationGestures;
 }
 
+- (BOOL)allowsLinkPreview {
+  return _webController.allowsLinkPreview;
+}
+
+- (void)setAllowsLinkPreview:(BOOL)allowsLinkPreview {
+  _webController.allowsLinkPreview = allowsLinkPreview;
+}
+
 - (CGRect)bounds {
   return [_contentView bounds];
 }
diff --git a/ios/web/web_state/ui/crw_web_view_proxy_impl_unittest.mm b/ios/web/web_state/ui/crw_web_view_proxy_impl_unittest.mm
index d2493f2f..1b4f4fb 100644
--- a/ios/web/web_state/ui/crw_web_view_proxy_impl_unittest.mm
+++ b/ios/web/web_state/ui/crw_web_view_proxy_impl_unittest.mm
@@ -78,4 +78,19 @@
   EXPECT_OCMOCK_VERIFY((id)mockWebController);
 }
 
+// Tests allowsLinkPreview property is delegated to CWVWebController.
+TEST_F(CRWWebViewProxyImplTest, AllowsLinkPreview) {
+  CRWWebController* mockWebController =
+      OCMStrictClassMock([CRWWebController class]);
+  CRWWebViewProxyImpl* proxy =
+      [[CRWWebViewProxyImpl alloc] initWithWebController:mockWebController];
+
+  OCMStub([mockWebController allowsLinkPreview]).andReturn(YES);
+  EXPECT_TRUE(proxy.allowsLinkPreview);
+
+  OCMExpect([mockWebController setAllowsLinkPreview:YES]);
+  proxy.allowsLinkPreview = YES;
+  EXPECT_OCMOCK_VERIFY((id)mockWebController);
+}
+
 }  // namespace
diff --git a/ios/web_view/internal/cwv_web_view.mm b/ios/web_view/internal/cwv_web_view.mm
index 14e6113..5e15a36 100644
--- a/ios/web_view/internal/cwv_web_view.mm
+++ b/ios/web_view/internal/cwv_web_view.mm
@@ -555,6 +555,21 @@
       allowsBackForwardNavigationGestures;
 }
 
+- (BOOL)allowsLinkPreview {
+  if (![self isWebStateSafeToUse]) {
+    return NO;
+  }
+
+  return _webState->GetWebViewProxy().allowsLinkPreview;
+}
+
+- (void)setAllowsLinkPreview:(BOOL)allowsLinkPreview {
+  if (![self isWebStateSafeToUse]) {
+    return;
+  }
+  _webState->GetWebViewProxy().allowsLinkPreview = allowsLinkPreview;
+}
+
 - (void)dealloc {
   if (_webState) {
     if (_webStateObserver) {
@@ -1089,6 +1104,7 @@
 
   BOOL allowsBackForwardNavigationGestures =
       self.allowsBackForwardNavigationGestures;
+  BOOL allowsLinkPreview = self.allowsLinkPreview;
 
   // CWVWebView does not support unrealized WebState, so ignore the
   // over-realization check (this simply reset the recent realization
@@ -1149,6 +1165,7 @@
 
   _webState->GetWebViewProxy().allowsBackForwardNavigationGestures =
       allowsBackForwardNavigationGestures;
+  _webState->GetWebViewProxy().allowsLinkPreview = allowsLinkPreview;
 
   if (_translationController) {
     id<CWVTranslationControllerDelegate> delegate =
diff --git a/ios/web_view/public/cwv_defines.h b/ios/web_view/public/cwv_defines.h
index 99ac5bf..23f46ff8 100644
--- a/ios/web_view/public/cwv_defines.h
+++ b/ios/web_view/public/cwv_defines.h
@@ -120,4 +120,7 @@
 // Supports timestamps in the CWVAutofillDataManager
 #define IOS_WEB_VIEW_CWV_AUTOFILL_DATA_MANAGER_TIMESTAMPS 1
 
+// Supports -[CWVWebView allowsLinkPreview].
+#define IOS_WEB_VIEW_SUPPORTS_ALLOWS_LINK_PREVIEW 1
+
 #endif  // IOS_WEB_VIEW_PUBLIC_CWV_DEFINES_H_
diff --git a/ios/web_view/public/cwv_web_view.h b/ios/web_view/public/cwv_web_view.h
index 1c1cca4c..9f65788 100644
--- a/ios/web_view/public/cwv_web_view.h
+++ b/ios/web_view/public/cwv_web_view.h
@@ -119,6 +119,9 @@
 // back-forward list navigations.
 @property(nonatomic) BOOL allowsBackForwardNavigationGestures;
 
+// Whether or not long pressing a link in the web view renders a link preview.
+@property(nonatomic) BOOL allowsLinkPreview;
+
 // The web view's autofill controller.
 @property(nonatomic, readonly) CWVAutofillController* autofillController;
 
diff --git a/ios_internal b/ios_internal
index b254cb4..6f93402 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit b254cb46f918229d29978dcd9685439f27798668
+Subproject commit 6f934023958e0f948212f4743697f175669da13b
diff --git a/media/renderers/video_resource_updater.cc b/media/renderers/video_resource_updater.cc
index fdd60140..1b31578 100644
--- a/media/renderers/video_resource_updater.cc
+++ b/media/renderers/video_resource_updater.cc
@@ -966,9 +966,13 @@
     auto* dest_ptr = upload_pixels_[0].get() +
                      video_frame->visible_rect().y() * bytes_per_row +
                      video_frame->visible_rect().x() * sizeof(uint32_t);
+    // Alpha can be premul for videos that can be delegated/overlaid.
+    bool premultiply_alpha =
+        hardware_resource->shared_image()->alpha_type() == kPremul_SkAlphaType
+            ? true
+            : false;
     PaintCanvasVideoRenderer::ConvertVideoFrameToRGBPixels(
-        video_frame.get(), dest_ptr, bytes_per_row,
-        /*premultiply_alpha=*/false);
+        video_frame.get(), dest_ptr, bytes_per_row, premultiply_alpha);
     source_pixels = upload_pixels_[0].get();
   }
 
@@ -983,7 +987,8 @@
       viz::ToClosestSkColorType(resource_format, /*plane_index=*/0);
   auto info = SkImageInfo::Make(
       gfx::SizeToSkISize(hardware_resource->size()), color_type,
-      hardware_resource->shared_image()->alpha_type());
+      hardware_resource->shared_image()->alpha_type(),
+      hardware_resource->shared_image()->color_space().ToSkColorSpace());
   SkPixmap pixmap(info, source_pixels, bytes_per_row);
   ri->WritePixels(
       hardware_resource->shared_image()->mailbox(), /*dst_x_offset=*/0,
@@ -1174,6 +1179,13 @@
   gfx::ColorSpace output_color_space = video_frame->ColorSpace();
   SkAlphaType output_alpha_type =
       software_compositor() ? kPremul_SkAlphaType : kUnpremul_SkAlphaType;
+  if (!software_compositor() && use_gpu_memory_buffer_resources_ &&
+      context_provider_->SharedImageInterface()
+          ->GetCapabilities()
+          .supports_scanout_shared_images) {
+    // Overlays can only work with Premul alpha types.
+    output_alpha_type = kPremul_SkAlphaType;
+  }
 
   // `output_si_format` can be single plane if we're using software compositor
   // or frame format is 32 bit RGB or we are unable to display frame format as
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins
index 574ec797..c1019fe 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-06-15 13:01 UTC
+# Last updated: 2025-06-16 12:53 UTC
 PinsListTimestamp
-1749992496
+1750078406
 
 TestSPKI
 sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json
index beb573d..4901c123 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-06-15 13:01 UTC
+// Last updated: 2025-06-16 12:53 UTC
 //
 {
   "pinsets": [
diff --git a/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc b/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
index 7bde5011..1df0b22 100644
--- a/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
+++ b/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
@@ -187,13 +187,12 @@
   if (sysno == __NR_fcntl)
     return RestrictFcntlCommands();
 
-#if defined(__i386__) || defined(__arm__) || \
-    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
+#if !defined(__LP64__)
   if (sysno == __NR_fcntl64)
     return RestrictFcntlCommands();
 #endif
 
-#if !defined(__aarch64__)
+#if defined(__NR_fork)
   // fork() is never used as a system call (clone() is used instead), but we
   // have seen it in fallback code on Android.
   if (sysno == __NR_fork) {
@@ -203,16 +202,15 @@
 
 #if defined(__NR_vfork)
   // vfork() is almost never used as a system call, but some libc versions (e.g.
-  // older versions of bionic) might use it in a posix_spawn() implementation,
-  // which is used by system();
+  // 32-bit versions of bionic) use it in a posix_spawn() implementation,
+  // which is used by system().
   if (sysno == __NR_vfork) {
     return Error(EPERM);
   }
 #endif
 
   if (sysno == __NR_futex
-#if defined(__i386__) || defined(__arm__) || \
-    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
+#if !defined(__LP64__)
       || sysno == __NR_futex_time64
 #endif
   ) {
@@ -254,14 +252,14 @@
         .Else(Error(EPERM));
   }
 
+  // TODO(crbug.com/40528912): should i386 really be in this list?
 #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
     defined(__aarch64__)
   if (sysno == __NR_mmap)
     return RestrictMmapFlags();
 #endif
 
-#if defined(__i386__) || defined(__arm__) || \
-    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
+#if !defined(__LP64__)
   if (sysno == __NR_mmap2)
     return RestrictMmapFlags();
 #endif
@@ -275,8 +273,7 @@
   if (sysno == __NR_prctl)
     return RestrictPrctl();
 
-#if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
-    defined(__aarch64__)
+  // (Note that i386 may also use socketcall() for this, handled below.)
   if (sysno == __NR_socketpair) {
     // Only allow AF_UNIX, PF_UNIX. Crash if anything else is seen.
     static_assert(AF_UNIX == PF_UNIX,
@@ -284,7 +281,6 @@
     const Arg<int> domain(0);
     return If(domain == AF_UNIX, Allow()).Else(CrashSIGSYS());
   }
-#endif
 
   // On Android, for https://crbug.com/701137.
   // On Desktop, for https://crbug.com/741984.
@@ -345,15 +341,14 @@
     return RestrictSocketcallCommand();
 #endif
 
-#if !defined(__i386__)
   if (sysno == __NR_getsockopt || sysno ==__NR_setsockopt) {
     // Used by Mojo EDK to catch a message pipe being sent over itself.
+    // TODO(crbug.com/40528912): is this still needed?
     const Arg<int> level(1);
     const Arg<int> optname(2);
     return If(AllOf(level == SOL_SOCKET, optname == SO_PEEK_OFF), Allow())
         .Else(CrashSIGSYS());
   }
-#endif
 
   // https://crbug.com/644759
   // https://chromium-review.googlesource.com/c/crashpad/crashpad/+/3278691
@@ -366,7 +361,7 @@
   // Allow creating pipes, but don't allow weird flags to pipe2().
   // O_NOTIFICATION_PIPE (== O_EXCL) can be used to create
   // "notification pipes", which are rarely used.
-#if !defined(__aarch64__)
+#if defined(__NR_pipe)
   if (sysno == __NR_pipe) {
     return Allow();
   }
diff --git a/services/device/battery/battery_status_manager_mac.cc b/services/device/battery/battery_status_manager_mac.cc
index 97d4252..22e2be7 100644
--- a/services/device/battery/battery_status_manager_mac.cc
+++ b/services/device/battery/battery_status_manager_mac.cc
@@ -9,10 +9,17 @@
 #include <IOKit/ps/IOPowerSources.h>
 
 #include <memory>
+#include <optional>
 #include <vector>
 
 #include "base/apple/foundation_util.h"
 #include "base/apple/scoped_cftyperef.h"
+#include "base/feature_list.h"
+#include "base/features.h"
+#include "base/functional/bind.h"
+#include "base/task/task_traits.h"
+#include "base/task/thread_pool.h"
+#include "base/threading/scoped_blocking_call.h"
 #include "base/time/time.h"
 
 namespace device {
@@ -106,9 +113,17 @@
   }
 }
 
-std::vector<mojom::BatteryStatus> GetInternalBatteriesStates() {
+std::vector<mojom::BatteryStatus> GetInternalBatteriesStates(bool may_block) {
   std::vector<mojom::BatteryStatus> internal_sources;
 
+  // This function is known to block but cannot always be tagged as such right
+  // now because it might run on the UI thread. When running on the ThreadPool
+  // though it should be appropriately tagged.
+  std::optional<base::ScopedBlockingCall> scoped_blocking_call;
+  if (may_block) {
+    scoped_blocking_call.emplace(FROM_HERE, base::BlockingType::MAY_BLOCK);
+  }
+
   base::apple::ScopedCFTypeRef<CFTypeRef> info(IOPSCopyPowerSourcesInfo());
   base::apple::ScopedCFTypeRef<CFArrayRef> power_sources_list(
       IOPSCopyPowerSourcesList(info.get()));
@@ -140,9 +155,8 @@
   return internal_sources;
 }
 
-void OnBatteryStatusChanged(const BatteryCallback& callback) {
-  std::vector<mojom::BatteryStatus> batteries(GetInternalBatteriesStates());
-
+void HandleNewBatteryStatus(const BatteryCallback& callback,
+                            std::vector<mojom::BatteryStatus> batteries) {
   if (batteries.empty()) {
     callback.Run(mojom::BatteryStatus());
     return;
@@ -155,6 +169,17 @@
   callback.Run(batteries.front());
 }
 
+void OnBatteryStatusChangedAsync(const BatteryCallback& callback) {
+  base::ThreadPool::PostTaskAndReplyWithResult(
+      FROM_HERE, {base::MayBlock()},
+      base::BindOnce(&GetInternalBatteriesStates, true),
+      base::BindOnce(&HandleNewBatteryStatus, callback));
+}
+
+void OnBatteryStatusChanged(const BatteryCallback& callback) {
+  HandleNewBatteryStatus(callback, GetInternalBatteriesStates(false));
+}
+
 class BatteryStatusObserver {
  public:
   explicit BatteryStatusObserver(const BatteryCallback& callback)
@@ -195,7 +220,11 @@
 
  private:
   static void CallOnBatteryStatusChanged(void* callback) {
-    OnBatteryStatusChanged(*static_cast<BatteryCallback*>(callback));
+    if (base::FeatureList::IsEnabled(base::features::kReducePPMs)) {
+      OnBatteryStatusChangedAsync(*static_cast<BatteryCallback*>(callback));
+    } else {
+      OnBatteryStatusChanged(*static_cast<BatteryCallback*>(callback));
+    }
   }
 
   BatteryCallback callback_;
diff --git a/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestActivity.java b/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestActivity.java
index 05f9701..6396c6a 100644
--- a/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestActivity.java
+++ b/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestActivity.java
@@ -12,7 +12,7 @@
 
 /** An {@link android.app.Activity} for running native browser tests. */
 public abstract class NativeBrowserTestActivity extends FragmentActivity {
-    private static final String TAG = "NativeTest";
+    private static final String TAG = "NativeTestActivity";
 
     private final NativeTest mTest = new NativeTest();
     private boolean mStarted;
@@ -44,7 +44,9 @@
         if (mStarted) return;
 
         mStarted = true;
-        NativeBrowserTest.deletePrivateDataDirectory(getPrivateDataDirectory());
+        if (!mTest.shouldKeepUserDataDir()) {
+            NativeBrowserTest.deletePrivateDataDirectory(getPrivateDataDirectory());
+        }
         initializeBrowserProcess();
     }
 
diff --git a/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java b/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java
index f0c7a91..ecde6d1 100644
--- a/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java
+++ b/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java
@@ -33,6 +33,7 @@
     private final StringBuilder mCommandLineFlags = new StringBuilder();
     private TestStatusReporter mReporter;
     private boolean mRunInSubThread;
+    private boolean mKeepUserDataDir;
     private String mStdoutFilePath;
 
     private static class ReportingUncaughtExceptionHandler
@@ -81,6 +82,10 @@
                         mReporter, Thread.getDefaultUncaughtExceptionHandler()));
     }
 
+    public boolean shouldKeepUserDataDir() {
+        return mKeepUserDataDir;
+    }
+
     private void parseArgumentsFromIntent(Activity activity, Intent intent) {
         Log.i(TAG, "Extras:");
         Bundle extras = intent.getExtras();
@@ -107,6 +112,11 @@
 
         mRunInSubThread = intent.hasExtra(NativeTestIntent.EXTRA_RUN_IN_SUB_THREAD);
 
+        mKeepUserDataDir = intent.getBooleanExtra(NativeTestIntent.EXTRA_KEEP_USER_DATA_DIR, false);
+        if (mKeepUserDataDir) {
+            Log.i(TAG, "user data dir is kept for the tests.");
+        }
+
         String gtestFilter = intent.getStringExtra(NativeTestIntent.EXTRA_GTEST_FILTER);
         if (gtestFilter != null) {
             appendCommandLineFlags("--gtest_filter=" + gtestFilter);
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 9ff2cb8..fe37291 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -13394,7 +13394,19 @@
                     "enable_features": [
                         "KeepDefaultSearchEngineRendererAlive",
                         "TrackEmptyRendererProcessesForReuse"
+                    ],
+                    "disable_features": [
+                        "ProcessPerSiteForDSE"
                     ]
+                },
+                {
+                    "name": "EnabledDSEKeepAliveWithProcessSharing",
+                    "enable_features": [
+                        "KeepDefaultSearchEngineRendererAlive",
+                        "ProcessPerSiteForDSE",
+                        "TrackEmptyRendererProcessesForReuse"
+                    ],
+                    "disable_features": []
                 }
             ]
         }
@@ -15422,6 +15434,26 @@
             ]
         }
     ],
+    "NoLateBeginFrames": [
+        {
+            "platforms": [
+                "android",
+                "android_webview",
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "NoLateBeginFrames"
+                    ]
+                }
+            ]
+        }
+    ],
     "NoPasswordSuggestionFiltering": [
         {
             "platforms": [
diff --git a/third_party/android_deps/autorolled/build.gradle.template b/third_party/android_deps/autorolled/build.gradle.template
index e92336d..3857dd2 100644
--- a/third_party/android_deps/autorolled/build.gradle.template
+++ b/third_party/android_deps/autorolled/build.gradle.template
@@ -52,6 +52,8 @@
     compileLatest "com.google.android.gms:play-services-tasks:+"
     compileLatest "com.google.android.gms:play-services-vision-common:+"
     compileLatest "com.google.android.gms:play-services-vision:+"
+
+    compileLatest 'com.airbnb.android:lottie:+'
 }
 
 task setUpRepository(type: BuildConfigGenerator) {
diff --git a/third_party/angle b/third_party/angle
index 94ee620..dfefcbc6 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit 94ee620d2e2f771d350e14ca90804bf1457834d3
+Subproject commit dfefcbc68cc3627e6cd80c83ce67815fb5b6efd9
diff --git a/third_party/blink/public/common/input/web_pointer_properties.h b/third_party/blink/public/common/input/web_pointer_properties.h
index 45e7be5..292b51e 100644
--- a/third_party/blink/public/common/input/web_pointer_properties.h
+++ b/third_party/blink/public/common/input/web_pointer_properties.h
@@ -18,8 +18,8 @@
 // This class encapsulates the properties that are common between mouse and
 // pointer events and touch points as we transition towards the unified pointer
 // event model.
-// TODO(mustaq): Unify WebTouchPoint & WebMouseEvent into WebPointerEvent.
-// crbug.com/508283
+// TODO(crbug.com/41371756): Unify WebTouchPoint & WebMouseEvent into
+// WebPointerEvent.
 class WebPointerProperties {
  public:
   using Button = mojom::Button;
diff --git a/third_party/blink/public/common/input/web_touch_event.h b/third_party/blink/public/common/input/web_touch_event.h
index 38a339b..32a38e5 100644
--- a/third_party/blink/public/common/input/web_touch_event.h
+++ b/third_party/blink/public/common/input/web_touch_event.h
@@ -14,7 +14,7 @@
 
 // WebTouchEvent --------------------------------------------------------------
 
-// TODO(e_hakkinen): Replace with WebPointerEvent. crbug.com/508283
+// TODO(crbug.com/41371756): Replace with WebPointerEvent.
 class BLINK_COMMON_EXPORT WebTouchEvent : public WebInputEvent {
  public:
   // Maximum number of simultaneous touches supported on
diff --git a/third_party/blink/public/common/input/web_touch_point.h b/third_party/blink/public/common/input/web_touch_point.h
index 95593eda..08e822ab 100644
--- a/third_party/blink/public/common/input/web_touch_point.h
+++ b/third_party/blink/public/common/input/web_touch_point.h
@@ -37,8 +37,8 @@
 
 namespace blink {
 
-// TODO(mustaq): Unify WebTouchPoint & WebMouseEvent into WebPointerEvent.
-// crbug.com/508283
+// TODO(crbug.com/41371756): Unify WebTouchPoint & WebMouseEvent into
+// WebPointerEvent.
 class BLINK_COMMON_EXPORT WebTouchPoint : public WebPointerProperties {
  public:
   WebTouchPoint() : WebTouchPoint(WebPointerProperties(0)) {}
diff --git a/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h b/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h
index 9b2dc42..f96781a04 100644
--- a/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h
+++ b/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h
@@ -113,9 +113,6 @@
       WebServiceWorkerContextProxy*,
       scoped_refptr<base::SequencedTaskRunner> worker_task_runner) {}
 
-  // Called before preparing v8 script engine for evaluation.
-  virtual void WillPrepareForEvaluation(v8::Local<v8::Context> v8_context) {}
-
   // Called immediately before V8 script evaluation starts for the main script.
   // This means all setup is finally complete: the script has been loaded, the
   // worker thread has started, the script has been passed to the worker thread,
diff --git a/third_party/blink/public/web/web_v8_features.h b/third_party/blink/public/web/web_v8_features.h
index f735897..6e540fe 100644
--- a/third_party/blink/public/web/web_v8_features.h
+++ b/third_party/blink/public/web/web_v8_features.h
@@ -58,9 +58,6 @@
   // Send isolate priority change notification to worker thread isolates.
   static void SetIsolatePriority(base::Process::Priority priority);
 
-  // Whether `WebV8Features` is supported for the given v8 context.
-  static bool IsSupported(v8::Local<v8::Context>);
-
  private:
   WebV8Features() = delete;
 };
diff --git a/third_party/blink/renderer/core/exported/web_v8_features.cc b/third_party/blink/renderer/core/exported/web_v8_features.cc
index 1ce89f4..160cec84 100644
--- a/third_party/blink/renderer/core/exported/web_v8_features.cc
+++ b/third_party/blink/renderer/core/exported/web_v8_features.cc
@@ -43,8 +43,7 @@
   }
   v8::Isolate* isolate = context->GetIsolate();
   ScriptState* script_state = ScriptState::From(isolate, context);
-  DCHECK(script_state->World().IsMainWorld() ||
-         script_state->World().IsWorkerOrWorkletWorld());
+  DCHECK(script_state->World().IsMainWorld());
   ContextFeatureSettings::From(
       ExecutionContext::From(script_state),
       ContextFeatureSettings::CreationMode::kCreateIfNotExists)
@@ -139,9 +138,4 @@
   WorkerBackingThread::SetWorkerThreadIsolatesPriority(isolate_priority);
 }
 
-// static
-bool WebV8Features::IsSupported(v8::Local<v8::Context> context) {
-  return blink::ExecutionContext::From(context);
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
index 123d1e46..0580966 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
@@ -276,9 +276,6 @@
   InitContentSecurityPolicyFromVector(std::move(csp_list));
   BindContentSecurityPolicyToExecutionContext();
 
-  // Allows `ContextFeatureSettings` to update before preparing script engine.
-  ReportingProxy().WillPrepareForEvaluation();
-
   // This should be called after OriginTrialContext::AddTokens() to install
   // origin trial features in JavaScript's global object.
   // DedicatedWorkerGlobalScope inherits the outside's OriginTrialTokens in the
diff --git a/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc b/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
index fc26ac9a..905f866 100644
--- a/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
@@ -113,9 +113,6 @@
 
   OriginTrialContext::AddTokens(this, response_origin_trial_tokens);
 
-  // Allows `ContextFeatureSettings` to update before preparing script engine.
-  ReportingProxy().WillPrepareForEvaluation();
-
   // This should be called after OriginTrialContext::AddTokens() to install
   // origin trial features in JavaScript's global object.
   ScriptController()->PrepareForEvaluation();
diff --git a/third_party/blink/renderer/core/workers/worker_reporting_proxy.h b/third_party/blink/renderer/core/workers/worker_reporting_proxy.h
index 0c14796..54c24e6 100644
--- a/third_party/blink/renderer/core/workers/worker_reporting_proxy.h
+++ b/third_party/blink/renderer/core/workers/worker_reporting_proxy.h
@@ -85,9 +85,6 @@
   // or InstalledScriptsManager).
   virtual void DidFailToFetchModuleScript() {}
 
-  // Invoked before preparing script engine for evaluation.
-  virtual void WillPrepareForEvaluation() {}
-
   // Invoked when the main classic/module script is about to be evaluated.
   virtual void WillEvaluateScript() {}
 
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc
index d8c871d..832d63c 100644
--- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc
@@ -46,6 +46,7 @@
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
 #include "third_party/blink/renderer/modules/mediarecorder/media_recorder.h"
+#include "third_party/blink/renderer/modules/mediarecorder/video_track_recorder.h"
 #include "third_party/blink/renderer/modules/mediastream/media_stream_video_track.h"
 #include "third_party/blink/renderer/platform/bindings/exception_code.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
diff --git a/third_party/blink/renderer/modules/mediarecorder/track_recorder.cc b/third_party/blink/renderer/modules/mediarecorder/track_recorder.cc
index 6c3c950..2745d2a 100644
--- a/third_party/blink/renderer/modules/mediarecorder/track_recorder.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/track_recorder.cc
@@ -19,7 +19,7 @@
   } else if (EqualIgnoringASCIICase(type, "video/webm")) {
     return MediaTrackContainerType::kVideoWebM;
   } else if (EqualIgnoringASCIICase(type, "video/x-matroska")) {
-    return MediaTrackContainerType::kVidoMatroska;
+    return MediaTrackContainerType::kVideoMatroska;
   } else if (EqualIgnoringASCIICase(type, "audio/mp4")) {
     return MediaTrackContainerType::kAudioMp4;
   } else if (EqualIgnoringASCIICase(type, "audio/webm")) {
diff --git a/third_party/blink/renderer/modules/mediarecorder/track_recorder.h b/third_party/blink/renderer/modules/mediarecorder/track_recorder.h
index 0325823..5d5901cb 100644
--- a/third_party/blink/renderer/modules/mediarecorder/track_recorder.h
+++ b/third_party/blink/renderer/modules/mediarecorder/track_recorder.h
@@ -50,7 +50,7 @@
   kNone,
   kVideoMp4,
   kVideoWebM,
-  kVidoMatroska,
+  kVideoMatroska,
   kAudioMp4,
   kAudioWebM,
 };
diff --git a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc
index 44624a6..38ccb7d 100644
--- a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc
@@ -39,6 +39,7 @@
 #include "third_party/blink/public/platform/web_graphics_context_3d_provider.h"
 #include "third_party/blink/renderer/modules/mediarecorder/media_recorder_encoder_wrapper.h"
 #include "third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h"
+#include "third_party/blink/renderer/modules/mediarecorder/track_recorder.h"
 #include "third_party/blink/renderer/modules/mediastream/media_stream_video_track.h"
 #include "third_party/blink/renderer/platform/graphics/web_graphics_context_3d_provider_util.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
@@ -126,20 +127,46 @@
 
 namespace {
 
-static const struct {
+constexpr MediaTrackContainerType kVp8Types[] = {
+    MediaTrackContainerType::kVideoMatroska,
+    MediaTrackContainerType::kVideoWebM};
+constexpr MediaTrackContainerType kVp9Types[] = {
+    MediaTrackContainerType::kVideoMatroska,
+    MediaTrackContainerType::kVideoWebM, MediaTrackContainerType::kVideoMp4};
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
+constexpr MediaTrackContainerType kH264Types[] = {
+    MediaTrackContainerType::kVideoMatroska,
+    MediaTrackContainerType::kVideoMp4};
+#endif
+constexpr MediaTrackContainerType kAv1Types[] = {
+    MediaTrackContainerType::kVideoWebM,
+    MediaTrackContainerType::kVideoMatroska,
+    MediaTrackContainerType::kVideoMp4};
+#if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER)
+constexpr MediaTrackContainerType kH265Types[] = {
+    MediaTrackContainerType::kVideoMatroska,
+    MediaTrackContainerType::kVideoMp4};
+#endif
+
+constexpr struct {
   CodecId codec_id;
   media::VideoCodecProfile min_profile;
   media::VideoCodecProfile max_profile;
+  base::raw_span<const MediaTrackContainerType> supported_container_types;
 } kPreferredCodecIdAndVEAProfiles[] = {
-    {CodecId::kVp8, media::VP8PROFILE_ANY, media::VP8PROFILE_ANY},
-    {CodecId::kVp9, media::VP9PROFILE_PROFILE0, media::VP9PROFILE_PROFILE0},
+    {CodecId::kVp8, media::VP8PROFILE_ANY, media::VP8PROFILE_ANY,
+     base::span{kVp8Types}},
+    {CodecId::kVp9, media::VP9PROFILE_PROFILE0, media::VP9PROFILE_PROFILE0,
+     base::span{kVp9Types}},
 #if BUILDFLAG(USE_PROPRIETARY_CODECS)
-    {CodecId::kH264, media::H264PROFILE_BASELINE, media::H264PROFILE_HIGH},
+    {CodecId::kH264, media::H264PROFILE_BASELINE, media::H264PROFILE_HIGH,
+     base::span{kH264Types}},
 #endif
     {CodecId::kAv1, media::AV1PROFILE_PROFILE_MAIN,
-     media::AV1PROFILE_PROFILE_MAIN},
+     media::AV1PROFILE_PROFILE_MAIN, base::span{kAv1Types}},
 #if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER)
-    {CodecId::kHevc, media::HEVCPROFILE_MAIN, media::HEVCPROFILE_MAIN},
+    {CodecId::kHevc, media::HEVCPROFILE_MAIN, media::HEVCPROFILE_MAIN,
+     base::span{kH265Types}},
 #endif
 };
 
@@ -147,6 +174,27 @@
                   static_cast<int>(CodecId::kLast),
               "|kPreferredCodecIdAndVEAProfiles| should consider all CodecIds");
 
+media::VideoCodec CodecIdToMediaCodec(VideoTrackRecorder::CodecId codec) {
+  switch (codec) {
+    case VideoTrackRecorder::CodecId::kVp8:
+      return media::VideoCodec::kVP8;
+    case VideoTrackRecorder::CodecId::kVp9:
+      return media::VideoCodec::kVP9;
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
+    case VideoTrackRecorder::CodecId::kH264:
+      return media::VideoCodec::kH264;
+#endif
+#if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER)
+    case VideoTrackRecorder::CodecId::kHevc:
+      return media::VideoCodec::kHEVC;
+#endif
+    case VideoTrackRecorder::CodecId::kAv1:
+      return media::VideoCodec::kAV1;
+    case VideoTrackRecorder::CodecId::kLast:
+      return media::VideoCodec::kUnknown;
+  }
+}
+
 void NotifyEncoderSupportKnown(base::OnceClosure callback) {
   if (!Platform::Current()) {
     DLOG(ERROR) << "Couldn't access the render thread";
@@ -683,29 +731,24 @@
 // static
 VideoTrackRecorderImpl::CodecId VideoTrackRecorderImpl::GetPreferredCodecId(
     MediaTrackContainerType type) {
-  const auto preferred_codec_id = []() {
-    for (const auto& supported_profile : GetVEASupportedProfiles()) {
-      const media::VideoCodecProfile codec = supported_profile.profile;
-      for (auto& codec_id_and_profile : kPreferredCodecIdAndVEAProfiles) {
-        if (codec >= codec_id_and_profile.min_profile &&
-            codec <= codec_id_and_profile.max_profile) {
-          DVLOG(2) << "Accelerated codec found: "
-                   << media::GetProfileName(codec) << ", min_resolution: "
-                   << supported_profile.min_resolution.ToString()
-                   << ", max_resolution: "
-                   << supported_profile.max_resolution.ToString()
-                   << ", max_framerate: "
-                   << supported_profile.max_framerate_numerator << "/"
-                   << supported_profile.max_framerate_denominator;
-          return codec_id_and_profile.codec_id;
-        }
+  for (const auto& supported_profile : GetVEASupportedProfiles()) {
+    const media::VideoCodecProfile codec = supported_profile.profile;
+    for (auto& entry : kPreferredCodecIdAndVEAProfiles) {
+      if (codec >= entry.min_profile && codec <= entry.max_profile &&
+          std::find(entry.supported_container_types.begin(),
+                    entry.supported_container_types.end(),
+                    type) != entry.supported_container_types.end()) {
+        DVLOG(2) << "Accelerated codec found: " << media::GetProfileName(codec)
+                 << ", min_resolution: "
+                 << supported_profile.min_resolution.ToString()
+                 << ", max_resolution: "
+                 << supported_profile.max_resolution.ToString()
+                 << ", max_framerate: "
+                 << supported_profile.max_framerate_numerator << "/"
+                 << supported_profile.max_framerate_denominator;
+        return entry.codec_id;
       }
     }
-    return CodecId::kLast;
-  }();
-
-  if (preferred_codec_id != CodecId::kLast) {
-    return preferred_codec_id;
   }
 
   if (type == MediaTrackContainerType::kVideoMp4 ||
@@ -731,27 +774,7 @@
     }
   }
 
-  const auto media_codec_id = [](CodecId codec) {
-    switch (codec) {
-      case VideoTrackRecorder::CodecId::kVp8:
-        return media::VideoCodec::kVP8;
-      case VideoTrackRecorder::CodecId::kVp9:
-        return media::VideoCodec::kVP9;
-#if BUILDFLAG(USE_PROPRIETARY_CODECS)
-      case VideoTrackRecorder::CodecId::kH264:
-        return media::VideoCodec::kH264;
-#endif
-#if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER)
-      case VideoTrackRecorder::CodecId::kHevc:
-        return media::VideoCodec::kHEVC;
-#endif
-      case VideoTrackRecorder::CodecId::kAv1:
-        return media::VideoCodec::kAV1;
-      case VideoTrackRecorder::CodecId::kLast:
-        return media::VideoCodec::kUnknown;
-    }
-  }(codec_profile.codec_id);
-
+  const auto media_codec_id = CodecIdToMediaCodec(codec_profile.codec_id);
   for (const auto& profile : GetVEASupportedProfiles()) {
     DCHECK_NE(profile.profile, media::VIDEO_CODEC_PROFILE_UNKNOWN);
 
diff --git a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc
index b70ea6c..3f5b3e5 100644
--- a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "third_party/blink/renderer/modules/mediarecorder/track_recorder.h"
 #ifdef UNSAFE_BUFFERS_BUILD
 // TODO(crbug.com/390223051): Remove C-library calls to fix the errors.
 #pragma allow_unsafe_libc_calls
@@ -1466,4 +1467,120 @@
                          VideoTrackRecorderPassthroughTest,
                          ValuesIn(kTrackRecorderTestCodec));
 
+TEST(VideoTrackRecorder, DefaultCodecWithoutGpuFactories) {
+  EXPECT_EQ(VideoTrackRecorder::CodecId::kVp8,
+            VideoTrackRecorderImpl::GetPreferredCodecId(
+                MediaTrackContainerType::kVideoWebM));
+  EXPECT_EQ(VideoTrackRecorder::CodecId::kVp8,
+            VideoTrackRecorderImpl::GetPreferredCodecId(
+                MediaTrackContainerType::kVideoMatroska));
+  EXPECT_EQ(VideoTrackRecorder::CodecId::kVp9,
+            VideoTrackRecorderImpl::GetPreferredCodecId(
+                MediaTrackContainerType::kVideoMp4));
+}
+
+TEST(VideoTrackRecorder, DefaultCodecWithAcceleratedVp9) {
+  auto sii = base::MakeRefCounted<gpu::TestSharedImageInterface>();
+  sii->UseTestGMBInSharedImageCreationWithBufferUsage();
+  media::MockGpuVideoAcceleratorFactories mock_gpu_factories(sii.get());
+  ScopedTestingPlatformSupport<MockTestingPlatform> platform;
+  EXPECT_CALL(*platform, GetGpuFactories())
+      .WillRepeatedly(Return(&mock_gpu_factories));
+  EXPECT_CALL(mock_gpu_factories, GetVideoEncodeAcceleratorSupportedProfiles)
+      .WillRepeatedly(
+          Return(std::vector<media::VideoEncodeAccelerator::SupportedProfile>{
+              media::VideoEncodeAccelerator::SupportedProfile(
+                  media::VideoCodecProfile::VP9PROFILE_PROFILE0,
+                  gfx::Size(1920, 1080)),
+          }));
+  EXPECT_EQ(VideoTrackRecorder::CodecId::kVp9,
+            VideoTrackRecorderImpl::GetPreferredCodecId(
+                MediaTrackContainerType::kVideoWebM));
+  EXPECT_EQ(VideoTrackRecorder::CodecId::kVp9,
+            VideoTrackRecorderImpl::GetPreferredCodecId(
+                MediaTrackContainerType::kVideoMatroska));
+  EXPECT_EQ(VideoTrackRecorder::CodecId::kVp9,
+            VideoTrackRecorderImpl::GetPreferredCodecId(
+                MediaTrackContainerType::kVideoMp4));
+}
+
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
+TEST(VideoTrackRecorder, DefaultCodecWithAcceleratedH264) {
+  auto sii = base::MakeRefCounted<gpu::TestSharedImageInterface>();
+  sii->UseTestGMBInSharedImageCreationWithBufferUsage();
+  media::MockGpuVideoAcceleratorFactories mock_gpu_factories(sii.get());
+  ScopedTestingPlatformSupport<MockTestingPlatform> platform;
+  EXPECT_CALL(*platform, GetGpuFactories())
+      .WillRepeatedly(Return(&mock_gpu_factories));
+  EXPECT_CALL(mock_gpu_factories, GetVideoEncodeAcceleratorSupportedProfiles)
+      .WillRepeatedly(
+          Return(std::vector<media::VideoEncodeAccelerator::SupportedProfile>{
+              media::VideoEncodeAccelerator::SupportedProfile(
+                  media::VideoCodecProfile::H264PROFILE_HIGH,
+                  gfx::Size(1920, 1080)),
+          }));
+  EXPECT_EQ(VideoTrackRecorder::CodecId::kVp8,
+            VideoTrackRecorderImpl::GetPreferredCodecId(
+                MediaTrackContainerType::kVideoWebM));
+  EXPECT_EQ(VideoTrackRecorder::CodecId::kH264,
+            VideoTrackRecorderImpl::GetPreferredCodecId(
+                MediaTrackContainerType::kVideoMatroska));
+  EXPECT_EQ(VideoTrackRecorder::CodecId::kH264,
+            VideoTrackRecorderImpl::GetPreferredCodecId(
+                MediaTrackContainerType::kVideoMp4));
+}
+#endif  // BUILDFLAG(USE_PROPRIETARY_CODECS)
+
+#if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER)
+TEST(VideoTrackRecorder, DefaultCodecWithAcceleratedH265) {
+  auto sii = base::MakeRefCounted<gpu::TestSharedImageInterface>();
+  sii->UseTestGMBInSharedImageCreationWithBufferUsage();
+  media::MockGpuVideoAcceleratorFactories mock_gpu_factories(sii.get());
+  ScopedTestingPlatformSupport<MockTestingPlatform> platform;
+  EXPECT_CALL(*platform, GetGpuFactories())
+      .WillRepeatedly(Return(&mock_gpu_factories));
+  EXPECT_CALL(mock_gpu_factories, GetVideoEncodeAcceleratorSupportedProfiles)
+      .WillRepeatedly(
+          Return(std::vector<media::VideoEncodeAccelerator::SupportedProfile>{
+              media::VideoEncodeAccelerator::SupportedProfile(
+                  media::VideoCodecProfile::HEVCPROFILE_MAIN,
+                  gfx::Size(1920, 1080)),
+          }));
+  EXPECT_EQ(VideoTrackRecorder::CodecId::kVp8,
+            VideoTrackRecorderImpl::GetPreferredCodecId(
+                MediaTrackContainerType::kVideoWebM));
+  EXPECT_EQ(VideoTrackRecorder::CodecId::kHevc,
+            VideoTrackRecorderImpl::GetPreferredCodecId(
+                MediaTrackContainerType::kVideoMatroska));
+  EXPECT_EQ(VideoTrackRecorder::CodecId::kHevc,
+            VideoTrackRecorderImpl::GetPreferredCodecId(
+                MediaTrackContainerType::kVideoMp4));
+}
+#endif  // BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER)
+
+TEST(VideoTrackRecorder, DefaultCodecWithAcceleratedVp8) {
+  auto sii = base::MakeRefCounted<gpu::TestSharedImageInterface>();
+  sii->UseTestGMBInSharedImageCreationWithBufferUsage();
+  media::MockGpuVideoAcceleratorFactories mock_gpu_factories(sii.get());
+  ScopedTestingPlatformSupport<MockTestingPlatform> platform;
+  EXPECT_CALL(*platform, GetGpuFactories())
+      .WillRepeatedly(Return(&mock_gpu_factories));
+  EXPECT_CALL(mock_gpu_factories, GetVideoEncodeAcceleratorSupportedProfiles)
+      .WillRepeatedly(
+          Return(std::vector<media::VideoEncodeAccelerator::SupportedProfile>{
+              media::VideoEncodeAccelerator::SupportedProfile(
+                  media::VideoCodecProfile::VP8PROFILE_ANY,
+                  gfx::Size(1920, 1080)),
+          }));
+  EXPECT_EQ(VideoTrackRecorder::CodecId::kVp8,
+            VideoTrackRecorderImpl::GetPreferredCodecId(
+                MediaTrackContainerType::kVideoWebM));
+  EXPECT_EQ(VideoTrackRecorder::CodecId::kVp8,
+            VideoTrackRecorderImpl::GetPreferredCodecId(
+                MediaTrackContainerType::kVideoMatroska));
+  EXPECT_EQ(VideoTrackRecorder::CodecId::kVp9,
+            VideoTrackRecorderImpl::GetPreferredCodecId(
+                MediaTrackContainerType::kVideoMp4));
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
index 9f1d06e9..48eed6c 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
@@ -514,10 +514,9 @@
   // TODO(nhiroki): Clarify mappings between the steps 4.8-4.11 and
   // implementation.
 
-  pending_prepare_for_evaluation_ = true;
-  if (!pause_evaluation_) {
-    PrepareForEvaluationIfNeeded();
-  }
+  // This should be called after OriginTrialContext::AddTokens() to install
+  // origin trial features in JavaScript's global object.
+  ScriptController()->PrepareForEvaluation();
 }
 
 void ServiceWorkerGlobalScope::LoadAndRunInstalledClassicScript(
@@ -1714,10 +1713,8 @@
   ancestor_frame_type_ = ancestor_frame_type;
 
   global_scope_initialized_ = true;
-  if (!pause_evaluation_) {
-    PrepareForEvaluationIfNeeded();
+  if (!pause_evaluation_)
     ReadyToRunWorkerScript();
-  }
 
   storage_key_ = storage_key;
 }
@@ -1733,10 +1730,8 @@
   DCHECK(IsContextThread());
   DCHECK(pause_evaluation_);
   pause_evaluation_ = false;
-  if (global_scope_initialized_) {
-    PrepareForEvaluationIfNeeded();
+  if (global_scope_initialized_)
     ReadyToRunWorkerScript();
-  }
 }
 
 void ServiceWorkerGlobalScope::DispatchInstallEvent(
@@ -2828,20 +2823,4 @@
   }
 }
 
-void ServiceWorkerGlobalScope::PrepareForEvaluationIfNeeded() {
-  DCHECK(!pause_evaluation_);
-
-  if (!pending_prepare_for_evaluation_) {
-    return;
-  }
-  pending_prepare_for_evaluation_ = false;
-
-  // Allows `ContextFeatureSettings` to update before preparing script engine.
-  ReportingProxy().WillPrepareForEvaluation();
-
-  // This should be called after OriginTrialContext::AddTokens() to install
-  // origin trial features in JavaScript's global object.
-  ScriptController()->PrepareForEvaluation();
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h
index ab4918a7..5e234602 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h
@@ -633,8 +633,6 @@
       const KURL& request_url);
   void RemoveItemFromRaceNetworkRequests(int fetch_event_id);
 
-  void PrepareForEvaluationIfNeeded();
-
   Member<ServiceWorkerClients> clients_;
   Member<ServiceWorkerRegistration> registration_;
   Member<::blink::ServiceWorker> service_worker_;
@@ -754,10 +752,6 @@
   // ResumeEvaluation() evaluates the top level script when this flag is true.
   bool global_scope_initialized_ = false;
 
-  // Whether `ScriptController()->PrepareForEvaluation()` should be called after
-  // evaluation is resumed.
-  bool pending_prepare_for_evaluation_ = false;
-
   // Connected by the ServiceWorkerHost in the browser process and by the
   // controllees. |controller_bindings_| should be destroyed before
   // |event_queue_| since the pipe needs to be disconnected before callbacks
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc
index 0bfb7ae01..400ad4c3 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc
@@ -172,14 +172,6 @@
   Client().FailedToFetchModuleScript();
 }
 
-void ServiceWorkerGlobalScopeProxy::WillPrepareForEvaluation() {
-  DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_);
-  ScriptState::Scope scope(
-      WorkerGlobalScope()->ScriptController()->GetScriptState());
-  Client().WillPrepareForEvaluation(
-      WorkerGlobalScope()->ScriptController()->GetContext());
-}
-
 void ServiceWorkerGlobalScopeProxy::WillEvaluateScript() {
   DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_);
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h
index b86e0fa..f7f3e68 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h
@@ -129,7 +129,6 @@
   void DidFetchScript() override;
   void DidFailToFetchClassicScript() override;
   void DidFailToFetchModuleScript() override;
-  void WillPrepareForEvaluation() override;
   void WillEvaluateScript() override;
   void DidEvaluateTopLevelScript(bool success) override;
   void DidCloseWorkerGlobalScope() override;
diff --git a/third_party/blink/renderer/platform/blink_platform_unittests_bundle_data.filelist b/third_party/blink/renderer/platform/blink_platform_unittests_bundle_data.filelist
index 76d090220..63af1543 100644
--- a/third_party/blink/renderer/platform/blink_platform_unittests_bundle_data.filelist
+++ b/third_party/blink/renderer/platform/blink_platform_unittests_bundle_data.filelist
@@ -363,6 +363,7 @@
 ../../web_tests/images/resources/count-down-color-test.png
 ../../web_tests/images/resources/count-down-color-test.webp
 ../../web_tests/images/resources/crbug.364830.webp
+../../web_tests/images/resources/crbug423310049.png
 ../../web_tests/images/resources/crbug702934.png
 ../../web_tests/images/resources/crbug752898.bmp
 ../../web_tests/images/resources/crbug779261.gif
diff --git a/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc b/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc
index 9b7ea22..c06f58237 100644
--- a/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc
+++ b/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc
@@ -160,7 +160,6 @@
 void CopyToGpuMemoryBuffer(
     base::WeakPtr<blink::WebGraphicsContext3DProviderWrapper> ctx_wrapper,
     media::VideoFrame* dst_frame,
-    const gpu::SyncToken& blit_done_sync_token,
     base::OnceClosure callback) {
   CHECK(dst_frame->HasMappableGpuBuffer());
   CHECK(!dst_frame->HasNativeGpuMemoryBuffer());
@@ -173,6 +172,9 @@
   auto* ri = raster_context_provider->RasterInterface();
   DCHECK(ri);
 
+  gpu::SyncToken blit_done_sync_token;
+  ri->GenUnverifiedSyncTokenCHROMIUM(blit_done_sync_token.GetData());
+
   auto* sii = context_provider.SharedImageInterface();
   DCHECK(sii);
 
@@ -199,9 +201,18 @@
 
   // Synchronize RasterInterface with SharedImageInterface.
   auto copy_to_gmb_done_sync_token = sii->GenUnverifiedSyncToken();
+  ri->WaitSyncTokenCHROMIUM(copy_to_gmb_done_sync_token.GetData());
 
-  media::SimpleSyncTokenClient simple_client(copy_to_gmb_done_sync_token);
-  dst_frame->UpdateAcquireSyncToken(copy_to_gmb_done_sync_token);
+  // Make access to the `dst_frame` wait on copy completion. We also update the
+  // ReleaseSyncToken here since it's used when the underlying GpuMemoryBuffer
+  // and SharedImage resources are returned to the pool. This is not necessary
+  // since we'll set the empty sync token on the video frame on GPU completion.
+  // But if we ever refactor this code to have a "don't wait for GMB" mode, the
+  // correct sync token on the video frame will be needed.
+  gpu::SyncToken completion_sync_token;
+  ri->GenUnverifiedSyncTokenCHROMIUM(completion_sync_token.GetData());
+  media::SimpleSyncTokenClient simple_client(completion_sync_token);
+  dst_frame->UpdateAcquireSyncToken(completion_sync_token);
   dst_frame->UpdateReleaseSyncToken(&simple_client);
 
   // Do not use a query to track copy completion on Windows when using the new
@@ -287,7 +298,6 @@
     // For shared memory GMBs we needed to explicitly request a copy
     // from the shared image GPU texture to the GMB.
     CopyToGpuMemoryBuffer(weak_context_provider_, dst_frame_ptr,
-                          completion_sync_token.value(),
                           wrapped_callback->callback());
   } else {
     // QueryEXT functions are used to make sure that
diff --git a/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.cc b/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.cc
index adbbd20..8644913 100644
--- a/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.cc
+++ b/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.cc
@@ -337,7 +337,17 @@
       }
     }
 
-    if (frame.GetStatus() == ImageFrame::kFrameInitialized) {
+    bool already_started_current_frame =
+        already_started_frame_.has_value() &&
+        already_started_frame_.value() == current_frame_index;
+    if (!already_started_current_frame) {
+      // `kFrameEmpty` and `kFrameComplete` are handled above.
+      // `kFrameInitialized` is possible when decoding a frame from scratch.
+      // `kFramePartial` is possible when resuming to decode a frame that
+      // previously returned `kIncompleteInput` from `incrementalDecode`.
+      DCHECK(frame.GetStatus() == ImageFrame::kFrameInitialized ||
+             frame.GetStatus() == ImageFrame::kFramePartial);
+
       SkCodec::FrameInfo frame_info;
       bool frame_info_received =
           codec_->getFrameInfo(current_frame_index, &frame_info);
@@ -363,10 +373,22 @@
       }
       DCHECK_NE(color_type, kUnknown_SkColorType);
 
+      sk_sp<SkColorSpace> color_space;
+      if (const ColorProfileTransform* transform = ColorTransform()) {
+        const skcms_ICCProfile* dst_profile = transform->DstProfile();
+        DCHECK(dst_profile);  // Always non-null ptr to `dst_profile_` field.
+        color_space = SkColorSpace::Make(*dst_profile);
+      } else {
+        // Explicitly ask for no color transformation.  This avoids transforming
+        // into sRGB if/when `SkEncodedInfo::makeImageInfo` has set
+        // `codec_->getInfo().colorSpace()` to sRGB as a fallback.
+        color_space = nullptr;
+      }
+
       SkImageInfo image_info = codec_->getInfo()
                                    .makeColorType(color_type)
-                                   .makeColorSpace(ColorSpaceForSkImages())
-                                   .makeAlphaType(alpha_type);
+                                   .makeAlphaType(alpha_type)
+                                   .makeColorSpace(color_space);
 
       SkCodec::Options options;
       options.fFrameIndex = current_frame_index;
@@ -386,11 +408,13 @@
           continue;
       }
       frame.SetStatus(ImageFrame::kFramePartial);
+      already_started_frame_.emplace(current_frame_index);
     }
 
     SkCodec::Result incremental_decode_result = codec_->incrementalDecode();
     switch (incremental_decode_result) {
       case SkCodec::kSuccess: {
+        already_started_frame_.reset();
         SkCodec::FrameInfo frame_info;
         bool frame_info_received =
             codec_->getFrameInfo(current_frame_index, &frame_info);
@@ -409,6 +433,7 @@
         }
         break;
       default:
+        already_started_frame_.reset();
         frame.SetPixelsChanged(true);
         SetFailedFrameIndex(current_frame_index);
         break;
diff --git a/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.h b/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.h
index bcdd4185..e057fa0f 100644
--- a/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.h
+++ b/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.h
@@ -95,6 +95,11 @@
   // an image embedded in a middle of another data stream - one specific example
   // is PNG images embedded inside ICO or BMP images.
   const wtf_size_t reading_offset_ = 0;
+
+  // Number of a frame for which calling `SkCodec::incrementalDecode` is okay.
+  // Set after calling `SkCodec::startIncrementalDecode` and reset after
+  // `SkCodec::incrementalDecode` succeeds or encounters a non-resumable error.
+  std::optional<wtf_size_t> already_started_frame_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index a39877b..f122444 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -4235,7 +4235,7 @@
     },
     {
       name: "ScrollAnchorPriorityCandidateSubtree",
-      status: "experimental",
+      status: "stable",
     },
     {
       name: "ScrollbarColor",
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests
index 2f05ee0..6037da6 100644
--- a/third_party/blink/web_tests/NeverFixTests
+++ b/third_party/blink/web_tests/NeverFixTests
@@ -124,6 +124,11 @@
 crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_after_target_appended.html?touch [ Skip ]
 crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_after_target_removed.html?touch [ Skip ]
 crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html?touch [ Skip ]
+crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_element_haspointercapture.html?touch [ Skip ]
+crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_element_haspointercapture_release_pending_capture.html?touch [ Skip ]
+crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_releasepointercapture_release_right_after_capture.html?touch [ Skip ]
+crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_setpointercapture_override_pending_capture_element.html?touch [ Skip ]
+crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_setpointercapture_to_same_element_twice.html?touch [ Skip ]
 crbug.com/613672 [ Mac ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Skip ]
 crbug.com/613672 [ Mac ] fast/events/pointerevents/multi-pointer-event-in-slop-region.html [ Skip ]
 crbug.com/613672 [ Mac ] fast/events/pointerevents/pointer-event-in-slop-region.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 768be04..1b89c011 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -2762,6 +2762,8 @@
 crbug.com/413411328 external/wpt/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrerpolicy-cross-origin.sub.html [ Failure ]
 crbug.com/413411328 external/wpt/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrerpolicy-same-origin.sub.html [ Failure ]
 
+crbug.com/424798906 external/wpt/pointerevents/pointerevent_element_haspointercapture.html?touch [ Failure ]
+
 # ====== New tests from wpt-importer added here ======
 crbug.com/425056982 [ Mac14 ] virtual/threaded-prefer-compositing/external/wpt/css/cssom-view/devicePixelRatio-undisplayed-iframe.tentative.html [ Crash ]
 crbug.com/425118323 [ Mac14 ] virtual/threaded-preload-scanner/external/wpt/html/semantics/scripting-1/the-script-element/async_001.htm [ Timeout ]
@@ -6517,7 +6519,6 @@
 
 # Virtual suite mostly fails while feature is in development.
 crbug.com/40253999 virtual/indexeddb_sqlite/* [ Skip Timeout ]
-
 crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/abort-in-initial-upgradeneeded.any.html [ Pass ]
 crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/abort-in-initial-upgradeneeded.any.serviceworker.html [ Pass ]
 crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/abort-in-initial-upgradeneeded.any.sharedworker.html [ Pass ]
@@ -6527,23 +6528,6 @@
 crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_count.any.sharedworker.html [ Pass ]
 crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_count.any.worker.html [ Pass ]
 
-crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor-direction-objectstore-keyrange.any.html [ Pass ]
-crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor-direction-objectstore.any.html [ Pass ]
-crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor_advance_objectstore.any.html [ Pass ]
-crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor_continue_objectstore.any.html [ Pass ]
-crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor_update_objectstore.any.html [ Pass ]
-crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_openCursor.any.html [ Pass ]
-crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_openKeyCursor.any.html [ Pass ]
-crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/interleaved-cursors-large.any.html [ Pass ]
-crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/interleaved-cursors-small.any.html [ Pass ]
-crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/parallel-cursors-upgrade.any.html [ Pass ]
-
-crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore-getAll-enforcerange.any.html [ Pass ]
-crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore-getAllKeys-enforcerange.any.html [ Pass ]
-crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAll.any.html [ Pass ]
-crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAllKeys.any.html [ Pass ]
-crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAllRecords.tentative.any.html [ Pass ]
-
 # Sheriff 2022-08-06
 crbug.com/1350337 [ Linux ] external/wpt/web-locks/query-ordering.tentative.https.html [ Failure Pass ]
 
@@ -9176,7 +9160,8 @@
 
 # Gardener 2025-06-12
 crbug.com/422636456 [ Mac ] http/tests/inspector-protocol/network/navigate-iframe-out2in.js [ Pass Timeout ]
+crbug.com/414257771 [ Mac ] external/wpt/notifications/shownotification.https.window.html [ Failure Pass ]
 
 # Gardener 2025-06-16
 crbug.com/424918655 [ Mac ] external/wpt/soft-navigation-heuristics/lcp/tentative/contracted-image.html [ Failure Pass ]
-crbug.com/420596996 [ Win ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/parallel-dispatch.https.any.serviceworker.html?gpu [ Failure Pass ]
\ No newline at end of file
+crbug.com/420596996 [ Win ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/parallel-dispatch.https.any.serviceworker.html?gpu [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index 75a49e9f..489d4ba6 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -8234,6 +8234,13 @@
          {}
         ]
        ],
+       "form-check-validity-crash.html": [
+        "6d3bd0d2e36751c554af42164189d921975ced93",
+        [
+         null,
+         {}
+        ]
+       ],
        "form-controls-id-removal-crash.html": [
         "2b1ef87774fc1c5393129fca8e65147c379ea7a9",
         [
@@ -75466,7 +75473,7 @@
       ]
      ],
      "position-area-scroll-adjust.html": [
-      "497b526fb62b942f93d092c0a247b3f45d8f6cd0",
+      "128f23f95f02615f987380bb752a1cc383c604ce",
       [
        null,
        [
@@ -183927,32 +183934,6 @@
        {}
       ]
      ],
-     "first-line-child-display-none-dynamic.html": [
-      "35fdf0a5c5ce455a55f526be4626daae317ecc13",
-      [
-       null,
-       [
-        [
-         "/css/css-pseudo/first-line-child-display-none-ref.html",
-         "=="
-        ]
-       ],
-       {}
-      ]
-     ],
-     "first-line-child-display-none.html": [
-      "3ec50d5b01a874a527d98537cec4b2160d0b8a26",
-      [
-       null,
-       [
-        [
-         "/css/css-pseudo/first-line-child-display-none-ref.html",
-         "=="
-        ]
-       ],
-       {}
-      ]
-     ],
      "first-line-inherited-no-transition.html": [
       "e5253daa63fc7cb074901dd086864e27426cd152",
       [
@@ -316184,7 +316165,7 @@
       ]
      ],
      "rect-03.svg": [
-      "f4b59c91b110a68db4bf3c54d76c84e8b40c4156",
+      "3562249ee11fd97e9fbd7886c0bf0ef5df751255",
       [
        null,
        [
@@ -316197,7 +316178,7 @@
       ]
      ],
      "rect-04.svg": [
-      "37c4c9b2ab59238f9ff1339ac31e1eb1c1f4685b",
+      "f3e6d576363c13467df5b89ecd7feedbe58ec858",
       [
        null,
        [
@@ -362664,10 +362645,6 @@
       "84becd9a78d186ba3c0e658746fd56aef8039b74",
       []
      ],
-     "first-line-child-display-none-ref.html": [
-      "6808b87159a0c0b18ea53a1627265e2b47fccfb9",
-      []
-     ],
      "first-line-green-ref.html": [
       "99e9c334bf2c856535c7643911a3050390658a6f",
       []
@@ -431038,7 +431015,7 @@
        []
       ],
       "text-context-fill-ref.svg": [
-       "a8fbd1964ee492b9ac54648c14419daeb45b4840",
+       "30f771d56331b5429e83166c1b10c7e275a7fa98",
        []
       ],
       "text-font-face-load-image-ref.html": [
@@ -431216,6 +431193,12 @@
         "07697d6491b83414923e80a4a8c5a06f7471cce9",
         []
        ]
+      },
+      "support": {
+       "initial-value-helper.js": [
+        "e417d582acc0ec1fbb2d8463d593aaf0fcba627b",
+        []
+       ]
       }
      }
     }
@@ -438020,7 +438003,7 @@
      []
     ],
     "RTCRtpTransceiver.https-expected.txt": [
-     "7a07190ce98f3583d9c15b123b4ad711ac39b217",
+     "3661b1e2a89371e612930805b28f985b571073eb",
      []
     ],
     "WEB_FEATURES.yml": [
@@ -438407,10 +438390,6 @@
      "f73ad23fc53014c79fb1d0aa11ece0ab1c2f8ff1",
      []
     ],
-    "outbound-rtp.https-expected.txt": [
-     "fb3703309450f9875522465b9fd34bda721c747a",
-     []
-    ],
     "rtp-stats-creation-expected.txt": [
      "cc727db1c7c73aa59774b77754a39e0f6b9cbda3",
      []
@@ -497539,6 +497518,13 @@
        {}
       ]
      ],
+     "anchor-name-mutation.html": [
+      "07272c387e04ce528c245d9e4e5624dbfe90235c",
+      [
+       null,
+       {}
+      ]
+     ],
      "anchor-parse-invalid.html": [
       "795722972a2ab79f133842c1d146550ed885038b",
       [
@@ -498043,8 +498029,8 @@
        {}
       ]
      ],
-     "anchor-transition-attr.html": [
-      "540ab893efc0166b2b1befaf80c58917d27e0571",
+     "anchor-transition-attr.tentative.html": [
+      "824c75c9665b3a94d16d7a0f9f4795a749a16f37",
       [
        null,
        {}
@@ -500803,21 +500789,21 @@
         ]
        ],
        "corner-shape-computed.html": [
-        "e48fda86af2bb161f12e3144b160e55a324b65c8",
+        "7ba3f089d28d065aff74235ee150aa469aa2f73c",
         [
          null,
          {}
         ]
        ],
        "corner-shape-invalid.html": [
-        "5426a5ec704f4f74618d00c36afdf5846231f0f0",
+        "d65ef996ade2f5581c3657131b406adc758536f7",
         [
          null,
          {}
         ]
        ],
        "corner-shape-valid.html": [
-        "c9c4421a46c0c33b96b6ea8b63edbb29640643c7",
+        "6c230ab56d51f8116a6471da219ccd33ed178001",
         [
          null,
          {}
@@ -527382,6 +527368,13 @@
         ]
        ]
       },
+      "text-transform-capitalize-036.html": [
+       "a47dc35b949b56c734a0090c9c7a4932c745c4cf",
+       [
+        null,
+        {}
+       ]
+      ],
       "text-transform-upperlower-107.html": [
        "791edd14c0e144a945b4766a338725bca13da6bd",
        [
@@ -737537,6 +737530,13 @@
       ]
      },
      "scripted": {
+      "SVGAnimatedAngle-initial-values.html": [
+       "7e59c46b7b90b62eb87d8b2393a9cb8ff42b2b24",
+       [
+        null,
+        {}
+       ]
+      ],
       "SVGAnimatedAngle.html": [
        "5fdc9f3cffb0a3aaabe231706afc2c871ecf1ee8",
        [
@@ -737656,6 +737656,13 @@
         {}
        ]
       ],
+      "SVGAnimatedEnumeration-initial-values.html": [
+       "e577aa32a355088bd6607d3db75cff3cc0c84e63",
+       [
+        null,
+        {}
+       ]
+      ],
       "SVGAnimatedEnumeration.html": [
        "990b884545d70a3f1156e4c070cdac2d6cc2ac79",
        [
@@ -737663,6 +737670,13 @@
         {}
        ]
       ],
+      "SVGAnimatedInteger-initial-values.html": [
+       "05aefaae27b6f2abcaedb0e769fdbb3733205166",
+       [
+        null,
+        {}
+       ]
+      ],
       "SVGAnimatedInteger.html": [
        "849c13d3671df44b759729572c76f5965965865c",
        [
@@ -737671,7 +737685,7 @@
        ]
       ],
       "SVGAnimatedLength-initial-values.html": [
-       "3c82087d169b089ba160ceac0b03eba286ee1549",
+       "c7f77edf4c09de0244aabc91946bceb453f81b12",
        [
         null,
         {}
@@ -737691,6 +737705,13 @@
         {}
        ]
       ],
+      "SVGAnimatedNumber-initial-values.html": [
+       "ac52575d273af8f2598090119c0439b97ba9bc18",
+       [
+        null,
+        {}
+       ]
+      ],
       "SVGAnimatedNumber.html": [
        "c72cabca1a84b8cf071b91097e23a4039468999b",
        [
@@ -779171,7 +779192,7 @@
       ]
      ],
      "qdq_subgraph.https.any.js": [
-      "b578270223928f89dc19c0819018465e37628ad0",
+      "b7bcdc06228075db5a54494f41f488ccf29f9207",
       [
        "webnn/conformance_tests/qdq_subgraph.https.any.html?cpu",
        {
@@ -801382,7 +801403,7 @@
      ]
     ],
     "RTCRtpTransceiver.https.html": [
-     "943550d4b7feeb0bc69dd02de3fec722aef4565c",
+     "54af97aa7b85629369f6bb83ad720c4346553180",
      [
       null,
       {
@@ -802704,7 +802725,7 @@
      ]
     ],
     "outbound-rtp.https.html": [
-     "ff87d54256026b3b6fc6da2aa9f03a579730b330",
+     "196e8fd003706f9d6fe89cdaa2adf17e8fc2b30e",
      [
       null,
       {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-mutation.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-mutation.html
new file mode 100644
index 0000000..07272c38
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-mutation.html
@@ -0,0 +1,217 @@
+<!DOCTYPE html>
+
+<html>
+
+<title>Tests that when an anchor name is mutated, the anchor-positioned element adjusts to the new anchor</title>
+
+<link rel="author" href="mailto:kiet.ho@apple.com">
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#name">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/rendering-utils.js"></script>
+
+<style>
+    .containing-block {
+        position: relative;
+        width: 300px;
+        height: 300px;
+
+        border: 1px black solid;
+    }
+
+    .cell {
+        width: 100px;
+        height: 100px;
+    }
+
+    #anchor-1 {
+        position: absolute;
+        top: 0;
+        left: 0;
+
+        background: green;
+    }
+
+    #anchor-2 {
+        position: absolute;
+        top: 100px;
+        left: 0;
+
+        background: blue;
+    }
+
+    .anchor {
+        anchor-name: --anchor;
+    }
+
+    #anchor-positioned {
+        background: orange;
+
+        position: absolute;
+        top: 0;
+        left: 0;
+    }
+
+    .positioned-using-anchor-function-explicit-name {
+        position: absolute;
+        top: anchor(--anchor bottom) !important;
+        left: anchor(--anchor right) !important;
+    }
+
+    .positioned-using-anchor-function-implicit-name {
+        position: absolute;
+        position-anchor: --anchor;
+
+        top: anchor(bottom) !important;
+        left: anchor(right) !important;
+    }
+
+    .positioned-using-position-area {
+        position: absolute;
+        position-anchor: --anchor;
+
+        position-area: bottom right;
+    }
+</style>
+
+<body>
+    <main id="main">
+    </main>
+
+    <template id="test-template">
+        <div class="containing-block">
+            <div class="cell" id="anchor-1"></div>
+            <div class="cell" id="anchor-2"></div>
+            <div class="cell" id="anchor-positioned"></div>
+        </div>
+    </template>
+
+    <script>
+        function inflate(t, template_element) {
+            const main_element = document.getElementById("main");
+
+            t.add_cleanup(() => main_element.replaceChildren());
+            main_element.append(template_element.content.cloneNode(true));
+        }
+
+        const test_template = document.getElementById("test-template");
+
+        const positioning_methods = [
+            "positioned-using-anchor-function-explicit-name",
+            "positioned-using-anchor-function-implicit-name",
+            "positioned-using-position-area"
+        ]
+
+        for (let positioning_method of positioning_methods) {
+            promise_test(async (t) => {
+                inflate(t, test_template);
+
+                const anchor1 = document.getElementById("anchor-1");
+                const anchorPositioned = document.getElementById("anchor-positioned");
+
+                anchorPositioned.classList.add(positioning_method);
+
+                // Here, anchorPositioned should be at the default location (top-left of containing block)
+                // This is because the anchor elements don't have an anchor name yet.
+                assert_equals(anchorPositioned.offsetTop, 0);
+                assert_equals(anchorPositioned.offsetLeft, 0);
+
+                anchor1.classList.add("anchor");
+
+                // Here, anchorPositioned should be bottom-right of anchor1
+                assert_equals(anchorPositioned.offsetTop, 100);
+                assert_equals(anchorPositioned.offsetLeft, 100);
+            }, `Tests when an anchor-name is added later ${positioning_method}`);
+
+            promise_test(async (t) => {
+                inflate(t, test_template);
+
+                const anchor1 = document.getElementById("anchor-1");
+                const anchorPositioned = document.getElementById("anchor-positioned");
+
+                anchor1.classList.add("anchor");
+                anchorPositioned.classList.add(positioning_method);
+
+                // Here, anchorPositioned should be bottom-right of anchor1
+                assert_equals(anchorPositioned.offsetTop, 100);
+                assert_equals(anchorPositioned.offsetLeft, 100);
+
+                anchor1.classList.remove("anchor");
+
+                // Here, anchorPositioned should be at the default location (top-left of containing block)
+                // This is because the anchor elements don't have an anchor name.
+                assert_equals(anchorPositioned.offsetTop, 0);
+                assert_equals(anchorPositioned.offsetLeft, 0);
+            }, `Tests when an anchor-name is removed later ${positioning_method}`);
+
+            promise_test(async (t) => {
+                inflate(t, test_template);
+
+                const anchor1 = document.getElementById("anchor-1");
+                const anchor2 = document.getElementById("anchor-2");
+                const anchorPositioned = document.getElementById("anchor-positioned");
+
+                anchor1.classList.add("anchor");
+                anchorPositioned.classList.add(positioning_method);
+
+                // Here, anchorPositioned should be bottom-right of anchor1
+                assert_equals(anchorPositioned.offsetTop, 100);
+                assert_equals(anchorPositioned.offsetLeft, 100);
+
+                anchor1.classList.remove("anchor");
+                anchor2.classList.add("anchor");
+
+                // Here, anchorPositioned should be bottom-right of anchor2
+                assert_equals(anchorPositioned.offsetTop, 200);
+                assert_equals(anchorPositioned.offsetLeft, 100);
+            }, `Tests when an anchor-name moves from one element to another ${positioning_method}`);
+
+            promise_test(async (t) => {
+                inflate(t, test_template);
+
+                const anchor1 = document.getElementById("anchor-1");
+                const anchor2 = document.getElementById("anchor-2");
+                const anchorPositioned = document.getElementById("anchor-positioned");
+
+                anchor1.classList.add("anchor");
+                anchorPositioned.classList.add(positioning_method);
+
+                // Here, anchorPositioned should be bottom-right of anchor1
+                assert_equals(anchorPositioned.offsetTop, 100);
+                assert_equals(anchorPositioned.offsetLeft, 100);
+
+                anchor2.classList.add("anchor");
+
+                // Here, anchorPositioned should be bottom-right of anchor2
+                assert_equals(anchorPositioned.offsetTop, 200);
+                assert_equals(anchorPositioned.offsetLeft, 100);
+            }, `Tests when a new anchor candidate is added (which wins out previous anchor) ${positioning_method}`);
+
+
+            promise_test(async (t) => {
+                inflate(t, test_template);
+
+                const anchor1 = document.getElementById("anchor-1");
+                const anchor2 = document.getElementById("anchor-2");
+                const anchorPositioned = document.getElementById("anchor-positioned");
+
+                anchor2.classList.add("anchor");
+                anchorPositioned.classList.add(positioning_method);
+
+                // Here, anchorPositioned should be bottom-right of anchor2
+                assert_equals(anchorPositioned.offsetTop, 200);
+                assert_equals(anchorPositioned.offsetLeft, 100);
+
+                anchor1.classList.add("anchor");
+
+                // Here, anchorPositioned should be bottom-right of anchor2
+                assert_equals(anchorPositioned.offsetTop, 200);
+                assert_equals(anchorPositioned.offsetLeft, 100);
+            }, `Tests when a new anchor candidate is added (which loses out previous anchor) ${positioning_method}`);
+        }
+    </script>
+
+</body>
+
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-036.html b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-036.html
new file mode 100644
index 0000000..a47dc35b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-036.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>text-transform: capitalize innerText WPT tests</title>
+    <link rel="author" href="mailto:yezhizhenjiakang@gmail.com" title="Euclid Ye">
+    <link rel="help" href="https://drafts.csswg.org/css-text/#propdef-text-transform">
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+    <div id="div1" style="text-transform: capitalize;">hello world</div>
+    <div id="div2" style="text-transform: capitalize;">foo-bar</div>
+    <div id="div3" style="text-transform: capitalize;">john's apple</div>
+    <!-- Test case 4 nested elements -->
+    <div id="div4" style="text-transform: capitalize;">
+        hello <span>world</span>
+    </div>
+    <div id="div5" style="text-transform: capitalize;">foo_bar</div>
+    <!-- Test case 6 not starting at word boundary -->
+    a<span id="span1" style="text-transform: capitalize;">b</span>c
+
+    <script>
+        test(function () {
+            var div = document.getElementById("div1");
+            assert_equals(div.innerText, "Hello World",
+                "innerText for 'hello world' should be 'Hello World'");
+        }, "text-transform: capitalize test for 'hello world'");
+
+        test(function () {
+            var div = document.getElementById("div2");
+            assert_equals(div.innerText, "Foo-Bar",
+                "innerText for 'foo-bar' should be 'Foo-Bar'");
+        }, "text-transform: capitalize test for 'foo-bar'");
+
+        test(function () {
+            var div = document.getElementById("div3");
+            assert_equals(div.innerText, "John's Apple",
+                "innerText for \"john's apple\" should be \"John's Apple\"");
+        }, "text-transform: capitalize test for \"john's apple\"");
+
+        // Test for nested elements: the text inside the span should also be affected.
+        test(function () {
+            var div = document.getElementById("div4");
+            assert_equals(div.innerText, "Hello World",
+                "innerText for nested 'hello <span>world</span>' should be 'Hello World'");
+        }, "text-transform: capitalize test for nested elements");
+
+        // Test for underscore
+        test(function () {
+            var div = document.getElementById("div5");
+            assert_equals(div.innerText.trim(), "Foo_bar",
+                "innerText for 'foo_bar' should be 'Foo_bar'");
+        }, "text-transform: capitalize test for underscore");
+
+        test(function () {
+            var div = document.getElementById("span1");
+            assert_equals(div.innerText, "b",
+                "innerText for span in 'a<span style='text-transform: capitalize;'>b</span>c' should be 'b'");
+        }, "text-transform: capitalize test for not starting at word boundary");
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-form-element/form-check-validity-crash.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-form-element/form-check-validity-crash.html
new file mode 100644
index 0000000..6d3bd0d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-form-element/form-check-validity-crash.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<div id="container">
+  <form id="formId"></form>
+</div>
+<input id="inputId" required form="formId" oninvalid="container.remove()">
+<script>
+  formId.checkValidity();
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture.html b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture.html
index 3db6acf..d0f73a03 100644
--- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture.html
+++ b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture.html
@@ -3,6 +3,9 @@
     <head>
         <title>Element.hasPointerCapture test</title>
         <meta name="viewport" content="width=device-width">
+        <meta name="variant" content="?mouse">
+        <meta name="variant" content="?pen">
+        <meta name="variant" content="?touch">
         <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
         <script src="/resources/testharness.js"></script>
         <script src="/resources/testharnessreport.js"></script>
@@ -11,6 +14,8 @@
         <script src="/resources/testdriver-vendor.js"></script>
         <script type="text/javascript" src="pointerevent_support.js"></script>
         <script>
+            const pointer_type = location.search.substring(1);
+
             var detected_pointertypes = {};
             add_completion_callback(showPointerTypes);
             var test_pointerEvent = async_test("hasPointerCapture");
@@ -32,8 +37,13 @@
                 on_event(target0, "pointerdown", function (e) {
                     detected_pointertypes[e.pointerType] = true;
                     test_pointerEvent.step(function () {
-                        assert_equals(target0.hasPointerCapture(e.pointerId), false,
-                                      "before target0.setPointerCapture, target0.hasPointerCapture should be false");
+                        if (pointer_type === "pen") {
+                            // Implicit capture for pen is platform-dependent.
+                            return;
+                        }
+                        const expected_default_capture = pointer_type !== "mouse";
+                        assert_equals(target0.hasPointerCapture(e.pointerId), expected_default_capture,
+                                      "before target0.setPointerCapture, target0.hasPointerCapture should be " + expected_default_capture);
                     });
                     target1.setPointerCapture(e.pointerId);
                     test_pointerEvent.step(function () {
@@ -112,6 +122,7 @@
 
                 // Inject mouse inputs.
                 actions_promise = new test_driver.Actions()
+                    .addPointer("TestPointer", pointer_type)
                     .pointerMove(0, 0, {origin: target0})
                     .pointerDown()
                     .pointerMove(0, 10, {origin: target0})
@@ -139,8 +150,8 @@
             </ol>
         </h4>
         <p>
-        <div id="target0" touch-action:none></div>
-        <div id="target1" touch-action:none></div>
+        <div id="target0" style="touch-action:none"></div>
+        <div id="target1"></div>
         <div id="complete-notice">
             <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
         </div>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture_release_pending_capture.html b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture_release_pending_capture.html
index e75dff86..26ce5837c 100644
--- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture_release_pending_capture.html
+++ b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture_release_pending_capture.html
@@ -3,6 +3,9 @@
     <head>
         <title>Element.hasPointerCapture test after the pending pointer capture element releases pointer capture</title>
         <meta name="viewport" content="width=device-width">
+        <meta name="variant" content="?mouse">
+        <meta name="variant" content="?pen">
+        <meta name="variant" content="?touch">
         <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
         <script src="/resources/testharness.js"></script>
         <script src="/resources/testharnessreport.js"></script>
@@ -11,6 +14,8 @@
         <script src="/resources/testdriver-vendor.js"></script>
         <script type="text/javascript" src="pointerevent_support.js"></script>
         <script>
+            const pointer_type = location.search.substring(1);
+
             var actions_promise;
             var detected_pointertypes = {};
             add_completion_callback(showPointerTypes);
@@ -59,6 +64,7 @@
 
                 // Inject mouse inputs.
                 actions_promise = new test_driver.Actions()
+                    .addPointer("TestPointer", pointer_type)
                     .pointerMove(10, 10, {origin: target0})
                     .pointerDown()
                     .pointerMove(10, 10, {origin: target1})
@@ -78,11 +84,11 @@
             </ol>
         </h4>
         <p>
-        <div id="target0" touch-action:none></div>
-        <div id="target1" touch-action:none></div>
+        <div id="target0" style="touch-action:none"></div>
+        <div id="target1"></div>
         <div id="complete-notice">
             <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
         </div>
         <div id="log"></div>
     </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_releasepointercapture_release_right_after_capture.html b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_releasepointercapture_release_right_after_capture.html
index 409951b..bdae1a3 100644
--- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_releasepointercapture_release_right_after_capture.html
+++ b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_releasepointercapture_release_right_after_capture.html
@@ -3,6 +3,9 @@
     <head>
         <title>Release pointer capture right after setpointercapture</title>
         <meta name="viewport" content="width=device-width">
+        <meta name="variant" content="?mouse">
+        <meta name="variant" content="?pen">
+        <meta name="variant" content="?touch">
         <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
         <script src="/resources/testharness.js"></script>
         <script src="/resources/testharnessreport.js"></script>
@@ -11,6 +14,8 @@
         <script src="/resources/testdriver-vendor.js"></script>
         <script src="pointerevent_support.js"></script>
         <script type="text/javascript">
+            const pointer_type = location.search.substring(1);
+
             var actions_promise;
             var detected_pointertypes = {};
             add_completion_callback(showPointerTypes);
@@ -48,6 +53,7 @@
 
                 // Inject mouse inputs.
                 actions_promise = new test_driver.Actions()
+                    .addPointer("TestPointer", pointer_type)
                     .pointerMove(0, 0, {origin: target0})
                     .pointerDown()
                     .pointerMove(10, 10, {origin: target0})
@@ -66,8 +72,8 @@
             </ol>
         </h4>
         <br>
-        <div id="target0" touch-action:none></div>
-        <div id="target1" touch-action:none></div>
+        <div id="target0" style="touch-action:none"></div>
+        <div id="target1"></div>
         <div id="complete-notice">
             <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
         </div>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_override_pending_capture_element.html b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_override_pending_capture_element.html
index f7c1d4299..7021153e 100644
--- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_override_pending_capture_element.html
+++ b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_override_pending_capture_element.html
@@ -3,6 +3,9 @@
     <head>
         <title>Test overriding the pending pointer capture element</title>
         <meta name="viewport" content="width=device-width">
+        <meta name="variant" content="?mouse">
+        <meta name="variant" content="?pen">
+        <meta name="variant" content="?touch">
         <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
         <script src="/resources/testharness.js"></script>
         <script src="/resources/testharnessreport.js"></script>
@@ -11,6 +14,8 @@
         <script src="/resources/testdriver-vendor.js"></script>
         <script src="pointerevent_support.js"></script>
         <script type="text/javascript">
+            const pointer_type = location.search.substring(1);
+
             var actions_promise;
             var detected_pointertypes = {};
             add_completion_callback(showPointerTypes);
@@ -50,6 +55,7 @@
 
                 // Inject mouse inputs.
                 actions_promise = new test_driver.Actions()
+                    .addPointer("TestPointer", pointer_type)
                     .pointerMove(0, 0, {origin: target0})
                     .pointerDown()
                     .pointerMove(10, 10, {origin: target0})
@@ -68,8 +74,8 @@
             </ol>
         </h4>
         <br>
-        <div id="target0" touch-action:none></div>
-        <div id="target1" touch-action:none></div>
+        <div id="target0" style="touch-action:none"></div>
+        <div id="target1"></div>
         <div id="complete-notice">
             <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
         </div>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_to_same_element_twice.html b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_to_same_element_twice.html
index 5225ac5..156fa6c 100644
--- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_to_same_element_twice.html
+++ b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_to_same_element_twice.html
@@ -1,77 +1,86 @@
-<!doctype html>
-<html>
-    <head>
-        <title>setPointerCapture() to the element which already captured the pointer</title>
-        <meta name="viewport" content="width=device-width">
-        <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
-        <script src="/resources/testharness.js"></script>
-        <script src="/resources/testharnessreport.js"></script>
-        <script src="/resources/testdriver.js"></script>
-        <script src="/resources/testdriver-actions.js"></script>
-        <script src="/resources/testdriver-vendor.js"></script>
-        <script src="pointerevent_support.js"></script>
-        <script type="text/javascript">
-            var actions_promise;
-            var detected_pointertypes = {};
-            add_completion_callback(showPointerTypes);
-            var test_setPointerCapture = async_test("setPointerCapture: set to the element which already captured the pointer");
-            var got_pointer_capture = false;
+<!DOCTYPE HTML>
+<title>Repeated setPointerCapture calls on the capturing element</title>
+<meta name="variant" content="?mouse">
+<meta name="variant" content="?pen">
+<meta name="variant" content="?touch">
+<link rel="help" href="https://github.com/w3c/pointerevents/issues/534">
+<meta name="viewport" content="width=device-width">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="pointerevent_support.js"></script>
 
-            function run() {
-                var target0 = document.getElementById("target0");
-                var target1 = document.getElementById("target1");
+<style>
+  div {
+    width: 50px;
+    height: 50px;
+    touch-action: none;
+    user-select: none;
+  }
+</style>
 
-                on_event(target0, "pointerdown", function (event) {
-                    detected_pointertypes[event.pointerType] = true;
-                    target0.setPointerCapture(event.pointerId);
-                });
+<div id="target"></div>
+<div id="other"></div>
+<div id="done"></div>
 
-                on_event(target0, "gotpointercapture", function (event) {
-                    test_setPointerCapture.step(function () {
-                        assert_equals(got_pointer_capture, false, "Target0 should receive gotpointercapture at the first time it captured the pointer");
-                        assert_equals(target0.hasPointerCapture(event.pointerId), true, "Target 0 received gotpointercapture, target0.hasPointerCapture should be true");
-                    });
-                    got_pointer_capture = true;
+<script>
+  'use strict';
+  const pointer_type = location.search.substring(1);
 
-                    target0.setPointerCapture(event.pointerId);
-                    test_setPointerCapture.step(function () {
-                        assert_equals(target0.hasPointerCapture(event.pointerId), true, "Set capture to target0, target0.hasPointerCapture should be true");
-                        assert_equals(target1.hasPointerCapture(event.pointerId), false, "Set capture to target0, target1.hasPointerCapture should be false");
-                    });
-                });
+  const target = document.getElementById("target");
+  const other = document.getElementById("other");
+  const done = document.getElementById("done");
 
-                on_event(target0, "pointerup", function (event) {
-                    // Make sure the test finishes after all the input actions are completed.
-                    actions_promise.then( () => {
-                        test_setPointerCapture.done();
-                    });
-                });
+  let event_log = [];
+  function logEvent(e) {
+    if (e.type === "pointermove" && e.buttons == 0) {
+      // Move events w/o button pressed are irrelevant, and could be noisy too.
+      return;
+    }
+    event_log.push(e.type + "@" + e.target.id);
+  }
 
-                // Inject mouse inputs.
-                actions_promise = new test_driver.Actions()
-                    .pointerMove(0, 0, {origin: target0})
-                    .pointerDown()
-                    .pointerMove(10, 10, {origin: target0})
-                    .pointerUp()
-                    .send();
-            }
-        </script>
-    </head>
-    <body onload="run()">
-        <h1>Pointer Event: setPointerCapture to the element which already captured the pointer</h1>
-        <h4>Test Description:
-            When the setPointerCapture method is invoked, if the target element had already captured the pointer, it should not trigger any gotpointercapture or lostpointercapture event
-            <ol>
-                <li>Press and hold left mouse button over black box
-                <li>Move mouse and release mouse button
-            </ol>
-        </h4>
-        <br>
-        <div id="target0" touch-action:none></div>
-        <div id="target1" touch-action:none></div>
-        <div id="complete-notice">
-            <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
-        </div>
-        <div id="log"></div>
-    </body>
-</html>
+  const logged_events = [
+    "pointerdown", "pointermove", "pointerup", "gotpointercapture", "lostpointercapture"
+  ];
+  logged_events.forEach(ename => {
+    [target, other].forEach(div => div.addEventListener(ename, logEvent));
+  });
+
+  target.addEventListener("pointerdown", e => {
+    other.setPointerCapture(e.pointerId);
+  });
+
+  const expected_events = [
+    "pointerdown@target", "gotpointercapture@other",
+    "pointermove@other", "pointerup@other",
+    "lostpointercapture@other"
+  ];
+
+  promise_test(async () => {
+    event_log = [];
+
+    target.addEventListener("pointermove", e => {
+      target.setPointerCapture(e.pointerId);
+    });
+
+    let done_click_promise = getEvent("click", done);
+
+    let actions = new test_driver.Actions()
+        .addPointer("TestPointer", pointer_type)
+        .pointerMove(0, 0, {origin: target})
+        .pointerDown()
+        .pointerMove(10, 10, {origin: target})
+        .pointerUp()
+        .pointerMove(0, 0, {origin: done})
+        .pointerDown()
+        .pointerUp();
+
+    await actions.send();
+    await done_click_promise;
+
+    assert_array_equals(event_log, expected_events, "events received");
+  }, "A repeated setPointerCapture call does not redispatch capture events");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/background-image-set-image.html b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/background-image-set-image.html
new file mode 100644
index 0000000..a99ba5bd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/background-image-set-image.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<!--
+The soft navigation version of the identically named test in
+/largest-contentful-paint/background-image-set-image.html
+Notes:
+ - Triggers trivial soft navigation with same page contents as original test.
+-->
+<title>Background image-set images should be LCP candidates after soft navigation</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/soft-navigation-heuristics/resources/soft-navigation-test-helper.js"></script>
+<script>
+  function clickHandler() {
+    document.body.innerHTML = `
+      <style>
+        .background {
+          width: calc(100vw - 40px);
+          height: calc(100vw - 40px);
+          max-width: 100px;
+          max-height: 100px;
+          background: #eee image-set("/images/lcp-100x50.png" type("image/png")) center center no-repeat;
+          background-size: cover;
+        }
+      </style>
+      <div class="background"></div>
+      <p>fallback</p>`;
+    history.pushState({}, "", "/test");
+  }
+</script>
+<body>
+  <div id="click-target" onclick="clickHandler()">Click!</div>
+</body>
+<script>
+  promise_test(async (t) => {
+    assert_implements(window.LargestContentfulPaint, "LargestContentfulPaint is not implemented");
+    const helper = new SoftNavigationTestHelper(t);
+    const lcpEntries = await helper.getBufferedPerformanceEntriesWithTimeout(
+      /*type=*/ "largest-contentful-paint",
+      /*includeSoftNavigationObservations=*/ false,
+      /*minNumEntries=*/ 1,
+    );
+    assert_equals(lcpEntries.length, 1);
+    assert_equals(lcpEntries[0].id, "click-target", "The first entry should be the button");
+
+    const softLcpPromise = new Promise((resolve) => {
+      new PerformanceObserver((list) => {
+        for (const entry of list.getEntries()) {
+          if (entry.url.includes("lcp-100x50")) {
+            resolve(entry.url);
+            return;
+          }
+        }
+      }).observe({
+        type: "largest-contentful-paint",
+        includeSoftNavigationObservations: true,
+        buffered: true,
+      });
+    });
+    if (test_driver) {
+      test_driver.click(document.getElementById("click-target"));
+    }
+    await helper.withTimeoutMessage(
+      softLcpPromise,
+      "Timed out waiting for LCP entry for background image-set image.",
+      /*timeoutMs=*/ 3000,
+    );
+    assert_equals(
+      1,
+      performance.getEntriesByType("soft-navigation").length,
+      "There should be one soft navigation entry.",
+    );
+  }, "Background image-set images should be eligible for LCP candidates after soft navigation.");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/first-paint-equals-lcp-text.html b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/first-paint-equals-lcp-text.html
new file mode 100644
index 0000000..ea0ceb1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/first-paint-equals-lcp-text.html
@@ -0,0 +1,99 @@
+<!doctype html>
+<!--
+The soft navigation version of the identically named test in
+/largest-contentful-paint/first-paint-equals-lcp-text.html.
+Notes:
+- Awaits trivial soft navigation with same page contents as original test.
+- Since FCP is not implemented for soft navigations, this test actually
+  compares the element timing of the text node to the LCP.
+-->
+<meta charset="utf-8" />
+<title>
+  LargestContentfulPaint after soft navigation compared with FirstPaint and FirstContentfulPaint on
+  single text page.
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/soft-navigation-heuristics/resources/soft-navigation-test-helper.js"></script>
+<script>
+  function clickHandler() {
+    document.body.innerHTML = `<p elementtiming=text>Text</p>`;
+    history.pushState({}, "", "/test");
+  }
+</script>
+<body>
+  <div id="click-target" onclick="clickHandler()">Click!</div>
+</body>
+<script>
+  setup({ hide_test_state: true });
+  promise_test(async (t) => {
+    assert_implements(window.LargestContentfulPaint, "LargestContentfulPaint is not implemented");
+
+    const helper = new SoftNavigationTestHelper(t);
+    const lcpEntries = await helper.getBufferedPerformanceEntriesWithTimeout(
+      /*type=*/ "largest-contentful-paint",
+      /*includeSoftNavigationObservations=*/ false,
+      /*minNumEntries=*/ 1,
+    );
+    assert_equals(lcpEntries.length, 1);
+    assert_equals(lcpEntries[0].id, "click-target", "The first entry should be the button");
+    const beforeLoad = performance.now();
+    const promise = Promise.all([
+      SoftNavigationTestHelper.getPerformanceEntries(
+        /*type=*/ "soft-navigation",
+        /*includeSoftNavigationObservations=*/ true,
+        /*minNumEntries=*/ 1,
+      ),
+      SoftNavigationTestHelper.getPerformanceEntries(
+        /*type=*/ "element",
+        /*includeSoftNavigationObservations=*/ true,
+        /*minNumEntries=*/ 1,
+      ),
+      SoftNavigationTestHelper.getPerformanceEntries(
+        /*type=*/ "largest-contentful-paint",
+        /*includeSoftNavigationObservations=*/ true,
+        /*minNumEntries=*/ 1,
+      ),
+    ]);
+    if (test_driver) {
+      test_driver.click(document.getElementById("click-target"));
+    }
+    const [softNavigationEntries, elementEntries, softLcpEntries] = await helper.withTimeoutMessage(
+      promise,
+      "Failed to get performance entries.",
+    );
+
+    assert_equals(1, softNavigationEntries.length, "There should be one soft navigation entry.");
+    assert_equals(1, elementEntries.length, "There should be one element entry.");
+    assert_equals(1, softLcpEntries.length, "There should be one soft LCP entry.");
+
+    assert_less_than_equal(
+      softNavigationEntries[0].startTime,
+      softLcpEntries[0].startTime,
+      "Soft LCP should be after soft navigation.",
+    );
+    assert_equals(
+      softLcpEntries[0].startTime,
+      elementEntries[0].startTime,
+      "Soft LCP and element entry should be at the same time.",
+    );
+
+    assert_not_equals(
+      lcpEntries[0].navigationId,
+      softNavigationEntries[0].navigationId,
+      "Initial LCP and soft navigation have different navigation ID.",
+    );
+    assert_equals(
+      softNavigationEntries[0].navigationId,
+      softLcpEntries[0].navigationId,
+      "Soft navigation and soft LCP have the same navigation ID.",
+    );
+    assert_equals(
+      softLcpEntries[0].navigationId,
+      elementEntries[0].navigationId,
+      "Soft LCP and element entry have the same navigation ID.",
+    );
+  }, "FCP and LCP after soft navigation are the same when there is a single text element in the page.");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/iframe-content-not-observed.html b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/iframe-content-not-observed.html
new file mode 100644
index 0000000..73beb752
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/iframe-content-not-observed.html
@@ -0,0 +1,67 @@
+<!doctype html>
+<!--
+The soft navigation version of the identically named test in
+/largest-contentful-paint/iframe-content-not-observed.html
+Notes:
+- This test almost triggers a soft navigation except that the
+  contents inside the iframe don't count, even though it's same-origin.
+  This is actually just like LCP, and we also test that the iframe content
+  doesn't generate a soft LCP entry either.
+-->
+<meta charset="utf-8" />
+<title>
+  Largest Contentful Paint and soft navigation: do NOT observe elements from same-origin iframes
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/soft-navigation-heuristics/resources/soft-navigation-test-helper.js"></script>
+<script>
+  function clickHandler() {
+    document.body.innerHTML = `<iframe src='/largest-contentful-paint/resources/iframe-with-content.html'></iframe>`;
+    history.pushState({}, "", "/test");
+  }
+</script>
+<body>
+  <div id="click-target" onclick="clickHandler()">Click!</div>
+</body>
+<script>
+  promise_test(async (t) => {
+    assert_implements(window.LargestContentfulPaint, "LargestContentfulPaint is not implemented");
+    const helper = new SoftNavigationTestHelper(t);
+    const lcpEntries = await helper.getBufferedPerformanceEntriesWithTimeout(
+      /*type=*/ "largest-contentful-paint",
+      /*includeSoftNavigationObservations=*/ false,
+      /*minNumEntries=*/ 1,
+    );
+    assert_equals(lcpEntries.length, 1);
+    assert_equals(lcpEntries[0].id, "click-target", "The first entry should be the button");
+
+    const softNavigationPromise = SoftNavigationTestHelper.getPerformanceEntries(
+      /*type=*/ "soft-navigation",
+      /*includeSoftNavigationObservations=*/ true,
+      /*minNumEntries=*/ 1,
+    ).then((entries) => {
+      assert_unreached("Should not have received a soft navigation entry!");
+    });
+    const softLcpPromise = SoftNavigationTestHelper.getPerformanceEntries(
+      /*type=*/ "largest-contentful-paint",
+      /*includeSoftNavigationObservations=*/ true,
+      /*minNumEntries=*/ 1,
+    ).then((entries) => {
+      assert_unreached("Should not have received an a soft LCP entry!");
+    });
+
+    if (test_driver) {
+      test_driver.click(document.getElementById("click-target"));
+    }
+
+    // If neither the soft navigation nor the soft LCP are received within 3 seconds, we're ok.
+    await Promise.race([
+      softNavigationPromise,
+      softLcpPromise,
+      new Promise((resolve) => t.step_timeout(resolve(), 2000)),
+    ]);
+  }, "Element in child iframe is not observed for lcp or soft navigation, even if same-origin.");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/svg/shapes/rect-03.svg b/third_party/blink/web_tests/external/wpt/svg/shapes/rect-03.svg
index f4b59c91..3562249 100644
--- a/third_party/blink/web_tests/external/wpt/svg/shapes/rect-03.svg
+++ b/third_party/blink/web_tests/external/wpt/svg/shapes/rect-03.svg
@@ -4,6 +4,7 @@
     <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="http://www.w3.org/TR/SVG2/shapes.html#RectElement"/>
     <link xmlns="http://www.w3.org/1999/xhtml" rel="match" href="rect-03-ref.html"/>
     <meta xmlns="http://www.w3.org/1999/xhtml" name="assert" content="rect element with rounded corners renders correctly."/>
+    <meta name="fuzzy" content="0-30;0-100"/>
   </metadata>
   <rect x="10" y="10" width="50" height="50" rx="8" ry="8" fill="blue"/>
 </svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/shapes/rect-04.svg b/third_party/blink/web_tests/external/wpt/svg/shapes/rect-04.svg
index 37c4c9b..f3e6d57 100644
--- a/third_party/blink/web_tests/external/wpt/svg/shapes/rect-04.svg
+++ b/third_party/blink/web_tests/external/wpt/svg/shapes/rect-04.svg
@@ -4,6 +4,7 @@
     <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="http://www.w3.org/TR/SVG2/shapes.html#RectElement"/>
     <link xmlns="http://www.w3.org/1999/xhtml" rel="match" href="rect-04-ref.html"/>
     <meta xmlns="http://www.w3.org/1999/xhtml" name="assert" content="rect element with rounded corners and stroke renders correctly."/>
+    <meta name="fuzzy" content="0-50;0-150"/>
   </metadata>
   <rect x="10" y="10" width="50" height="50" rx="8" ry="8" fill="none" stroke="blue" stroke-width="4"/>
 </svg>
diff --git a/third_party/blink/web_tests/images/png-crbug423310049.html b/third_party/blink/web_tests/images/png-crbug423310049.html
new file mode 100644
index 0000000..94df631
--- /dev/null
+++ b/third_party/blink/web_tests/images/png-crbug423310049.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+In https://crbug.com/423310049 the color space transformation wasn't quite
+right - with the test image below the symptom was that yellow and cyan
+bands were swapped (magenta and black bands were preserved).
+<p>
+The test image below was created by
+<ul>
+  <li>Taking IHDR, IDAT, and IEND chunks from basn2c08 from the PNG test suite
+  <li>Taking iCCP chunk from the repro image from https://crbug.com/423310049
+</ul>
+<hr>
+<img src="resources/crbug423310049.png">
diff --git a/third_party/blink/web_tests/images/resources/crbug423310049.png b/third_party/blink/web_tests/images/resources/crbug423310049.png
new file mode 100644
index 0000000..2b097080
--- /dev/null
+++ b/third_party/blink/web_tests/images/resources/crbug423310049.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/linux/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..a4e8341a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..51a82e7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..33ae7623
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac-mac12/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..2f6f5ae
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac12/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12/virtual/gpu-rasterization/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac-mac12/virtual/gpu-rasterization/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..c183cfe
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac12/virtual/gpu-rasterization/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac-mac13/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..2f6f5ae
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac13/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13/virtual/gpu-rasterization/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac-mac13/virtual/gpu-rasterization/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..c183cfe
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac13/virtual/gpu-rasterization/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..866cf6a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..2c8b9af
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..2f6f5ae
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..4ad3f745
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/gpu-rasterization/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac/virtual/gpu-rasterization/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..c183cfe
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/gpu-rasterization/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/win/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..a5f2bc1f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..5a20637
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..946d2db
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/win11-arm64/images/png-crbug423310049-expected.png
new file mode 100644
index 0000000..8e53544
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win11-arm64/images/png-crbug423310049-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor_continue_objectstore.any-expected.txt b/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor_continue_objectstore.any-expected.txt
deleted file mode 100644
index 8118d60..0000000
--- a/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor_continue_objectstore.any-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Delete next element, and iterate to it
-  assert_unreached: unexpected db.error (AbortError) Reached unreachable code
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAll.any-expected.txt b/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAll.any-expected.txt
deleted file mode 100644
index 5fcf71ca..0000000
--- a/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAll.any-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Get all with large values
-  Cannot read properties of null (reading 'join')
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAllRecords.tentative.any-expected.txt b/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAllRecords.tentative.any-expected.txt
deleted file mode 100644
index afd207e9..0000000
--- a/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAllRecords.tentative.any-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Get all records with large values
-  Cannot read properties of null (reading 'join')
-Harness: the test ran to completion.
-
diff --git a/third_party/boringssl/src b/third_party/boringssl/src
index 5622da9..45f35e0 160000
--- a/third_party/boringssl/src
+++ b/third_party/boringssl/src
@@ -1 +1 @@
-Subproject commit 5622da92e1e7bacb5d0785ff5650a5a23b143b84
+Subproject commit 45f35e007cf55285581fae079b721c63922871b9
diff --git a/third_party/catapult b/third_party/catapult
index 9e57472..43e5bb8 160000
--- a/third_party/catapult
+++ b/third_party/catapult
@@ -1 +1 @@
-Subproject commit 9e57472d991ef17726931163fb943277e372421e
+Subproject commit 43e5bb872890d0b7038c81744e169c9e0edd8013
diff --git a/third_party/chromite b/third_party/chromite
index be7db7a..d6db0868 160000
--- a/third_party/chromite
+++ b/third_party/chromite
@@ -1 +1 @@
-Subproject commit be7db7a8cb09acf9cb9467be836b9569777baba6
+Subproject commit d6db0868fc4ae3f19fd9d9ee4a4dfd6f0c88b078
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 668292f..576cf52 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 668292f6e38a78c16e1877c6e9919716bd7da04d
+Subproject commit 576cf523f65f423424a2991c4c7983bf87d05348
diff --git a/third_party/libaom/README.chromium b/third_party/libaom/README.chromium
index 651f4128..28773e3 100644
--- a/third_party/libaom/README.chromium
+++ b/third_party/libaom/README.chromium
@@ -2,7 +2,7 @@
 Short Name: libaom
 URL: https://aomedia.googlesource.com/aom/
 Version: N/A
-Revision: 3304ee478e7e8e41da2d9f96e5c5fc9b1e5bb043
+Revision: 6c4010bde34318fd6c1f0d10196f27ac9908eeb8
 CPEPrefix: cpe:/a:aomedia:aomedia:3.12.1
 License: BSD-2-Clause, Patent
 License Android Compatible: yes
diff --git a/third_party/libaom/source/config/config/aom_version.h b/third_party/libaom/source/config/config/aom_version.h
index 63c6e7c5..1225abc6 100644
--- a/third_party/libaom/source/config/config/aom_version.h
+++ b/third_party/libaom/source/config/config/aom_version.h
@@ -14,9 +14,9 @@
 #define VERSION_MAJOR 3
 #define VERSION_MINOR 12
 #define VERSION_PATCH 1
-#define VERSION_EXTRA "179-g3304ee478e"
+#define VERSION_EXTRA "182-g6c4010bde3"
 #define VERSION_PACKED \
   ((VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | (VERSION_PATCH))
-#define VERSION_STRING_NOSP "3.12.1-179-g3304ee478e"
-#define VERSION_STRING " 3.12.1-179-g3304ee478e"
+#define VERSION_STRING_NOSP "3.12.1-182-g6c4010bde3"
+#define VERSION_STRING " 3.12.1-182-g6c4010bde3"
 #endif  // AOM_VERSION_H_
diff --git a/third_party/libaom/source/libaom b/third_party/libaom/source/libaom
index 3304ee4..6c4010b 160000
--- a/third_party/libaom/source/libaom
+++ b/third_party/libaom/source/libaom
@@ -1 +1 @@
-Subproject commit 3304ee478e7e8e41da2d9f96e5c5fc9b1e5bb043
+Subproject commit 6c4010bde34318fd6c1f0d10196f27ac9908eeb8
diff --git a/third_party/llvm-libc/src b/third_party/llvm-libc/src
index a2f7b48..ced0173 160000
--- a/third_party/llvm-libc/src
+++ b/third_party/llvm-libc/src
@@ -1 +1 @@
-Subproject commit a2f7b489cd4fecf856eb3739cc5a341545022896
+Subproject commit ced017335267492f948279508b4c60681eddf1b8
diff --git a/third_party/nearby/BUILD.gn b/third_party/nearby/BUILD.gn
index 1fc085b4b..d94e1ee 100644
--- a/third_party/nearby/BUILD.gn
+++ b/third_party/nearby/BUILD.gn
@@ -1330,6 +1330,7 @@
   proto_in_dir = "src"
   sources = [ "${proto_in_dir}/internal/proto/metadata.proto" ]
   proto_out_dir = "third_party/nearby"
+  deps = [ ":connections_credential_proto" ]
 }
 
 # src/connections/implementation/proto
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium
index 28715d4..8a4dcb3 100644
--- a/third_party/nearby/README.chromium
+++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@
 Name: Nearby Connections Library
 Short Name: Nearby
 URL: https://github.com/google/nearby
-Version: e96ebef1d3b0e109109f1c108e5d9f4c773bd281
+Version: fff5c22e3178a633f57e4ad1fb5ad96a6116240a
 License: Apache-2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/third_party/nearby/src b/third_party/nearby/src
index e96ebef..fff5c22 160000
--- a/third_party/nearby/src
+++ b/third_party/nearby/src
@@ -1 +1 @@
-Subproject commit e96ebef1d3b0e109109f1c108e5d9f4c773bd281
+Subproject commit fff5c22e3178a633f57e4ad1fb5ad96a6116240a
diff --git a/third_party/perfetto b/third_party/perfetto
index 167e1f0..891351c 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit 167e1f0dab2691a4b2a911e001317353405d83d9
+Subproject commit 891351c7233523c01dc0e58ac8650df47fad9ab5
diff --git a/third_party/rust/chromium_crates_io/Cargo.lock b/third_party/rust/chromium_crates_io/Cargo.lock
index 9f62894..5b31c9d 100644
--- a/third_party/rust/chromium_crates_io/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/Cargo.lock
@@ -74,7 +74,7 @@
 
 [[package]]
 name = "cc"
-version = "1.2.26"
+version = "1.2.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "shlex",
@@ -650,7 +650,7 @@
 
 [[package]]
 name = "libc"
-version = "0.2.172"
+version = "0.2.173"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -964,7 +964,7 @@
 
 [[package]]
 name = "syn"
-version = "2.0.102"
+version = "2.0.103"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro2",
diff --git a/third_party/rust/chromium_crates_io/supply-chain/config.toml b/third_party/rust/chromium_crates_io/supply-chain/config.toml
index 4420c67..95dc0de91 100644
--- a/third_party/rust/chromium_crates_io/supply-chain/config.toml
+++ b/third_party/rust/chromium_crates_io/supply-chain/config.toml
@@ -74,7 +74,7 @@
 [policy."calendrical_calculations:0.2.0"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
-[policy."cc:1.2.26"]
+[policy."cc:1.2.27"]
 criteria = []
 
 [policy."cfg-if:1.0.1"]
@@ -248,7 +248,7 @@
 [policy."lazy_static:1.5.0"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
-[policy."libc:0.2.172"]
+[policy."libc:0.2.173"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
 [policy."libm:0.2.15"]
@@ -374,7 +374,7 @@
 [policy."subtle:2.6.1"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
-[policy."syn:2.0.102"]
+[policy."syn:2.0.103"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
 [policy."synstructure:0.13.2"]
diff --git a/third_party/rust/chromium_crates_io/vendor/cc-v1/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/cc-v1/Cargo.toml
index 7330449..126d497 100644
--- a/third_party/rust/chromium_crates_io/vendor/cc-v1/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/cc-v1/Cargo.toml
@@ -6,13 +6,13 @@
 # by `tools/crates/run_gnrt.py vendor`. Do not edit!
 #
 # This is an empty placeholder that has replaced the
-# `cc-1.2.26` crate.
+# `cc-1.2.27` crate.
 #
 # See `//tools/crates/gnrt/removed_crate.md` to learn more.
 
 [package]
 name = "cc"
-version = "1.2.26"
+version = "1.2.27"
 
 [package.metadata.gnrt]
 is_placeholder = true
diff --git a/third_party/rust/chromium_crates_io/vendor/cc-v1/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/cc-v1/src/lib.rs
index aaccf6cc..97eb002 100644
--- a/third_party/rust/chromium_crates_io/vendor/cc-v1/src/lib.rs
+++ b/third_party/rust/chromium_crates_io/vendor/cc-v1/src/lib.rs
@@ -6,6 +6,6 @@
 // by `tools/crates/run_gnrt.py vendor`. Do not edit!
 //
 // This is an empty placeholder that has replaced the
-// `cc-1.2.26` crate.
+// `cc-1.2.27` crate.
 //
 // See `//tools/crates/gnrt/removed_crate.md` to learn more.
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/.cargo_vcs_info.json
index af5afed..49f714d4 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/.cargo_vcs_info.json
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/.cargo_vcs_info.json
@@ -1,6 +1,6 @@
 {
   "git": {
-    "sha1": "a5eab581f9c9c03f29e3edd4a4d4f850d748f2e9"
+    "sha1": "9288ec0123086439f27ea47a2b120345e6007e24"
   },
   "path_in_vcs": ""
 }
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/CHANGELOG.md b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/CHANGELOG.md
index 82a37cf..0adc302 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/CHANGELOG.md
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/CHANGELOG.md
@@ -1,5 +1,42 @@
 # Changelog
 
+
+## [0.2.173](https://github.com/rust-lang/libc/compare/0.2.172...0.2.173) - 2025-06-09
+
+### Added
+
+- AIX: Add an AIX triple to Cargo.toml for doc ([#4475](https://github.com/rust-lang/libc/pull/4475))
+- FreeBSD: Add the `SO_SPLICE` socket option support for FreeBSD >= 14.2 ([#4451](https://github.com/rust-lang/libc/pull/4451))
+- Linux GNU: Prepare for supporting `_TIME_BITS=64` ([#4433](https://github.com/rust-lang/libc/pull/4433))
+- Linux: Add constant PACKET_IGNORE_OUTGOING ([#4319](https://github.com/rust-lang/libc/pull/4319))
+- Linux: Add constants and types for `nsfs` ioctls ([#4436](https://github.com/rust-lang/libc/pull/4436))
+- Linux: Add constants for Memory-Deny-Write-Execute `prctls` ([#4400](https://github.com/rust-lang/libc/pull/4400))
+- Linux: Add constants from `linux/cn_proc.h` and `linux/connector.h` ([#4434](https://github.com/rust-lang/libc/pull/4434))
+- Linux: Add new flags for `pwritev2` and `preadv2` ([#4452](https://github.com/rust-lang/libc/pull/4452))
+- Linux: Add pid_type enum values ([#4403](https://github.com/rust-lang/libc/pull/4403))
+- Linux: Update pidfd constants and types (Linux 6.9-6.15) ([#4402](https://github.com/rust-lang/libc/pull/4402))
+- Loongarch64 musl: Define the `MADV_SOFT_OFFLINE` constant ([#4448](https://github.com/rust-lang/libc/pull/4448))
+- Musl: Add new fields since 1.2.0/1.2.2 to `struct tcp_info` ([#4443](https://github.com/rust-lang/libc/pull/4443))
+- Musl: Prepare for supporting v1.2.3 ([#4443](https://github.com/rust-lang/libc/pull/4443))
+- NuttX: Add `arc4random` and `arc4random_buf` ([#4464](https://github.com/rust-lang/libc/pull/4464))
+- RISC-V Musl: Add `MADV_SOFT_OFFLINE` definition ([#4447](https://github.com/rust-lang/libc/pull/4447))
+- Redox: Define SCM_RIGHTS ([#4440](https://github.com/rust-lang/libc/pull/4440))
+- VxWorks: Add missing UTIME defines and TASK_RENAME_LENGTH ([#4407](https://github.com/rust-lang/libc/pull/4407))
+- Windows: Add more `time.h` functions ([#4427](https://github.com/rust-lang/libc/pull/4427))
+
+### Changed
+
+- Redox: Update `SA_` constants. ([#4426](https://github.com/rust-lang/libc/pull/4426))
+- Redox: make `CMSG_ALIGN`, `CMSG_LEN`, and `CMSG_SPACE` const functions ([#4441](https://github.com/rust-lang/libc/pull/4441))
+
+### Fixed
+
+- AIX: Enable libc-test and fix definitions/declarations. ([#4450](https://github.com/rust-lang/libc/pull/4450))
+- Emscripten: Fix querying emcc on windows (use emcc.bat) ([#4248](https://github.com/rust-lang/libc/pull/4248))
+- Hurd: Fix build from missing `fpos_t` ([#4472](https://github.com/rust-lang/libc/pull/4472))
+- Loongarch64 Musl: Fix the `struct ipc_perm` bindings ([#4384](https://github.com/rust-lang/libc/pull/4384))
+- Musl: Fix the `O_LARGEFILE` constant value. ([#4443](https://github.com/rust-lang/libc/pull/4443))
+
 ## [0.2.172](https://github.com/rust-lang/libc/compare/0.2.171...0.2.172) - 2025-04-14
 
 ### Added
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.lock
index 833de34..eae0e13 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.lock
@@ -4,7 +4,7 @@
 
 [[package]]
 name = "libc"
-version = "0.2.172"
+version = "0.2.173"
 dependencies = [
  "rustc-std-workspace-core",
 ]
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml
index 946d700e..0bfc5e5 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.63"
 name = "libc"
-version = "0.2.172"
+version = "0.2.173"
 authors = ["The Rust Project Developers"]
 build = "build.rs"
 exclude = [
@@ -27,11 +27,7 @@
 autoexamples = false
 autotests = false
 autobenches = false
-description = """
-Raw FFI bindings to platform libraries like libc.
-"""
-homepage = "https://github.com/rust-lang/libc"
-documentation = "https://docs.rs/libc/"
+description = "Raw FFI bindings to platform libraries like libc."
 readme = "README.md"
 keywords = [
     "libc",
@@ -108,6 +104,7 @@
     "powerpc-unknown-netbsd",
     "powerpc-wrs-vxworks",
     "powerpc-wrs-vxworks-spe",
+    "powerpc64-ibm-aix",
     "powerpc64-unknown-freebsd",
     "powerpc64-unknown-linux-gnu",
     "powerpc64-wrs-vxworks",
@@ -184,3 +181,20 @@
 [dependencies.rustc-std-workspace-core]
 version = "1.0.0"
 optional = true
+
+[lints.clippy]
+expl_impl_clone_on_copy = "allow"
+explicit_iter_loop = "warn"
+identity_op = "allow"
+manual_assert = "warn"
+map_unwrap_or = "warn"
+missing_safety_doc = "allow"
+non_minimal_cfg = "allow"
+ptr_as_ptr = "warn"
+uninlined_format_args = "allow"
+unnecessary_cast = "allow"
+unnecessary_semicolon = "warn"
+used_underscore_binding = "allow"
+
+[lints.rust]
+unused_qualifications = "allow"
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml.orig
index cabbc528..b9d9d73 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml.orig
@@ -1,21 +1,15 @@
 [package]
 name = "libc"
-version = "0.2.172"
-authors = ["The Rust Project Developers"]
-license = "MIT OR Apache-2.0"
-readme = "README.md"
-edition = "2021"
-repository = "https://github.com/rust-lang/libc"
-homepage = "https://github.com/rust-lang/libc"
-documentation = "https://docs.rs/libc/"
+version = "0.2.173"
 keywords = ["libc", "ffi", "bindings", "operating", "system"]
 categories = ["external-ffi-bindings", "no-std", "os"]
-build = "build.rs"
 exclude = ["/ci/*", "/.github/*", "/.cirrus.yml", "/triagebot.toml"]
+description = "Raw FFI bindings to platform libraries like libc."
+authors = ["The Rust Project Developers"]
+edition = "2021"
+license = "MIT OR Apache-2.0"
+repository = "https://github.com/rust-lang/libc"
 rust-version = "1.63"
-description = """
-Raw FFI bindings to platform libraries like libc.
-"""
 
 [package.metadata.docs.rs]
 features = ["extra_traits"]
@@ -78,6 +72,7 @@
     "powerpc-unknown-netbsd",
     "powerpc-wrs-vxworks",
     "powerpc-wrs-vxworks-spe",
+    "powerpc64-ibm-aix",
     "powerpc64-unknown-freebsd",
     "powerpc64-unknown-linux-gnu",
     "powerpc64-wrs-vxworks",
@@ -153,5 +148,33 @@
 [workspace]
 members = [
     "ctest",
+    "ctest-next",
     "libc-test",
 ]
+
+# FIXME(msrv): These should be renamed as `[workspace.lints.*]` once MSRV is above 1.64
+#       This way all crates can use it with `[lints] workspace=true` section
+
+[lints.rust]
+# FIXME(cleanup): make ident usage consistent in each file
+unused_qualifications = "allow"
+
+[lints.clippy]
+# Enable pedantic lints - use this manually once in a while, but don't enable by default
+# pedantic = { level = "warn", priority = -1 }
+
+# We are okay with the current state of these lints
+explicit_iter_loop = "warn"
+identity_op = "allow"  # some expressions like `0 | x` are clearer for bit ops
+manual_assert = "warn"
+map_unwrap_or = "warn"
+missing_safety_doc = "allow"  # safety? in libc? seriously?
+non_minimal_cfg = "allow"  # for some reason cfg_if! sometimes trigger this
+ptr_as_ptr = "warn"
+unnecessary_semicolon = "warn"
+
+# FIXME(clippy): these should be fixed if possible
+expl_impl_clone_on_copy = "allow"
+uninlined_format_args = "allow"
+unnecessary_cast = "allow"  # some casts like `as usize` are only needed for some targets
+used_underscore_binding = "allow"
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/build.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/build.rs
index bf5277a9..5e1e62c5 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/build.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/build.rs
@@ -4,7 +4,7 @@
 // List of cfgs this build script is allowed to set. The list is needed to support check-cfg, as we
 // need to know all the possible cfgs that this script will set. If you need to set another cfg
 // make sure to add it to this list as well.
-const ALLOWED_CFGS: &'static [&'static str] = &[
+const ALLOWED_CFGS: &[&str] = &[
     "emscripten_old_stat_abi",
     "espidf_time32",
     "freebsd10",
@@ -15,6 +15,8 @@
     "freebsd15",
     // Corresponds to `_FILE_OFFSET_BITS=64` in glibc
     "gnu_file_offset_bits64",
+    // Corresponds to `_TIME_BITS=64` in glibc
+    "gnu_time_bits64",
     // FIXME(ctest): this config shouldn't be needed but ctest can't parse `const extern fn`
     "libc_const_extern_fn",
     "libc_deny_warnings",
@@ -22,10 +24,11 @@
     "libc_ctest",
     // Corresponds to `__USE_TIME_BITS64` in UAPI
     "linux_time_bits64",
+    "musl_v1_2_3",
 ];
 
 // Extra values to allow for check-cfg.
-const CHECK_CFG_EXTRA: &'static [(&'static str, &'static [&'static str])] = &[
+const CHECK_CFG_EXTRA: &[(&str, &[&str])] = &[
     (
         "target_os",
         &[
@@ -89,29 +92,48 @@
         _ => (),
     }
 
+    let musl_v1_2_3 = env::var("RUST_LIBC_UNSTABLE_MUSL_V1_2_3").is_ok();
+    println!("cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_MUSL_V1_2_3");
+    // loongarch64 and ohos have already updated
+    if musl_v1_2_3 || target_os == "loongarch64" || target_env == "ohos" {
+        // FIXME(musl): enable time64 api as well
+        set_cfg("musl_v1_2_3");
+    }
     let linux_time_bits64 = env::var("RUST_LIBC_UNSTABLE_LINUX_TIME_BITS64").is_ok();
     println!("cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_LINUX_TIME_BITS64");
     if linux_time_bits64 {
         set_cfg("linux_time_bits64");
     }
     println!("cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS");
-    match env::var("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS") {
-        Ok(val) if val == "64" => {
-            if target_env == "gnu"
-                && target_os == "linux"
-                && target_ptr_width == "32"
-                && target_arch != "riscv32"
-                && target_arch != "x86_64"
-            {
+    println!("cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_GNU_TIME_BITS");
+    if target_env == "gnu"
+        && target_os == "linux"
+        && target_ptr_width == "32"
+        && target_arch != "riscv32"
+        && target_arch != "x86_64"
+    {
+        match env::var("RUST_LIBC_UNSTABLE_GNU_TIME_BITS") {
+            Ok(val) if val == "64" => {
                 set_cfg("gnu_file_offset_bits64");
+                set_cfg("linux_time_bits64");
+                set_cfg("gnu_time_bits64");
+            }
+            Ok(val) if val != "32" => {
+                panic!("RUST_LIBC_UNSTABLE_GNU_TIME_BITS may only be set to '32' or '64'")
+            }
+            _ => {
+                match env::var("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS") {
+                    Ok(val) if val == "64" => {
+                        set_cfg("gnu_file_offset_bits64");
+                    }
+                    Ok(val) if val != "32" => {
+                        panic!("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS may only be set to '32' or '64'")
+                    }
+                    _ => {}
+                }
             }
         }
-        Ok(val) if val != "32" => {
-            panic!("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS may only be set to '32' or '64'")
-        }
-        _ => {}
     }
-
     // On CI: deny all warnings
     if libc_ci {
         set_cfg("libc_deny_warnings");
@@ -130,17 +152,17 @@
     if rustc_minor_ver >= 80 {
         for cfg in ALLOWED_CFGS {
             if rustc_minor_ver >= 75 {
-                println!("cargo:rustc-check-cfg=cfg({})", cfg);
+                println!("cargo:rustc-check-cfg=cfg({cfg})");
             } else {
-                println!("cargo:rustc-check-cfg=values({})", cfg);
+                println!("cargo:rustc-check-cfg=values({cfg})");
             }
         }
         for &(name, values) in CHECK_CFG_EXTRA {
             let values = values.join("\",\"");
             if rustc_minor_ver >= 75 {
-                println!("cargo:rustc-check-cfg=cfg({},values(\"{}\"))", name, values);
+                println!("cargo:rustc-check-cfg=cfg({name},values(\"{values}\"))");
             } else {
-                println!("cargo:rustc-check-cfg=values({},\"{}\")", name, values);
+                println!("cargo:rustc-check-cfg=values({name},\"{values}\")");
             }
         }
     }
@@ -169,12 +191,11 @@
 
     let output = cmd.output().expect("Failed to get rustc version");
 
-    if !output.status.success() {
-        panic!(
-            "failed to run rustc: {}",
-            String::from_utf8_lossy(output.stderr.as_slice())
-        );
-    }
+    assert!(
+        output.status.success(),
+        "failed to run rustc: {}",
+        String::from_utf8_lossy(output.stderr.as_slice())
+    );
 
     output
 }
@@ -201,9 +222,11 @@
 
     let mut pieces = version.split('.');
 
-    if pieces.next() != Some("rustc 1") {
-        panic!("Failed to get rustc version");
-    }
+    assert_eq!(
+        pieces.next(),
+        Some("rustc 1"),
+        "Failed to get rustc version"
+    );
 
     let minor = pieces.next();
 
@@ -213,9 +236,9 @@
     // since a nightly build should either come from CI
     // or a git checkout
     let nightly_raw = otry!(pieces.next()).split('-').nth(1);
-    let nightly = nightly_raw
-        .map(|raw| raw.starts_with("dev") || raw.starts_with("nightly"))
-        .unwrap_or(false);
+    let nightly = nightly_raw.map_or(false, |raw| {
+        raw.starts_with("dev") || raw.starts_with("nightly")
+    });
     let minor = otry!(otry!(minor).parse().ok());
 
     (minor, nightly)
@@ -241,7 +264,13 @@
 }
 
 fn emcc_version_code() -> Option<u64> {
-    let output = Command::new("emcc").arg("-dumpversion").output().ok()?;
+    let emcc = if cfg!(target_os = "windows") {
+        "emcc.bat"
+    } else {
+        "emcc"
+    };
+
+    let output = Command::new(emcc).arg("-dumpversion").output().ok()?;
     if !output.status.success() {
         return None;
     }
@@ -260,8 +289,9 @@
 }
 
 fn set_cfg(cfg: &str) {
-    if !ALLOWED_CFGS.contains(&cfg) {
-        panic!("trying to set cfg {}, but it is not in ALLOWED_CFGS", cfg);
-    }
-    println!("cargo:rustc-cfg={}", cfg);
+    assert!(
+        ALLOWED_CFGS.contains(&cfg),
+        "trying to set cfg {cfg}, but it is not in ALLOWED_CFGS",
+    );
+    println!("cargo:rustc-cfg={cfg}");
 }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/mod.rs
index b602017..bfd71ff 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/mod.rs
@@ -1068,26 +1068,6 @@
             }
         }
         impl Eq for sysinfo {}
-        impl fmt::Debug for sysinfo {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sysinfo")
-                    .field("uptime", &self.uptime)
-                    .field("loads", &self.loads)
-                    .field("totalram", &self.totalram)
-                    .field("freeram", &self.freeram)
-                    .field("sharedram", &self.sharedram)
-                    .field("bufferram", &self.bufferram)
-                    .field("totalswap", &self.totalswap)
-                    .field("freeswap", &self.freeswap)
-                    .field("procs", &self.procs)
-                    .field("pad", &self.pad)
-                    .field("totalhigh", &self.totalhigh)
-                    .field("freehigh", &self.freehigh)
-                    .field("mem_unit", &self.mem_unit)
-                    // FIXME(debug): .field("__reserved", &self.__reserved)
-                    .finish()
-            }
-        }
         impl hash::Hash for sysinfo {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uptime.hash(state);
@@ -1118,14 +1098,6 @@
             }
         }
         impl Eq for sockaddr_un {}
-        impl fmt::Debug for sockaddr_un {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_un")
-                    .field("sun_family", &self.sun_family)
-                    // FIXME(debug): .field("sun_path", &self.sun_path)
-                    .finish()
-            }
-        }
         impl hash::Hash for sockaddr_un {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sun_family.hash(state);
@@ -1145,15 +1117,6 @@
             }
         }
         impl Eq for sockaddr_storage {}
-        impl fmt::Debug for sockaddr_storage {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_storage")
-                    .field("ss_family", &self.ss_family)
-                    .field("__ss_align", &self.__ss_align)
-                    // FIXME(debug): .field("__ss_pad2", &self.__ss_pad2)
-                    .finish()
-            }
-        }
         impl hash::Hash for sockaddr_storage {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ss_family.hash(state);
@@ -1191,17 +1154,6 @@
             }
         }
         impl Eq for utsname {}
-        impl fmt::Debug for utsname {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utsname")
-                    // FIXME(debug): .field("sysname", &self.sysname)
-                    // FIXME(debug): .field("nodename", &self.nodename)
-                    // FIXME(debug): .field("release", &self.release)
-                    // FIXME(debug): .field("version", &self.version)
-                    // FIXME(debug): .field("machine", &self.machine)
-                    .finish()
-            }
-        }
         impl hash::Hash for utsname {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sysname.hash(state);
@@ -1226,17 +1178,6 @@
             }
         }
         impl Eq for dirent {}
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_ino", &self.d_ino)
-                    .field("d_off", &self.d_off)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_type", &self.d_type)
-                    // FIXME(debug): .field("d_name", &self.d_name)
-                    .finish()
-            }
-        }
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_ino.hash(state);
@@ -1261,17 +1202,6 @@
             }
         }
         impl Eq for dirent64 {}
-        impl fmt::Debug for dirent64 {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent64")
-                    .field("d_ino", &self.d_ino)
-                    .field("d_off", &self.d_off)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_type", &self.d_type)
-                    // FIXME(debug): .field("d_name", &self.d_name)
-                    .finish()
-            }
-        }
         impl hash::Hash for dirent64 {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_ino.hash(state);
@@ -1291,16 +1221,6 @@
             }
         }
         impl Eq for mq_attr {}
-        impl fmt::Debug for mq_attr {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mq_attr")
-                    .field("mq_flags", &self.mq_flags)
-                    .field("mq_maxmsg", &self.mq_maxmsg)
-                    .field("mq_msgsize", &self.mq_msgsize)
-                    .field("mq_curmsgs", &self.mq_curmsgs)
-                    .finish()
-            }
-        }
         impl hash::Hash for mq_attr {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.mq_flags.hash(state);
@@ -1318,15 +1238,6 @@
             }
         }
         impl Eq for sockaddr_nl {}
-        impl fmt::Debug for sockaddr_nl {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_nl")
-                    .field("nl_family", &self.nl_family)
-                    .field("nl_pid", &self.nl_pid)
-                    .field("nl_groups", &self.nl_groups)
-                    .finish()
-            }
-        }
         impl hash::Hash for sockaddr_nl {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.nl_family.hash(state);
@@ -1347,17 +1258,6 @@
             }
         }
         impl Eq for sigevent {}
-        impl fmt::Debug for sigevent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sigevent")
-                    .field("sigev_value", &self.sigev_value)
-                    .field("sigev_signo", &self.sigev_signo)
-                    .field("sigev_notify", &self.sigev_notify)
-                    .field("sigev_notify_function", &self.sigev_notify_function)
-                    .field("sigev_notify_attributes", &self.sigev_notify_attributes)
-                    .finish()
-            }
-        }
         impl hash::Hash for sigevent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sigev_value.hash(state);
@@ -1374,13 +1274,6 @@
             }
         }
         impl Eq for pthread_cond_t {}
-        impl fmt::Debug for pthread_cond_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_cond_t")
-                    // FIXME(debug): .field("size", &self.size)
-                    .finish()
-            }
-        }
         impl hash::Hash for pthread_cond_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.size.hash(state);
@@ -1393,13 +1286,6 @@
             }
         }
         impl Eq for pthread_mutex_t {}
-        impl fmt::Debug for pthread_mutex_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_mutex_t")
-                    // FIXME(debug): .field("size", &self.size)
-                    .finish()
-            }
-        }
         impl hash::Hash for pthread_mutex_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.size.hash(state);
@@ -1412,13 +1298,6 @@
             }
         }
         impl Eq for pthread_rwlock_t {}
-        impl fmt::Debug for pthread_rwlock_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_rwlock_t")
-                    // FIXME(debug): .field("size", &self.size)
-                    .finish()
-            }
-        }
         impl hash::Hash for pthread_rwlock_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.size.hash(state);
@@ -1452,9 +1331,9 @@
 
 pub const SIGIOT: c_int = 6;
 
-pub const S_ISUID: crate::mode_t = 0o4000;
-pub const S_ISGID: crate::mode_t = 0o2000;
-pub const S_ISVTX: crate::mode_t = 0o1000;
+pub const S_ISUID: mode_t = 0o4000;
+pub const S_ISGID: mode_t = 0o2000;
+pub const S_ISVTX: mode_t = 0o1000;
 
 pub const IF_NAMESIZE: size_t = 16;
 pub const IFNAMSIZ: size_t = IF_NAMESIZE;
@@ -1585,26 +1464,26 @@
 pub const O_WRONLY: c_int = 1;
 pub const O_RDWR: c_int = 2;
 
-pub const S_IFIFO: crate::mode_t = 0o1_0000;
-pub const S_IFCHR: crate::mode_t = 0o2_0000;
-pub const S_IFBLK: crate::mode_t = 0o6_0000;
-pub const S_IFDIR: crate::mode_t = 0o4_0000;
-pub const S_IFREG: crate::mode_t = 0o10_0000;
-pub const S_IFLNK: crate::mode_t = 0o12_0000;
-pub const S_IFSOCK: crate::mode_t = 0o14_0000;
-pub const S_IFMT: crate::mode_t = 0o17_0000;
-pub const S_IRWXU: crate::mode_t = 0o0700;
-pub const S_IXUSR: crate::mode_t = 0o0100;
-pub const S_IWUSR: crate::mode_t = 0o0200;
-pub const S_IRUSR: crate::mode_t = 0o0400;
-pub const S_IRWXG: crate::mode_t = 0o0070;
-pub const S_IXGRP: crate::mode_t = 0o0010;
-pub const S_IWGRP: crate::mode_t = 0o0020;
-pub const S_IRGRP: crate::mode_t = 0o0040;
-pub const S_IRWXO: crate::mode_t = 0o0007;
-pub const S_IXOTH: crate::mode_t = 0o0001;
-pub const S_IWOTH: crate::mode_t = 0o0002;
-pub const S_IROTH: crate::mode_t = 0o0004;
+pub const S_IFIFO: mode_t = 0o1_0000;
+pub const S_IFCHR: mode_t = 0o2_0000;
+pub const S_IFBLK: mode_t = 0o6_0000;
+pub const S_IFDIR: mode_t = 0o4_0000;
+pub const S_IFREG: mode_t = 0o10_0000;
+pub const S_IFLNK: mode_t = 0o12_0000;
+pub const S_IFSOCK: mode_t = 0o14_0000;
+pub const S_IFMT: mode_t = 0o17_0000;
+pub const S_IRWXU: mode_t = 0o0700;
+pub const S_IXUSR: mode_t = 0o0100;
+pub const S_IWUSR: mode_t = 0o0200;
+pub const S_IRUSR: mode_t = 0o0400;
+pub const S_IRWXG: mode_t = 0o0070;
+pub const S_IXGRP: mode_t = 0o0010;
+pub const S_IWGRP: mode_t = 0o0020;
+pub const S_IRGRP: mode_t = 0o0040;
+pub const S_IRWXO: mode_t = 0o0007;
+pub const S_IXOTH: mode_t = 0o0001;
+pub const S_IWOTH: mode_t = 0o0002;
+pub const S_IROTH: mode_t = 0o0004;
 pub const F_OK: c_int = 0;
 pub const R_OK: c_int = 4;
 pub const W_OK: c_int = 2;
@@ -3429,9 +3308,9 @@
 
     pub fn CMSG_NXTHDR(mhdr: *const msghdr, cmsg: *const cmsghdr) -> *mut cmsghdr {
         if ((*cmsg).cmsg_len as size_t) < mem::size_of::<cmsghdr>() {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         } else if __CMSG_NEXT(cmsg).add(mem::size_of::<cmsghdr>()) >= __MHDR_END(mhdr) {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         } else {
             __CMSG_NEXT(cmsg).cast()
         }
@@ -3441,7 +3320,7 @@
         if (*mhdr).msg_controllen as size_t >= mem::size_of::<cmsghdr>() {
             (*mhdr).msg_control.cast()
         } else {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         }
     }
 
@@ -3726,12 +3605,7 @@
     pub fn rewinddir(dirp: *mut crate::DIR);
 
     pub fn openat(dirfd: c_int, pathname: *const c_char, flags: c_int, ...) -> c_int;
-    pub fn fchmodat(
-        dirfd: c_int,
-        pathname: *const c_char,
-        mode: crate::mode_t,
-        flags: c_int,
-    ) -> c_int;
+    pub fn fchmodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, flags: c_int) -> c_int;
     pub fn fchown(fd: c_int, owner: crate::uid_t, group: crate::gid_t) -> c_int;
     pub fn fchownat(
         dirfd: c_int,
@@ -3748,7 +3622,7 @@
         newpath: *const c_char,
         flags: c_int,
     ) -> c_int;
-    pub fn mkdirat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int;
+    pub fn mkdirat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int;
     pub fn readlinkat(
         dirfd: c_int,
         pathname: *const c_char,
@@ -3966,7 +3840,7 @@
     pub fn gmtime(time_p: *const time_t) -> *mut tm;
     pub fn localtime(time_p: *const time_t) -> *mut tm;
 
-    pub fn mknod(pathname: *const c_char, mode: crate::mode_t, dev: crate::dev_t) -> c_int;
+    pub fn mknod(pathname: *const c_char, mode: mode_t, dev: crate::dev_t) -> c_int;
     pub fn uname(buf: *mut crate::utsname) -> c_int;
     pub fn gethostname(name: *mut c_char, len: size_t) -> c_int;
     pub fn getservbyname(name: *const c_char, proto: *const c_char) -> *mut servent;
@@ -4086,8 +3960,7 @@
 
     pub fn fdopendir(fd: c_int) -> *mut crate::DIR;
 
-    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t)
-        -> c_int;
+    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int;
     pub fn pthread_condattr_getclock(
         attr: *const pthread_condattr_t,
         clock_id: *mut clockid_t,
@@ -4214,7 +4087,7 @@
     pub fn setfsuid(uid: crate::uid_t) -> c_int;
 
     // Not available now on Android
-    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int;
+    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int;
     pub fn if_nameindex() -> *mut if_nameindex;
     pub fn if_freenameindex(ptr: *mut if_nameindex);
     pub fn sync_file_range(fd: c_int, offset: off64_t, nbytes: off64_t, flags: c_uint) -> c_int;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/x86_64.rs
index a184539..add60a45 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/x86_64.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/x86_64.rs
@@ -94,18 +94,6 @@
             }
         }
         impl Eq for ucontext_t {}
-        impl fmt::Debug for ucontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ucontext_t")
-                    .field("uc_flags", &self.uc_flags)
-                    .field("uc_link", &self.uc_link)
-                    .field("uc_stack", &self.uc_stack)
-                    .field("uc_mcontext", &self.uc_mcontext)
-                    .field("uc_sigmask", &self.uc_sigmask)
-                    // FIXME(debug): .field("__private", &self.__private)
-                    .finish()
-            }
-        }
         impl hash::Hash for ucontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/lib.rs
index 50aed357..a96ffc6f 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/lib.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/lib.rs
@@ -7,15 +7,8 @@
     bad_style,
     overflowing_literals,
     improper_ctypes,
-    // This lint is renamed but we run CI for old stable rustc so should be here.
-    redundant_semicolon,
-    redundant_semicolons,
     unused_macros,
     unused_macro_rules,
-    // FIXME(1.0): temporarily allow dead_code to fix CI:
-    // - https://github.com/rust-lang/libc/issues/3740
-    // - https://github.com/rust-lang/rust/pull/126456
-    dead_code,
 )]
 #![cfg_attr(libc_deny_warnings, deny(warnings))]
 // Attributes needed when building as part of the standard library
@@ -25,8 +18,8 @@
 // DIFF(1.0): The thread local references that raise this lint were removed in 1.0
 #![cfg_attr(feature = "rustc-dep-of-std", allow(static_mut_refs))]
 // Enable extra lints:
-#![cfg_attr(feature = "extra_traits", deny(missing_debug_implementations))]
-#![deny(missing_copy_implementations, safe_packed_borrows)]
+#![cfg_attr(feature = "extra_traits", warn(missing_debug_implementations))]
+#![warn(missing_copy_implementations, safe_packed_borrows)]
 #![cfg_attr(not(feature = "rustc-dep-of-std"), no_std)]
 #![cfg_attr(feature = "rustc-dep-of-std", no_core)]
 
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/macros.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/macros.rs
index e7dbf5611..a0fb7ff1 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/macros.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/macros.rs
@@ -141,7 +141,8 @@
     )*);
 }
 
-/// Implement `Clone` and `Copy` for a struct with no `extra_traits` feature.
+/// Implement `Clone` and `Copy` for a struct with no `extra_traits` feature, as well as `Debug`
+/// with `extra_traits` since that can always be derived.
 ///
 /// Most items will prefer to use [`s`].
 macro_rules! s_no_extra_traits {
@@ -172,6 +173,7 @@
         __item! {
             #[repr(C)]
             #[::core::prelude::v1::derive(::core::clone::Clone, ::core::marker::Copy)]
+            #[cfg_attr(feature = "extra_traits", ::core::prelude::v1::derive(Debug))]
             $(#[$attr])*
             pub struct $i { $($field)* }
         }
@@ -193,6 +195,7 @@
 
 /// Implement `Clone` and `Copy` for an enum, as well as `Debug`, `Eq`, `Hash`, and
 /// `PartialEq` if the `extra_traits` feature is enabled.
+// FIXME(#4419): Replace all uses of `e!` with `c_enum!`
 macro_rules! e {
     ($(
         $(#[$attr:meta])*
@@ -210,6 +213,48 @@
     )*);
 }
 
+/// Represent a C enum as Rust constants and a type.
+///
+/// C enums can't soundly be mapped to Rust enums since C enums are allowed to have duplicates or
+/// unlisted values, but this is UB in Rust. This enum doesn't implement any traits, its main
+/// purpose is to calculate the correct enum values.
+///
+/// See <https://github.com/rust-lang/libc/issues/4419> for more.
+macro_rules! c_enum {
+    (
+        $(#[repr($repr:ty)])?
+        $ty_name:ident {
+            $($variant:ident $(= $value:literal)?,)+
+        }
+    ) => {
+        pub type $ty_name = c_enum!(@ty $($repr)?);
+        c_enum!(@one; $ty_name; 0; $($variant $(= $value)?,)+);
+    };
+
+    // Matcher for a single variant
+    (@one; $_ty_name:ident; $_idx:expr;) => {};
+    (
+        @one; $ty_name:ident; $default_val:expr;
+        $variant:ident $(= $value:literal)?,
+        $($tail:tt)*
+    ) => {
+        pub const $variant: $ty_name = {
+            #[allow(unused_variables)]
+            let r = $default_val;
+            $(let r = $value;)?
+            r
+        };
+
+        // The next value is always one more than the previous value, unless
+        // set explicitly.
+        c_enum!(@one; $ty_name; $variant + 1; $($tail)*);
+    };
+
+    // Use a specific type if provided, otherwise default to `c_uint`
+    (@ty $repr:ty) => { $repr };
+    (@ty) => { $crate::c_uint };
+}
+
 // This is a pretty horrible hack to allow us to conditionally mark some functions as 'const',
 // without requiring users of this macro to care "libc_const_extern_fn".
 //
@@ -359,3 +404,76 @@
         )*
     }
 }
+
+#[cfg(test)]
+mod tests {
+    #[test]
+    fn c_enumbasic() {
+        // By default, variants get sequential values.
+        c_enum! {
+            e {
+                VAR0,
+                VAR1,
+                VAR2,
+            }
+        }
+
+        assert_eq!(VAR0, 0_u32);
+        assert_eq!(VAR1, 1_u32);
+        assert_eq!(VAR2, 2_u32);
+    }
+
+    #[test]
+    fn c_enumrepr() {
+        // By default, variants get sequential values.
+        c_enum! {
+            #[repr(u16)]
+            e {
+                VAR0,
+            }
+        }
+
+        assert_eq!(VAR0, 0_u16);
+    }
+
+    #[test]
+    fn c_enumset_value() {
+        // Setting an explicit value resets the count.
+        c_enum! {
+            e {
+                VAR2 = 2,
+                VAR3,
+                VAR4,
+            }
+        }
+
+        assert_eq!(VAR2, 2_u32);
+        assert_eq!(VAR3, 3_u32);
+        assert_eq!(VAR4, 4_u32);
+    }
+
+    #[test]
+    fn c_enummultiple_set_value() {
+        // C enums always take one more than the previous value, unless set to a specific
+        // value. Duplicates are allowed.
+        c_enum! {
+            e {
+                VAR0,
+                VAR2_0 = 2,
+                VAR3_0,
+                VAR4_0,
+                VAR2_1 = 2,
+                VAR3_1,
+                VAR4_1,
+            }
+        }
+
+        assert_eq!(VAR0, 0_u32);
+        assert_eq!(VAR2_0, 2_u32);
+        assert_eq!(VAR3_0, 3_u32);
+        assert_eq!(VAR4_0, 4_u32);
+        assert_eq!(VAR2_1, 2_u32);
+        assert_eq!(VAR3_1, 3_u32);
+        assert_eq!(VAR4_1, 4_u32);
+    }
+}
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/psp.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/psp.rs
index 73d4ae0..56d528c 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/psp.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/psp.rs
@@ -2115,12 +2115,10 @@
 }
 
 s_no_extra_traits! {
-    #[allow(missing_debug_implementations)]
     pub struct GeContext {
         pub context: [u32; 512],
     }
 
-    #[allow(missing_debug_implementations)]
     pub struct SceKernelUtilsSha1Context {
         pub h: [u32; 5usize],
         pub us_remains: u16,
@@ -2129,13 +2127,11 @@
         pub buf: [u8; 64usize],
     }
 
-    #[allow(missing_debug_implementations)]
     pub struct SceKernelUtilsMt19937Context {
         pub count: u32,
         pub state: [u32; 624usize],
     }
 
-    #[allow(missing_debug_implementations)]
     pub struct SceKernelUtilsMd5Context {
         pub h: [u32; 4usize],
         pub pad: u32,
@@ -2145,7 +2141,6 @@
         pub buf: [u8; 64usize],
     }
 
-    #[allow(missing_debug_implementations)]
     pub struct SceIoDirent {
         pub d_stat: SceIoStat,
         pub d_name: [u8; 256usize],
@@ -2153,7 +2148,6 @@
         pub dummy: i32,
     }
 
-    #[cfg_attr(feature = "extra_traits", derive(Debug))]
     pub struct ScePspFRect {
         pub x: f32,
         pub y: f32,
@@ -2162,7 +2156,6 @@
     }
 
     #[repr(align(16))]
-    #[cfg_attr(feature = "extra_traits", derive(Debug))]
     pub struct ScePspFVector3 {
         pub x: f32,
         pub y: f32,
@@ -2170,7 +2163,6 @@
     }
 
     #[repr(align(16))]
-    #[cfg_attr(feature = "extra_traits", derive(Debug))]
     pub struct ScePspFVector4 {
         pub x: f32,
         pub y: f32,
@@ -2178,7 +2170,6 @@
         pub w: f32,
     }
 
-    #[cfg_attr(feature = "extra_traits", derive(Debug))]
     pub struct ScePspFVector4Unaligned {
         pub x: f32,
         pub y: f32,
@@ -2186,26 +2177,22 @@
         pub w: f32,
     }
 
-    #[cfg_attr(feature = "extra_traits", derive(Debug))]
     pub struct ScePspFVector2 {
         pub x: f32,
         pub y: f32,
     }
 
-    #[cfg_attr(feature = "extra_traits", derive(Debug))]
     pub struct ScePspFMatrix2 {
         pub x: ScePspFVector2,
         pub y: ScePspFVector2,
     }
 
-    #[cfg_attr(feature = "extra_traits", derive(Debug))]
     pub struct ScePspFMatrix3 {
         pub x: ScePspFVector3,
         pub y: ScePspFVector3,
         pub z: ScePspFVector3,
     }
 
-    #[cfg_attr(feature = "extra_traits", derive(Debug))]
     #[repr(align(16))]
     pub struct ScePspFMatrix4 {
         pub x: ScePspFVector4,
@@ -2214,7 +2201,6 @@
         pub w: ScePspFVector4,
     }
 
-    #[allow(missing_debug_implementations)]
     pub struct ScePspFMatrix4Unaligned {
         pub x: ScePspFVector4,
         pub y: ScePspFVector4,
@@ -2222,7 +2208,6 @@
         pub w: ScePspFVector4,
     }
 
-    #[allow(missing_debug_implementations)]
     pub union ScePspVector3 {
         pub fv: ScePspFVector3,
         pub iv: ScePspIVector3,
@@ -2230,7 +2215,6 @@
         pub i: [i32; 3usize],
     }
 
-    #[allow(missing_debug_implementations)]
     pub union ScePspVector4 {
         pub fv: ScePspFVector4,
         pub iv: ScePspIVector4,
@@ -2239,7 +2223,6 @@
         pub i: [i32; 4usize],
     }
 
-    #[allow(missing_debug_implementations)]
     pub union ScePspMatrix2 {
         pub fm: ScePspFMatrix2,
         pub im: ScePspIMatrix2,
@@ -2250,7 +2233,6 @@
         pub i: [[i32; 2usize]; 2usize],
     }
 
-    #[allow(missing_debug_implementations)]
     pub union ScePspMatrix3 {
         pub fm: ScePspFMatrix3,
         pub im: ScePspIMatrix3,
@@ -2261,7 +2243,6 @@
         pub i: [[i32; 3usize]; 3usize],
     }
 
-    #[allow(missing_debug_implementations)]
     pub union ScePspVector2 {
         pub fv: ScePspFVector2,
         pub iv: ScePspIVector2,
@@ -2269,7 +2250,6 @@
         pub i: [i32; 2usize],
     }
 
-    #[allow(missing_debug_implementations)]
     pub union ScePspMatrix4 {
         pub fm: ScePspFMatrix4,
         pub im: ScePspIMatrix4,
@@ -2280,7 +2260,6 @@
         pub i: [[i32; 4usize]; 4usize],
     }
 
-    #[allow(missing_debug_implementations)]
     pub struct Key {
         pub key_type: KeyType,
         pub name: [u8; 256usize],
@@ -2289,7 +2268,6 @@
         pub unk3: u32,
     }
 
-    #[allow(missing_debug_implementations)]
     pub struct UtilityMsgDialogParams {
         pub base: UtilityDialogCommon,
         pub unknown: i32,
@@ -2300,13 +2278,11 @@
         pub button_pressed: UtilityMsgDialogPressed,
     }
 
-    #[allow(missing_debug_implementations)]
     pub union UtilityNetData {
         pub as_uint: u32,
         pub as_string: [u8; 128usize],
     }
 
-    #[allow(missing_debug_implementations)]
     pub struct UtilitySavedataSFOParam {
         pub title: [u8; 128usize],
         pub savedata_title: [u8; 128usize],
@@ -2315,7 +2291,6 @@
         pub unknown: [u8; 3usize],
     }
 
-    #[allow(missing_debug_implementations)]
     pub struct SceUtilitySavedataParam {
         pub base: UtilityDialogCommon,
         pub mode: UtilitySavedataMode,
@@ -2342,7 +2317,6 @@
         pub unknown3: [u8; 20],
     }
 
-    #[allow(missing_debug_implementations)]
     pub struct SceNetAdhocctlPeerInfo {
         pub next: *mut SceNetAdhocctlPeerInfo,
         pub nickname: [u8; 128usize],
@@ -2351,7 +2325,6 @@
         pub timestamp: u32,
     }
 
-    #[allow(missing_debug_implementations)]
     pub struct SceNetAdhocctlParams {
         pub channel: i32,
         pub name: [u8; 8usize],
@@ -2359,7 +2332,6 @@
         pub nickname: [u8; 128usize],
     }
 
-    #[cfg_attr(feature = "extra_traits", allow(missing_debug_implementations))]
     pub union SceNetApctlInfo {
         pub name: [u8; 64usize],
         pub bssid: [u8; 6usize],
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/mod.rs
index a43fcd104..3f8145d 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/mod.rs
@@ -1,4 +1,5 @@
 use crate::prelude::*;
+use crate::{in_addr_t, in_port_t};
 
 pub type caddr_t = *mut c_char;
 pub type clockid_t = c_longlong;
@@ -9,7 +10,6 @@
 pub type fpos64_t = c_longlong;
 pub type fsblkcnt_t = c_ulong;
 pub type fsfilcnt_t = c_ulong;
-pub type idtype_t = c_int;
 pub type ino_t = c_ulong;
 pub type key_t = c_int;
 pub type mode_t = c_uint;
@@ -18,25 +18,23 @@
 pub type speed_t = c_uint;
 pub type tcflag_t = c_uint;
 pub type time_t = c_long;
-pub type time64_t = crate::int64_t;
+pub type time64_t = i64;
 pub type timer_t = c_long;
 pub type wchar_t = c_uint;
-pub type nfds_t = c_int;
+pub type nfds_t = c_uint;
 pub type projid_t = c_int;
 pub type id_t = c_uint;
 pub type blksize64_t = c_ulonglong;
 pub type blkcnt64_t = c_ulonglong;
-pub type sctp_assoc_t = crate::uint32_t;
-
 pub type suseconds_t = c_int;
 pub type useconds_t = c_uint;
 pub type off_t = c_long;
+pub type offset_t = c_longlong;
 pub type off64_t = c_longlong;
+pub type idtype_t = c_uint;
 
 pub type socklen_t = c_uint;
 pub type sa_family_t = c_uchar;
-pub type in_port_t = c_ushort;
-pub type in_addr_t = c_uint;
 
 pub type signal_t = c_int;
 pub type pthread_t = c_uint;
@@ -69,6 +67,11 @@
         UIO_WRITE_NO_MOVE,
         UIO_PWRITE,
     }
+    #[repr(u32)]
+    pub enum ACTION {
+        FIND = 0,
+        ENTER,
+    }
 }
 
 s! {
@@ -228,7 +231,7 @@
         pub sin_family: sa_family_t,
         pub sin_port: in_port_t,
         pub sin_addr: in_addr,
-        pub sin_zero: [c_char; 8],
+        pub sin_zero: [c_uchar; 8],
     }
 
     pub struct sockaddr_in6 {
@@ -318,19 +321,6 @@
         pub sigev_notify_attributes: *mut pthread_attr_t,
     }
 
-    // Should be union with another 'sival_int'
-    pub struct sigval64 {
-        pub sival_ptr: c_ulonglong,
-    }
-
-    pub struct sigevent64 {
-        pub sigev_value: sigval64,
-        pub sigev_signo: c_int,
-        pub sigev_notify: c_int,
-        pub sigev_notify_function: c_ulonglong,
-        pub sigev_notify_attributes: c_ulonglong,
-    }
-
     pub struct osigevent {
         pub sevt_value: *mut c_void,
         pub sevt_signo: signal_t,
@@ -402,7 +392,7 @@
         pub keepcost: c_int,
     }
 
-    pub struct utmp_exit_status {
+    pub struct exit_status {
         pub e_termination: c_short,
         pub e_exit: c_short,
     }
@@ -414,7 +404,7 @@
         pub ut_pid: crate::pid_t,
         pub ut_type: c_short,
         pub ut_time: time64_t,
-        pub ut_exit: utmp_exit_status,
+        pub ut_exit: exit_status,
         pub ut_host: [c_char; 256],
         pub __dbl_word_pad: c_int,
         pub __reservedA: [c_int; 2],
@@ -459,7 +449,7 @@
         pub shm_extshm: c_int,
         pub shm_pagesize: crate::int64_t,
         pub shm_lba: crate::uint64_t,
-        pub shm_reserved: crate::int64_t,
+        pub shm_reserved0: crate::int64_t,
         pub shm_reserved1: crate::int64_t,
     }
 
@@ -554,7 +544,7 @@
         pub events: c_short,
         pub fd: c_int,
         pub u: __poll_ctl_ext_u,
-        pub reversed64: [u64; 6],
+        pub reserved64: [u64; 6],
     }
 }
 
@@ -586,23 +576,11 @@
                     && self.command == other.command
                     && self.events == other.events
                     && self.fd == other.fd
-                    && self.reversed64 == other.reversed64
+                    && self.reserved64 == other.reserved64
                     && self.u == other.u
             }
         }
         impl Eq for poll_ctl_ext {}
-        impl fmt::Debug for poll_ctl_ext {
-            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-                f.debug_struct("poll_ctl_ext")
-                    .field("version", &self.version)
-                    .field("command", &self.command)
-                    .field("events", &self.events)
-                    .field("fd", &self.fd)
-                    .field("u", &self.u)
-                    .field("reversed64", &self.reversed64)
-                    .finish()
-            }
-        }
         impl hash::Hash for poll_ctl_ext {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.version.hash(state);
@@ -610,7 +588,7 @@
                 self.events.hash(state);
                 self.fd.hash(state);
                 self.u.hash(state);
-                self.reversed64.hash(state);
+                self.reserved64.hash(state);
             }
         }
     }
@@ -643,33 +621,33 @@
 pub const O_SEARCH: c_int = 0x20;
 pub const O_EXEC: c_int = 0x20;
 pub const O_CLOEXEC: c_int = 0x800000;
-pub const O_ACCMODE: c_int = O_RDONLY | O_WRONLY | O_RDWR;
+pub const O_ACCMODE: c_int = O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH;
 pub const O_DIRECT: c_int = 0x8000000;
 pub const O_TTY_INIT: c_int = 0;
 pub const O_RSYNC: c_int = 0x200000;
 pub const O_LARGEFILE: c_int = 0x4000000;
-pub const F_CLOSEM: c_int = 10;
+pub const F_DUPFD: c_int = 0;
 pub const F_DUPFD_CLOEXEC: c_int = 16;
-pub const F_GETLK64: c_int = 11;
-pub const F_SETLK64: c_int = 12;
-pub const F_SETLKW64: c_int = 13;
-pub const F_DUP2FD: c_int = 14;
-pub const F_TSTLK: c_int = 15;
+pub const F_GETFD: c_int = 1;
+pub const F_SETFD: c_int = 2;
+pub const F_GETFL: c_int = 3;
+pub const F_SETFL: c_int = 4;
 pub const F_GETLK: c_int = F_GETLK64;
 pub const F_SETLK: c_int = F_SETLK64;
 pub const F_SETLKW: c_int = F_SETLKW64;
 pub const F_GETOWN: c_int = 8;
 pub const F_SETOWN: c_int = 9;
+pub const F_CLOSEM: c_int = 10;
+pub const F_GETLK64: c_int = 11;
+pub const F_SETLK64: c_int = 12;
+pub const F_SETLKW64: c_int = 13;
+pub const F_DUP2FD: c_int = 14;
+pub const F_TSTLK: c_int = 15;
 pub const AT_FDCWD: c_int = -2;
 pub const AT_SYMLINK_NOFOLLOW: c_int = 1;
 pub const AT_SYMLINK_FOLLOW: c_int = 2;
 pub const AT_REMOVEDIR: c_int = 1;
 pub const AT_EACCESS: c_int = 1;
-pub const F_DUPFD: c_int = 0;
-pub const F_GETFD: c_int = 1;
-pub const F_SETFD: c_int = 2;
-pub const F_GETFL: c_int = 3;
-pub const F_SETFL: c_int = 4;
 pub const O_SYNC: c_int = 16;
 pub const O_NONBLOCK: c_int = 4;
 pub const FASYNC: c_int = 0x20000;
@@ -754,25 +732,25 @@
 
 // locale.h
 pub const LC_GLOBAL_LOCALE: crate::locale_t = -1isize as crate::locale_t;
+pub const LC_COLLATE: c_int = 0;
 pub const LC_CTYPE: c_int = 1;
+pub const LC_MONETARY: c_int = 2;
 pub const LC_NUMERIC: c_int = 3;
 pub const LC_TIME: c_int = 4;
-pub const LC_COLLATE: c_int = 0;
-pub const LC_MONETARY: c_int = 2;
-pub const LC_MESSAGES: c_int = 4;
+pub const LC_MESSAGES: c_int = 5;
 pub const LC_ALL: c_int = -1;
+pub const LC_COLLATE_MASK: c_int = 1;
 pub const LC_CTYPE_MASK: c_int = 2;
+pub const LC_MESSAGES_MASK: c_int = 4;
+pub const LC_MONETARY_MASK: c_int = 8;
 pub const LC_NUMERIC_MASK: c_int = 16;
 pub const LC_TIME_MASK: c_int = 32;
-pub const LC_COLLATE_MASK: c_int = 1;
-pub const LC_MONETARY_MASK: c_int = 8;
-pub const LC_MESSAGES_MASK: c_int = 4;
-pub const LC_ALL_MASK: c_int = LC_CTYPE_MASK
-    | LC_NUMERIC_MASK
-    | LC_TIME_MASK
-    | LC_COLLATE_MASK
+pub const LC_ALL_MASK: c_int = LC_COLLATE_MASK
+    | LC_CTYPE_MASK
+    | LC_MESSAGES_MASK
     | LC_MONETARY_MASK
-    | LC_MESSAGES_MASK;
+    | LC_NUMERIC_MASK
+    | LC_TIME_MASK;
 
 // netdb.h
 pub const NI_MAXHOST: crate::socklen_t = 1025;
@@ -808,8 +786,11 @@
 pub const IPV6_CHECKSUM: c_int = 39;
 pub const IPV6_DONTFRAG: c_int = 45;
 pub const IPV6_DSTOPTS: c_int = 54;
-pub const IPV6_FLOWINFO_FLOWLABEL: c_int = 16777215;
-pub const IPV6_FLOWINFO_PRIORITY: c_int = 251658240;
+pub const IPV6_FLOWINFO_FLOWLABEL: c_int = 0x00ffffff;
+pub const IPV6_FLOWINFO_PRIORITY: c_int = 0x0f000000;
+pub const IPV6_FLOWINFO_PRIFLOW: c_int = 0x0fffffff;
+pub const IPV6_FLOWINFO_SRFLAG: c_int = 0x10000000;
+pub const IPV6_FLOWINFO_VERSION: c_int = 0xf0000000;
 pub const IPV6_HOPLIMIT: c_int = 40;
 pub const IPV6_HOPOPTS: c_int = 52;
 pub const IPV6_NEXTHOP: c_int = 48;
@@ -844,20 +825,20 @@
 pub const DLT_FDDI: c_int = 0xf;
 pub const DLT_ATM: c_int = 0x25;
 pub const DLT_IPOIB: c_int = 0xc7;
-pub const BIOCSETF: c_ulong = 0x80104267;
-pub const BIOCGRTIMEOUT: c_ulong = 0x4010426e;
-pub const BIOCGBLEN: c_int = 0x40044266;
-pub const BIOCSBLEN: c_int = 0xc0044266;
-pub const BIOCFLUSH: c_int = 0x20004268;
-pub const BIOCPROMISC: c_int = 0x20004269;
-pub const BIOCGDLT: c_int = 0x4004426a;
-pub const BIOCSRTIMEOUT: c_int = 0x8010426d;
-pub const BIOCGSTATS: c_int = 0x4008426f;
-pub const BIOCIMMEDIATE: c_int = 0x80044270;
-pub const BIOCVERSION: c_int = 0x40044271;
-pub const BIOCSDEVNO: c_int = 0x20004272;
-pub const BIOCGETIF: c_ulong = 0x4020426b;
-pub const BIOCSETIF: c_ulong = 0xffffffff8020426c;
+pub const BIOCSETF: c_long = -2146418073;
+pub const BIOCGRTIMEOUT: c_long = 1074807406;
+pub const BIOCGBLEN: c_long = 1074020966;
+pub const BIOCSBLEN: c_long = -1073462682;
+pub const BIOCFLUSH: c_long = 536887912;
+pub const BIOCPROMISC: c_long = 536887913;
+pub const BIOCGDLT: c_long = 1074020970;
+pub const BIOCSRTIMEOUT: c_long = -2146418067;
+pub const BIOCGSTATS: c_long = 1074283119;
+pub const BIOCIMMEDIATE: c_long = -2147204496;
+pub const BIOCVERSION: c_long = 1074020977;
+pub const BIOCSDEVNO: c_long = 536887922;
+pub const BIOCGETIF: c_long = 1075855979;
+pub const BIOCSETIF: c_long = -2145369492;
 pub const BPF_ABS: c_int = 32;
 pub const BPF_ADD: c_int = 0;
 pub const BPF_ALIGNMENT: c_ulong = 4;
@@ -1024,7 +1005,6 @@
 pub const IPPROTO_MH: c_int = 135;
 pub const IPPROTO_GIF: c_int = 140;
 pub const IPPROTO_RAW: c_int = 255;
-pub const IPPROTO_MAX: c_int = 256;
 pub const IP_OPTIONS: c_int = 1;
 pub const IP_HDRINCL: c_int = 2;
 pub const IP_TOS: c_int = 3;
@@ -1121,7 +1101,7 @@
 pub const TCP_NODELAYACK: c_int = 0x14;
 
 // pthread.h
-pub const PTHREAD_BARRIER_SERIAL_THREAD: c_int = -1;
+pub const PTHREAD_BARRIER_SERIAL_THREAD: c_int = 2;
 pub const PTHREAD_CREATE_JOINABLE: c_int = 0;
 pub const PTHREAD_CREATE_DETACHED: c_int = 1;
 pub const PTHREAD_PROCESS_SHARED: c_int = 0;
@@ -1163,17 +1143,18 @@
 pub const REG_ENOSYS: c_int = 17;
 
 // rpcsvc/mount.h
-pub const NFSMNT_ACDIRMAX: c_int = 2048;
-pub const NFSMNT_ACDIRMIN: c_int = 1024;
-pub const NFSMNT_ACREGMAX: c_int = 512;
-pub const NFSMNT_ACREGMIN: c_int = 256;
-pub const NFSMNT_INT: c_int = 64;
-pub const NFSMNT_NOAC: c_int = 128;
-pub const NFSMNT_RETRANS: c_int = 16;
-pub const NFSMNT_RSIZE: c_int = 4;
-pub const NFSMNT_SOFT: c_int = 1;
-pub const NFSMNT_TIMEO: c_int = 8;
-pub const NFSMNT_WSIZE: c_int = 2;
+pub const NFSMNT_SOFT: c_int = 0x001;
+pub const NFSMNT_WSIZE: c_int = 0x002;
+pub const NFSMNT_RSIZE: c_int = 0x004;
+pub const NFSMNT_TIMEO: c_int = 0x008;
+pub const NFSMNT_RETRANS: c_int = 0x010;
+pub const NFSMNT_HOSTNAME: c_int = 0x020;
+pub const NFSMNT_INT: c_int = 0x040;
+pub const NFSMNT_NOAC: c_int = 0x080;
+pub const NFSMNT_ACREGMIN: c_int = 0x0100;
+pub const NFSMNT_ACREGMAX: c_int = 0x0200;
+pub const NFSMNT_ACDIRMIN: c_int = 0x0400;
+pub const NFSMNT_ACDIRMAX: c_int = 0x0800;
 
 // rpcsvc/rstat.h
 pub const CPUSTATES: c_int = 4;
@@ -1276,35 +1257,19 @@
 pub const ENOCSI: c_int = 43;
 pub const EL2HLT: c_int = 44;
 pub const EDEADLK: c_int = 45;
+pub const ENOTREADY: c_int = 46;
+pub const EWRPROTECT: c_int = 47;
+pub const EFORMAT: c_int = 48;
 pub const ENOLCK: c_int = 49;
-pub const ECANCELED: c_int = 117;
-pub const ENOTSUP: c_int = 124;
-pub const EPROCLIM: c_int = 83;
-pub const EDQUOT: c_int = 88;
-pub const EOWNERDEAD: c_int = 95;
-pub const ENOTRECOVERABLE: c_int = 94;
-pub const ENOSTR: c_int = 123;
-pub const ENODATA: c_int = 122;
-pub const ETIME: c_int = 119;
-pub const ENOSR: c_int = 118;
-pub const EREMOTE: c_int = 93;
-pub const ENOATTR: c_int = 112;
-pub const ESAD: c_int = 113;
-pub const ENOTRUST: c_int = 114;
-pub const ENOLINK: c_int = 126;
-pub const EPROTO: c_int = 121;
-pub const EMULTIHOP: c_int = 125;
-pub const EBADMSG: c_int = 120;
-pub const ENAMETOOLONG: c_int = 86;
-pub const EOVERFLOW: c_int = 127;
-pub const EILSEQ: c_int = 116;
-pub const ENOSYS: c_int = 109;
-pub const ELOOP: c_int = 85;
-pub const ERESTART: c_int = 82;
-pub const ENOTEMPTY: c_int = 87;
-pub const EUSERS: c_int = 84;
+pub const ENOCONNECT: c_int = 50;
+pub const ESTALE: c_int = 52;
+pub const EDIST: c_int = 53;
+pub const EWOULDBLOCK: c_int = EAGAIN;
+pub const EINPROGRESS: c_int = 55;
+pub const EALREADY: c_int = 56;
 pub const ENOTSOCK: c_int = 57;
 pub const EDESTADDRREQ: c_int = 58;
+pub const EDESTADDREQ: c_int = EDESTADDRREQ;
 pub const EMSGSIZE: c_int = 59;
 pub const EPROTOTYPE: c_int = 60;
 pub const ENOPROTOOPT: c_int = 61;
@@ -1324,15 +1289,43 @@
 pub const EISCONN: c_int = 75;
 pub const ENOTCONN: c_int = 76;
 pub const ESHUTDOWN: c_int = 77;
-pub const ETOOMANYREFS: c_int = 115;
 pub const ETIMEDOUT: c_int = 78;
 pub const ECONNREFUSED: c_int = 79;
 pub const EHOSTDOWN: c_int = 80;
 pub const EHOSTUNREACH: c_int = 81;
-pub const EWOULDBLOCK: c_int = EAGAIN;
-pub const EALREADY: c_int = 56;
-pub const EINPROGRESS: c_int = 55;
-pub const ESTALE: c_int = 52;
+pub const ERESTART: c_int = 82;
+pub const EPROCLIM: c_int = 83;
+pub const EUSERS: c_int = 84;
+pub const ELOOP: c_int = 85;
+pub const ENAMETOOLONG: c_int = 86;
+pub const ENOTEMPTY: c_int = EEXIST;
+pub const EDQUOT: c_int = 88;
+pub const ECORRUPT: c_int = 89;
+pub const ESYSERROR: c_int = 90;
+pub const EREMOTE: c_int = 93;
+pub const ENOTRECOVERABLE: c_int = 94;
+pub const EOWNERDEAD: c_int = 95;
+// errnos 96-108 reserved for future use compatible with AIX PS/2
+pub const ENOSYS: c_int = 109;
+pub const EMEDIA: c_int = 110;
+pub const ESOFT: c_int = 111;
+pub const ENOATTR: c_int = 112;
+pub const ESAD: c_int = 113;
+pub const ENOTRUST: c_int = 114;
+pub const ETOOMANYREFS: c_int = 115;
+pub const EILSEQ: c_int = 116;
+pub const ECANCELED: c_int = 117;
+pub const ENOSR: c_int = 118;
+pub const ETIME: c_int = 119;
+pub const EBADMSG: c_int = 120;
+pub const EPROTO: c_int = 121;
+pub const ENODATA: c_int = 122;
+pub const ENOSTR: c_int = 123;
+pub const ECLONEME: c_int = ERESTART;
+pub const ENOTSUP: c_int = 124;
+pub const EMULTIHOP: c_int = 125;
+pub const ENOLINK: c_int = 126;
+pub const EOVERFLOW: c_int = 127;
 
 // sys/dr.h
 pub const LPAR_INFO_FORMAT1: c_int = 1;
@@ -1371,22 +1364,22 @@
 
 // sys/ioctl.h
 pub const IOCPARM_MASK: c_int = 0x7f;
-pub const IOC_VOID: c_int = 0x20000000;
-pub const IOC_OUT: c_int = 0x40000000;
-pub const IOC_IN: c_int = 0x40000000 << 1;
-pub const IOC_INOUT: c_int = IOC_IN | IOC_OUT;
-pub const FIOCLEX: c_int = 536897025;
-pub const FIONCLEX: c_int = 536897026;
-pub const FIONREAD: c_int = 1074030207;
-pub const FIONBIO: c_int = -2147195266;
-pub const FIOASYNC: c_int = -2147195267;
-pub const FIOSETOWN: c_int = -2147195268;
-pub const FIOGETOWN: c_int = 1074030203;
-pub const TIOCGETD: c_int = 0x40047400;
-pub const TIOCSETD: c_int = 0x80047401;
-pub const TIOCHPCL: c_int = 0x20007402;
-pub const TIOCMODG: c_int = 0x40047403;
-pub const TIOCMODS: c_int = 0x80047404;
+pub const IOC_VOID: c_long = 536870912;
+pub const IOC_OUT: c_long = 1073741824;
+pub const IOC_IN: c_long = -2147483648;
+pub const IOC_INOUT: c_long = IOC_IN | IOC_OUT;
+pub const FIOCLEX: c_long = 536897025;
+pub const FIONCLEX: c_long = 536897026;
+pub const FIONREAD: c_long = 1074030207;
+pub const FIONBIO: c_long = -2147195266;
+pub const FIOASYNC: c_long = -2147195267;
+pub const FIOSETOWN: c_long = -2147195268;
+pub const FIOGETOWN: c_long = 1074030203;
+pub const TIOCGETD: c_long = 1074033664;
+pub const TIOCSETD: c_long = -2147191807;
+pub const TIOCHPCL: c_long = 536900610;
+pub const TIOCMODG: c_long = 1074033667;
+pub const TIOCMODS: c_long = -2147191804;
 pub const TIOCM_LE: c_int = 0x1;
 pub const TIOCM_DTR: c_int = 0x2;
 pub const TIOCM_RTS: c_int = 0x4;
@@ -1398,46 +1391,46 @@
 pub const TIOCM_RNG: c_int = 0x80;
 pub const TIOCM_RI: c_int = 0x80;
 pub const TIOCM_DSR: c_int = 0x100;
-pub const TIOCGETP: c_int = 0x40067408;
-pub const TIOCSETP: c_int = 0x80067409;
-pub const TIOCSETN: c_int = 0x8006740a;
-pub const TIOCEXCL: c_int = 0x2000740d;
-pub const TIOCNXCL: c_int = 0x2000740e;
-pub const TIOCFLUSH: c_int = 0x80047410;
-pub const TIOCSETC: c_int = 0x80067411;
-pub const TIOCGETC: c_int = 0x40067412;
+pub const TIOCGETP: c_long = 1074164744;
+pub const TIOCSETP: c_long = -2147060727;
+pub const TIOCSETN: c_long = -2147060726;
+pub const TIOCEXCL: c_long = 536900621;
+pub const TIOCNXCL: c_long = 536900622;
+pub const TIOCFLUSH: c_long = -2147191792;
+pub const TIOCSETC: c_long = -2147060719;
+pub const TIOCGETC: c_long = 1074164754;
 pub const TANDEM: c_int = 0x1;
 pub const CBREAK: c_int = 0x2;
 pub const LCASE: c_int = 0x4;
 pub const MDMBUF: c_int = 0x800000;
 pub const XTABS: c_int = 0xc00;
-pub const SIOCADDMULTI: c_int = -2145359567;
-pub const SIOCADDRT: c_int = -2143784438;
-pub const SIOCDARP: c_int = -2142476000;
-pub const SIOCDELMULTI: c_int = -2145359566;
-pub const SIOCDELRT: c_int = -2143784437;
-pub const SIOCDIFADDR: c_int = -2144835303;
-pub const SIOCGARP: c_int = -1068734170;
-pub const SIOCGIFADDR: c_int = -1071093471;
-pub const SIOCGIFBRDADDR: c_int = -1071093469;
-pub const SIOCGIFCONF: c_int = -1072666299;
-pub const SIOCGIFDSTADDR: c_int = -1071093470;
-pub const SIOCGIFFLAGS: c_int = -1071093487;
-pub const SIOCGIFHWADDR: c_int = -1068209771;
-pub const SIOCGIFMETRIC: c_int = -1071093481;
-pub const SIOCGIFMTU: c_int = -1071093418;
-pub const SIOCGIFNETMASK: c_int = -1071093467;
-pub const SIOCSARP: c_int = -2142476002;
-pub const SIOCSIFADDR: c_int = -2144835316;
-pub const SIOCSIFBRDADDR: c_int = -2144835309;
-pub const SIOCSIFDSTADDR: c_int = -2144835314;
-pub const SIOCSIFFLAGS: c_int = -2144835312;
-pub const SIOCSIFMETRIC: c_int = -2144835304;
-pub const SIOCSIFMTU: c_int = -2144835240;
-pub const SIOCSIFNETMASK: c_int = -2144835306;
-pub const TIOCUCNTL: c_int = -2147191706;
-pub const TIOCCONS: c_int = -2147191710;
-pub const TIOCPKT: c_int = -2147191696;
+pub const SIOCADDMULTI: c_long = -2145359567;
+pub const SIOCADDRT: c_long = -2143784438;
+pub const SIOCDARP: c_long = -2142476000;
+pub const SIOCDELMULTI: c_long = -2145359566;
+pub const SIOCDELRT: c_long = -2143784437;
+pub const SIOCDIFADDR: c_long = -2144835303;
+pub const SIOCGARP: c_long = -1068734170;
+pub const SIOCGIFADDR: c_long = -1071093471;
+pub const SIOCGIFBRDADDR: c_long = -1071093469;
+pub const SIOCGIFCONF: c_long = -1072666299;
+pub const SIOCGIFDSTADDR: c_long = -1071093470;
+pub const SIOCGIFFLAGS: c_long = -1071093487;
+pub const SIOCGIFHWADDR: c_long = -1068209771;
+pub const SIOCGIFMETRIC: c_long = -1071093481;
+pub const SIOCGIFMTU: c_long = -1071093418;
+pub const SIOCGIFNETMASK: c_long = -1071093467;
+pub const SIOCSARP: c_long = -2142476002;
+pub const SIOCSIFADDR: c_long = -2144835316;
+pub const SIOCSIFBRDADDR: c_long = -2144835309;
+pub const SIOCSIFDSTADDR: c_long = -2144835314;
+pub const SIOCSIFFLAGS: c_long = -2144835312;
+pub const SIOCSIFMETRIC: c_long = -2144835304;
+pub const SIOCSIFMTU: c_long = -2144835240;
+pub const SIOCSIFNETMASK: c_long = -2144835306;
+pub const TIOCUCNTL: c_long = -2147191706;
+pub const TIOCCONS: c_long = -2147191710;
+pub const TIOCPKT: c_long = -2147191696;
 pub const TIOCPKT_DATA: c_int = 0;
 pub const TIOCPKT_FLUSHREAD: c_int = 1;
 pub const TIOCPKT_FLUSHWRITE: c_int = 2;
@@ -1463,9 +1456,13 @@
 pub const SHM_UNLOCK: c_int = 202;
 
 // sys/ldr.h
+pub const L_GETMESSAGES: c_int = 1;
 pub const L_GETINFO: c_int = 2;
-pub const L_GETMESSAGE: c_int = 1;
 pub const L_GETLIBPATH: c_int = 3;
+pub const L_GETKERNINFO: c_int = 4;
+pub const L_GETLIB32INFO: c_int = 5;
+pub const L_GETLIB64INFO: c_int = 6;
+pub const L_GETPROCINFO: c_int = 7;
 pub const L_GETXINFO: c_int = 8;
 
 // sys/limits.h
@@ -2097,31 +2094,31 @@
 pub const TCIOFF: c_int = 2;
 pub const TCION: c_int = 3;
 pub const TIOC: c_int = 0x5400;
-pub const TIOCGWINSZ: c_int = 0x40087468;
-pub const TIOCSWINSZ: c_int = 0x80087467;
-pub const TIOCLBIS: c_int = 0x8004747f;
-pub const TIOCLBIC: c_int = 0x8004747e;
-pub const TIOCLSET: c_int = 0x8004747d;
-pub const TIOCLGET: c_int = 0x4004747c;
-pub const TIOCSBRK: c_int = 0x2000747b;
-pub const TIOCCBRK: c_int = 0x2000747a;
-pub const TIOCSDTR: c_int = 0x20007479;
-pub const TIOCCDTR: c_int = 0x20007478;
-pub const TIOCSLTC: c_int = 0x80067475;
-pub const TIOCGLTC: c_int = 0x40067474;
-pub const TIOCOUTQ: c_int = 0x40047473;
-pub const TIOCNOTTY: c_int = 0x20007471;
-pub const TIOCSTOP: c_int = 0x2000746f;
-pub const TIOCSTART: c_int = 0x2000746e;
-pub const TIOCGPGRP: c_int = 0x40047477;
-pub const TIOCSPGRP: c_int = 0x80047476;
-pub const TIOCGSID: c_int = 0x40047448;
-pub const TIOCSTI: c_int = 0x80017472;
-pub const TIOCMSET: c_int = 0x8004746d;
-pub const TIOCMBIS: c_int = 0x8004746c;
-pub const TIOCMBIC: c_int = 0x8004746b;
-pub const TIOCMGET: c_int = 0x4004746a;
-pub const TIOCREMOTE: c_int = 0x80047469;
+pub const TIOCGWINSZ: c_long = 1074295912;
+pub const TIOCSWINSZ: c_long = -2146929561;
+pub const TIOCLBIS: c_long = -2147191681;
+pub const TIOCLBIC: c_long = -2147191682;
+pub const TIOCLSET: c_long = -2147191683;
+pub const TIOCLGET: c_long = 1074033788;
+pub const TIOCSBRK: c_long = 536900731;
+pub const TIOCCBRK: c_long = 536900730;
+pub const TIOCSDTR: c_long = 536900729;
+pub const TIOCCDTR: c_long = 536900728;
+pub const TIOCSLTC: c_long = -2147060619;
+pub const TIOCGLTC: c_long = 1074164852;
+pub const TIOCOUTQ: c_long = 1074033779;
+pub const TIOCNOTTY: c_long = 536900721;
+pub const TIOCSTOP: c_long = 536900719;
+pub const TIOCSTART: c_long = 536900718;
+pub const TIOCGPGRP: c_long = 1074033783;
+pub const TIOCSPGRP: c_long = -2147191690;
+pub const TIOCGSID: c_long = 1074033736;
+pub const TIOCSTI: c_long = -2147388302;
+pub const TIOCMSET: c_long = -2147191699;
+pub const TIOCMBIS: c_long = -2147191700;
+pub const TIOCMBIC: c_long = -2147191701;
+pub const TIOCMGET: c_long = 1074033770;
+pub const TIOCREMOTE: c_long = -2147191703;
 
 // sys/user.h
 pub const MAXCOMLEN: c_int = 32;
@@ -2133,9 +2130,9 @@
 pub const AT_UID: c_int = 4;
 
 // sys/wait.h
-pub const P_ALL: c_int = 0;
-pub const P_PID: c_int = 1;
-pub const P_PGID: c_int = 2;
+pub const P_ALL: idtype_t = 0;
+pub const P_PID: idtype_t = 1;
+pub const P_PGID: idtype_t = 2;
 pub const WNOHANG: c_int = 0x1;
 pub const WUNTRACED: c_int = 0x2;
 pub const WEXITED: c_int = 0x04;
@@ -2157,7 +2154,7 @@
 pub const CS7: crate::tcflag_t = 0x00000020;
 pub const CS8: crate::tcflag_t = 0x00000030;
 pub const CSTOPB: crate::tcflag_t = 0x00000040;
-pub const ECHO: crate::tcflag_t = 0x20000;
+pub const ECHO: crate::tcflag_t = 0x00000008;
 pub const ECHOE: crate::tcflag_t = 0x00000010;
 pub const ECHOK: crate::tcflag_t = 0x00000020;
 pub const ECHONL: crate::tcflag_t = 0x00000040;
@@ -2173,7 +2170,7 @@
 pub const INLCR: crate::tcflag_t = 0x00000040;
 pub const IGNCR: crate::tcflag_t = 0x00000080;
 pub const ICRNL: crate::tcflag_t = 0x00000100;
-pub const IXON: crate::tcflag_t = 0x0001;
+pub const IXON: crate::tcflag_t = 0x00000200;
 pub const IXOFF: crate::tcflag_t = 0x00000400;
 pub const IXANY: crate::tcflag_t = 0x00001000;
 pub const IMAXBEL: crate::tcflag_t = 0x00010000;
@@ -2426,7 +2423,7 @@
 pub const _SC_RAW_SOCKETS: c_int = 155;
 
 // utmp.h
-pub const EMPTY: c_short = -1;
+pub const EMPTY: c_short = 0;
 pub const RUN_LVL: c_short = 1;
 pub const BOOT_TIME: c_short = 2;
 pub const OLD_TIME: c_short = 3;
@@ -2442,7 +2439,7 @@
         if (*mhdr).msg_controllen as usize >= mem::size_of::<cmsghdr>() {
             (*mhdr).msg_control as *mut cmsghdr
         } else {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         }
     }
 
@@ -2453,7 +2450,7 @@
             if (cmsg as usize + (*cmsg).cmsg_len as usize + mem::size_of::<cmsghdr>())
                 > ((*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize)
             {
-                0 as *mut cmsghdr
+                core::ptr::null_mut::<cmsghdr>()
             } else {
                 // AIX does not have any alignment/padding for ancillary data, so we don't need _CMSG_ALIGN here.
                 (cmsg as usize + (*cmsg).cmsg_len as usize) as *mut cmsghdr
@@ -2579,109 +2576,249 @@
         parent: Option<unsafe extern "C" fn()>,
         child: Option<unsafe extern "C" fn()>,
     ) -> c_int;
+
+    pub fn pthread_attr_getdetachstate(
+        attr: *const crate::pthread_attr_t,
+        detachstate: *mut c_int,
+    ) -> c_int;
+
     pub fn pthread_attr_getguardsize(
         attr: *const crate::pthread_attr_t,
         guardsize: *mut size_t,
     ) -> c_int;
-    pub fn pthread_attr_setguardsize(attr: *mut crate::pthread_attr_t, guardsize: size_t) -> c_int;
+
+    pub fn pthread_attr_getinheritsched(
+        attr: *const crate::pthread_attr_t,
+        inheritsched: *mut c_int,
+    ) -> c_int;
+
     pub fn pthread_attr_getschedparam(
         attr: *const crate::pthread_attr_t,
         param: *mut sched_param,
     ) -> c_int;
+
+    pub fn pthread_attr_getstackaddr(
+        attr: *const crate::pthread_attr_t,
+        stackaddr: *mut *mut c_void,
+    ) -> c_int;
+
+    pub fn pthread_attr_getschedpolicy(
+        attr: *const crate::pthread_attr_t,
+        policy: *mut c_int,
+    ) -> c_int;
+
+    pub fn pthread_attr_getscope(
+        attr: *const crate::pthread_attr_t,
+        contentionscope: *mut c_int,
+    ) -> c_int;
+
     pub fn pthread_attr_getstack(
         attr: *const crate::pthread_attr_t,
         stackaddr: *mut *mut c_void,
         stacksize: *mut size_t,
     ) -> c_int;
+
+    pub fn pthread_attr_setguardsize(attr: *mut crate::pthread_attr_t, guardsize: size_t) -> c_int;
+
+    pub fn pthread_attr_setinheritsched(
+        attr: *mut crate::pthread_attr_t,
+        inheritsched: c_int,
+    ) -> c_int;
+
     pub fn pthread_attr_setschedparam(
         attr: *mut crate::pthread_attr_t,
         param: *const sched_param,
     ) -> c_int;
+
+    pub fn pthread_attr_setschedpolicy(attr: *mut crate::pthread_attr_t, policy: c_int) -> c_int;
+
+    pub fn pthread_attr_setscope(attr: *mut crate::pthread_attr_t, contentionscope: c_int)
+        -> c_int;
+
+    pub fn pthread_attr_setstack(
+        attr: *mut crate::pthread_attr_t,
+        stackaddr: *mut c_void,
+        stacksize: size_t,
+    ) -> c_int;
+
+    pub fn pthread_attr_setstackaddr(
+        attr: *mut crate::pthread_attr_t,
+        stackaddr: *mut c_void,
+    ) -> c_int;
+
+    pub fn pthread_barrierattr_destroy(attr: *mut crate::pthread_barrierattr_t) -> c_int;
+
+    pub fn pthread_barrierattr_getpshared(
+        attr: *const crate::pthread_barrierattr_t,
+        pshared: *mut c_int,
+    ) -> c_int;
+
+    pub fn pthread_barrierattr_init(attr: *mut crate::pthread_barrierattr_t) -> c_int;
+
+    pub fn pthread_barrierattr_setpshared(
+        attr: *mut crate::pthread_barrierattr_t,
+        pshared: c_int,
+    ) -> c_int;
+
     pub fn pthread_barrier_destroy(barrier: *mut pthread_barrier_t) -> c_int;
+
     pub fn pthread_barrier_init(
         barrier: *mut pthread_barrier_t,
         attr: *const crate::pthread_barrierattr_t,
         count: c_uint,
     ) -> c_int;
+
     pub fn pthread_barrier_wait(barrier: *mut pthread_barrier_t) -> c_int;
-    pub fn pthread_barrierattr_destroy(attr: *mut crate::pthread_barrierattr_t) -> c_int;
-    pub fn pthread_barrierattr_getpshared(
-        attr: *const crate::pthread_barrierattr_t,
-        shared: *mut c_int,
-    ) -> c_int;
-    pub fn pthread_barrierattr_init(attr: *mut crate::pthread_barrierattr_t) -> c_int;
-    pub fn pthread_barrierattr_setpshared(
-        attr: *mut crate::pthread_barrierattr_t,
-        shared: c_int,
-    ) -> c_int;
+
     pub fn pthread_cancel(thread: crate::pthread_t) -> c_int;
+
+    pub fn pthread_cleanup_pop(execute: c_int) -> c_void;
+
+    pub fn pthread_cleanup_push(
+        routine: Option<unsafe extern "C" fn(*mut c_void)>,
+        arg: *mut c_void,
+    ) -> c_void;
+
     pub fn pthread_condattr_getclock(
         attr: *const pthread_condattr_t,
         clock_id: *mut clockid_t,
     ) -> c_int;
+
     pub fn pthread_condattr_getpshared(
         attr: *const pthread_condattr_t,
         pshared: *mut c_int,
     ) -> c_int;
+
     pub fn pthread_condattr_setclock(
         attr: *mut pthread_condattr_t,
         clock_id: crate::clockid_t,
     ) -> c_int;
+
     pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t, pshared: c_int) -> c_int;
+
     pub fn pthread_create(
-        native: *mut crate::pthread_t,
+        thread: *mut crate::pthread_t,
         attr: *const crate::pthread_attr_t,
-        f: extern "C" fn(*mut c_void) -> *mut c_void,
-        value: *mut c_void,
+        start_routine: extern "C" fn(*mut c_void) -> *mut c_void,
+        arg: *mut c_void,
     ) -> c_int;
-    pub fn pthread_getattr_np(native: crate::pthread_t, attr: *mut crate::pthread_attr_t) -> c_int;
-    pub fn pthread_getcpuclockid(thread: crate::pthread_t, clk_id: *mut crate::clockid_t) -> c_int;
+
+    pub fn pthread_getconcurrency() -> c_int;
+
+    pub fn pthread_getcpuclockid(
+        thread_id: crate::pthread_t,
+        clock_id: *mut crate::clockid_t,
+    ) -> c_int;
+
     pub fn pthread_getschedparam(
         thread: crate::pthread_t,
         policy: *mut c_int,
         param: *mut sched_param,
     ) -> c_int;
-    pub fn pthread_kill(thread: crate::pthread_t, signal: c_int) -> c_int;
-    pub fn pthread_mutex_consistent(mutex: *mut crate::pthread_mutex_t) -> c_int;
-    pub fn pthread_mutex_timedlock(
-        lock: *mut pthread_mutex_t,
-        abstime: *const crate::timespec,
+
+    pub fn pthread_kill(thread: crate::pthread_t, sig: c_int) -> c_int;
+
+    pub fn pthread_mutexattr_getprioceiling(
+        attr: *const crate::pthread_mutexattr_t,
+        prioceiling: *mut c_int,
     ) -> c_int;
+
     pub fn pthread_mutexattr_getprotocol(
         attr: *const pthread_mutexattr_t,
         protocol: *mut c_int,
     ) -> c_int;
+
     pub fn pthread_mutexattr_getpshared(
         attr: *const pthread_mutexattr_t,
         pshared: *mut c_int,
     ) -> c_int;
+
     pub fn pthread_mutexattr_getrobust(
-        attr: *mut crate::pthread_mutexattr_t,
+        attr: *const crate::pthread_mutexattr_t,
         robust: *mut c_int,
     ) -> c_int;
+
+    pub fn pthread_mutexattr_gettype(
+        attr: *const crate::pthread_mutexattr_t,
+        _type: *mut c_int,
+    ) -> c_int;
+
+    pub fn pthread_mutexattr_setprioceiling(
+        attr: *mut crate::pthread_mutexattr_t,
+        prioceiling: c_int,
+    ) -> c_int;
+
     pub fn pthread_mutexattr_setprotocol(attr: *mut pthread_mutexattr_t, protocol: c_int) -> c_int;
+
     pub fn pthread_mutexattr_setpshared(attr: *mut pthread_mutexattr_t, pshared: c_int) -> c_int;
+
     pub fn pthread_mutexattr_setrobust(
         attr: *mut crate::pthread_mutexattr_t,
         robust: c_int,
     ) -> c_int;
+
+    pub fn pthread_mutex_consistent(mutex: *mut crate::pthread_mutex_t) -> c_int;
+
+    pub fn pthread_mutex_getprioceiling(
+        mutex: *const crate::pthread_mutex_t,
+        prioceiling: *mut c_int,
+    ) -> c_int;
+
+    pub fn pthread_mutex_setprioceiling(
+        mutex: *mut crate::pthread_mutex_t,
+        prioceiling: c_int,
+        old_ceiling: *mut c_int,
+    ) -> c_int;
+
+    pub fn pthread_mutex_timedlock(
+        mutex: *mut pthread_mutex_t,
+        abstime: *const crate::timespec,
+    ) -> c_int;
+
+    pub fn pthread_once(
+        once_control: *mut crate::pthread_once_t,
+        init_routine: Option<unsafe extern "C" fn()>,
+    ) -> c_int;
+
     pub fn pthread_rwlockattr_getpshared(
         attr: *const pthread_rwlockattr_t,
-        val: *mut c_int,
+        pshared: *mut c_int,
     ) -> c_int;
-    pub fn pthread_rwlockattr_setpshared(attr: *mut pthread_rwlockattr_t, val: c_int) -> c_int;
+
+    pub fn pthread_rwlockattr_setpshared(attr: *mut pthread_rwlockattr_t, pshared: c_int) -> c_int;
+
+    pub fn pthread_rwlock_timedrdlock(
+        rwlock: *mut crate::pthread_rwlock_t,
+        abstime: *const crate::timespec,
+    ) -> c_int;
+
+    pub fn pthread_rwlock_timedwrlock(
+        rwlock: *mut crate::pthread_rwlock_t,
+        abstime: *const crate::timespec,
+    ) -> c_int;
+
+    pub fn pthread_setcancelstate(state: c_int, oldstate: *mut c_int) -> c_int;
+    pub fn pthread_setcanceltype(_type: c_int, oldtype: *mut c_int) -> c_int;
+
+    pub fn pthread_setconcurrency(new_level: c_int) -> c_int;
+
     pub fn pthread_setschedparam(
         thread: crate::pthread_t,
         policy: c_int,
         param: *const sched_param,
     ) -> c_int;
-    pub fn pthread_setschedprio(native: crate::pthread_t, priority: c_int) -> c_int;
-    pub fn pthread_sigmask(how: c_int, set: *const sigset_t, oldset: *mut sigset_t) -> c_int;
+
+    pub fn pthread_setschedprio(thread: crate::pthread_t, prio: c_int) -> c_int;
+
+    pub fn pthread_sigmask(how: c_int, set: *const sigset_t, oset: *mut sigset_t) -> c_int;
+
     pub fn pthread_spin_destroy(lock: *mut pthread_spinlock_t) -> c_int;
     pub fn pthread_spin_init(lock: *mut pthread_spinlock_t, pshared: c_int) -> c_int;
     pub fn pthread_spin_lock(lock: *mut pthread_spinlock_t) -> c_int;
     pub fn pthread_spin_trylock(lock: *mut pthread_spinlock_t) -> c_int;
     pub fn pthread_spin_unlock(lock: *mut pthread_spinlock_t) -> c_int;
+
+    pub fn pthread_testcancel() -> c_void;
 }
 
 #[link(name = "iconv")]
@@ -2698,14 +2835,25 @@
 }
 
 extern "C" {
-    pub fn acct(filename: *const c_char) -> c_int;
+    pub fn acct(filename: *mut c_char) -> c_int;
+    #[link_name = "_posix_aio_cancel"]
     pub fn aio_cancel(fildes: c_int, aiocbp: *mut crate::aiocb) -> c_int;
-    pub fn aio_error(aiocbp: *mut crate::aiocb) -> c_int;
+    #[link_name = "_posix_aio_error"]
+    pub fn aio_error(aiocbp: *const crate::aiocb) -> c_int;
     #[link_name = "_posix_aio_fsync"]
     pub fn aio_fsync(op: c_int, aiocbp: *mut crate::aiocb) -> c_int;
+    #[link_name = "_posix_aio_read"]
     pub fn aio_read(aiocbp: *mut crate::aiocb) -> c_int;
-    // pub fn aio_suspend
-    // pub fn aio_write
+    #[link_name = "_posix_aio_return"]
+    pub fn aio_return(aiocbp: *mut crate::aiocb) -> ssize_t;
+    #[link_name = "_posix_aio_suspend"]
+    pub fn aio_suspend(
+        list: *const *const crate::aiocb,
+        nent: c_int,
+        timeout: *const crate::timespec,
+    ) -> c_int;
+    #[link_name = "_posix_aio_write"]
+    pub fn aio_write(aiocbp: *mut crate::aiocb) -> c_int;
     pub fn basename(path: *mut c_char) -> *mut c_char;
     pub fn bind(
         socket: c_int,
@@ -2771,6 +2919,7 @@
     pub fn getdtablesize() -> c_int;
     pub fn getgrent() -> *mut crate::group;
     pub fn getgrgid(gid: crate::gid_t) -> *mut crate::group;
+    #[link_name = "_posix_getgrgid_r"]
     pub fn getgrgid_r(
         gid: crate::gid_t,
         grp: *mut crate::group,
@@ -2779,14 +2928,15 @@
         result: *mut *mut crate::group,
     ) -> c_int;
     pub fn getgrnam(name: *const c_char) -> *mut crate::group;
+    #[link_name = "_posix_getgrnam_r"]
     pub fn getgrnam_r(
         name: *const c_char,
         grp: *mut crate::group,
         buf: *mut c_char,
-        buflen: size_t,
+        buflen: c_int,
         result: *mut *mut crate::group,
     ) -> c_int;
-    pub fn getgrset(user: *mut c_char) -> *mut c_char;
+    pub fn getgrset(user: *const c_char) -> *mut c_char;
     pub fn gethostid() -> c_long;
     pub fn getmntent(stream: *mut crate::FILE) -> *mut crate::mntent;
     pub fn getnameinfo(
@@ -2799,9 +2949,9 @@
         flags: c_int,
     ) -> c_int;
     pub fn getpagesize() -> c_int;
-    pub fn getpeereid(socket: c_int, euid: *mut crate::uid_t, egid: *mut crate::gid_t) -> c_int;
     pub fn getpriority(which: c_int, who: crate::id_t) -> c_int;
     pub fn getpwent() -> *mut crate::passwd;
+    #[link_name = "_posix_getpwnam_r"]
     pub fn getpwnam_r(
         name: *const c_char,
         pwd: *mut passwd,
@@ -2809,6 +2959,7 @@
         buflen: size_t,
         result: *mut *mut passwd,
     ) -> c_int;
+    #[link_name = "_posix_getpwuid_r"]
     pub fn getpwuid_r(
         uid: crate::uid_t,
         pwd: *mut passwd,
@@ -2836,7 +2987,7 @@
     pub fn hasmntopt(mnt: *const crate::mntent, opt: *const c_char) -> *mut c_char;
     pub fn hcreate(nelt: size_t) -> c_int;
     pub fn hdestroy();
-    pub fn hsearch(entry: entry, action: c_int) -> *mut entry;
+    pub fn hsearch(entry: entry, action: ACTION) -> *mut entry;
     pub fn if_freenameindex(ptr: *mut if_nameindex);
     pub fn if_nameindex() -> *mut if_nameindex;
     pub fn initgroups(name: *const c_char, basegid: crate::gid_t) -> c_int;
@@ -2850,13 +3001,14 @@
         width: size_t,
         compar: Option<unsafe extern "C" fn(*const c_void, *const c_void) -> c_int>,
     ) -> *mut c_void;
+    #[link_name = "_posix_lio_listio"]
     pub fn lio_listio(
         mode: c_int,
         aiocb_list: *const *mut aiocb,
-        nitems: c_int,
+        nent: c_int,
         sevp: *mut sigevent,
     ) -> c_int;
-    pub fn loadquery(flags: c_int, buf: *mut c_char, buflen: c_uint) -> c_int;
+    pub fn loadquery(flags: c_int, buf: *mut c_void, buflen: c_uint, ...) -> c_int;
     pub fn lpar_get_info(command: c_int, buf: *mut c_void, bufsize: size_t) -> c_int;
     pub fn lpar_set_resources(id: c_int, resource: *mut c_void) -> c_int;
     pub fn lrand48() -> c_long;
@@ -2869,7 +3021,7 @@
     ) -> *mut c_void;
     pub fn lseek64(fd: c_int, offset: off64_t, whence: c_int) -> off64_t;
     pub fn lstat64(path: *const c_char, buf: *mut stat64) -> c_int;
-    pub fn madvise(addr: *mut c_void, len: size_t, advice: c_int) -> c_int;
+    pub fn madvise(addr: caddr_t, len: size_t, advice: c_int) -> c_int;
     pub fn makecontext(ucp: *mut crate::ucontext_t, func: extern "C" fn(), argc: c_int, ...);
     pub fn mallinfo() -> crate::mallinfo;
     pub fn mallopt(param: c_int, value: c_int) -> c_int;
@@ -2880,11 +3032,9 @@
         needlelen: size_t,
     ) -> *mut c_void;
     pub fn memset_s(s: *mut c_void, smax: size_t, c: c_int, n: size_t) -> c_int;
-    pub fn mincore(addr: *const c_void, len: size_t, vec: *mut c_char) -> c_int;
-    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int;
-    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t)
-        -> c_int;
-    pub fn mount(device: *const c_char, path: *const c_char, flags: c_int) -> c_int;
+    pub fn mincore(addr: caddr_t, len: size_t, vec: *mut c_char) -> c_int;
+    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int;
+    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int;
     pub fn mprotect(addr: *mut c_void, len: size_t, prot: c_int) -> c_int;
     pub fn mq_close(mqd: crate::mqd_t) -> c_int;
     pub fn mq_getattr(mqd: crate::mqd_t, attr: *mut crate::mq_attr) -> c_int;
@@ -2977,7 +3127,7 @@
         fd: c_int,
         path: *const c_char,
         oflag: c_int,
-        mode: crate::mode_t,
+        mode: mode_t,
     ) -> c_int;
     pub fn posix_spawn_file_actions_destroy(actions: *mut posix_spawn_file_actions_t) -> c_int;
     pub fn posix_spawn_file_actions_init(actions: *mut posix_spawn_file_actions_t) -> c_int;
@@ -3028,7 +3178,7 @@
         envp: *const *mut c_char,
     ) -> c_int;
     pub fn pread64(fd: c_int, buf: *mut c_void, count: size_t, offset: off64_t) -> ssize_t;
-    pub fn preadv(fd: c_int, iov: *const crate::iovec, iovcnt: c_int, offset: off_t) -> ssize_t;
+    pub fn preadv(fd: c_int, iov: *const crate::iovec, iovcnt: c_int, offset: offset_t) -> ssize_t;
     pub fn ptrace64(
         request: c_int,
         id: c_longlong,
@@ -3039,11 +3189,13 @@
     pub fn pututline(u: *const utmp) -> *mut utmp;
     pub fn pututxline(ut: *const utmpx) -> *mut utmpx;
     pub fn pwrite64(fd: c_int, buf: *const c_void, count: size_t, offset: off64_t) -> ssize_t;
-    pub fn pwritev(fd: c_int, iov: *const crate::iovec, iovcnt: c_int, offset: off_t) -> ssize_t;
-    #[link_name = "__linux_quotactl"]
-    pub fn quotactl(cmd: c_int, special: *const c_char, id: c_int, data: *mut c_char) -> c_int;
+    pub fn pwritev(fd: c_int, iov: *const crate::iovec, iovcnt: c_int, offset: offset_t)
+        -> ssize_t;
+    pub fn quotactl(cmd: *mut c_char, special: c_int, id: c_int, data: caddr_t) -> c_int;
     pub fn rand() -> c_int;
     pub fn readv(fd: c_int, iov: *const crate::iovec, iovcnt: c_int) -> ssize_t;
+    // AIX header socket.h maps recvfrom() to nrecvfrom()
+    #[link_name = "nrecvfrom"]
     pub fn recvfrom(
         socket: c_int,
         buf: *mut c_void,
@@ -3052,13 +3204,8 @@
         addr: *mut crate::sockaddr,
         addrlen: *mut crate::socklen_t,
     ) -> ssize_t;
-    pub fn recvmmsg(
-        sockfd: c_int,
-        msgvec: *mut crate::mmsghdr,
-        vlen: c_uint,
-        flags: c_int,
-        timeout: *mut crate::timespec,
-    ) -> c_int;
+    // AIX header socket.h maps recvmsg() to nrecvmsg().
+    #[link_name = "nrecvmsg"]
     pub fn recvmsg(sockfd: c_int, msg: *mut msghdr, flags: c_int) -> ssize_t;
     pub fn regcomp(preg: *mut regex_t, pattern: *const c_char, cflags: c_int) -> c_int;
     pub fn regerror(
@@ -3087,14 +3234,6 @@
         policy: c_int,
         param: *const crate::sched_param,
     ) -> c_int;
-    pub fn sctp_opt_info(
-        sd: c_int,
-        id: crate::sctp_assoc_t,
-        opt: c_int,
-        arg_size: *mut c_void,
-        size: *mut size_t,
-    ) -> c_int;
-    pub fn sctp_peeloff(s: c_int, id: crate::sctp_assoc_t) -> c_int;
     pub fn seed48(xseed: *mut c_ushort) -> *mut c_ushort;
     pub fn seekdir(dirp: *mut crate::DIR, loc: c_long);
     pub fn sem_close(sem: *mut sem_t) -> c_int;
@@ -3108,20 +3247,19 @@
     pub fn semget(key: crate::key_t, nsems: c_int, semflag: c_int) -> c_int;
     pub fn semop(semid: c_int, sops: *mut sembuf, nsops: size_t) -> c_int;
     pub fn send_file(socket: *mut c_int, iobuf: *mut sf_parms, flags: c_uint) -> ssize_t;
-    pub fn sendmmsg(sockfd: c_int, msgvec: *mut mmsghdr, vlen: c_uint, flags: c_int) -> c_int;
+    // AIX header socket.h maps sendmsg() to nsendmsg().
+    #[link_name = "nsendmsg"]
     pub fn sendmsg(sockfd: c_int, msg: *const msghdr, flags: c_int) -> ssize_t;
     pub fn setcontext(ucp: *const ucontext_t) -> c_int;
-    pub fn setdomainname(name: *const c_char, len: c_int) -> c_int;
-    pub fn setgroups(ngroups: c_int, ptr: *const crate::gid_t) -> c_int;
+    pub fn setdomainname(name: *mut c_char, len: c_int) -> c_int;
+    pub fn setgroups(ngroups: c_int, ptr: *mut crate::gid_t) -> c_int;
     pub fn setgrent();
-    pub fn sethostid(hostid: c_int) -> c_int;
-    pub fn sethostname(name: *const c_char, len: c_int) -> c_int;
     pub fn setmntent(filename: *const c_char, ty: *const c_char) -> *mut crate::FILE;
     pub fn setpriority(which: c_int, who: id_t, priority: c_int) -> c_int;
     pub fn setpwent();
     pub fn setrlimit(resource: c_int, rlim: *const crate::rlimit) -> c_int;
     pub fn setrlimit64(resource: c_int, rlim: *const rlimit64) -> c_int;
-    pub fn settimeofday(tv: *const crate::timeval, tz: *const crate::timezone) -> c_int;
+    pub fn settimeofday(tv: *mut crate::timeval, tz: *mut crate::timezone) -> c_int;
     pub fn setitimer(
         which: c_int,
         new_value: *const crate::itimerval,
@@ -3142,17 +3280,16 @@
     pub fn shmdt(shmaddr: *const c_void) -> c_int;
     pub fn shmctl(shmid: c_int, cmd: c_int, buf: *mut crate::shmid_ds) -> c_int;
     pub fn shmget(key: key_t, size: size_t, shmflg: c_int) -> c_int;
-    pub fn shm_open(name: *const c_char, oflag: c_int, mode: crate::mode_t) -> c_int;
+    pub fn shm_open(name: *const c_char, oflag: c_int, mode: mode_t) -> c_int;
     pub fn shm_unlink(name: *const c_char) -> c_int;
-    pub fn splice(socket1: c_int, socket2: c_int, flags: c_int) -> c_int;
     pub fn srand(seed: c_uint);
     pub fn srand48(seed: c_long);
     pub fn stat64(path: *const c_char, buf: *mut stat64) -> c_int;
     pub fn stat64at(dirfd: c_int, path: *const c_char, buf: *mut stat64, flags: c_int) -> c_int;
-    pub fn statfs(path: *const c_char, buf: *mut statfs) -> c_int;
-    pub fn statfs64(path: *const c_char, buf: *mut statfs64) -> c_int;
+    pub fn statfs(path: *mut c_char, buf: *mut statfs) -> c_int;
+    pub fn statfs64(path: *mut c_char, buf: *mut statfs64) -> c_int;
     pub fn statvfs64(path: *const c_char, buf: *mut statvfs64) -> c_int;
-    pub fn statx(path: *const c_char, buf: *mut stat, length: c_int, command: c_int) -> c_int;
+    pub fn statx(path: *mut c_char, buf: *mut stat, length: c_int, command: c_int) -> c_int;
     pub fn strcasecmp_l(
         string1: *const c_char,
         string2: *const c_char,
@@ -3174,8 +3311,8 @@
     pub fn strptime(s: *const c_char, format: *const c_char, tm: *mut crate::tm) -> *mut c_char;
     pub fn strsep(string: *mut *mut c_char, delim: *const c_char) -> *mut c_char;
     pub fn swapcontext(uocp: *mut ucontext_t, ucp: *const ucontext_t) -> c_int;
-    pub fn swapoff(puath: *const c_char) -> c_int;
-    pub fn swapon(path: *const c_char) -> c_int;
+    pub fn swapoff(puath: *mut c_char) -> c_int;
+    pub fn swapon(path: *mut c_char) -> c_int;
     pub fn sync();
     pub fn telldir(dirp: *mut crate::DIR) -> c_long;
     pub fn timer_create(
@@ -3194,9 +3331,9 @@
     ) -> c_int;
     pub fn truncate64(path: *const c_char, length: off64_t) -> c_int;
     pub fn uname(buf: *mut crate::utsname) -> c_int;
-    pub fn updwtmp(file: *const c_char, u: *mut utmp);
+    pub fn updwtmp(file: *const c_char, u: *const utmp);
     pub fn uselocale(loc: crate::locale_t) -> crate::locale_t;
-    pub fn utmpname(file: *const c_char) -> c_int;
+    pub fn utmpname(file: *mut c_char) -> c_int;
     pub fn utimensat(
         dirfd: c_int,
         path: *const c_char,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/powerpc64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/powerpc64.rs
index fcb9e6e..f379e2df 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/powerpc64.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/powerpc64.rs
@@ -29,7 +29,7 @@
         pub f_files: crate::fsfilcnt_t,
         pub f_ffree: crate::fsfilcnt_t,
         pub f_favail: crate::fsfilcnt_t,
-        pub f_fsid: c_ulong,
+        pub f_fsid: crate::fsid_t,
         pub f_basetype: [c_char; 16],
         pub f_flag: c_ulong,
         pub f_namemax: c_ulong,
@@ -49,6 +49,10 @@
         __mt_word: [c_long; 8],
     }
 
+    pub struct pthread_once_t {
+        __on_word: [c_long; 9],
+    }
+
     pub struct stat {
         pub st_dev: crate::dev_t,
         pub st_ino: crate::ino_t,
@@ -59,9 +63,9 @@
         pub st_gid: crate::gid_t,
         pub st_rdev: crate::dev_t,
         pub st_ssize: c_int,
-        pub st_atime: crate::st_timespec,
-        pub st_mtime: crate::st_timespec,
-        pub st_ctime: crate::st_timespec,
+        pub st_atim: crate::st_timespec,
+        pub st_mtim: crate::st_timespec,
+        pub st_ctim: crate::st_timespec,
         pub st_blksize: crate::blksize_t,
         pub st_blocks: crate::blkcnt_t,
         pub st_vfstype: c_int,
@@ -112,20 +116,47 @@
         pub aio_sigev_tid: c_long,
     }
 
-    pub struct ucontext_t {
-        pub __sc_onstack: c_int,
-        pub uc_sigmask: crate::sigset_t,
-        pub __sc_uerror: c_int,
-        pub uc_mcontext: crate::mcontext_t,
-        pub uc_link: *mut ucontext_t,
-        pub uc_stack: crate::stack_t,
-        // Should be pointer to __extctx_t
-        pub __extctx: *mut c_void,
-        pub __extctx_magic: c_int,
-        pub __pad: [c_int; 1],
+    pub struct __vmxreg_t {
+        __v: [c_uint; 4],
     }
 
-    pub struct mcontext_t {
+    pub struct __vmx_context_t {
+        pub __vr: [crate::__vmxreg_t; 32],
+        pub __pad1: [c_uint; 3],
+        pub __vscr: c_uint,
+        pub __vrsave: c_uint,
+        pub __pad2: [c_uint; 3],
+    }
+
+    pub struct __vsx_context_t {
+        pub __vsr_dw1: [c_ulonglong; 32],
+    }
+
+    pub struct __tm_context_t {
+        pub vmx: crate::__vmx_context_t,
+        pub vsx: crate::__vsx_context_t,
+        pub gpr: [c_ulonglong; 32],
+        pub lr: c_ulonglong,
+        pub ctr: c_ulonglong,
+        pub cr: c_uint,
+        pub xer: c_uint,
+        pub amr: c_ulonglong,
+        pub texasr: c_ulonglong,
+        pub tfiar: c_ulonglong,
+        pub tfhar: c_ulonglong,
+        pub ppr: c_ulonglong,
+        pub dscr: c_ulonglong,
+        pub tar: c_ulonglong,
+        pub fpscr: c_uint,
+        pub fpscrx: c_uint,
+        pub fpr: [fpreg_t; 32],
+        pub tmcontext: c_char,
+        pub tmstate: c_char,
+        pub prevowner: c_char,
+        pub pad: [c_char; 5],
+    }
+
+    pub struct __context64 {
         pub gpr: [c_ulonglong; 32],
         pub msr: c_ulonglong,
         pub iar: c_ulonglong,
@@ -136,8 +167,7 @@
         pub fpscr: c_uint,
         pub fpscrx: c_uint,
         pub except: [c_ulonglong; 1],
-        // Should be array of double type
-        pub fpr: [crate::uint64_t; 32],
+        pub fpr: [fpreg_t; 32],
         pub fpeu: c_char,
         pub fpinfo: c_char,
         pub fpscr24_31: c_char,
@@ -145,6 +175,33 @@
         pub excp_type: c_int,
     }
 
+    pub struct mcontext_t {
+        pub jmp_context: __context64,
+    }
+
+    pub struct __extctx_t {
+        pub __flags: c_uint,
+        pub __rsvd1: [c_uint; 3],
+        pub __vmx: crate::__vmx_context_t,
+        pub __ukeys: [c_uint; 2],
+        pub __vsx: crate::__vsx_context_t,
+        pub __tm: crate::__tm_context_t,
+        pub __reserved: [c_char; 1860],
+        pub __extctx_magic: c_int,
+    }
+
+    pub struct ucontext_t {
+        pub __sc_onstack: c_int,
+        pub uc_sigmask: crate::sigset_t,
+        pub __sc_uerror: c_int,
+        pub uc_mcontext: crate::mcontext_t,
+        pub uc_link: *mut ucontext_t,
+        pub uc_stack: crate::stack_t,
+        pub __extctx: *mut crate::__extctx_t,
+        pub __extctx_magic: c_int,
+        pub __pad: [c_int; 1],
+    }
+
     pub struct utmpx {
         pub ut_user: [c_char; 256],
         pub ut_id: [c_char; 14],
@@ -199,70 +256,6 @@
         pub __pad: [c_int; 3],
     }
 
-    pub union _kernel_simple_lock {
-        pub _slock: c_long,
-        // Should be pointer to 'lock_data_instrumented'
-        pub _slockp: *mut c_void,
-    }
-
-    pub struct fileops_t {
-        pub fo_rw: extern "C" fn(
-            file: *mut file,
-            rw: crate::uio_rw,
-            io: *mut c_void,
-            ext: c_long,
-            secattr: *mut c_void,
-        ) -> c_int,
-        pub fo_ioctl: extern "C" fn(
-            file: *mut file,
-            a: c_long,
-            b: crate::caddr_t,
-            c: c_long,
-            d: c_long,
-        ) -> c_int,
-        pub fo_select:
-            extern "C" fn(file: *mut file, a: c_int, b: *mut c_ushort, c: extern "C" fn()) -> c_int,
-        pub fo_close: extern "C" fn(file: *mut file) -> c_int,
-        pub fo_fstat: extern "C" fn(file: *mut file, sstat: *mut crate::stat) -> c_int,
-    }
-
-    pub struct file {
-        pub f_flag: c_long,
-        pub f_count: c_int,
-        pub f_options: c_short,
-        pub f_type: c_short,
-        // Should be pointer to 'vnode'
-        pub f_data: *mut c_void,
-        pub f_offset: c_longlong,
-        pub f_dir_off: c_long,
-        // Should be pointer to 'cred'
-        pub f_cred: *mut c_void,
-        pub f_lock: _kernel_simple_lock,
-        pub f_offset_lock: _kernel_simple_lock,
-        pub f_vinfo: crate::caddr_t,
-        pub f_ops: *mut fileops_t,
-        pub f_parentp: crate::caddr_t,
-        pub f_fnamep: crate::caddr_t,
-        pub f_fdata: [c_char; 160],
-    }
-
-    pub union __ld_info_file {
-        pub _ldinfo_fd: c_int,
-        pub _ldinfo_fp: *mut file,
-        pub _core_offset: c_long,
-    }
-
-    pub struct ld_info {
-        pub ldinfo_next: c_uint,
-        pub ldinfo_flags: c_uint,
-        pub _file: __ld_info_file,
-        pub ldinfo_textorg: *mut c_void,
-        pub ldinfo_textsize: c_ulong,
-        pub ldinfo_dataorg: *mut c_void,
-        pub ldinfo_datasize: c_ulong,
-        pub ldinfo_filename: [c_char; 2],
-    }
-
     pub union __pollfd_ext_u {
         pub addr: *mut c_void,
         pub data32: u32,
@@ -271,10 +264,14 @@
 
     pub struct pollfd_ext {
         pub fd: c_int,
-        pub events: c_ushort,
-        pub revents: c_ushort,
+        pub events: c_short,
+        pub revents: c_short,
         pub data: __pollfd_ext_u,
     }
+
+    pub struct fpreg_t {
+        pub d: c_double,
+    }
 }
 
 impl siginfo_t {
@@ -316,22 +313,6 @@
             }
         }
         impl Eq for siginfo_t {}
-        impl fmt::Debug for siginfo_t {
-            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-                f.debug_struct("siginfo_t")
-                    .field("si_signo", &self.si_signo)
-                    .field("si_errno", &self.si_errno)
-                    .field("si_code", &self.si_code)
-                    .field("si_pid", &self.si_pid)
-                    .field("si_uid", &self.si_uid)
-                    .field("si_status", &self.si_status)
-                    .field("si_addr", &self.si_addr)
-                    .field("si_band", &self.si_band)
-                    .field("si_value", &self.si_value)
-                    .field("__si_flags", &self.__si_flags)
-                    .finish()
-            }
-        }
         impl hash::Hash for siginfo_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.si_signo.hash(state);
@@ -346,174 +327,6 @@
                 self.__si_flags.hash(state);
             }
         }
-
-        impl PartialEq for _kernel_simple_lock {
-            fn eq(&self, other: &_kernel_simple_lock) -> bool {
-                unsafe { self._slock == other._slock && self._slockp == other._slockp }
-            }
-        }
-        impl Eq for _kernel_simple_lock {}
-        impl hash::Hash for _kernel_simple_lock {
-            fn hash<H: hash::Hasher>(&self, state: &mut H) {
-                unsafe {
-                    self._slock.hash(state);
-                    self._slockp.hash(state);
-                }
-            }
-        }
-
-        impl PartialEq for fileops_t {
-            fn eq(&self, other: &fileops_t) -> bool {
-                self.fo_rw == other.fo_rw
-                    && self.fo_ioctl == other.fo_ioctl
-                    && self.fo_select == other.fo_select
-                    && self.fo_close == other.fo_close
-                    && self.fo_fstat == other.fo_fstat
-            }
-        }
-        impl Eq for fileops_t {}
-        impl fmt::Debug for fileops_t {
-            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-                f.debug_struct("fileops_t")
-                    .field("fo_rw", &self.fo_rw)
-                    .field("fo_ioctl", &self.fo_ioctl)
-                    .field("fo_select", &self.fo_select)
-                    .field("fo_close", &self.fo_close)
-                    .field("fo_fstat", &self.fo_fstat)
-                    .finish()
-            }
-        }
-        impl hash::Hash for fileops_t {
-            fn hash<H: hash::Hasher>(&self, state: &mut H) {
-                self.fo_rw.hash(state);
-                self.fo_ioctl.hash(state);
-                self.fo_select.hash(state);
-                self.fo_close.hash(state);
-                self.fo_fstat.hash(state);
-            }
-        }
-
-        impl PartialEq for file {
-            fn eq(&self, other: &file) -> bool {
-                self.f_flag == other.f_flag
-                    && self.f_count == other.f_count
-                    && self.f_options == other.f_options
-                    && self.f_type == other.f_type
-                    && self.f_data == other.f_data
-                    && self.f_offset == other.f_offset
-                    && self.f_dir_off == other.f_dir_off
-                    && self.f_cred == other.f_cred
-                    && self.f_vinfo == other.f_vinfo
-                    && self.f_ops == other.f_ops
-                    && self.f_parentp == other.f_parentp
-                    && self.f_fnamep == other.f_fnamep
-                    && self.f_fdata == other.f_fdata
-                    && self.f_lock == other.f_lock
-                    && self.f_offset_lock == other.f_offset_lock
-            }
-        }
-        impl Eq for file {}
-        impl fmt::Debug for file {
-            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-                f.debug_struct("file")
-                    .field("f_flag", &self.f_flag)
-                    .field("f_count", &self.f_count)
-                    .field("f_options", &self.f_options)
-                    .field("f_type", &self.f_type)
-                    .field("f_data", &self.f_data)
-                    .field("f_offset", &self.f_offset)
-                    .field("f_dir_off", &self.f_dir_off)
-                    .field("f_cred", &self.f_cred)
-                    .field("f_lock", &self.f_lock)
-                    .field("f_offset_lock", &self.f_offset_lock)
-                    .field("f_vinfo", &self.f_vinfo)
-                    .field("f_ops", &self.f_ops)
-                    .field("f_parentp", &self.f_parentp)
-                    .field("f_fnamep", &self.f_fnamep)
-                    .field("f_fdata", &self.f_fdata)
-                    .finish()
-            }
-        }
-        impl hash::Hash for file {
-            fn hash<H: hash::Hasher>(&self, state: &mut H) {
-                self.f_flag.hash(state);
-                self.f_count.hash(state);
-                self.f_options.hash(state);
-                self.f_type.hash(state);
-                self.f_data.hash(state);
-                self.f_offset.hash(state);
-                self.f_dir_off.hash(state);
-                self.f_cred.hash(state);
-                self.f_lock.hash(state);
-                self.f_offset_lock.hash(state);
-                self.f_vinfo.hash(state);
-                self.f_ops.hash(state);
-                self.f_parentp.hash(state);
-                self.f_fnamep.hash(state);
-                self.f_fdata.hash(state);
-            }
-        }
-
-        impl PartialEq for __ld_info_file {
-            fn eq(&self, other: &__ld_info_file) -> bool {
-                unsafe {
-                    self._ldinfo_fd == other._ldinfo_fd
-                        && self._ldinfo_fp == other._ldinfo_fp
-                        && self._core_offset == other._core_offset
-                }
-            }
-        }
-        impl Eq for __ld_info_file {}
-        impl hash::Hash for __ld_info_file {
-            fn hash<H: hash::Hasher>(&self, state: &mut H) {
-                unsafe {
-                    self._ldinfo_fd.hash(state);
-                    self._ldinfo_fp.hash(state);
-                    self._core_offset.hash(state);
-                }
-            }
-        }
-
-        impl PartialEq for ld_info {
-            fn eq(&self, other: &ld_info) -> bool {
-                self.ldinfo_next == other.ldinfo_next
-                    && self.ldinfo_flags == other.ldinfo_flags
-                    && self.ldinfo_textorg == other.ldinfo_textorg
-                    && self.ldinfo_textsize == other.ldinfo_textsize
-                    && self.ldinfo_dataorg == other.ldinfo_dataorg
-                    && self.ldinfo_datasize == other.ldinfo_datasize
-                    && self.ldinfo_filename == other.ldinfo_filename
-                    && self._file == other._file
-            }
-        }
-        impl Eq for ld_info {}
-        impl fmt::Debug for ld_info {
-            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-                f.debug_struct("ld_info")
-                    .field("ldinfo_next", &self.ldinfo_next)
-                    .field("ldinfo_flags", &self.ldinfo_flags)
-                    .field("ldinfo_textorg", &self.ldinfo_textorg)
-                    .field("ldinfo_textsize", &self.ldinfo_textsize)
-                    .field("ldinfo_dataorg", &self.ldinfo_dataorg)
-                    .field("ldinfo_datasize", &self.ldinfo_datasize)
-                    .field("ldinfo_filename", &self.ldinfo_filename)
-                    .field("_file", &self._file)
-                    .finish()
-            }
-        }
-        impl hash::Hash for ld_info {
-            fn hash<H: hash::Hasher>(&self, state: &mut H) {
-                self.ldinfo_next.hash(state);
-                self.ldinfo_flags.hash(state);
-                self.ldinfo_textorg.hash(state);
-                self.ldinfo_textsize.hash(state);
-                self.ldinfo_dataorg.hash(state);
-                self.ldinfo_datasize.hash(state);
-                self.ldinfo_filename.hash(state);
-                self._file.hash(state);
-            }
-        }
-
         impl PartialEq for __pollfd_ext_u {
             fn eq(&self, other: &__pollfd_ext_u) -> bool {
                 unsafe {
@@ -543,16 +356,6 @@
             }
         }
         impl Eq for pollfd_ext {}
-        impl fmt::Debug for pollfd_ext {
-            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-                f.debug_struct("pollfd_ext")
-                    .field("fd", &self.fd)
-                    .field("events", &self.events)
-                    .field("revents", &self.revents)
-                    .field("data", &self.data)
-                    .finish()
-            }
-        }
         impl hash::Hash for pollfd_ext {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.fd.hash(state);
@@ -561,6 +364,20 @@
                 self.data.hash(state);
             }
         }
+        impl PartialEq for fpreg_t {
+            fn eq(&self, other: &fpreg_t) -> bool {
+                self.d == other.d
+            }
+        }
+
+        impl Eq for fpreg_t {}
+
+        impl hash::Hash for fpreg_t {
+            fn hash<H: hash::Hasher>(&self, state: &mut H) {
+                let d: u64 = unsafe { mem::transmute(self.d) };
+                d.hash(state);
+            }
+        }
     }
 }
 
@@ -573,6 +390,11 @@
 pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t {
     __rw_word: [2, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 };
+
+pub const PTHREAD_ONCE_INIT: pthread_once_t = pthread_once_t {
+    __on_word: [0, 0, 0, 0, 0, 2, 0, 0, 0],
+};
+
 pub const RLIM_INFINITY: c_ulong = 0x7fffffffffffffff;
 
 extern "C" {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b32/mod.rs
index 3753ffb..bdc986d 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b32/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b32/mod.rs
@@ -80,14 +80,6 @@
             }
         }
         impl Eq for pthread_attr_t {}
-        impl fmt::Debug for pthread_attr_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_attr_t")
-                    .field("__sig", &self.__sig)
-                    // FIXME(debug): .field("__opaque", &self.__opaque)
-                    .finish()
-            }
-        }
         impl hash::Hash for pthread_attr_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.__sig.hash(state);
@@ -105,13 +97,6 @@
             }
         }
         impl Eq for pthread_once_t {}
-        impl fmt::Debug for pthread_once_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_once_t")
-                    .field("__sig", &self.__sig)
-                    .finish()
-            }
-        }
         impl hash::Hash for pthread_once_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.__sig.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b64/mod.rs
index 2bd6823..3474346 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b64/mod.rs
@@ -73,14 +73,6 @@
             }
         }
         impl Eq for pthread_attr_t {}
-        impl fmt::Debug for pthread_attr_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_attr_t")
-                    .field("__sig", &self.__sig)
-                    // FIXME(debug): .field("__opaque", &self.__opaque)
-                    .finish()
-            }
-        }
         impl hash::Hash for pthread_attr_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.__sig.hash(state);
@@ -98,13 +90,6 @@
             }
         }
         impl Eq for pthread_once_t {}
-        impl fmt::Debug for pthread_once_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_once_t")
-                    .field("__sig", &self.__sig)
-                    .finish()
-            }
-        }
         impl hash::Hash for pthread_once_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.__sig.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/mod.rs
index 56169a5..14b35e2 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/mod.rs
@@ -775,7 +775,7 @@
         pub gid: crate::gid_t,
         pub cuid: crate::uid_t,
         pub cgid: crate::gid_t,
-        pub mode: crate::mode_t,
+        pub mode: mode_t,
         pub _seq: c_ushort,
         pub _key: crate::key_t,
     }
@@ -1691,7 +1691,7 @@
             si_value: crate::sigval,
         }
 
-        (*(self as *const siginfo_t as *const siginfo_timer)).si_value
+        (*(self as *const siginfo_t).cast::<siginfo_timer>()).si_value
     }
 
     pub unsafe fn si_pid(&self) -> crate::pid_t {
@@ -1753,11 +1753,6 @@
             }
         }
         impl Eq for ifconf {}
-        impl fmt::Debug for ifconf {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ifconf").finish_non_exhaustive()
-            }
-        }
 
         impl PartialEq for kevent {
             fn eq(&self, other: &kevent) -> bool {
@@ -1770,24 +1765,6 @@
             }
         }
         impl Eq for kevent {}
-        impl fmt::Debug for kevent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let ident = self.ident;
-                let filter = self.filter;
-                let flags = self.flags;
-                let fflags = self.fflags;
-                let data = self.data;
-                let udata = self.udata;
-                f.debug_struct("kevent")
-                    .field("ident", &ident)
-                    .field("filter", &filter)
-                    .field("flags", &flags)
-                    .field("fflags", &fflags)
-                    .field("data", &data)
-                    .field("udata", &udata)
-                    .finish()
-            }
-        }
         impl hash::Hash for kevent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let ident = self.ident;
@@ -1822,28 +1799,6 @@
             }
         }
         impl Eq for semid_ds {}
-        impl fmt::Debug for semid_ds {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let sem_perm = self.sem_perm;
-                let sem_base = self.sem_base;
-                let sem_nsems = self.sem_nsems;
-                let sem_otime = self.sem_otime;
-                let sem_pad1 = self.sem_pad1;
-                let sem_ctime = self.sem_ctime;
-                let sem_pad2 = self.sem_pad2;
-                let sem_pad3 = self.sem_pad3;
-                f.debug_struct("semid_ds")
-                    .field("sem_perm", &sem_perm)
-                    .field("sem_base", &sem_base)
-                    .field("sem_nsems", &sem_nsems)
-                    .field("sem_otime", &sem_otime)
-                    .field("sem_pad1", &sem_pad1)
-                    .field("sem_ctime", &sem_ctime)
-                    .field("sem_pad2", &sem_pad2)
-                    .field("sem_pad3", &sem_pad3)
-                    .finish()
-            }
-        }
         impl hash::Hash for semid_ds {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let sem_perm = self.sem_perm;
@@ -1881,30 +1836,6 @@
             }
         }
         impl Eq for shmid_ds {}
-        impl fmt::Debug for shmid_ds {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let shm_perm = self.shm_perm;
-                let shm_segsz = self.shm_segsz;
-                let shm_lpid = self.shm_lpid;
-                let shm_cpid = self.shm_cpid;
-                let shm_nattch = self.shm_nattch;
-                let shm_atime = self.shm_atime;
-                let shm_dtime = self.shm_dtime;
-                let shm_ctime = self.shm_ctime;
-                let shm_internal = self.shm_internal;
-                f.debug_struct("shmid_ds")
-                    .field("shm_perm", &shm_perm)
-                    .field("shm_segsz", &shm_segsz)
-                    .field("shm_lpid", &shm_lpid)
-                    .field("shm_cpid", &shm_cpid)
-                    .field("shm_nattch", &shm_nattch)
-                    .field("shm_atime", &shm_atime)
-                    .field("shm_dtime", &shm_dtime)
-                    .field("shm_ctime", &shm_ctime)
-                    .field("shm_internal", &shm_internal)
-                    .finish()
-            }
-        }
         impl hash::Hash for shmid_ds {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let shm_perm = self.shm_perm;
@@ -1948,23 +1879,6 @@
             }
         }
         impl Eq for proc_threadinfo {}
-        impl fmt::Debug for proc_threadinfo {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("proc_threadinfo")
-                    .field("pth_user_time", &self.pth_user_time)
-                    .field("pth_system_time", &self.pth_system_time)
-                    .field("pth_cpu_usage", &self.pth_cpu_usage)
-                    .field("pth_policy", &self.pth_policy)
-                    .field("pth_run_state", &self.pth_run_state)
-                    .field("pth_flags", &self.pth_flags)
-                    .field("pth_sleep_time", &self.pth_sleep_time)
-                    .field("pth_curpri", &self.pth_curpri)
-                    .field("pth_priority", &self.pth_priority)
-                    .field("pth_maxpriority", &self.pth_maxpriority)
-                    // FIXME(debug): .field("pth_name", &self.pth_name)
-                    .finish()
-            }
-        }
         impl hash::Hash for proc_threadinfo {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.pth_user_time.hash(state);
@@ -2011,28 +1925,6 @@
         }
 
         impl Eq for statfs {}
-        impl fmt::Debug for statfs {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("statfs")
-                    .field("f_bsize", &self.f_bsize)
-                    .field("f_iosize", &self.f_iosize)
-                    .field("f_blocks", &self.f_blocks)
-                    .field("f_bfree", &self.f_bfree)
-                    .field("f_bavail", &self.f_bavail)
-                    .field("f_files", &self.f_files)
-                    .field("f_ffree", &self.f_ffree)
-                    .field("f_fsid", &self.f_fsid)
-                    .field("f_owner", &self.f_owner)
-                    .field("f_flags", &self.f_flags)
-                    .field("f_fssubtype", &self.f_fssubtype)
-                    .field("f_fstypename", &self.f_fstypename)
-                    .field("f_type", &self.f_type)
-                    // FIXME(debug): .field("f_mntonname", &self.f_mntonname)
-                    // FIXME(debug): .field("f_mntfromname", &self.f_mntfromname)
-                    .field("f_reserved", &self.f_reserved)
-                    .finish()
-            }
-        }
 
         impl hash::Hash for statfs {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
@@ -2070,18 +1962,6 @@
             }
         }
         impl Eq for dirent {}
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_ino", &self.d_ino)
-                    .field("d_seekoff", &self.d_seekoff)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_namlen", &self.d_namlen)
-                    .field("d_type", &self.d_type)
-                    // FIXME(debug): .field("d_name", &self.d_name)
-                    .finish()
-            }
-        }
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_ino.hash(state);
@@ -2103,14 +1983,6 @@
             }
         }
         impl Eq for pthread_rwlock_t {}
-        impl fmt::Debug for pthread_rwlock_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_rwlock_t")
-                    .field("__sig", &self.__sig)
-                    // FIXME(debug): .field("__opaque", &self.__opaque)
-                    .finish()
-            }
-        }
         impl hash::Hash for pthread_rwlock_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.__sig.hash(state);
@@ -2131,15 +2003,6 @@
 
         impl Eq for pthread_mutex_t {}
 
-        impl fmt::Debug for pthread_mutex_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_mutex_t")
-                    .field("__sig", &self.__sig)
-                    // FIXME(debug): .field("__opaque", &self.__opaque)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for pthread_mutex_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.__sig.hash(state);
@@ -2160,15 +2023,6 @@
 
         impl Eq for pthread_cond_t {}
 
-        impl fmt::Debug for pthread_cond_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_cond_t")
-                    .field("__sig", &self.__sig)
-                    // FIXME(debug): .field("__opaque", &self.__opaque)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for pthread_cond_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.__sig.hash(state);
@@ -2196,18 +2050,6 @@
 
         impl Eq for sockaddr_storage {}
 
-        impl fmt::Debug for sockaddr_storage {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_storage")
-                    .field("ss_len", &self.ss_len)
-                    .field("ss_family", &self.ss_family)
-                    .field("__ss_pad1", &self.__ss_pad1)
-                    .field("__ss_align", &self.__ss_align)
-                    // FIXME(debug): .field("__ss_pad2", &self.__ss_pad2)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for sockaddr_storage {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ss_len.hash(state);
@@ -2240,21 +2082,6 @@
 
         impl Eq for utmpx {}
 
-        impl fmt::Debug for utmpx {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utmpx")
-                    // FIXME(debug): .field("ut_user", &self.ut_user)
-                    .field("ut_id", &self.ut_id)
-                    .field("ut_line", &self.ut_line)
-                    .field("ut_pid", &self.ut_pid)
-                    .field("ut_type", &self.ut_type)
-                    .field("ut_tv", &self.ut_tv)
-                    // FIXME(debug): .field("ut_host", &self.ut_host)
-                    .field("ut_pad", &self.ut_pad)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for utmpx {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ut_user.hash(state);
@@ -2279,17 +2106,6 @@
 
         impl Eq for sigevent {}
 
-        impl fmt::Debug for sigevent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sigevent")
-                    .field("sigev_notify", &self.sigev_notify)
-                    .field("sigev_signo", &self.sigev_signo)
-                    .field("sigev_value", &self.sigev_value)
-                    .field("sigev_notify_attributes", &self.sigev_notify_attributes)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for sigevent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sigev_notify.hash(state);
@@ -2305,13 +2121,6 @@
             }
         }
         impl Eq for processor_cpu_load_info {}
-        impl fmt::Debug for processor_cpu_load_info {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("processor_cpu_load_info")
-                    .field("cpu_ticks", &self.cpu_ticks)
-                    .finish()
-            }
-        }
         impl hash::Hash for processor_cpu_load_info {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.cpu_ticks.hash(state);
@@ -2328,17 +2137,6 @@
             }
         }
         impl Eq for processor_basic_info {}
-        impl fmt::Debug for processor_basic_info {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("processor_basic_info")
-                    .field("cpu_type", &self.cpu_type)
-                    .field("cpu_subtype", &self.cpu_subtype)
-                    .field("running", &self.running)
-                    .field("slot_num", &self.slot_num)
-                    .field("is_master", &self.is_master)
-                    .finish()
-            }
-        }
         impl hash::Hash for processor_basic_info {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.cpu_type.hash(state);
@@ -2356,14 +2154,6 @@
             }
         }
         impl Eq for processor_set_basic_info {}
-        impl fmt::Debug for processor_set_basic_info {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("processor_set_basic_info")
-                    .field("processor_count", &self.processor_count)
-                    .field("default_policy", &self.default_policy)
-                    .finish()
-            }
-        }
         impl hash::Hash for processor_set_basic_info {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.processor_count.hash(state);
@@ -2380,16 +2170,6 @@
             }
         }
         impl Eq for processor_set_load_info {}
-        impl fmt::Debug for processor_set_load_info {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("processor_set_load_info")
-                    .field("task_count", &self.task_count)
-                    .field("thread_count", &self.thread_count)
-                    .field("load_average", &self.load_average)
-                    .field("mach_factor", &self.mach_factor)
-                    .finish()
-            }
-        }
         impl hash::Hash for processor_set_load_info {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.task_count.hash(state);
@@ -2405,14 +2185,6 @@
             }
         }
         impl Eq for time_value_t {}
-        impl fmt::Debug for time_value_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("time_value_t")
-                    .field("seconds", &self.seconds)
-                    .field("microseconds", &self.microseconds)
-                    .finish()
-            }
-        }
         impl hash::Hash for time_value_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.seconds.hash(state);
@@ -2432,20 +2204,6 @@
             }
         }
         impl Eq for thread_basic_info {}
-        impl fmt::Debug for thread_basic_info {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("thread_basic_info")
-                    .field("user_time", &self.user_time)
-                    .field("system_time", &self.system_time)
-                    .field("cpu_usage", &self.cpu_usage)
-                    .field("policy", &self.policy)
-                    .field("run_state", &self.run_state)
-                    .field("flags", &self.flags)
-                    .field("suspend_count", &self.suspend_count)
-                    .field("sleep_time", &self.sleep_time)
-                    .finish()
-            }
-        }
         impl hash::Hash for thread_basic_info {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.user_time.hash(state);
@@ -2478,23 +2236,6 @@
             }
         }
         impl Eq for thread_extended_info {}
-        impl fmt::Debug for thread_extended_info {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("proc_threadinfo")
-                    .field("pth_user_time", &self.pth_user_time)
-                    .field("pth_system_time", &self.pth_system_time)
-                    .field("pth_cpu_usage", &self.pth_cpu_usage)
-                    .field("pth_policy", &self.pth_policy)
-                    .field("pth_run_state", &self.pth_run_state)
-                    .field("pth_flags", &self.pth_flags)
-                    .field("pth_sleep_time", &self.pth_sleep_time)
-                    .field("pth_curpri", &self.pth_curpri)
-                    .field("pth_priority", &self.pth_priority)
-                    .field("pth_maxpriority", &self.pth_maxpriority)
-                    // FIXME(debug): .field("pth_name", &self.pth_name)
-                    .finish()
-            }
-        }
         impl hash::Hash for thread_extended_info {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.pth_user_time.hash(state);
@@ -2518,15 +2259,6 @@
             }
         }
         impl Eq for thread_identifier_info {}
-        impl fmt::Debug for thread_identifier_info {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("thread_identifier_info")
-                    .field("thread_id", &self.thread_id)
-                    .field("thread_handle", &self.thread_handle)
-                    .field("dispatch_qaddr", &self.dispatch_qaddr)
-                    .finish()
-            }
-        }
         impl hash::Hash for thread_identifier_info {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.thread_id.hash(state);
@@ -2564,62 +2296,6 @@
             }
         }
         impl Eq for if_data64 {}
-        impl fmt::Debug for if_data64 {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let ifi_type = self.ifi_type;
-                let ifi_typelen = self.ifi_typelen;
-                let ifi_physical = self.ifi_physical;
-                let ifi_addrlen = self.ifi_addrlen;
-                let ifi_hdrlen = self.ifi_hdrlen;
-                let ifi_recvquota = self.ifi_recvquota;
-                let ifi_xmitquota = self.ifi_xmitquota;
-                let ifi_unused1 = self.ifi_unused1;
-                let ifi_mtu = self.ifi_mtu;
-                let ifi_metric = self.ifi_metric;
-                let ifi_baudrate = self.ifi_baudrate;
-                let ifi_ipackets = self.ifi_ipackets;
-                let ifi_ierrors = self.ifi_ierrors;
-                let ifi_opackets = self.ifi_opackets;
-                let ifi_oerrors = self.ifi_oerrors;
-                let ifi_collisions = self.ifi_collisions;
-                let ifi_ibytes = self.ifi_ibytes;
-                let ifi_obytes = self.ifi_obytes;
-                let ifi_imcasts = self.ifi_imcasts;
-                let ifi_omcasts = self.ifi_omcasts;
-                let ifi_iqdrops = self.ifi_iqdrops;
-                let ifi_noproto = self.ifi_noproto;
-                let ifi_recvtiming = self.ifi_recvtiming;
-                let ifi_xmittiming = self.ifi_xmittiming;
-                let ifi_lastchange = self.ifi_lastchange;
-                f.debug_struct("if_data64")
-                    .field("ifi_type", &ifi_type)
-                    .field("ifi_typelen", &ifi_typelen)
-                    .field("ifi_physical", &ifi_physical)
-                    .field("ifi_addrlen", &ifi_addrlen)
-                    .field("ifi_hdrlen", &ifi_hdrlen)
-                    .field("ifi_recvquota", &ifi_recvquota)
-                    .field("ifi_xmitquota", &ifi_xmitquota)
-                    .field("ifi_unused1", &ifi_unused1)
-                    .field("ifi_mtu", &ifi_mtu)
-                    .field("ifi_metric", &ifi_metric)
-                    .field("ifi_baudrate", &ifi_baudrate)
-                    .field("ifi_ipackets", &ifi_ipackets)
-                    .field("ifi_ierrors", &ifi_ierrors)
-                    .field("ifi_opackets", &ifi_opackets)
-                    .field("ifi_oerrors", &ifi_oerrors)
-                    .field("ifi_collisions", &ifi_collisions)
-                    .field("ifi_ibytes", &ifi_ibytes)
-                    .field("ifi_obytes", &ifi_obytes)
-                    .field("ifi_imcasts", &ifi_imcasts)
-                    .field("ifi_omcasts", &ifi_omcasts)
-                    .field("ifi_iqdrops", &ifi_iqdrops)
-                    .field("ifi_noproto", &ifi_noproto)
-                    .field("ifi_recvtiming", &ifi_recvtiming)
-                    .field("ifi_xmittiming", &ifi_xmittiming)
-                    .field("ifi_lastchange", &ifi_lastchange)
-                    .finish()
-            }
-        }
         impl hash::Hash for if_data64 {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let ifi_type = self.ifi_type;
@@ -2690,34 +2366,6 @@
             }
         }
         impl Eq for if_msghdr2 {}
-        impl fmt::Debug for if_msghdr2 {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let ifm_msglen = self.ifm_msglen;
-                let ifm_version = self.ifm_version;
-                let ifm_type = self.ifm_type;
-                let ifm_addrs = self.ifm_addrs;
-                let ifm_flags = self.ifm_flags;
-                let ifm_index = self.ifm_index;
-                let ifm_snd_len = self.ifm_snd_len;
-                let ifm_snd_maxlen = self.ifm_snd_maxlen;
-                let ifm_snd_drops = self.ifm_snd_drops;
-                let ifm_timer = self.ifm_timer;
-                let ifm_data = self.ifm_data;
-                f.debug_struct("if_msghdr2")
-                    .field("ifm_msglen", &ifm_msglen)
-                    .field("ifm_version", &ifm_version)
-                    .field("ifm_type", &ifm_type)
-                    .field("ifm_addrs", &ifm_addrs)
-                    .field("ifm_flags", &ifm_flags)
-                    .field("ifm_index", &ifm_index)
-                    .field("ifm_snd_len", &ifm_snd_len)
-                    .field("ifm_snd_maxlen", &ifm_snd_maxlen)
-                    .field("ifm_snd_drops", &ifm_snd_drops)
-                    .field("ifm_timer", &ifm_timer)
-                    .field("ifm_data", &ifm_data)
-                    .finish()
-            }
-        }
         impl hash::Hash for if_msghdr2 {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let ifm_msglen = self.ifm_msglen;
@@ -2775,64 +2423,6 @@
             }
         }
         impl Eq for vm_statistics64 {}
-        impl fmt::Debug for vm_statistics64 {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let free_count = self.free_count;
-                let active_count = self.active_count;
-                let inactive_count = self.inactive_count;
-                let wire_count = self.wire_count;
-                let zero_fill_count = self.zero_fill_count;
-                let reactivations = self.reactivations;
-                let pageins = self.pageins;
-                let pageouts = self.pageouts;
-                let faults = self.faults;
-                let cow_faults = self.cow_faults;
-                let lookups = self.lookups;
-                let hits = self.hits;
-                let purges = self.purges;
-                let purgeable_count = self.purgeable_count;
-                let speculative_count = self.speculative_count;
-                let decompressions = self.decompressions;
-                let compressions = self.compressions;
-                let swapins = self.swapins;
-                let swapouts = self.swapouts;
-                let compressor_page_count = self.compressor_page_count;
-                let throttled_count = self.throttled_count;
-                let external_page_count = self.external_page_count;
-                let internal_page_count = self.internal_page_count;
-                // Otherwise rustfmt crashes...
-                let total_uncompressed = self.total_uncompressed_pages_in_compressor;
-                f.debug_struct("vm_statistics64")
-                    .field("free_count", &free_count)
-                    .field("active_count", &active_count)
-                    .field("inactive_count", &inactive_count)
-                    .field("wire_count", &wire_count)
-                    .field("zero_fill_count", &zero_fill_count)
-                    .field("reactivations", &reactivations)
-                    .field("pageins", &pageins)
-                    .field("pageouts", &pageouts)
-                    .field("faults", &faults)
-                    .field("cow_faults", &cow_faults)
-                    .field("lookups", &lookups)
-                    .field("hits", &hits)
-                    .field("purges", &purges)
-                    .field("purgeable_count", &purgeable_count)
-                    .field("speculative_count", &speculative_count)
-                    .field("decompressions", &decompressions)
-                    .field("compressions", &compressions)
-                    .field("swapins", &swapins)
-                    .field("swapouts", &swapouts)
-                    .field("compressor_page_count", &compressor_page_count)
-                    .field("throttled_count", &throttled_count)
-                    .field("external_page_count", &external_page_count)
-                    .field("internal_page_count", &internal_page_count)
-                    .field(
-                        "total_uncompressed_pages_in_compressor",
-                        &total_uncompressed,
-                    )
-                    .finish()
-            }
-        }
         impl hash::Hash for vm_statistics64 {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let free_count = self.free_count;
@@ -2899,26 +2489,6 @@
             }
         }
         impl Eq for mach_task_basic_info {}
-        impl fmt::Debug for mach_task_basic_info {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let virtual_size = self.virtual_size;
-                let resident_size = self.resident_size;
-                let resident_size_max = self.resident_size_max;
-                let user_time = self.user_time;
-                let system_time = self.system_time;
-                let policy = self.policy;
-                let suspend_count = self.suspend_count;
-                f.debug_struct("mach_task_basic_info")
-                    .field("virtual_size", &virtual_size)
-                    .field("resident_size", &resident_size)
-                    .field("resident_size_max", &resident_size_max)
-                    .field("user_time", &user_time)
-                    .field("system_time", &system_time)
-                    .field("policy", &policy)
-                    .field("suspend_count", &suspend_count)
-                    .finish()
-            }
-        }
         impl hash::Hash for mach_task_basic_info {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let virtual_size = self.virtual_size;
@@ -2946,18 +2516,6 @@
             }
         }
         impl Eq for log2phys {}
-        impl fmt::Debug for log2phys {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let l2p_flags = self.l2p_flags;
-                let l2p_contigbytes = self.l2p_contigbytes;
-                let l2p_devoffset = self.l2p_devoffset;
-                f.debug_struct("log2phys")
-                    .field("l2p_flags", &l2p_flags)
-                    .field("l2p_contigbytes", &l2p_contigbytes)
-                    .field("l2p_devoffset", &l2p_devoffset)
-                    .finish()
-            }
-        }
         impl hash::Hash for log2phys {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let l2p_flags = self.l2p_flags;
@@ -2976,14 +2534,6 @@
 
         impl Eq for os_unfair_lock {}
 
-        impl fmt::Debug for os_unfair_lock {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("os_unfair_lock")
-                    .field("_os_unfair_lock_opaque", &self._os_unfair_lock_opaque)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for os_unfair_lock {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self._os_unfair_lock_opaque.hash(state);
@@ -3002,24 +2552,6 @@
 
         impl Eq for sockaddr_vm {}
 
-        impl fmt::Debug for sockaddr_vm {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let svm_len = self.svm_len;
-                let svm_family = self.svm_family;
-                let svm_reserved1 = self.svm_reserved1;
-                let svm_port = self.svm_port;
-                let svm_cid = self.svm_cid;
-
-                f.debug_struct("sockaddr_vm")
-                    .field("svm_len", &svm_len)
-                    .field("svm_family", &svm_family)
-                    .field("svm_reserved1", &svm_reserved1)
-                    .field("svm_port", &svm_port)
-                    .field("svm_cid", &svm_cid)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for sockaddr_vm {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let svm_len = self.svm_len;
@@ -3046,16 +2578,6 @@
 
         impl Eq for ifdevmtu {}
 
-        impl fmt::Debug for ifdevmtu {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ifdevmtu")
-                    .field("ifdm_current", &self.ifdm_current)
-                    .field("ifdm_min", &self.ifdm_min)
-                    .field("ifdm_max", &self.ifdm_max)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for ifdevmtu {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ifdm_current.hash(state);
@@ -3088,15 +2610,6 @@
 
         impl Eq for ifkpi {}
 
-        impl fmt::Debug for ifkpi {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ifkpi")
-                    .field("ifk_module_id", &self.ifk_module_id)
-                    .field("ifk_type", &self.ifk_type)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for ifkpi {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ifk_module_id.hash(state);
@@ -3164,15 +2677,6 @@
 
         impl Eq for ifreq {}
 
-        impl fmt::Debug for ifreq {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ifreq")
-                    .field("ifr_name", &self.ifr_name)
-                    .field("ifr_ifru", &self.ifr_ifru)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for ifreq {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ifr_name.hash(state);
@@ -3238,15 +2742,6 @@
         }
 
         impl Eq for in6_ifreq {}
-
-        impl fmt::Debug for in6_ifreq {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("in6_ifreq")
-                    .field("ifr_name", &self.ifr_name)
-                    .field("ifr_ifru", &self.ifr_ifru)
-                    .finish()
-            }
-        }
     }
 }
 
@@ -5635,7 +5130,7 @@
 
 const fn __DARWIN_ALIGN32(p: usize) -> usize {
     const __DARWIN_ALIGNBYTES32: usize = mem::size_of::<u32>() - 1;
-    p + __DARWIN_ALIGNBYTES32 & !__DARWIN_ALIGNBYTES32
+    (p + __DARWIN_ALIGNBYTES32) & !__DARWIN_ALIGNBYTES32
 }
 
 pub const THREAD_EXTENDED_POLICY_COUNT: mach_msg_type_number_t =
@@ -5710,7 +5205,7 @@
     pub fn CMSG_NXTHDR(mhdr: *const crate::msghdr, cmsg: *const cmsghdr) -> *mut cmsghdr {
         if cmsg.is_null() {
             return crate::CMSG_FIRSTHDR(mhdr);
-        };
+        }
         let cmsg_len = (*cmsg).cmsg_len as usize;
         let next = cmsg as usize + __DARWIN_ALIGN32(cmsg_len);
         let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize;
@@ -6341,7 +5836,7 @@
         fd: c_int,
         path: *const c_char,
         oflag: c_int,
-        mode: crate::mode_t,
+        mode: mode_t,
     ) -> c_int;
     pub fn posix_spawn_file_actions_addclose(
         actions: *mut posix_spawn_file_actions_t,
@@ -6660,9 +6155,8 @@
     pub fn dirname(path: *mut c_char) -> *mut c_char;
     pub fn basename(path: *mut c_char) -> *mut c_char;
 
-    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int;
-    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t)
-        -> c_int;
+    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int;
+    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int;
     pub fn freadlink(fd: c_int, buf: *mut c_char, size: size_t) -> c_int;
     pub fn execvP(
         file: *const c_char,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/dragonfly/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/dragonfly/mod.rs
index 5dbe69e..168c850 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/dragonfly/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/dragonfly/mod.rs
@@ -554,24 +554,6 @@
             }
         }
         impl Eq for utmpx {}
-        impl fmt::Debug for utmpx {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utmpx")
-                    .field("ut_name", &self.ut_name)
-                    .field("ut_id", &self.ut_id)
-                    .field("ut_line", &self.ut_line)
-                    // FIXME(debug): .field("ut_host", &self.ut_host)
-                    .field("ut_unused", &self.ut_unused)
-                    .field("ut_session", &self.ut_session)
-                    .field("ut_type", &self.ut_type)
-                    .field("ut_pid", &self.ut_pid)
-                    .field("ut_exit", &self.ut_exit)
-                    .field("ut_ss", &self.ut_ss)
-                    .field("ut_tv", &self.ut_tv)
-                    .field("ut_unused2", &self.ut_unused2)
-                    .finish()
-            }
-        }
         impl hash::Hash for utmpx {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ut_name.hash(state);
@@ -597,16 +579,6 @@
             }
         }
         impl Eq for lastlogx {}
-        impl fmt::Debug for lastlogx {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("lastlogx")
-                    .field("ll_tv", &self.ll_tv)
-                    .field("ll_line", &self.ll_line)
-                    .field("ll_host", &self.ll_host)
-                    .field("ll_ss", &self.ll_ss)
-                    .finish()
-            }
-        }
         impl hash::Hash for lastlogx {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ll_tv.hash(state);
@@ -631,18 +603,6 @@
             }
         }
         impl Eq for dirent {}
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_fileno", &self.d_fileno)
-                    .field("d_namlen", &self.d_namlen)
-                    .field("d_type", &self.d_type)
-                    // Ignore __unused1
-                    // Ignore __unused2
-                    // FIXME(debug): .field("d_name", &self.d_name)
-                    .finish()
-            }
-        }
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_fileno.hash(state);
@@ -685,29 +645,6 @@
             }
         }
         impl Eq for statfs {}
-        impl fmt::Debug for statfs {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("statfs")
-                    .field("f_bsize", &self.f_bsize)
-                    .field("f_iosize", &self.f_iosize)
-                    .field("f_blocks", &self.f_blocks)
-                    .field("f_bfree", &self.f_bfree)
-                    .field("f_bavail", &self.f_bavail)
-                    .field("f_files", &self.f_files)
-                    .field("f_ffree", &self.f_ffree)
-                    .field("f_fsid", &self.f_fsid)
-                    .field("f_owner", &self.f_owner)
-                    .field("f_type", &self.f_type)
-                    .field("f_flags", &self.f_flags)
-                    .field("f_syncwrites", &self.f_syncwrites)
-                    .field("f_asyncwrites", &self.f_asyncwrites)
-                    // FIXME(debug): .field("f_mntonname", &self.f_mntonname)
-                    .field("f_syncreads", &self.f_syncreads)
-                    .field("f_asyncreads", &self.f_asyncreads)
-                    // FIXME(debug): .field("f_mntfromname", &self.f_mntfromname)
-                    .finish()
-            }
-        }
         impl hash::Hash for statfs {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.f_bsize.hash(state);
@@ -739,15 +676,6 @@
             }
         }
         impl Eq for sigevent {}
-        impl fmt::Debug for sigevent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sigevent")
-                    .field("sigev_notify", &self.sigev_notify)
-                    .field("sigev_signo", &self.sigev_signo)
-                    .field("sigev_value", &self.sigev_value)
-                    .finish()
-            }
-        }
         impl hash::Hash for sigevent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sigev_notify.hash(state);
@@ -790,42 +718,6 @@
             }
         }
         impl Eq for mcontext_t {}
-        impl fmt::Debug for mcontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mcontext_t")
-                    .field("mc_onstack", &self.mc_onstack)
-                    .field("mc_rdi", &self.mc_rdi)
-                    .field("mc_rsi", &self.mc_rsi)
-                    .field("mc_rdx", &self.mc_rdx)
-                    .field("mc_rcx", &self.mc_rcx)
-                    .field("mc_r8", &self.mc_r8)
-                    .field("mc_r9", &self.mc_r9)
-                    .field("mc_rax", &self.mc_rax)
-                    .field("mc_rbx", &self.mc_rbx)
-                    .field("mc_rbp", &self.mc_rbp)
-                    .field("mc_r10", &self.mc_r10)
-                    .field("mc_r11", &self.mc_r11)
-                    .field("mc_r12", &self.mc_r12)
-                    .field("mc_r13", &self.mc_r13)
-                    .field("mc_r14", &self.mc_r14)
-                    .field("mc_r15", &self.mc_r15)
-                    .field("mc_xflags", &self.mc_xflags)
-                    .field("mc_trapno", &self.mc_trapno)
-                    .field("mc_addr", &self.mc_addr)
-                    .field("mc_flags", &self.mc_flags)
-                    .field("mc_err", &self.mc_err)
-                    .field("mc_rip", &self.mc_rip)
-                    .field("mc_cs", &self.mc_cs)
-                    .field("mc_rflags", &self.mc_rflags)
-                    .field("mc_rsp", &self.mc_rsp)
-                    .field("mc_ss", &self.mc_ss)
-                    .field("mc_len", &self.mc_len)
-                    .field("mc_fpformat", &self.mc_fpformat)
-                    .field("mc_ownedfp", &self.mc_ownedfp)
-                    .field("mc_fpregs", &self.mc_fpregs)
-                    .finish()
-            }
-        }
         impl hash::Hash for mcontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.mc_onstack.hash(state);
@@ -875,18 +767,6 @@
             }
         }
         impl Eq for ucontext_t {}
-        impl fmt::Debug for ucontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ucontext_t")
-                    .field("uc_sigmask", &self.uc_sigmask)
-                    .field("uc_mcontext", &self.uc_mcontext)
-                    .field("uc_link", &self.uc_link)
-                    .field("uc_stack", &self.uc_stack)
-                    .field("uc_cofunc", &self.uc_cofunc)
-                    .field("uc_arg", &self.uc_arg)
-                    .finish()
-            }
-        }
         impl hash::Hash for ucontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uc_sigmask.hash(state);
@@ -1560,7 +1440,7 @@
         if next <= max {
             (cmsg as usize + _CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr
         } else {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         }
     }
 
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/aarch64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/aarch64.rs
index ae93648..7f5693d 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/aarch64.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/aarch64.rs
@@ -48,18 +48,6 @@
             }
         }
         impl Eq for gpregs {}
-        impl fmt::Debug for gpregs {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("gpregs")
-                    .field("gp_x", &self.gp_x)
-                    .field("gp_lr", &self.gp_lr)
-                    .field("gp_sp", &self.gp_sp)
-                    .field("gp_elr", &self.gp_elr)
-                    .field("gp_spsr", &self.gp_spsr)
-                    .field("gp_pad", &self.gp_pad)
-                    .finish()
-            }
-        }
         impl hash::Hash for gpregs {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.gp_x.hash(state);
@@ -80,17 +68,6 @@
             }
         }
         impl Eq for fpregs {}
-        impl fmt::Debug for fpregs {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("fpregs")
-                    .field("fp_q", &self.fp_q)
-                    .field("fp_sr", &self.fp_sr)
-                    .field("fp_cr", &self.fp_cr)
-                    .field("fp_flags", &self.fp_flags)
-                    .field("fp_pad", &self.fp_pad)
-                    .finish()
-            }
-        }
         impl hash::Hash for fpregs {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.fp_q.hash(state);
@@ -114,17 +91,6 @@
             }
         }
         impl Eq for mcontext_t {}
-        impl fmt::Debug for mcontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mcontext_t")
-                    .field("mc_gpregs", &self.mc_gpregs)
-                    .field("mc_fpregs", &self.mc_fpregs)
-                    .field("mc_flags", &self.mc_flags)
-                    .field("mc_pad", &self.mc_pad)
-                    .field("mc_spare", &self.mc_spare)
-                    .finish()
-            }
-        }
         impl hash::Hash for mcontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.mc_gpregs.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/arm.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/arm.rs
index e29c9ce..27eeafe 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/arm.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/arm.rs
@@ -32,16 +32,6 @@
             }
         }
         impl Eq for mcontext_t {}
-        impl fmt::Debug for mcontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mcontext_t")
-                    .field("__gregs", &self.__gregs)
-                    .field("mc_vfp_size", &self.mc_vfp_size)
-                    .field("mc_vfp_ptr", &self.mc_vfp_ptr)
-                    .field("mc_spare", &self.mc_spare)
-                    .finish()
-            }
-        }
         impl hash::Hash for mcontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.__gregs.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs
index 5846447..9705e30 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs
@@ -296,29 +296,6 @@
             }
         }
         impl Eq for statfs {}
-        impl fmt::Debug for statfs {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("statfs")
-                    .field("f_bsize", &self.f_bsize)
-                    .field("f_iosize", &self.f_iosize)
-                    .field("f_blocks", &self.f_blocks)
-                    .field("f_bfree", &self.f_bfree)
-                    .field("f_bavail", &self.f_bavail)
-                    .field("f_files", &self.f_files)
-                    .field("f_ffree", &self.f_ffree)
-                    .field("f_syncwrites", &self.f_syncwrites)
-                    .field("f_asyncwrites", &self.f_asyncwrites)
-                    .field("f_syncreads", &self.f_syncreads)
-                    .field("f_asyncreads", &self.f_asyncreads)
-                    .field("f_namemax", &self.f_namemax)
-                    .field("f_owner", &self.f_owner)
-                    .field("f_fsid", &self.f_fsid)
-                    .field("f_fstypename", &self.f_fstypename)
-                    .field("f_mntfromname", &&self.f_mntfromname[..])
-                    .field("f_mntonname", &&self.f_mntonname[..])
-                    .finish()
-            }
-        }
         impl hash::Hash for statfs {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.f_version.hash(state);
@@ -357,17 +334,6 @@
             }
         }
         impl Eq for dirent {}
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_fileno", &self.d_fileno)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_type", &self.d_type)
-                    .field("d_namlen", &self.d_namlen)
-                    .field("d_name", &&self.d_name[..self.d_namlen as _])
-                    .finish()
-            }
-        }
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_fileno.hash(state);
@@ -394,22 +360,6 @@
             }
         }
         impl Eq for vnstat {}
-        impl fmt::Debug for vnstat {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let self_vn_devname: &[c_char] = &self.vn_devname;
-
-                f.debug_struct("vnstat")
-                    .field("vn_fileid", &self.vn_fileid)
-                    .field("vn_size", &self.vn_size)
-                    .field("vn_mntdir", &self.vn_mntdir)
-                    .field("vn_dev", &self.vn_dev)
-                    .field("vn_fsid", &self.vn_fsid)
-                    .field("vn_type", &self.vn_type)
-                    .field("vn_mode", &self.vn_mode)
-                    .field("vn_devname", &self_vn_devname)
-                    .finish()
-            }
-        }
         impl hash::Hash for vnstat {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let self_vn_devname: &[c_char] = &self.vn_devname;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs
index 21062e5..005b268 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs
@@ -340,29 +340,6 @@
             }
         }
         impl Eq for statfs {}
-        impl fmt::Debug for statfs {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("statfs")
-                    .field("f_bsize", &self.f_bsize)
-                    .field("f_iosize", &self.f_iosize)
-                    .field("f_blocks", &self.f_blocks)
-                    .field("f_bfree", &self.f_bfree)
-                    .field("f_bavail", &self.f_bavail)
-                    .field("f_files", &self.f_files)
-                    .field("f_ffree", &self.f_ffree)
-                    .field("f_syncwrites", &self.f_syncwrites)
-                    .field("f_asyncwrites", &self.f_asyncwrites)
-                    .field("f_syncreads", &self.f_syncreads)
-                    .field("f_asyncreads", &self.f_asyncreads)
-                    .field("f_namemax", &self.f_namemax)
-                    .field("f_owner", &self.f_owner)
-                    .field("f_fsid", &self.f_fsid)
-                    .field("f_fstypename", &self.f_fstypename)
-                    .field("f_mntfromname", &&self.f_mntfromname[..])
-                    .field("f_mntonname", &&self.f_mntonname[..])
-                    .finish()
-            }
-        }
         impl hash::Hash for statfs {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.f_version.hash(state);
@@ -403,18 +380,6 @@
             }
         }
         impl Eq for dirent {}
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_fileno", &self.d_fileno)
-                    .field("d_off", &self.d_off)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_type", &self.d_type)
-                    .field("d_namlen", &self.d_namlen)
-                    .field("d_name", &&self.d_name[..self.d_namlen as _])
-                    .finish()
-            }
-        }
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_fileno.hash(state);
@@ -442,22 +407,6 @@
             }
         }
         impl Eq for vnstat {}
-        impl fmt::Debug for vnstat {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let self_vn_devname: &[c_char] = &self.vn_devname;
-
-                f.debug_struct("vnstat")
-                    .field("vn_fileid", &self.vn_fileid)
-                    .field("vn_size", &self.vn_size)
-                    .field("vn_dev", &self.vn_dev)
-                    .field("vn_fsid", &self.vn_fsid)
-                    .field("vn_mntdir", &self.vn_mntdir)
-                    .field("vn_type", &self.vn_type)
-                    .field("vn_mode", &self.vn_mode)
-                    .field("vn_devname", &self_vn_devname)
-                    .finish()
-            }
-        }
         impl hash::Hash for vnstat {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let self_vn_devname: &[c_char] = &self.vn_devname;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs
index 505d2d1..5c40a355 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs
@@ -353,29 +353,6 @@
             }
         }
         impl Eq for statfs {}
-        impl fmt::Debug for statfs {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("statfs")
-                    .field("f_bsize", &self.f_bsize)
-                    .field("f_iosize", &self.f_iosize)
-                    .field("f_blocks", &self.f_blocks)
-                    .field("f_bfree", &self.f_bfree)
-                    .field("f_bavail", &self.f_bavail)
-                    .field("f_files", &self.f_files)
-                    .field("f_ffree", &self.f_ffree)
-                    .field("f_syncwrites", &self.f_syncwrites)
-                    .field("f_asyncwrites", &self.f_asyncwrites)
-                    .field("f_syncreads", &self.f_syncreads)
-                    .field("f_asyncreads", &self.f_asyncreads)
-                    .field("f_namemax", &self.f_namemax)
-                    .field("f_owner", &self.f_owner)
-                    .field("f_fsid", &self.f_fsid)
-                    .field("f_fstypename", &self.f_fstypename)
-                    .field("f_mntfromname", &&self.f_mntfromname[..])
-                    .field("f_mntonname", &&self.f_mntonname[..])
-                    .finish()
-            }
-        }
         impl hash::Hash for statfs {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.f_version.hash(state);
@@ -416,18 +393,6 @@
             }
         }
         impl Eq for dirent {}
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_fileno", &self.d_fileno)
-                    .field("d_off", &self.d_off)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_type", &self.d_type)
-                    .field("d_namlen", &self.d_namlen)
-                    .field("d_name", &&self.d_name[..self.d_namlen as _])
-                    .finish()
-            }
-        }
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_fileno.hash(state);
@@ -455,22 +420,6 @@
             }
         }
         impl Eq for vnstat {}
-        impl fmt::Debug for vnstat {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let self_vn_devname: &[c_char] = &self.vn_devname;
-
-                f.debug_struct("vnstat")
-                    .field("vn_fileid", &self.vn_fileid)
-                    .field("vn_size", &self.vn_size)
-                    .field("vn_dev", &self.vn_dev)
-                    .field("vn_fsid", &self.vn_fsid)
-                    .field("vn_mntdir", &self.vn_mntdir)
-                    .field("vn_type", &self.vn_type)
-                    .field("vn_mode", &self.vn_mode)
-                    .field("vn_devname", &self_vn_devname)
-                    .finish()
-            }
-        }
         impl hash::Hash for vnstat {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let self_vn_devname: &[c_char] = &self.vn_devname;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs
index 44a3656..de1001b2 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs
@@ -353,29 +353,6 @@
             }
         }
         impl Eq for statfs {}
-        impl fmt::Debug for statfs {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("statfs")
-                    .field("f_bsize", &self.f_bsize)
-                    .field("f_iosize", &self.f_iosize)
-                    .field("f_blocks", &self.f_blocks)
-                    .field("f_bfree", &self.f_bfree)
-                    .field("f_bavail", &self.f_bavail)
-                    .field("f_files", &self.f_files)
-                    .field("f_ffree", &self.f_ffree)
-                    .field("f_syncwrites", &self.f_syncwrites)
-                    .field("f_asyncwrites", &self.f_asyncwrites)
-                    .field("f_syncreads", &self.f_syncreads)
-                    .field("f_asyncreads", &self.f_asyncreads)
-                    .field("f_namemax", &self.f_namemax)
-                    .field("f_owner", &self.f_owner)
-                    .field("f_fsid", &self.f_fsid)
-                    .field("f_fstypename", &self.f_fstypename)
-                    .field("f_mntfromname", &&self.f_mntfromname[..])
-                    .field("f_mntonname", &&self.f_mntonname[..])
-                    .finish()
-            }
-        }
         impl hash::Hash for statfs {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.f_version.hash(state);
@@ -416,18 +393,6 @@
             }
         }
         impl Eq for dirent {}
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_fileno", &self.d_fileno)
-                    .field("d_off", &self.d_off)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_type", &self.d_type)
-                    .field("d_namlen", &self.d_namlen)
-                    .field("d_name", &&self.d_name[..self.d_namlen as _])
-                    .finish()
-            }
-        }
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_fileno.hash(state);
@@ -455,22 +420,6 @@
             }
         }
         impl Eq for vnstat {}
-        impl fmt::Debug for vnstat {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let self_vn_devname: &[c_char] = &self.vn_devname;
-
-                f.debug_struct("vnstat")
-                    .field("vn_fileid", &self.vn_fileid)
-                    .field("vn_size", &self.vn_size)
-                    .field("vn_dev", &self.vn_dev)
-                    .field("vn_fsid", &self.vn_fsid)
-                    .field("vn_mntdir", &self.vn_mntdir)
-                    .field("vn_type", &self.vn_type)
-                    .field("vn_mode", &self.vn_mode)
-                    .field("vn_devname", &self_vn_devname)
-                    .finish()
-            }
-        }
         impl hash::Hash for vnstat {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let self_vn_devname: &[c_char] = &self.vn_devname;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs
index 29c9c0c..6a02d7b 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs
@@ -354,29 +354,6 @@
             }
         }
         impl Eq for statfs {}
-        impl fmt::Debug for statfs {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("statfs")
-                    .field("f_bsize", &self.f_bsize)
-                    .field("f_iosize", &self.f_iosize)
-                    .field("f_blocks", &self.f_blocks)
-                    .field("f_bfree", &self.f_bfree)
-                    .field("f_bavail", &self.f_bavail)
-                    .field("f_files", &self.f_files)
-                    .field("f_ffree", &self.f_ffree)
-                    .field("f_syncwrites", &self.f_syncwrites)
-                    .field("f_asyncwrites", &self.f_asyncwrites)
-                    .field("f_syncreads", &self.f_syncreads)
-                    .field("f_asyncreads", &self.f_asyncreads)
-                    .field("f_namemax", &self.f_namemax)
-                    .field("f_owner", &self.f_owner)
-                    .field("f_fsid", &self.f_fsid)
-                    .field("f_fstypename", &self.f_fstypename)
-                    .field("f_mntfromname", &&self.f_mntfromname[..])
-                    .field("f_mntonname", &&self.f_mntonname[..])
-                    .finish()
-            }
-        }
         impl hash::Hash for statfs {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.f_version.hash(state);
@@ -417,18 +394,6 @@
             }
         }
         impl Eq for dirent {}
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_fileno", &self.d_fileno)
-                    .field("d_off", &self.d_off)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_type", &self.d_type)
-                    .field("d_namlen", &self.d_namlen)
-                    .field("d_name", &&self.d_name[..self.d_namlen as _])
-                    .finish()
-            }
-        }
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_fileno.hash(state);
@@ -456,22 +421,6 @@
             }
         }
         impl Eq for vnstat {}
-        impl fmt::Debug for vnstat {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let self_vn_devname: &[c_char] = &self.vn_devname;
-
-                f.debug_struct("vnstat")
-                    .field("vn_fileid", &self.vn_fileid)
-                    .field("vn_size", &self.vn_size)
-                    .field("vn_dev", &self.vn_dev)
-                    .field("vn_fsid", &self.vn_fsid)
-                    .field("vn_mntdir", &self.vn_mntdir)
-                    .field("vn_type", &self.vn_type)
-                    .field("vn_mode", &self.vn_mode)
-                    .field("vn_devname", &self_vn_devname)
-                    .finish()
-            }
-        }
         impl hash::Hash for vnstat {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let self_vn_devname: &[c_char] = &self.vn_devname;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/mod.rs
index 11830db..bd460157 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/mod.rs
@@ -1398,6 +1398,12 @@
         tqh_first: *mut c_void,
         tqh_last: *mut *mut c_void,
     }
+
+    pub struct splice {
+        pub sp_fd: c_int,
+        pub sp_max: off_t,
+        pub sp_idle: crate::timeval,
+    }
 }
 
 s_no_extra_traits! {
@@ -1720,20 +1726,6 @@
             }
         }
         impl Eq for utmpx {}
-        impl fmt::Debug for utmpx {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utmpx")
-                    .field("ut_type", &self.ut_type)
-                    .field("ut_tv", &self.ut_tv)
-                    .field("ut_id", &self.ut_id)
-                    .field("ut_pid", &self.ut_pid)
-                    .field("ut_user", &self.ut_user)
-                    .field("ut_line", &self.ut_line)
-                    // FIXME(debug): .field("ut_host", &self.ut_host)
-                    // FIXME(debug): .field("__ut_spare", &self.__ut_spare)
-                    .finish()
-            }
-        }
         impl hash::Hash for utmpx {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ut_type.hash(state);
@@ -1769,17 +1761,6 @@
             }
         }
         impl Eq for xucred {}
-        impl fmt::Debug for xucred {
-            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-                f.debug_struct("xucred")
-                    .field("cr_version", &self.cr_version)
-                    .field("cr_uid", &self.cr_uid)
-                    .field("cr_ngroups", &self.cr_ngroups)
-                    .field("cr_groups", &self.cr_groups)
-                    .field("cr_pid__c_anonymous_union", &self.cr_pid__c_anonymous_union)
-                    .finish()
-            }
-        }
         impl hash::Hash for xucred {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.cr_version.hash(state);
@@ -1807,20 +1788,6 @@
             }
         }
         impl Eq for sockaddr_dl {}
-        impl fmt::Debug for sockaddr_dl {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_dl")
-                    .field("sdl_len", &self.sdl_len)
-                    .field("sdl_family", &self.sdl_family)
-                    .field("sdl_index", &self.sdl_index)
-                    .field("sdl_type", &self.sdl_type)
-                    .field("sdl_nlen", &self.sdl_nlen)
-                    .field("sdl_alen", &self.sdl_alen)
-                    .field("sdl_slen", &self.sdl_slen)
-                    // FIXME(debug): .field("sdl_data", &self.sdl_data)
-                    .finish()
-            }
-        }
         impl hash::Hash for sockaddr_dl {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sdl_len.hash(state);
@@ -1843,16 +1810,6 @@
             }
         }
         impl Eq for mq_attr {}
-        impl fmt::Debug for mq_attr {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mq_attr")
-                    .field("mq_flags", &self.mq_flags)
-                    .field("mq_maxmsg", &self.mq_maxmsg)
-                    .field("mq_msgsize", &self.mq_msgsize)
-                    .field("mq_curmsgs", &self.mq_curmsgs)
-                    .finish()
-            }
-        }
         impl hash::Hash for mq_attr {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.mq_flags.hash(state);
@@ -1871,16 +1828,6 @@
             }
         }
         impl Eq for sigevent {}
-        impl fmt::Debug for sigevent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sigevent")
-                    .field("sigev_notify", &self.sigev_notify)
-                    .field("sigev_signo", &self.sigev_signo)
-                    .field("sigev_value", &self.sigev_value)
-                    .field("sigev_notify_thread_id", &self.sigev_notify_thread_id)
-                    .finish()
-            }
-        }
         impl hash::Hash for sigevent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sigev_notify.hash(state);
@@ -1899,16 +1846,6 @@
             }
         }
         impl Eq for ptsstat {}
-        impl fmt::Debug for ptsstat {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let self_devname: &[c_char] = &self.devname;
-
-                f.debug_struct("ptsstat")
-                    .field("dev", &self.dev)
-                    .field("devname", &self_devname)
-                    .finish()
-            }
-        }
         impl hash::Hash for ptsstat {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let self_devname: &[c_char] = &self.devname;
@@ -1930,14 +1867,6 @@
             }
         }
         impl Eq for Elf32_Auxinfo {}
-        impl fmt::Debug for Elf32_Auxinfo {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("Elf32_Auxinfo")
-                    .field("a_type", &self.a_type)
-                    .field("a_un", &self.a_un)
-                    .finish()
-            }
-        }
 
         impl PartialEq for __c_anonymous_ifr_ifru {
             fn eq(&self, other: &__c_anonymous_ifr_ifru) -> bool {
@@ -1987,14 +1916,6 @@
             }
         }
         impl Eq for ifreq {}
-        impl fmt::Debug for ifreq {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ifreq")
-                    .field("ifr_name", &self.ifr_name)
-                    .field("ifr_ifru", &self.ifr_ifru)
-                    .finish()
-            }
-        }
         impl hash::Hash for ifreq {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ifr_name.hash(state);
@@ -2026,16 +1947,6 @@
             }
         }
         impl Eq for ifstat {}
-        impl fmt::Debug for ifstat {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let ascii: &[c_char] = &self.ascii;
-
-                f.debug_struct("ifstat")
-                    .field("ifs_name", &self.ifs_name)
-                    .field("ascii", &ascii)
-                    .finish()
-            }
-        }
         impl hash::Hash for ifstat {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ifs_name.hash(state);
@@ -2056,19 +1967,6 @@
             }
         }
         impl Eq for ifrsskey {}
-        impl fmt::Debug for ifrsskey {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let ifrk_key: &[u8] = &self.ifrk_key;
-
-                f.debug_struct("ifrsskey")
-                    .field("ifrk_name", &self.ifrk_name)
-                    .field("ifrk_func", &self.ifrk_func)
-                    .field("ifrk_spare0", &self.ifrk_spare0)
-                    .field("ifrk_keylen", &self.ifrk_keylen)
-                    .field("ifrk_key", &ifrk_key)
-                    .finish()
-            }
-        }
         impl hash::Hash for ifrsskey {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ifrk_name.hash(state);
@@ -2091,18 +1989,6 @@
             }
         }
         impl Eq for ifdownreason {}
-        impl fmt::Debug for ifdownreason {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let ifdr_msg: &[c_char] = &self.ifdr_msg;
-
-                f.debug_struct("ifdownreason")
-                    .field("ifdr_name", &self.ifdr_name)
-                    .field("ifdr_reason", &self.ifdr_reason)
-                    .field("ifdr_vendor", &self.ifdr_vendor)
-                    .field("ifdr_msg", &ifdr_msg)
-                    .finish()
-            }
-        }
         impl hash::Hash for ifdownreason {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ifdr_name.hash(state);
@@ -2172,37 +2058,6 @@
             }
         }
         impl Eq for if_data {}
-        impl fmt::Debug for if_data {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("if_data")
-                    .field("ifi_type", &self.ifi_type)
-                    .field("ifi_physical", &self.ifi_physical)
-                    .field("ifi_addrlen", &self.ifi_addrlen)
-                    .field("ifi_hdrlen", &self.ifi_hdrlen)
-                    .field("ifi_link_state", &self.ifi_link_state)
-                    .field("ifi_vhid", &self.ifi_vhid)
-                    .field("ifi_datalen", &self.ifi_datalen)
-                    .field("ifi_mtu", &self.ifi_mtu)
-                    .field("ifi_metric", &self.ifi_metric)
-                    .field("ifi_baudrate", &self.ifi_baudrate)
-                    .field("ifi_ipackets", &self.ifi_ipackets)
-                    .field("ifi_ierrors", &self.ifi_ierrors)
-                    .field("ifi_opackets", &self.ifi_opackets)
-                    .field("ifi_oerrors", &self.ifi_oerrors)
-                    .field("ifi_collisions", &self.ifi_collisions)
-                    .field("ifi_ibytes", &self.ifi_ibytes)
-                    .field("ifi_obytes", &self.ifi_obytes)
-                    .field("ifi_imcasts", &self.ifi_imcasts)
-                    .field("ifi_omcasts", &self.ifi_omcasts)
-                    .field("ifi_iqdrops", &self.ifi_iqdrops)
-                    .field("ifi_oqdrops", &self.ifi_oqdrops)
-                    .field("ifi_noproto", &self.ifi_noproto)
-                    .field("ifi_hwassist", &self.ifi_hwassist)
-                    .field("__ifi_epoch", &self.__ifi_epoch)
-                    .field("__ifi_lastchange", &self.__ifi_lastchange)
-                    .finish()
-            }
-        }
         impl hash::Hash for if_data {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ifi_type.hash(state);
@@ -2242,16 +2097,6 @@
             }
         }
         impl Eq for sctphdr {}
-        impl fmt::Debug for sctphdr {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sctphdr")
-                    .field("src_port", &{ self.src_port })
-                    .field("dest_port", &{ self.dest_port })
-                    .field("v_tag", &{ self.v_tag })
-                    .field("checksum", &{ self.checksum })
-                    .finish()
-            }
-        }
         impl hash::Hash for sctphdr {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 { self.src_port }.hash(state);
@@ -2269,15 +2114,6 @@
             }
         }
         impl Eq for sctp_chunkhdr {}
-        impl fmt::Debug for sctp_chunkhdr {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sctp_chunkhdr")
-                    .field("chunk_type", &{ self.chunk_type })
-                    .field("chunk_flags", &{ self.chunk_flags })
-                    .field("chunk_length", &{ self.chunk_length })
-                    .finish()
-            }
-        }
         impl hash::Hash for sctp_chunkhdr {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 { self.chunk_type }.hash(state);
@@ -2294,14 +2130,6 @@
             }
         }
         impl Eq for sctp_paramhdr {}
-        impl fmt::Debug for sctp_paramhdr {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sctp_paramhdr")
-                    .field("param_type", &{ self.param_type })
-                    .field("param_length", &{ self.param_length })
-                    .finish()
-            }
-        }
         impl hash::Hash for sctp_paramhdr {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 { self.param_type }.hash(state);
@@ -2320,15 +2148,6 @@
             }
         }
         impl Eq for sctp_gen_error_cause {}
-        impl fmt::Debug for sctp_gen_error_cause {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sctp_gen_error_cause")
-                    .field("code", &{ self.code })
-                    .field("length", &{ self.length })
-                    // FIXME(debug): .field("info", &{self.info})
-                    .finish()
-            }
-        }
         impl hash::Hash for sctp_gen_error_cause {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 { self.code }.hash(state);
@@ -2343,14 +2162,6 @@
             }
         }
         impl Eq for sctp_error_cause {}
-        impl fmt::Debug for sctp_error_cause {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sctp_error_cause")
-                    .field("code", &{ self.code })
-                    .field("length", &{ self.length })
-                    .finish()
-            }
-        }
         impl hash::Hash for sctp_error_cause {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 { self.code }.hash(state);
@@ -2366,14 +2177,6 @@
             }
         }
         impl Eq for sctp_error_invalid_stream {}
-        impl fmt::Debug for sctp_error_invalid_stream {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sctp_error_invalid_stream")
-                    .field("cause", &{ self.cause })
-                    .field("stream_id", &{ self.stream_id })
-                    .finish()
-            }
-        }
         impl hash::Hash for sctp_error_invalid_stream {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 { self.cause }.hash(state);
@@ -2392,15 +2195,6 @@
             }
         }
         impl Eq for sctp_error_missing_param {}
-        impl fmt::Debug for sctp_error_missing_param {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sctp_error_missing_param")
-                    .field("cause", &{ self.cause })
-                    .field("num_missing_params", &{ self.num_missing_params })
-                    // FIXME(debug): .field("tpe", &{self.tpe})
-                    .finish()
-            }
-        }
         impl hash::Hash for sctp_error_missing_param {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 { self.cause }.hash(state);
@@ -2417,14 +2211,6 @@
             }
         }
         impl Eq for sctp_error_stale_cookie {}
-        impl fmt::Debug for sctp_error_stale_cookie {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sctp_error_stale_cookie")
-                    .field("cause", &{ self.cause })
-                    .field("stale_time", &{ self.stale_time })
-                    .finish()
-            }
-        }
         impl hash::Hash for sctp_error_stale_cookie {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 { self.cause }.hash(state);
@@ -2438,13 +2224,6 @@
             }
         }
         impl Eq for sctp_error_out_of_resource {}
-        impl fmt::Debug for sctp_error_out_of_resource {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sctp_error_out_of_resource")
-                    .field("cause", &{ self.cause })
-                    .finish()
-            }
-        }
         impl hash::Hash for sctp_error_out_of_resource {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 { self.cause }.hash(state);
@@ -2457,13 +2236,6 @@
             }
         }
         impl Eq for sctp_error_unresolv_addr {}
-        impl fmt::Debug for sctp_error_unresolv_addr {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sctp_error_unresolv_addr")
-                    .field("cause", &{ self.cause })
-                    .finish()
-            }
-        }
         impl hash::Hash for sctp_error_unresolv_addr {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 { self.cause }.hash(state);
@@ -2476,14 +2248,6 @@
             }
         }
         impl Eq for sctp_error_unrecognized_chunk {}
-        impl fmt::Debug for sctp_error_unrecognized_chunk {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sctp_error_unrecognized_chunk")
-                    .field("cause", &{ self.cause })
-                    .field("ch", &{ self.ch })
-                    .finish()
-            }
-        }
         impl hash::Hash for sctp_error_unrecognized_chunk {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 { self.cause }.hash(state);
@@ -2497,14 +2261,6 @@
             }
         }
         impl Eq for sctp_error_no_user_data {}
-        impl fmt::Debug for sctp_error_no_user_data {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sctp_error_no_user_data")
-                    .field("cause", &{ self.cause })
-                    .field("tsn", &{ self.tsn })
-                    .finish()
-            }
-        }
         impl hash::Hash for sctp_error_no_user_data {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 { self.cause }.hash(state);
@@ -2518,14 +2274,6 @@
             }
         }
         impl Eq for sctp_error_auth_invalid_hmac {}
-        impl fmt::Debug for sctp_error_auth_invalid_hmac {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sctp_error_invalid_hmac")
-                    .field("cause", &{ self.cause })
-                    .field("hmac_id", &{ self.hmac_id })
-                    .finish()
-            }
-        }
         impl hash::Hash for sctp_error_auth_invalid_hmac {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 { self.cause }.hash(state);
@@ -2551,21 +2299,6 @@
             }
         }
         impl Eq for kinfo_file {}
-        impl fmt::Debug for kinfo_file {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("kinfo_file")
-                    .field("kf_structsize", &self.kf_structsize)
-                    .field("kf_type", &self.kf_type)
-                    .field("kf_fd", &self.kf_fd)
-                    .field("kf_ref_count", &self.kf_ref_count)
-                    .field("kf_flags", &self.kf_flags)
-                    .field("kf_offset", &self.kf_offset)
-                    .field("kf_status", &self.kf_status)
-                    .field("kf_cap_rights", &self.kf_cap_rights)
-                    .field("kf_path", &&self.kf_path[..])
-                    .finish()
-            }
-        }
         impl hash::Hash for kinfo_file {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.kf_structsize.hash(state);
@@ -2579,18 +2312,6 @@
                 self.kf_path.hash(state);
             }
         }
-
-        impl fmt::Debug for ucontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ucontext_t")
-                    .field("uc_sigmask", &self.uc_sigmask)
-                    .field("uc_mcontext", &self.uc_mcontext)
-                    .field("uc_link", &self.uc_link)
-                    .field("uc_stack", &self.uc_stack)
-                    .field("uc_flags", &self.uc_flags)
-                    .finish()
-            }
-        }
     }
 }
 
@@ -3193,6 +2914,7 @@
 pub const SO_PROTOTYPE: c_int = SO_PROTOCOL;
 pub const SO_TS_CLOCK: c_int = 0x1017;
 pub const SO_DOMAIN: c_int = 0x1019;
+pub const SO_SPLICE: c_int = 0x1023;
 pub const SO_VENDOR: c_int = 0x80000000;
 
 pub const SO_TS_REALTIME_MICRO: c_int = 0;
@@ -4930,7 +4652,7 @@
 
 f! {
     pub fn CMSG_DATA(cmsg: *const cmsghdr) -> *mut c_uchar {
-        (cmsg as *mut c_uchar).offset(_ALIGN(mem::size_of::<cmsghdr>()) as isize)
+        (cmsg as *mut c_uchar).add(_ALIGN(mem::size_of::<cmsghdr>()))
     }
 
     pub {const} fn CMSG_LEN(length: c_uint) -> c_uint {
@@ -4945,7 +4667,7 @@
             cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize) + _ALIGN(mem::size_of::<cmsghdr>());
         let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize;
         if next > max {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         } else {
             (cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr
         }
@@ -4992,14 +4714,12 @@
         let bitset_bits = 8 * mem::size_of::<c_long>();
         let (idx, offset) = (cpu / bitset_bits, cpu % bitset_bits);
         cpuset.__bits[idx] |= 1 << offset;
-        ()
     }
 
     pub fn CPU_CLR(cpu: usize, cpuset: &mut cpuset_t) -> () {
         let bitset_bits = 8 * mem::size_of::<c_long>();
         let (idx, offset) = (cpu / bitset_bits, cpu % bitset_bits);
         cpuset.__bits[idx] &= !(1 << offset);
-        ()
     }
 
     pub fn CPU_ISSET(cpu: usize, cpuset: &cpuset_t) -> bool {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc.rs
index 9fde25d..a6d9ed6d 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc.rs
@@ -37,21 +37,6 @@
             }
         }
         impl Eq for mcontext_t {}
-        impl fmt::Debug for mcontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mcontext_t")
-                    .field("mc_vers", &self.mc_vers)
-                    .field("mc_flags", &self.mc_flags)
-                    .field("mc_onstack", &self.mc_onstack)
-                    .field("mc_len", &self.mc_len)
-                    .field("mc_avec", &self.mc_avec)
-                    .field("mc_av", &self.mc_av)
-                    .field("mc_frame", &self.mc_frame)
-                    .field("mc_fpreg", &self.mc_fpreg)
-                    .field("mc_vsxfpreg", &self.mc_vsxfpreg)
-                    .finish()
-            }
-        }
         impl hash::Hash for mcontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.mc_vers.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs
index e7df7f7..87b425ad 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs
@@ -37,21 +37,6 @@
             }
         }
         impl Eq for mcontext_t {}
-        impl fmt::Debug for mcontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mcontext_t")
-                    .field("mc_vers", &self.mc_vers)
-                    .field("mc_flags", &self.mc_flags)
-                    .field("mc_onstack", &self.mc_onstack)
-                    .field("mc_len", &self.mc_len)
-                    .field("mc_avec", &self.mc_avec)
-                    .field("mc_av", &self.mc_av)
-                    .field("mc_frame", &self.mc_frame)
-                    .field("mc_fpreg", &self.mc_fpreg)
-                    .field("mc_vsxfpreg", &self.mc_vsxfpreg)
-                    .finish()
-            }
-        }
         impl hash::Hash for mcontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.mc_vers.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/riscv64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/riscv64.rs
index 449a29f..bc065cfa5 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/riscv64.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/riscv64.rs
@@ -51,21 +51,6 @@
             }
         }
         impl Eq for gpregs {}
-        impl fmt::Debug for gpregs {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("gpregs")
-                    .field("gp_ra", &self.gp_ra)
-                    .field("gp_sp", &self.gp_sp)
-                    .field("gp_gp", &self.gp_gp)
-                    .field("gp_tp", &self.gp_tp)
-                    .field("gp_t", &self.gp_t)
-                    .field("gp_s", &self.gp_s)
-                    .field("gp_a", &self.gp_a)
-                    .field("gp_sepc", &self.gp_sepc)
-                    .field("gp_sstatus", &self.gp_sstatus)
-                    .finish()
-            }
-        }
         impl hash::Hash for gpregs {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.gp_ra.hash(state);
@@ -88,16 +73,6 @@
             }
         }
         impl Eq for fpregs {}
-        impl fmt::Debug for fpregs {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("fpregs")
-                    .field("fp_x", &self.fp_x)
-                    .field("fp_fcsr", &self.fp_fcsr)
-                    .field("fp_flags", &self.fp_flags)
-                    .field("pad", &self.pad)
-                    .finish()
-            }
-        }
         impl hash::Hash for fpregs {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.fp_x.hash(state);
@@ -120,17 +95,6 @@
             }
         }
         impl Eq for mcontext_t {}
-        impl fmt::Debug for mcontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mcontext_t")
-                    .field("mc_gpregs", &self.mc_gpregs)
-                    .field("mc_fpregs", &self.mc_fpregs)
-                    .field("mc_flags", &self.mc_flags)
-                    .field("mc_pad", &self.mc_pad)
-                    .field("mc_spare", &self.mc_spare)
-                    .finish()
-            }
-        }
         impl hash::Hash for mcontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.mc_gpregs.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86.rs
index b196eafe..b7397193 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86.rs
@@ -87,42 +87,6 @@
             }
         }
         impl Eq for mcontext_t {}
-        impl fmt::Debug for mcontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mcontext_t")
-                    .field("mc_onstack", &self.mc_onstack)
-                    .field("mc_gs", &self.mc_gs)
-                    .field("mc_fs", &self.mc_fs)
-                    .field("mc_es", &self.mc_es)
-                    .field("mc_ds", &self.mc_ds)
-                    .field("mc_edi", &self.mc_edi)
-                    .field("mc_esi", &self.mc_esi)
-                    .field("mc_ebp", &self.mc_ebp)
-                    .field("mc_isp", &self.mc_isp)
-                    .field("mc_ebx", &self.mc_ebx)
-                    .field("mc_edx", &self.mc_edx)
-                    .field("mc_ecx", &self.mc_ecx)
-                    .field("mc_eax", &self.mc_eax)
-                    .field("mc_trapno", &self.mc_trapno)
-                    .field("mc_err", &self.mc_err)
-                    .field("mc_eip", &self.mc_eip)
-                    .field("mc_cs", &self.mc_cs)
-                    .field("mc_eflags", &self.mc_eflags)
-                    .field("mc_esp", &self.mc_esp)
-                    .field("mc_ss", &self.mc_ss)
-                    .field("mc_len", &self.mc_len)
-                    .field("mc_fpformat", &self.mc_fpformat)
-                    .field("mc_ownedfp", &self.mc_ownedfp)
-                    .field("mc_flags", &self.mc_flags)
-                    .field("mc_fpstate", &self.mc_fpstate)
-                    .field("mc_fsbase", &self.mc_fsbase)
-                    .field("mc_gsbase", &self.mc_gsbase)
-                    .field("mc_xfpustate", &self.mc_xfpustate)
-                    .field("mc_xfpustate_len", &self.mc_xfpustate_len)
-                    .field("mc_spare2", &self.mc_spare2)
-                    .finish()
-            }
-        }
         impl hash::Hash for mcontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.mc_onstack.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs
index 0658470..40e1d72 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs
@@ -156,16 +156,6 @@
             }
         }
         impl Eq for fpreg32 {}
-        impl fmt::Debug for fpreg32 {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("fpreg32")
-                    .field("fpr_env", &&self.fpr_env[..])
-                    .field("fpr_acc", &self.fpr_acc)
-                    .field("fpr_ex_sw", &self.fpr_ex_sw)
-                    .field("fpr_pad", &&self.fpr_pad[..])
-                    .finish()
-            }
-        }
         impl hash::Hash for fpreg32 {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.fpr_env.hash(state);
@@ -184,16 +174,6 @@
             }
         }
         impl Eq for fpreg {}
-        impl fmt::Debug for fpreg {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("fpreg")
-                    .field("fpr_env", &self.fpr_env)
-                    .field("fpr_acc", &self.fpr_acc)
-                    .field("fpr_xacc", &self.fpr_xacc)
-                    .field("fpr_spare", &self.fpr_spare)
-                    .finish()
-            }
-        }
         impl hash::Hash for fpreg {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.fpr_env.hash(state);
@@ -216,16 +196,6 @@
             }
         }
         impl Eq for xmmreg {}
-        impl fmt::Debug for xmmreg {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("xmmreg")
-                    .field("xmm_env", &self.xmm_env)
-                    .field("xmm_acc", &self.xmm_acc)
-                    .field("xmm_reg", &self.xmm_reg)
-                    .field("xmm_pad", &&self.xmm_pad[..])
-                    .finish()
-            }
-        }
         impl hash::Hash for xmmreg {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.xmm_env.hash(state);
@@ -253,14 +223,6 @@
             }
         }
         impl Eq for Elf64_Auxinfo {}
-        impl fmt::Debug for Elf64_Auxinfo {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("Elf64_Auxinfo")
-                    .field("a_type", &self.a_type)
-                    .field("a_un", &self.a_un)
-                    .finish()
-            }
-        }
 
         impl PartialEq for mcontext_t {
             fn eq(&self, other: &mcontext_t) -> bool {
@@ -309,50 +271,6 @@
             }
         }
         impl Eq for mcontext_t {}
-        impl fmt::Debug for mcontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mcontext_t")
-                    .field("mc_onstack", &self.mc_onstack)
-                    .field("mc_rdi", &self.mc_rdi)
-                    .field("mc_rsi", &self.mc_rsi)
-                    .field("mc_rdx", &self.mc_rdx)
-                    .field("mc_rcx", &self.mc_rcx)
-                    .field("mc_r8", &self.mc_r8)
-                    .field("mc_r9", &self.mc_r9)
-                    .field("mc_rax", &self.mc_rax)
-                    .field("mc_rbx", &self.mc_rbx)
-                    .field("mc_rbp", &self.mc_rbp)
-                    .field("mc_r10", &self.mc_r10)
-                    .field("mc_r11", &self.mc_r11)
-                    .field("mc_r12", &self.mc_r12)
-                    .field("mc_r13", &self.mc_r13)
-                    .field("mc_r14", &self.mc_r14)
-                    .field("mc_r15", &self.mc_r15)
-                    .field("mc_trapno", &self.mc_trapno)
-                    .field("mc_fs", &self.mc_fs)
-                    .field("mc_gs", &self.mc_gs)
-                    .field("mc_addr", &self.mc_addr)
-                    .field("mc_flags", &self.mc_flags)
-                    .field("mc_es", &self.mc_es)
-                    .field("mc_ds", &self.mc_ds)
-                    .field("mc_err", &self.mc_err)
-                    .field("mc_rip", &self.mc_rip)
-                    .field("mc_cs", &self.mc_cs)
-                    .field("mc_rflags", &self.mc_rflags)
-                    .field("mc_rsp", &self.mc_rsp)
-                    .field("mc_ss", &self.mc_ss)
-                    .field("mc_len", &self.mc_len)
-                    .field("mc_fpformat", &self.mc_fpformat)
-                    .field("mc_ownedfp", &self.mc_ownedfp)
-                    // FIXME(debug): .field("mc_fpstate", &self.mc_fpstate)
-                    .field("mc_fsbase", &self.mc_fsbase)
-                    .field("mc_gsbase", &self.mc_gsbase)
-                    .field("mc_xfpustate", &self.mc_xfpustate)
-                    .field("mc_xfpustate_len", &self.mc_xfpustate_len)
-                    .field("mc_spare", &self.mc_spare)
-                    .finish()
-            }
-        }
         impl hash::Hash for mcontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.mc_onstack.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/mod.rs
index 5ed09c78..644e035 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/mod.rs
@@ -378,7 +378,7 @@
         pub cgid: crate::gid_t,
         pub uid: crate::uid_t,
         pub gid: crate::gid_t,
-        pub mode: crate::mode_t,
+        pub mode: mode_t,
         pub seq: c_ushort,
         pub key: crate::key_t,
     }
@@ -414,17 +414,6 @@
             }
         }
         impl Eq for sockaddr_storage {}
-        impl fmt::Debug for sockaddr_storage {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_storage")
-                    .field("ss_len", &self.ss_len)
-                    .field("ss_family", &self.ss_family)
-                    .field("__ss_pad1", &self.__ss_pad1)
-                    .field("__ss_align", &self.__ss_align)
-                    // FIXME(debug): .field("__ss_pad2", &self.__ss_pad2)
-                    .finish()
-            }
-        }
         impl hash::Hash for sockaddr_storage {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ss_len.hash(state);
@@ -1602,13 +1591,12 @@
     pub fn lchflags(path: *const c_char, flags: c_ulong) -> c_int;
     pub fn lutimes(file: *const c_char, times: *const crate::timeval) -> c_int;
     pub fn memrchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void;
-    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int;
+    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int;
     #[cfg_attr(
         all(target_os = "freebsd", any(freebsd11, freebsd10)),
         link_name = "mknodat@FBSD_1.1"
     )]
-    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t)
-        -> c_int;
+    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int;
     pub fn malloc_usable_size(ptr: *const c_void) -> size_t;
     pub fn mincore(addr: *const c_void, len: size_t, vec: *mut c_char) -> c_int;
     pub fn newlocale(mask: c_int, locale: *const c_char, base: crate::locale_t) -> crate::locale_t;
@@ -1730,7 +1718,7 @@
     pub fn setresuid(ruid: crate::uid_t, euid: crate::uid_t, suid: crate::uid_t) -> c_int;
     pub fn settimeofday(tv: *const crate::timeval, tz: *const crate::timezone) -> c_int;
     pub fn setutxent();
-    pub fn shm_open(name: *const c_char, oflag: c_int, mode: crate::mode_t) -> c_int;
+    pub fn shm_open(name: *const c_char, oflag: c_int, mode: mode_t) -> c_int;
     pub fn sigtimedwait(
         set: *const sigset_t,
         info: *mut siginfo_t,
@@ -1872,7 +1860,7 @@
         fd: c_int,
         path: *const c_char,
         oflag: c_int,
-        mode: crate::mode_t,
+        mode: mode_t,
     ) -> c_int;
     pub fn posix_spawn_file_actions_addclose(
         actions: *mut posix_spawn_file_actions_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/mod.rs
index 674fdc08..f2f17f4 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/mod.rs
@@ -180,16 +180,6 @@
 
         impl Eq for sockaddr_un {}
 
-        impl fmt::Debug for sockaddr_un {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_un")
-                    .field("sun_len", &self.sun_len)
-                    .field("sun_family", &self.sun_family)
-                    // FIXME(debug): .field("sun_path", &self.sun_path)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for sockaddr_un {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sun_len.hash(state);
@@ -229,18 +219,6 @@
 
         impl Eq for utsname {}
 
-        impl fmt::Debug for utsname {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utsname")
-                    // FIXME(debug): .field("sysname", &self.sysname)
-                    // FIXME(debug): .field("nodename", &self.nodename)
-                    // FIXME(debug): .field("release", &self.release)
-                    // FIXME(debug): .field("version", &self.version)
-                    // FIXME(debug): .field("machine", &self.machine)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for utsname {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sysname.hash(state);
@@ -596,7 +574,7 @@
 f! {
     pub fn CMSG_FIRSTHDR(mhdr: *const crate::msghdr) -> *mut cmsghdr {
         if (*mhdr).msg_controllen as usize >= mem::size_of::<cmsghdr>() {
-            (*mhdr).msg_control as *mut cmsghdr
+            (*mhdr).msg_control.cast::<cmsghdr>()
         } else {
             core::ptr::null_mut()
         }
@@ -623,7 +601,7 @@
     }
 
     pub fn FD_ZERO(set: *mut fd_set) -> () {
-        for slot in (*set).fds_bits.iter_mut() {
+        for slot in &mut (*set).fds_bits {
             *slot = 0;
         }
     }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/mod.rs
index dfd58d7..682b8b7 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/mod.rs
@@ -78,7 +78,7 @@
         pub cgid: crate::gid_t,
         pub uid: crate::uid_t,
         pub gid: crate::gid_t,
-        pub mode: crate::mode_t,
+        pub mode: mode_t,
         #[cfg(target_os = "openbsd")]
         pub seq: c_ushort,
         #[cfg(target_os = "netbsd")]
@@ -689,7 +689,7 @@
     #[cfg_attr(target_os = "netbsd", link_name = "__clock_settime50")]
     pub fn clock_settime(clk_id: crate::clockid_t, tp: *const crate::timespec) -> c_int;
     pub fn __errno() -> *mut c_int;
-    pub fn shm_open(name: *const c_char, oflag: c_int, mode: crate::mode_t) -> c_int;
+    pub fn shm_open(name: *const c_char, oflag: c_int, mode: mode_t) -> c_int;
     pub fn memrchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void;
     pub fn mkostemp(template: *mut c_char, flags: c_int) -> c_int;
     pub fn mkostemps(template: *mut c_char, suffixlen: c_int, flags: c_int) -> c_int;
@@ -707,9 +707,8 @@
     pub fn getpriority(which: c_int, who: crate::id_t) -> c_int;
     pub fn setpriority(which: c_int, who: crate::id_t, prio: c_int) -> c_int;
 
-    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t)
-        -> c_int;
-    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int;
+    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int;
+    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int;
     pub fn sem_timedwait(sem: *mut sem_t, abstime: *const crate::timespec) -> c_int;
     pub fn sem_getvalue(sem: *mut sem_t, sval: *mut c_int) -> c_int;
     pub fn pthread_condattr_setclock(
@@ -830,7 +829,7 @@
         fd: c_int,
         path: *const c_char,
         oflag: c_int,
-        mode: crate::mode_t,
+        mode: mode_t,
     ) -> c_int;
     pub fn posix_spawn_file_actions_addclose(
         actions: *mut posix_spawn_file_actions_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/netbsd/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/netbsd/mod.rs
index 9f44907..3addd5a8 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/netbsd/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/netbsd/mod.rs
@@ -940,24 +940,6 @@
 
         impl Eq for utmpx {}
 
-        impl fmt::Debug for utmpx {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utmpx")
-                    .field("ut_name", &self.ut_name)
-                    .field("ut_id", &self.ut_id)
-                    .field("ut_line", &self.ut_line)
-                    // FIXME(debug) .field("ut_host", &self.ut_host)
-                    .field("ut_session", &self.ut_session)
-                    .field("ut_type", &self.ut_type)
-                    .field("ut_pid", &self.ut_pid)
-                    .field("ut_exit", &self.ut_exit)
-                    .field("ut_ss", &self.ut_ss)
-                    .field("ut_tv", &self.ut_tv)
-                    // FIXME(debug) .field("ut_pad", &self.ut_pad)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for utmpx {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ut_name.hash(state);
@@ -989,17 +971,6 @@
 
         impl Eq for lastlogx {}
 
-        impl fmt::Debug for lastlogx {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("lastlogx")
-                    .field("ll_tv", &self.ll_tv)
-                    .field("ll_line", &self.ll_line)
-                    // FIXME(debug).field("ll_host", &self.ll_host)
-                    .field("ll_ss", &self.ll_ss)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for lastlogx {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ll_tv.hash(state);
@@ -1015,14 +986,6 @@
             }
         }
         impl Eq for in_pktinfo {}
-        impl fmt::Debug for in_pktinfo {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("in_pktinfo")
-                    .field("ipi_addr", &self.ipi_addr)
-                    .field("ipi_ifindex", &self.ipi_ifindex)
-                    .finish()
-            }
-        }
         impl hash::Hash for in_pktinfo {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ipi_addr.hash(state);
@@ -1040,20 +1003,6 @@
             }
         }
         impl Eq for arphdr {}
-        impl fmt::Debug for arphdr {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let ar_hrd = self.ar_hrd;
-                let ar_pro = self.ar_pro;
-                let ar_op = self.ar_op;
-                f.debug_struct("arphdr")
-                    .field("ar_hrd", &ar_hrd)
-                    .field("ar_pro", &ar_pro)
-                    .field("ar_hln", &self.ar_hln)
-                    .field("ar_pln", &self.ar_pln)
-                    .field("ar_op", &ar_op)
-                    .finish()
-            }
-        }
         impl hash::Hash for arphdr {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let ar_hrd = self.ar_hrd;
@@ -1073,12 +1022,6 @@
             }
         }
         impl Eq for in_addr {}
-        impl fmt::Debug for in_addr {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let s_addr = self.s_addr;
-                f.debug_struct("in_addr").field("s_addr", &s_addr).finish()
-            }
-        }
         impl hash::Hash for in_addr {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let s_addr = self.s_addr;
@@ -1093,14 +1036,6 @@
             }
         }
         impl Eq for ip_mreq {}
-        impl fmt::Debug for ip_mreq {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ip_mreq")
-                    .field("imr_multiaddr", &self.imr_multiaddr)
-                    .field("imr_interface", &self.imr_interface)
-                    .finish()
-            }
-        }
         impl hash::Hash for ip_mreq {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.imr_multiaddr.hash(state);
@@ -1118,17 +1053,6 @@
             }
         }
         impl Eq for sockaddr_in {}
-        impl fmt::Debug for sockaddr_in {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_in")
-                    .field("sin_len", &self.sin_len)
-                    .field("sin_family", &self.sin_family)
-                    .field("sin_port", &self.sin_port)
-                    .field("sin_addr", &self.sin_addr)
-                    .field("sin_zero", &self.sin_zero)
-                    .finish()
-            }
-        }
         impl hash::Hash for sockaddr_in {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sin_len.hash(state);
@@ -1153,17 +1077,6 @@
             }
         }
         impl Eq for dirent {}
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_fileno", &self.d_fileno)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_namlen", &self.d_namlen)
-                    .field("d_type", &self.d_type)
-                    // FIXME(debug): .field("d_name", &self.d_name)
-                    .finish()
-            }
-        }
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_fileno.hash(state);
@@ -1211,36 +1124,6 @@
             }
         }
         impl Eq for statvfs {}
-        impl fmt::Debug for statvfs {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("statvfs")
-                    .field("f_flag", &self.f_flag)
-                    .field("f_bsize", &self.f_bsize)
-                    .field("f_frsize", &self.f_frsize)
-                    .field("f_iosize", &self.f_iosize)
-                    .field("f_blocks", &self.f_blocks)
-                    .field("f_bfree", &self.f_bfree)
-                    .field("f_bavail", &self.f_bavail)
-                    .field("f_bresvd", &self.f_bresvd)
-                    .field("f_files", &self.f_files)
-                    .field("f_ffree", &self.f_ffree)
-                    .field("f_favail", &self.f_favail)
-                    .field("f_fresvd", &self.f_fresvd)
-                    .field("f_syncreads", &self.f_syncreads)
-                    .field("f_syncwrites", &self.f_syncwrites)
-                    .field("f_asyncreads", &self.f_asyncreads)
-                    .field("f_asyncwrites", &self.f_asyncwrites)
-                    .field("f_fsidx", &self.f_fsidx)
-                    .field("f_fsid", &self.f_fsid)
-                    .field("f_namemax", &self.f_namemax)
-                    .field("f_owner", &self.f_owner)
-                    .field("f_spare", &self.f_spare)
-                    .field("f_fstypename", &self.f_fstypename)
-                    // FIXME(debug): .field("f_mntonname", &self.f_mntonname)
-                    // FIXME(debug): .field("f_mntfromname", &self.f_mntfromname)
-                    .finish()
-            }
-        }
         impl hash::Hash for statvfs {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.f_flag.hash(state);
@@ -1284,17 +1167,6 @@
             }
         }
         impl Eq for sockaddr_storage {}
-        impl fmt::Debug for sockaddr_storage {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_storage")
-                    .field("ss_len", &self.ss_len)
-                    .field("ss_family", &self.ss_family)
-                    .field("__ss_pad1", &self.__ss_pad1)
-                    .field("__ss_pad2", &self.__ss_pad2)
-                    // FIXME(debug): .field("__ss_pad3", &self.__ss_pad3)
-                    .finish()
-            }
-        }
         impl hash::Hash for sockaddr_storage {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ss_len.hash(state);
@@ -1314,16 +1186,6 @@
             }
         }
         impl Eq for sigevent {}
-        impl fmt::Debug for sigevent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sigevent")
-                    .field("sigev_notify", &self.sigev_notify)
-                    .field("sigev_signo", &self.sigev_signo)
-                    .field("sigev_value", &self.sigev_value)
-                    .field("sigev_notify_attributes", &self.sigev_notify_attributes)
-                    .finish()
-            }
-        }
         impl hash::Hash for sigevent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sigev_notify.hash(state);
@@ -2423,7 +2285,7 @@
 
 f! {
     pub fn CMSG_DATA(cmsg: *const cmsghdr) -> *mut c_uchar {
-        (cmsg as *mut c_uchar).offset(_ALIGN(mem::size_of::<cmsghdr>()) as isize)
+        (cmsg as *mut c_uchar).add(_ALIGN(mem::size_of::<cmsghdr>()))
     }
 
     pub {const} fn CMSG_LEN(length: c_uint) -> c_uint {
@@ -2438,7 +2300,7 @@
             cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize) + _ALIGN(mem::size_of::<cmsghdr>());
         let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize;
         if next > max {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         } else {
             (cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr
         }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/mod.rs
index ff3a99f..3b397169 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/mod.rs
@@ -773,19 +773,6 @@
 
         impl Eq for dirent {}
 
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_fileno", &self.d_fileno)
-                    .field("d_off", &self.d_off)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_type", &self.d_type)
-                    .field("d_namlen", &self.d_namlen)
-                    // FIXME(debug): .field("d_name", &self.d_name)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_fileno.hash(state);
@@ -805,15 +792,6 @@
 
         impl Eq for sockaddr_storage {}
 
-        impl fmt::Debug for sockaddr_storage {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_storage")
-                    .field("ss_len", &self.ss_len)
-                    .field("ss_family", &self.ss_family)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for sockaddr_storage {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ss_len.hash(state);
@@ -832,17 +810,6 @@
 
         impl Eq for siginfo_t {}
 
-        impl fmt::Debug for siginfo_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("siginfo_t")
-                    .field("si_signo", &self.si_signo)
-                    .field("si_code", &self.si_code)
-                    .field("si_errno", &self.si_errno)
-                    .field("si_addr", &self.si_addr)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for siginfo_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.si_signo.hash(state);
@@ -870,16 +837,6 @@
 
         impl Eq for lastlog {}
 
-        impl fmt::Debug for lastlog {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("lastlog")
-                    .field("ll_time", &self.ll_time)
-                    // FIXME(debug): .field("ll_line", &self.ll_line)
-                    // FIXME(debug): .field("ll_host", &self.ll_host)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for lastlog {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ll_time.hash(state);
@@ -911,17 +868,6 @@
 
         impl Eq for utmp {}
 
-        impl fmt::Debug for utmp {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utmp")
-                    // FIXME(debug): .field("ut_line", &self.ut_line)
-                    // FIXME(debug): .field("ut_name", &self.ut_name)
-                    // FIXME(debug): .field("ut_host", &self.ut_host)
-                    .field("ut_time", &self.ut_time)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for utmp {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ut_line.hash(state);
@@ -1029,35 +975,6 @@
 
         impl Eq for statfs {}
 
-        impl fmt::Debug for statfs {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("statfs")
-                    .field("f_flags", &self.f_flags)
-                    .field("f_bsize", &self.f_bsize)
-                    .field("f_iosize", &self.f_iosize)
-                    .field("f_blocks", &self.f_blocks)
-                    .field("f_bfree", &self.f_bfree)
-                    .field("f_bavail", &self.f_bavail)
-                    .field("f_files", &self.f_files)
-                    .field("f_ffree", &self.f_ffree)
-                    .field("f_favail", &self.f_favail)
-                    .field("f_syncwrites", &self.f_syncwrites)
-                    .field("f_syncreads", &self.f_syncreads)
-                    .field("f_asyncwrites", &self.f_asyncwrites)
-                    .field("f_asyncreads", &self.f_asyncreads)
-                    .field("f_fsid", &self.f_fsid)
-                    .field("f_namemax", &self.f_namemax)
-                    .field("f_owner", &self.f_owner)
-                    .field("f_ctime", &self.f_ctime)
-                    // FIXME(debug): .field("f_fstypename", &self.f_fstypename)
-                    // FIXME(debug): .field("f_mntonname", &self.f_mntonname)
-                    // FIXME(debug): .field("f_mntfromname", &self.f_mntfromname)
-                    // FIXME(debug): .field("f_mntfromspec", &self.f_mntfromspec)
-                    .field("mount_info", &self.mount_info)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for statfs {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.f_flags.hash(state);
@@ -1957,7 +1874,7 @@
             cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize) + _ALIGN(mem::size_of::<cmsghdr>());
         let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize;
         if next > max {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         } else {
             (cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr
         }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/x86_64.rs
index 9003f35..33a19f96 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/x86_64.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/x86_64.rs
@@ -81,22 +81,6 @@
             }
         }
         impl Eq for fxsave64 {}
-        impl fmt::Debug for fxsave64 {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("fxsave64")
-                    .field("fx_fcw", &{ self.fx_fcw })
-                    .field("fx_fsw", &{ self.fx_fsw })
-                    .field("fx_ftw", &{ self.fx_ftw })
-                    .field("fx_fop", &{ self.fx_fop })
-                    .field("fx_rip", &{ self.fx_rip })
-                    .field("fx_rdp", &{ self.fx_rdp })
-                    .field("fx_mxcsr", &{ self.fx_mxcsr })
-                    .field("fx_mxcsr_mask", &{ self.fx_mxcsr_mask })
-                    // FIXME(debug): .field("fx_st", &{self.fx_st})
-                    // FIXME(debug): .field("fx_xmm", &{self.fx_xmm})
-                    .finish()
-            }
-        }
         impl hash::Hash for fxsave64 {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 { self.fx_fcw }.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/cygwin/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/cygwin/mod.rs
index c2fda67..2986c7c 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/cygwin/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/cygwin/mod.rs
@@ -583,19 +583,6 @@
 
         impl Eq for siginfo_t {}
 
-        impl fmt::Debug for siginfo_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("siginfo_t")
-                    .field("si_signo", &self.si_signo)
-                    .field("si_code", &self.si_code)
-                    .field("si_pid", &self.si_pid)
-                    .field("si_uid", &self.si_uid)
-                    .field("si_errno", &self.si_errno)
-                    // Ignore __pad
-                    .finish()
-            }
-        }
-
         impl hash::Hash for siginfo_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.si_signo.hash(state);
@@ -607,24 +594,6 @@
             }
         }
 
-        impl fmt::Debug for ifreq {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ifreq")
-                    .field("ifr_name", &self.ifr_name)
-                    .field("ifr_ifru", &self.ifr_ifru)
-                    .finish()
-            }
-        }
-
-        impl fmt::Debug for ifconf {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ifconf")
-                    .field("ifc_len", &self.ifc_len)
-                    .field("ifc_ifcu", &self.ifc_ifcu)
-                    .finish()
-            }
-        }
-
         impl PartialEq for dirent {
             fn eq(&self, other: &dirent) -> bool {
                 self.d_ino == other.d_ino
@@ -639,16 +608,6 @@
 
         impl Eq for dirent {}
 
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_ino", &self.d_ino)
-                    .field("d_type", &self.d_type)
-                    // FIXME: .field("d_name", &self.d_name)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_ino.hash(state);
@@ -670,15 +629,6 @@
 
         impl Eq for sockaddr_un {}
 
-        impl fmt::Debug for sockaddr_un {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_un")
-                    .field("sun_family", &self.sun_family)
-                    // FIXME: .field("sun_path", &self.sun_path)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for sockaddr_un {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sun_family.hash(state);
@@ -722,19 +672,6 @@
 
         impl Eq for utsname {}
 
-        impl fmt::Debug for utsname {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utsname")
-                    // FIXME: .field("sysname", &self.sysname)
-                    // FIXME: .field("nodename", &self.nodename)
-                    // FIXME: .field("release", &self.release)
-                    // FIXME: .field("version", &self.version)
-                    // FIXME: .field("machine", &self.machine)
-                    // FIXME: .field("domainname", &self.domainname)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for utsname {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sysname.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/mod.rs
index 76e44cc7..6b168a47 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/mod.rs
@@ -420,7 +420,7 @@
         pub gid: crate::gid_t,
         pub cuid: crate::uid_t,
         pub cgid: crate::gid_t,
-        pub mode: crate::mode_t,
+        pub mode: mode_t,
     }
 
     pub struct sembuf {
@@ -517,22 +517,6 @@
         }
 
         impl Eq for utmpx {}
-
-        impl fmt::Debug for utmpx {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utmpx")
-                    .field("ut_type", &self.ut_type)
-                    .field("ut_tv", &self.ut_tv)
-                    .field("ut_id", &self.ut_id)
-                    .field("ut_pid", &self.ut_pid)
-                    .field("ut_user", &self.ut_user)
-                    .field("ut_line", &self.ut_line)
-                    .field("ut_host", &self.ut_host)
-                    .field("__ut_reserved", &self.__ut_reserved)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for utmpx {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ut_type.hash(state);
@@ -557,15 +541,6 @@
             }
         }
         impl Eq for sockaddr_un {}
-        impl fmt::Debug for sockaddr_un {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_un")
-                    .field("sun_len", &self.sun_len)
-                    .field("sun_family", &self.sun_family)
-                    // FIXME(debug): .field("sun_path", &self.sun_path)
-                    .finish()
-            }
-        }
         impl hash::Hash for sockaddr_un {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sun_len.hash(state);
@@ -592,17 +567,6 @@
             }
         }
         impl Eq for sockaddr_storage {}
-        impl fmt::Debug for sockaddr_storage {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_storage")
-                    .field("ss_len", &self.ss_len)
-                    .field("ss_family", &self.ss_family)
-                    .field("__ss_pad1", &self.__ss_pad1)
-                    .field("__ss_pad2", &self.__ss_pad2)
-                    // FIXME(debug): .field("__ss_pad3", &self.__ss_pad3)
-                    .finish()
-            }
-        }
         impl hash::Hash for sockaddr_storage {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ss_len.hash(state);
@@ -628,18 +592,6 @@
             }
         }
         impl Eq for dirent {}
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_dev", &self.d_dev)
-                    .field("d_pdev", &self.d_pdev)
-                    .field("d_ino", &self.d_ino)
-                    .field("d_pino", &self.d_pino)
-                    .field("d_reclen", &self.d_reclen)
-                    // FIXME(debug): .field("d_name", &self.d_name)
-                    .finish()
-            }
-        }
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_dev.hash(state);
@@ -660,16 +612,6 @@
             }
         }
         impl Eq for sigevent {}
-        impl fmt::Debug for sigevent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sigevent")
-                    .field("sigev_notify", &self.sigev_notify)
-                    .field("sigev_signo", &self.sigev_signo)
-                    .field("sigev_value", &self.sigev_value)
-                    .field("sigev_notify_attributes", &self.sigev_notify_attributes)
-                    .finish()
-            }
-        }
         impl hash::Hash for sigevent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sigev_notify.hash(state);
@@ -774,27 +716,27 @@
 pub const O_NOCACHE: c_int = 0x00100000;
 pub const O_DIRECTORY: c_int = 0x00200000;
 
-pub const S_IFIFO: crate::mode_t = 0o1_0000;
-pub const S_IFCHR: crate::mode_t = 0o2_0000;
-pub const S_IFBLK: crate::mode_t = 0o6_0000;
-pub const S_IFDIR: crate::mode_t = 0o4_0000;
-pub const S_IFREG: crate::mode_t = 0o10_0000;
-pub const S_IFLNK: crate::mode_t = 0o12_0000;
-pub const S_IFSOCK: crate::mode_t = 0o14_0000;
-pub const S_IFMT: crate::mode_t = 0o17_0000;
+pub const S_IFIFO: mode_t = 0o1_0000;
+pub const S_IFCHR: mode_t = 0o2_0000;
+pub const S_IFBLK: mode_t = 0o6_0000;
+pub const S_IFDIR: mode_t = 0o4_0000;
+pub const S_IFREG: mode_t = 0o10_0000;
+pub const S_IFLNK: mode_t = 0o12_0000;
+pub const S_IFSOCK: mode_t = 0o14_0000;
+pub const S_IFMT: mode_t = 0o17_0000;
 
-pub const S_IRWXU: crate::mode_t = 0o0700;
-pub const S_IRUSR: crate::mode_t = 0o0400;
-pub const S_IWUSR: crate::mode_t = 0o0200;
-pub const S_IXUSR: crate::mode_t = 0o0100;
-pub const S_IRWXG: crate::mode_t = 0o0070;
-pub const S_IRGRP: crate::mode_t = 0o0040;
-pub const S_IWGRP: crate::mode_t = 0o0020;
-pub const S_IXGRP: crate::mode_t = 0o0010;
-pub const S_IRWXO: crate::mode_t = 0o0007;
-pub const S_IROTH: crate::mode_t = 0o0004;
-pub const S_IWOTH: crate::mode_t = 0o0002;
-pub const S_IXOTH: crate::mode_t = 0o0001;
+pub const S_IRWXU: mode_t = 0o0700;
+pub const S_IRUSR: mode_t = 0o0400;
+pub const S_IWUSR: mode_t = 0o0200;
+pub const S_IXUSR: mode_t = 0o0100;
+pub const S_IRWXG: mode_t = 0o0070;
+pub const S_IRGRP: mode_t = 0o0040;
+pub const S_IWGRP: mode_t = 0o0020;
+pub const S_IXGRP: mode_t = 0o0010;
+pub const S_IRWXO: mode_t = 0o0007;
+pub const S_IROTH: mode_t = 0o0004;
+pub const S_IWOTH: mode_t = 0o0002;
+pub const S_IXOTH: mode_t = 0o0001;
 
 pub const F_OK: c_int = 0;
 pub const R_OK: c_int = 4;
@@ -1572,7 +1514,7 @@
         if (*mhdr).msg_controllen as usize >= mem::size_of::<cmsghdr>() {
             (*mhdr).msg_control as *mut cmsghdr
         } else {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         }
     }
 
@@ -1597,7 +1539,7 @@
             + CMSG_ALIGN(mem::size_of::<cmsghdr>());
         let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize;
         if next > max {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         } else {
             (cmsg as usize + CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr
         }
@@ -1733,9 +1675,8 @@
         bufferSize: size_t,
         res: *mut *mut spwd,
     ) -> c_int;
-    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int;
-    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t)
-        -> c_int;
+    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int;
+    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int;
     pub fn sem_destroy(sem: *mut sem_t) -> c_int;
     pub fn sem_init(sem: *mut sem_t, pshared: c_int, value: c_uint) -> c_int;
 
@@ -1813,7 +1754,7 @@
     pub fn posix_fadvise(fd: c_int, offset: off_t, len: off_t, advice: c_int) -> c_int;
     pub fn posix_fallocate(fd: c_int, offset: off_t, len: off_t) -> c_int;
 
-    pub fn shm_open(name: *const c_char, oflag: c_int, mode: crate::mode_t) -> c_int;
+    pub fn shm_open(name: *const c_char, oflag: c_int, mode: mode_t) -> c_int;
     pub fn shm_unlink(name: *const c_char) -> c_int;
 
     pub fn seekdir(dirp: *mut crate::DIR, loc: c_long);
@@ -2032,7 +1973,7 @@
         fildes: c_int,
         path: *const c_char,
         oflag: c_int,
-        mode: crate::mode_t,
+        mode: mode_t,
     ) -> c_int;
     pub fn posix_spawn_file_actions_addclose(
         file_actions: *mut posix_spawn_file_actions_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/native.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/native.rs
index d373a9ce..a5a5e53 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/native.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/native.rs
@@ -520,15 +520,6 @@
         }
 
         impl Eq for cpu_topology_node_info {}
-        impl fmt::Debug for cpu_topology_node_info {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("cpu_topology_node_info")
-                    .field("id", &self.id)
-                    .field("type", &self.type_)
-                    .field("level", &self.level)
-                    .finish()
-            }
-        }
     }
 }
 
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/x86_64.rs
index 548c8e0..16e2612 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/x86_64.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/x86_64.rs
@@ -83,23 +83,6 @@
             }
         }
         impl Eq for fpu_state {}
-        impl fmt::Debug for fpu_state {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("fpu_state")
-                    .field("control", &self.control)
-                    .field("status", &self.status)
-                    .field("tag", &self.tag)
-                    .field("opcode", &self.opcode)
-                    .field("rip", &self.rip)
-                    .field("rdp", &self.rdp)
-                    .field("mxcsr", &self.mxcsr)
-                    .field("mscsr_mask", &self.mscsr_mask)
-                    // FIXME(debug): .field("_fpreg", &self._fpreg)
-                    // FIXME(debug): .field("_xmm", &self._xmm)
-                    // FIXME(debug): .field("_reserved_416_511", &self._reserved_416_511)
-                    .finish()
-            }
-        }
         impl hash::Hash for fpu_state {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.control.hash(state);
@@ -128,15 +111,6 @@
             }
         }
         impl Eq for xstate_hdr {}
-        impl fmt::Debug for xstate_hdr {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("xstate_hdr")
-                    .field("bv", &self.bv)
-                    .field("xcomp_bv", &self.xcomp_bv)
-                    // FIXME(debug): .field("_reserved", &field._reserved)
-                    .finish()
-            }
-        }
         impl hash::Hash for xstate_hdr {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.bv.hash(state);
@@ -157,15 +131,6 @@
             }
         }
         impl Eq for savefpu {}
-        impl fmt::Debug for savefpu {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("savefpu")
-                    .field("fp_fxsave", &self.fp_fxsave)
-                    .field("fp_xstate", &self.fp_xstate)
-                    // FIXME(debug): .field("_fp_ymm", &field._fp_ymm)
-                    .finish()
-            }
-        }
         impl hash::Hash for savefpu {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.fp_fxsave.hash(state);
@@ -198,31 +163,6 @@
             }
         }
         impl Eq for mcontext_t {}
-        impl fmt::Debug for mcontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mcontext_t")
-                    .field("rax", &self.rax)
-                    .field("rbx", &self.rbx)
-                    .field("rcx", &self.rcx)
-                    .field("rdx", &self.rdx)
-                    .field("rdi", &self.rdi)
-                    .field("rsi", &self.rsi)
-                    .field("rbp", &self.rbp)
-                    .field("r8", &self.r8)
-                    .field("r9", &self.r9)
-                    .field("r10", &self.r10)
-                    .field("r11", &self.r11)
-                    .field("r12", &self.r12)
-                    .field("r13", &self.r13)
-                    .field("r14", &self.r14)
-                    .field("r15", &self.r15)
-                    .field("rsp", &self.rsp)
-                    .field("rip", &self.rip)
-                    .field("rflags", &self.rflags)
-                    .field("fpu", &self.fpu)
-                    .finish()
-            }
-        }
         impl hash::Hash for mcontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.rax.hash(state);
@@ -256,16 +196,6 @@
             }
         }
         impl Eq for ucontext_t {}
-        impl fmt::Debug for ucontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ucontext_t")
-                    .field("uc_link", &self.uc_link)
-                    .field("uc_sigmask", &self.uc_sigmask)
-                    .field("uc_stack", &self.uc_stack)
-                    .field("uc_mcontext", &self.uc_mcontext)
-                    .finish()
-            }
-        }
         impl hash::Hash for ucontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uc_link.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/hurd/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/hurd/mod.rs
index 8703f4d..49bb076 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/hurd/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/hurd/mod.rs
@@ -1084,24 +1084,6 @@
 
         impl Eq for utmpx {}
 
-        impl fmt::Debug for utmpx {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utmpx")
-                    .field("ut_type", &self.ut_type)
-                    .field("ut_pid", &self.ut_pid)
-                    .field("ut_line", &self.ut_line)
-                    .field("ut_id", &self.ut_id)
-                    .field("ut_user", &self.ut_user)
-                    // FIXME(debug): .field("ut_host", &self.ut_host)
-                    .field("ut_exit", &self.ut_exit)
-                    .field("ut_session", &self.ut_session)
-                    .field("ut_tv", &self.ut_tv)
-                    .field("ut_addr_v6", &self.ut_addr_v6)
-                    .field("__glibc_reserved", &self.__glibc_reserved)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for utmpx {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ut_type.hash(state);
@@ -2150,35 +2132,35 @@
 pub const SF_SNAPSHOT: c_uint = 2097152;
 pub const UTIME_NOW: c_long = -1;
 pub const UTIME_OMIT: c_long = -2;
-pub const S_IFMT: crate::mode_t = 0o17_0000;
-pub const S_IFDIR: crate::mode_t = 0o4_0000;
-pub const S_IFCHR: crate::mode_t = 0o2_0000;
-pub const S_IFBLK: crate::mode_t = 0o6_0000;
-pub const S_IFREG: crate::mode_t = 0o10_0000;
-pub const S_IFIFO: crate::mode_t = 0o1_0000;
-pub const S_IFLNK: crate::mode_t = 0o12_0000;
-pub const S_IFSOCK: crate::mode_t = 0o14_0000;
-pub const S_ISUID: crate::mode_t = 0o4000;
-pub const S_ISGID: crate::mode_t = 0o2000;
-pub const S_ISVTX: crate::mode_t = 0o1000;
-pub const S_IRUSR: crate::mode_t = 0o0400;
-pub const S_IWUSR: crate::mode_t = 0o0200;
-pub const S_IXUSR: crate::mode_t = 0o0100;
-pub const S_IRWXU: crate::mode_t = 0o0700;
-pub const S_IREAD: crate::mode_t = 0o0400;
-pub const S_IWRITE: crate::mode_t = 0o0200;
-pub const S_IEXEC: crate::mode_t = 0o0100;
-pub const S_IRGRP: crate::mode_t = 0o0040;
-pub const S_IWGRP: crate::mode_t = 0o0020;
-pub const S_IXGRP: crate::mode_t = 0o0010;
-pub const S_IRWXG: crate::mode_t = 0o0070;
-pub const S_IROTH: crate::mode_t = 0o0004;
-pub const S_IWOTH: crate::mode_t = 0o0002;
-pub const S_IXOTH: crate::mode_t = 0o0001;
-pub const S_IRWXO: crate::mode_t = 0o0007;
-pub const ACCESSPERMS: crate::mode_t = 511;
-pub const ALLPERMS: crate::mode_t = 4095;
-pub const DEFFILEMODE: crate::mode_t = 438;
+pub const S_IFMT: mode_t = 0o17_0000;
+pub const S_IFDIR: mode_t = 0o4_0000;
+pub const S_IFCHR: mode_t = 0o2_0000;
+pub const S_IFBLK: mode_t = 0o6_0000;
+pub const S_IFREG: mode_t = 0o10_0000;
+pub const S_IFIFO: mode_t = 0o1_0000;
+pub const S_IFLNK: mode_t = 0o12_0000;
+pub const S_IFSOCK: mode_t = 0o14_0000;
+pub const S_ISUID: mode_t = 0o4000;
+pub const S_ISGID: mode_t = 0o2000;
+pub const S_ISVTX: mode_t = 0o1000;
+pub const S_IRUSR: mode_t = 0o0400;
+pub const S_IWUSR: mode_t = 0o0200;
+pub const S_IXUSR: mode_t = 0o0100;
+pub const S_IRWXU: mode_t = 0o0700;
+pub const S_IREAD: mode_t = 0o0400;
+pub const S_IWRITE: mode_t = 0o0200;
+pub const S_IEXEC: mode_t = 0o0100;
+pub const S_IRGRP: mode_t = 0o0040;
+pub const S_IWGRP: mode_t = 0o0020;
+pub const S_IXGRP: mode_t = 0o0010;
+pub const S_IRWXG: mode_t = 0o0070;
+pub const S_IROTH: mode_t = 0o0004;
+pub const S_IWOTH: mode_t = 0o0002;
+pub const S_IXOTH: mode_t = 0o0001;
+pub const S_IRWXO: mode_t = 0o0007;
+pub const ACCESSPERMS: mode_t = 511;
+pub const ALLPERMS: mode_t = 4095;
+pub const DEFFILEMODE: mode_t = 438;
 pub const S_BLKSIZE: usize = 512;
 pub const STATX_TYPE: c_uint = 1;
 pub const STATX_MODE: c_uint = 2;
@@ -3444,7 +3426,7 @@
         if (*mhdr).msg_controllen as usize >= mem::size_of::<cmsghdr>() {
             (*mhdr).msg_control as *mut cmsghdr
         } else {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         }
     }
 
@@ -3462,14 +3444,14 @@
 
     pub fn CMSG_NXTHDR(mhdr: *const msghdr, cmsg: *const cmsghdr) -> *mut cmsghdr {
         if ((*cmsg).cmsg_len as usize) < mem::size_of::<cmsghdr>() {
-            return 0 as *mut cmsghdr;
+            return core::ptr::null_mut::<cmsghdr>();
         };
         let next = (cmsg as usize + CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr;
         let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize;
         if (next.offset(1)) as usize > max
             || next as usize + CMSG_ALIGN((*next).cmsg_len as usize) > max
         {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         } else {
             next as *mut cmsghdr
         }
@@ -3574,8 +3556,7 @@
 
     pub fn mkfifoat(__fd: c_int, __path: *const c_char, __mode: __mode_t) -> c_int;
 
-    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t)
-        -> c_int;
+    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int;
 
     pub fn __libc_current_sigrtmin() -> c_int;
 
@@ -4248,7 +4229,7 @@
         fd: c_int,
         path: *const c_char,
         oflag: c_int,
-        mode: crate::mode_t,
+        mode: mode_t,
     ) -> c_int;
     pub fn posix_spawn_file_actions_addclose(
         actions: *mut posix_spawn_file_actions_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/arm.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/arm.rs
index a6170adc..b78c8a83 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/arm.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/arm.rs
@@ -65,14 +65,6 @@
             }
         }
         impl Eq for __c_anonymous_uc_sigmask_with_padding {}
-        impl fmt::Debug for __c_anonymous_uc_sigmask_with_padding {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("uc_sigmask_with_padding")
-                    .field("uc_sigmask_with_padding", &self.uc_sigmask)
-                    // Ignore padding
-                    .finish()
-            }
-        }
         impl hash::Hash for __c_anonymous_uc_sigmask_with_padding {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uc_sigmask.hash(state)
@@ -104,22 +96,6 @@
             }
         }
         impl Eq for ucontext_t {}
-        impl fmt::Debug for ucontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ucontext_t")
-                    .field("uc_flags", &self.uc_flags)
-                    .field("uc_link", &self.uc_link)
-                    .field("uc_stack", &self.uc_stack)
-                    .field("uc_mcontext", &self.uc_mcontext)
-                    .field(
-                        "uc_sigmask__c_anonymous_union",
-                        &self.uc_sigmask__c_anonymous_union,
-                    )
-                    .field("uc_regspace", &&self.uc_regspace[..])
-                    // Ignore padding field
-                    .finish()
-            }
-        }
         impl hash::Hash for ucontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/mod.rs
index 42be94d..43e739b 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/mod.rs
@@ -181,18 +181,6 @@
     }
 }
 
-cfg_if! {
-    if #[cfg(feature = "extra_traits")] {
-        impl fmt::Debug for sigset64_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sigset64_t")
-                    .field("__bits", &self.__bits)
-                    .finish()
-            }
-        }
-    }
-}
-
 // These constants must be of the same type of sigaction.sa_flags
 pub const SA_NOCLDSTOP: c_int = 0x00000001;
 pub const SA_NOCLDWAIT: c_int = 0x00000002;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/x86/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/x86/mod.rs
index 2acbe771..edbfd38 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/x86/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/x86/mod.rs
@@ -67,14 +67,6 @@
             }
         }
         impl Eq for __c_anonymous_uc_sigmask_with_padding {}
-        impl fmt::Debug for __c_anonymous_uc_sigmask_with_padding {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("uc_sigmask_with_padding")
-                    .field("uc_sigmask_with_padding", &self.uc_sigmask)
-                    // Ignore padding
-                    .finish()
-            }
-        }
         impl hash::Hash for __c_anonymous_uc_sigmask_with_padding {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uc_sigmask.hash(state)
@@ -105,21 +97,6 @@
             }
         }
         impl Eq for ucontext_t {}
-        impl fmt::Debug for ucontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ucontext_t")
-                    .field("uc_flags", &self.uc_flags)
-                    .field("uc_link", &self.uc_link)
-                    .field("uc_stack", &self.uc_stack)
-                    .field("uc_mcontext", &self.uc_mcontext)
-                    .field(
-                        "uc_sigmask__c_anonymous_union",
-                        &self.uc_sigmask__c_anonymous_union,
-                    )
-                    // Ignore padding field
-                    .finish()
-            }
-        }
         impl hash::Hash for ucontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/mod.rs
index b507dac..b23c562c 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/mod.rs
@@ -155,15 +155,6 @@
 
         impl Eq for pthread_mutex_t {}
 
-        impl fmt::Debug for pthread_mutex_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_mutex_t")
-                    .field("value", &self.value)
-                    // FIXME(debug): .field("__reserved", &self.__reserved)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for pthread_mutex_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.value.hash(state);
@@ -184,15 +175,6 @@
 
         impl Eq for pthread_cond_t {}
 
-        impl fmt::Debug for pthread_cond_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_cond_t")
-                    .field("value", &self.value)
-                    // FIXME(debug): .field("__reserved", &self.__reserved)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for pthread_cond_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.value.hash(state);
@@ -217,19 +199,6 @@
 
         impl Eq for pthread_rwlock_t {}
 
-        impl fmt::Debug for pthread_rwlock_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_rwlock_t")
-                    .field("numLocks", &self.numLocks)
-                    .field("writerThreadId", &self.writerThreadId)
-                    .field("pendingReaders", &self.pendingReaders)
-                    .field("pendingWriters", &self.pendingWriters)
-                    .field("attr", &self.attr)
-                    // FIXME(debug): .field("__reserved", &self.__reserved)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for pthread_rwlock_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.numLocks.hash(state);
@@ -240,14 +209,6 @@
                 self.__reserved.hash(state);
             }
         }
-
-        impl fmt::Debug for sigset64_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sigset64_t")
-                    .field("__bits", &self.__bits)
-                    .finish()
-            }
-        }
     }
 }
 
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/x86_64/mod.rs
index ce2d7099..3288f05 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/x86_64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/x86_64/mod.rs
@@ -195,15 +195,6 @@
             }
         }
         impl Eq for _libc_fpxreg {}
-        impl fmt::Debug for _libc_fpxreg {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("_libc_fpxreg")
-                    .field("significand", &self.significand)
-                    .field("exponent", &self.exponent)
-                    // Ignore padding field
-                    .finish()
-            }
-        }
         impl hash::Hash for _libc_fpxreg {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.significand.hash(state);
@@ -228,23 +219,6 @@
             }
         }
         impl Eq for _libc_fpstate {}
-        impl fmt::Debug for _libc_fpstate {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("_libc_fpstate")
-                    .field("cwd", &self.cwd)
-                    .field("swd", &self.swd)
-                    .field("ftw", &self.ftw)
-                    .field("fop", &self.fop)
-                    .field("rip", &self.rip)
-                    .field("rdp", &self.rdp)
-                    .field("mxcsr", &self.mxcsr)
-                    .field("mxcr_mask", &self.mxcr_mask)
-                    .field("_st", &self._st)
-                    .field("_xmm", &self._xmm)
-                    // Ignore padding field
-                    .finish()
-            }
-        }
         impl hash::Hash for _libc_fpstate {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.cwd.hash(state);
@@ -268,15 +242,6 @@
             }
         }
         impl Eq for mcontext_t {}
-        impl fmt::Debug for mcontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mcontext_t")
-                    .field("gregs", &self.gregs)
-                    .field("fpregs", &self.fpregs)
-                    // Ignore padding field
-                    .finish()
-            }
-        }
         impl hash::Hash for mcontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.gregs.hash(state);
@@ -296,18 +261,6 @@
             }
         }
         impl Eq for ucontext_t {}
-        impl fmt::Debug for ucontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ucontext_t")
-                    .field("uc_flags", &self.uc_flags)
-                    .field("uc_link", &self.uc_link)
-                    .field("uc_stack", &self.uc_stack)
-                    .field("uc_mcontext", &self.uc_mcontext)
-                    .field("uc_sigmask64", &self.uc_sigmask64)
-                    // Ignore padding field
-                    .finish()
-            }
-        }
         impl hash::Hash for ucontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uc_flags.hash(state);
@@ -341,24 +294,6 @@
 
         impl Eq for user_fpregs_struct {}
 
-        impl fmt::Debug for user_fpregs_struct {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("user_fpregs_struct")
-                    .field("cwd", &self.cwd)
-                    .field("swd", &self.swd)
-                    .field("ftw", &self.ftw)
-                    .field("fop", &self.fop)
-                    .field("rip", &self.rip)
-                    .field("rdp", &self.rdp)
-                    .field("mxcsr", &self.mxcsr)
-                    .field("mxcr_mask", &self.mxcr_mask)
-                    .field("st_space", &self.st_space)
-                    // FIXME(debug): .field("xmm_space", &self.xmm_space)
-                    // Ignore padding field
-                    .finish()
-            }
-        }
-
         impl hash::Hash for user_fpregs_struct {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.cwd.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/mod.rs
index c5875f29..3dee96e 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/mod.rs
@@ -2,6 +2,15 @@
 
 use crate::prelude::*;
 
+cfg_if! {
+    if #[cfg(doc)] {
+        pub(crate) type Ioctl = c_int;
+    } else {
+        #[doc(hidden)]
+        pub type Ioctl = c_int;
+    }
+}
+
 pub type clock_t = c_long;
 pub type time_t = c_long;
 pub type suseconds_t = c_long;
@@ -337,19 +346,6 @@
         pub dlpi_tls_data: *mut c_void,
     }
 
-    // linux/filter.h
-    pub struct sock_filter {
-        pub code: crate::__u16,
-        pub jt: crate::__u8,
-        pub jf: crate::__u8,
-        pub k: crate::__u32,
-    }
-
-    pub struct sock_fprog {
-        pub len: c_ushort,
-        pub filter: *mut sock_filter,
-    }
-
     // linux/seccomp.h
     pub struct seccomp_data {
         pub nr: c_int,
@@ -664,15 +660,6 @@
             }
         }
         impl Eq for sockaddr_nl {}
-        impl fmt::Debug for sockaddr_nl {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_nl")
-                    .field("nl_family", &self.nl_family)
-                    .field("nl_pid", &self.nl_pid)
-                    .field("nl_groups", &self.nl_groups)
-                    .finish()
-            }
-        }
         impl hash::Hash for sockaddr_nl {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.nl_family.hash(state);
@@ -697,18 +684,6 @@
 
         impl Eq for dirent {}
 
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_ino", &self.d_ino)
-                    .field("d_off", &self.d_off)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_type", &self.d_type)
-                    // FIXME(debug): .field("d_name", &self.d_name)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_ino.hash(state);
@@ -735,18 +710,6 @@
 
         impl Eq for dirent64 {}
 
-        impl fmt::Debug for dirent64 {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent64")
-                    .field("d_ino", &self.d_ino)
-                    .field("d_off", &self.d_off)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_type", &self.d_type)
-                    // FIXME(debug): .field("d_name", &self.d_name)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for dirent64 {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_ino.hash(state);
@@ -769,18 +732,6 @@
 
         impl Eq for siginfo_t {}
 
-        impl fmt::Debug for siginfo_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("siginfo_t")
-                    .field("si_signo", &self.si_signo)
-                    .field("si_errno", &self.si_errno)
-                    .field("si_code", &self.si_code)
-                    // Ignore _pad
-                    // Ignore _align
-                    .finish()
-            }
-        }
-
         impl hash::Hash for siginfo_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.si_signo.hash(state);
@@ -809,16 +760,6 @@
 
         impl Eq for lastlog {}
 
-        impl fmt::Debug for lastlog {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("lastlog")
-                    .field("ll_time", &self.ll_time)
-                    .field("ll_line", &self.ll_line)
-                    // FIXME(debug): .field("ll_host", &self.ll_host)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for lastlog {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ll_time.hash(state);
@@ -857,24 +798,6 @@
 
         impl Eq for utmp {}
 
-        impl fmt::Debug for utmp {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utmp")
-                    .field("ut_type", &self.ut_type)
-                    .field("ut_pid", &self.ut_pid)
-                    .field("ut_line", &self.ut_line)
-                    .field("ut_id", &self.ut_id)
-                    .field("ut_user", &self.ut_user)
-                    // FIXME(debug): .field("ut_host", &self.ut_host)
-                    .field("ut_exit", &self.ut_exit)
-                    .field("ut_session", &self.ut_session)
-                    .field("ut_tv", &self.ut_tv)
-                    .field("ut_addr_v6", &self.ut_addr_v6)
-                    .field("unused", &self.unused)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for utmp {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ut_type.hash(state);
@@ -911,18 +834,6 @@
 
         impl Eq for sockaddr_alg {}
 
-        impl fmt::Debug for sockaddr_alg {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_alg")
-                    .field("salg_family", &self.salg_family)
-                    .field("salg_type", &self.salg_type)
-                    .field("salg_feat", &self.salg_feat)
-                    .field("salg_mask", &self.salg_mask)
-                    .field("salg_name", &&self.salg_name[..])
-                    .finish()
-            }
-        }
-
         impl hash::Hash for sockaddr_alg {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.salg_family.hash(state);
@@ -942,16 +853,6 @@
         }
         impl Eq for uinput_setup {}
 
-        impl fmt::Debug for uinput_setup {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("uinput_setup")
-                    .field("id", &self.id)
-                    .field("name", &&self.name[..])
-                    .field("ff_effects_max", &self.ff_effects_max)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for uinput_setup {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.id.hash(state);
@@ -973,20 +874,6 @@
         }
         impl Eq for uinput_user_dev {}
 
-        impl fmt::Debug for uinput_user_dev {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("uinput_setup")
-                    .field("name", &&self.name[..])
-                    .field("id", &self.id)
-                    .field("ff_effects_max", &self.ff_effects_max)
-                    .field("absmax", &&self.absmax[..])
-                    .field("absmin", &&self.absmin[..])
-                    .field("absfuzz", &&self.absfuzz[..])
-                    .field("absflat", &&self.absflat[..])
-                    .finish()
-            }
-        }
-
         impl hash::Hash for uinput_user_dev {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.name.hash(state);
@@ -999,24 +886,6 @@
             }
         }
 
-        impl fmt::Debug for ifreq {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ifreq")
-                    .field("ifr_name", &self.ifr_name)
-                    .field("ifr_ifru", &self.ifr_ifru)
-                    .finish()
-            }
-        }
-
-        impl fmt::Debug for ifconf {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ifconf")
-                    .field("ifc_len", &self.ifc_len)
-                    .field("ifc_ifcu", &self.ifc_ifcu)
-                    .finish()
-            }
-        }
-
         #[allow(deprecated)]
         impl af_alg_iv {
             fn as_slice(&self) -> &[u8] {
@@ -1035,15 +904,6 @@
         impl Eq for af_alg_iv {}
 
         #[allow(deprecated)]
-        impl fmt::Debug for af_alg_iv {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("af_alg_iv")
-                    .field("ivlen", &self.ivlen)
-                    .finish()
-            }
-        }
-
-        #[allow(deprecated)]
         impl hash::Hash for af_alg_iv {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.as_slice().hash(state);
@@ -1058,15 +918,6 @@
             }
         }
         impl Eq for prop_info {}
-        impl fmt::Debug for prop_info {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("prop_info")
-                    .field("__name", &self.__name)
-                    .field("__serial", &self.__serial)
-                    .field("__value", &self.__value)
-                    .finish()
-            }
-        }
     }
 }
 
@@ -1698,27 +1549,6 @@
 pub const TIOCCONS: c_int = 0x541D;
 pub const TIOCSBRK: c_int = 0x5427;
 pub const TIOCCBRK: c_int = 0x5428;
-cfg_if! {
-    if #[cfg(any(
-        target_arch = "x86",
-        target_arch = "x86_64",
-        target_arch = "arm",
-        target_arch = "aarch64",
-        target_arch = "riscv64",
-        target_arch = "s390x"
-    ))] {
-        pub const FICLONE: c_int = 0x40049409;
-        pub const FICLONERANGE: c_int = 0x4020940D;
-    } else if #[cfg(any(
-        target_arch = "mips",
-        target_arch = "mips64",
-        target_arch = "powerpc",
-        target_arch = "powerpc64"
-    ))] {
-        pub const FICLONE: c_int = 0x80049409;
-        pub const FICLONERANGE: c_int = 0x8020940D;
-    }
-}
 
 pub const ST_RDONLY: c_ulong = 1;
 pub const ST_NOSUID: c_ulong = 2;
@@ -1900,38 +1730,6 @@
 pub const BLKSSZGET: c_int = 0x1268;
 pub const BLKPBSZGET: c_int = 0x127B;
 
-cfg_if! {
-    // Those type are constructed using the _IOC macro
-    // DD-SS_SSSS_SSSS_SSSS-TTTT_TTTT-NNNN_NNNN
-    // where D stands for direction (either None (00), Read (01) or Write (11))
-    // where S stands for size (int, long, struct...)
-    // where T stands for type ('f','v','X'...)
-    // where N stands for NR (NumbeR)
-    if #[cfg(any(target_arch = "x86", target_arch = "arm"))] {
-        pub const FS_IOC_GETFLAGS: c_int = 0x80046601;
-        pub const FS_IOC_SETFLAGS: c_int = 0x40046602;
-        pub const FS_IOC_GETVERSION: c_int = 0x80047601;
-        pub const FS_IOC_SETVERSION: c_int = 0x40047602;
-        pub const FS_IOC32_GETFLAGS: c_int = 0x80046601;
-        pub const FS_IOC32_SETFLAGS: c_int = 0x40046602;
-        pub const FS_IOC32_GETVERSION: c_int = 0x80047601;
-        pub const FS_IOC32_SETVERSION: c_int = 0x40047602;
-    } else if #[cfg(any(
-        target_arch = "x86_64",
-        target_arch = "riscv64",
-        target_arch = "aarch64"
-    ))] {
-        pub const FS_IOC_GETFLAGS: c_int = 0x80086601;
-        pub const FS_IOC_SETFLAGS: c_int = 0x40086602;
-        pub const FS_IOC_GETVERSION: c_int = 0x80087601;
-        pub const FS_IOC_SETVERSION: c_int = 0x40087602;
-        pub const FS_IOC32_GETFLAGS: c_int = 0x80046601;
-        pub const FS_IOC32_SETFLAGS: c_int = 0x40046602;
-        pub const FS_IOC32_GETVERSION: c_int = 0x80047601;
-        pub const FS_IOC32_SETVERSION: c_int = 0x40047602;
-    }
-}
-
 pub const EAI_AGAIN: c_int = 2;
 pub const EAI_BADFLAGS: c_int = 3;
 pub const EAI_FAIL: c_int = 4;
@@ -2666,65 +2464,6 @@
 pub const UINPUT_VERSION: c_uint = 5;
 pub const UINPUT_MAX_NAME_SIZE: usize = 80;
 
-// bionic/libc/kernel/uapi/linux/if_tun.h
-pub const IFF_TUN: c_int = 0x0001;
-pub const IFF_TAP: c_int = 0x0002;
-pub const IFF_NAPI: c_int = 0x0010;
-pub const IFF_NAPI_FRAGS: c_int = 0x0020;
-pub const IFF_NO_CARRIER: c_int = 0x0040;
-pub const IFF_NO_PI: c_int = 0x1000;
-pub const IFF_ONE_QUEUE: c_int = 0x2000;
-pub const IFF_VNET_HDR: c_int = 0x4000;
-pub const IFF_TUN_EXCL: c_int = 0x8000;
-pub const IFF_MULTI_QUEUE: c_int = 0x0100;
-pub const IFF_ATTACH_QUEUE: c_int = 0x0200;
-pub const IFF_DETACH_QUEUE: c_int = 0x0400;
-pub const IFF_PERSIST: c_int = 0x0800;
-pub const IFF_NOFILTER: c_int = 0x1000;
-pub const TUN_TX_TIMESTAMP: c_int = 1;
-// Features for GSO (TUNSETOFFLOAD)
-pub const TUN_F_CSUM: c_uint = 0x01;
-pub const TUN_F_TSO4: c_uint = 0x02;
-pub const TUN_F_TSO6: c_uint = 0x04;
-pub const TUN_F_TSO_ECN: c_uint = 0x08;
-pub const TUN_F_UFO: c_uint = 0x10;
-pub const TUN_F_USO4: c_uint = 0x20;
-pub const TUN_F_USO6: c_uint = 0x40;
-// Protocol info prepended to the packets (when IFF_NO_PI is not set)
-pub const TUN_PKT_STRIP: c_int = 0x0001;
-// Accept all multicast packets
-pub const TUN_FLT_ALLMULTI: c_int = 0x0001;
-// Ioctl operation codes
-const T_TYPE: u32 = b'T' as u32;
-pub const TUNSETNOCSUM: c_int = _IOW::<c_int>(T_TYPE, 200);
-pub const TUNSETDEBUG: c_int = _IOW::<c_int>(T_TYPE, 201);
-pub const TUNSETIFF: c_int = _IOW::<c_int>(T_TYPE, 202);
-pub const TUNSETPERSIST: c_int = _IOW::<c_int>(T_TYPE, 203);
-pub const TUNSETOWNER: c_int = _IOW::<c_int>(T_TYPE, 204);
-pub const TUNSETLINK: c_int = _IOW::<c_int>(T_TYPE, 205);
-pub const TUNSETGROUP: c_int = _IOW::<c_int>(T_TYPE, 206);
-pub const TUNGETFEATURES: c_int = _IOR::<c_int>(T_TYPE, 207);
-pub const TUNSETOFFLOAD: c_int = _IOW::<c_int>(T_TYPE, 208);
-pub const TUNSETTXFILTER: c_int = _IOW::<c_int>(T_TYPE, 209);
-pub const TUNGETIFF: c_int = _IOR::<c_int>(T_TYPE, 210);
-pub const TUNGETSNDBUF: c_int = _IOR::<c_int>(T_TYPE, 211);
-pub const TUNSETSNDBUF: c_int = _IOW::<c_int>(T_TYPE, 212);
-pub const TUNATTACHFILTER: c_int =  _IOW::<sock_fprog>(T_TYPE, 213);
-pub const TUNDETACHFILTER: c_int = _IOW::<sock_fprog>(T_TYPE, 214);
-pub const TUNGETVNETHDRSZ: c_int = _IOR::<c_int>(T_TYPE, 215);
-pub const TUNSETVNETHDRSZ: c_int = _IOW::<c_int>(T_TYPE, 216);
-pub const TUNSETQUEUE: c_int = _IOW::<c_int>(T_TYPE, 217);
-pub const TUNSETIFINDEX: c_int = _IOW::<c_int>(T_TYPE, 218);
-pub const TUNGETFILTER: c_int = _IOR::<sock_fprog>(T_TYPE, 219);
-pub const TUNSETVNETLE: c_int = _IOW::<c_int>(T_TYPE, 220);
-pub const TUNGETVNETLE: c_int = _IOR::<c_int>(T_TYPE, 221);
-pub const TUNSETVNETBE: c_int = _IOW::<c_int>(T_TYPE, 222);
-pub const TUNGETVNETBE: c_int = _IOR::<c_int>(T_TYPE, 223);
-pub const TUNSETSTEERINGEBPF: c_int = _IOR::<c_int>(T_TYPE, 224);
-pub const TUNSETFILTEREBPF: c_int = _IOR::<c_int>(T_TYPE, 225);
-pub const TUNSETCARRIER: c_int = _IOW::<c_int>(T_TYPE, 226);
-pub const TUNGETDEVNETNS: c_int = _IO(T_TYPE, 227);
-
 // start android/platform/bionic/libc/kernel/uapi/linux/if_ether.h
 // from https://android.googlesource.com/platform/bionic/+/HEAD/libc/kernel/uapi/linux/if_ether.h
 pub const ETH_ALEN: c_int = 6;
@@ -3653,7 +3392,7 @@
         let next = (cmsg as usize + super::CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr;
         let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize;
         if (next.offset(1)) as usize > max {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         } else {
             next as *mut cmsghdr
         }
@@ -3758,7 +3497,6 @@
     pub fn gettimeofday(tp: *mut crate::timeval, tz: *mut crate::timezone) -> c_int;
     pub fn mlock2(addr: *const c_void, len: size_t, flags: c_int) -> c_int;
     pub fn madvise(addr: *mut c_void, len: size_t, advice: c_int) -> c_int;
-    pub fn ioctl(fd: c_int, request: c_int, ...) -> c_int;
     pub fn msync(addr: *mut c_void, len: size_t, flags: c_int) -> c_int;
     pub fn mprotect(addr: *mut c_void, len: size_t, prot: c_int) -> c_int;
     pub fn recvfrom(
@@ -4299,23 +4037,3 @@
         self.sifields().sigchld.si_stime
     }
 }
-
-/// Build an ioctl number for an argumentless ioctl.
-pub const fn _IO(ty: u32, nr: u32) -> c_int {
-    super::_IOC(super::_IOC_NONE, ty, nr, 0) as c_int
-}
-
-/// Build an ioctl number for an read-only ioctl.
-pub const fn _IOR<T>(ty: u32, nr: u32) -> c_int {
-    super::_IOC(super::_IOC_READ, ty, nr, mem::size_of::<T>())  as c_int
-}
-
-/// Build an ioctl number for an write-only ioctl.
-pub const fn _IOW<T>(ty: u32, nr: u32) -> c_int {
-    super::_IOC(super::_IOC_WRITE, ty, nr, mem::size_of::<T>())  as c_int
-}
-
-/// Build an ioctl number for a read-write ioctl.
-pub const fn _IOWR<T>(ty: u32, nr: u32) -> c_int {
-    super::_IOC(super::_IOC_READ | super::_IOC_WRITE, ty, nr, mem::size_of::<T>())  as c_int
-}
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/emscripten/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/emscripten/mod.rs
index 985b3c0c..deac314 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/emscripten/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/emscripten/mod.rs
@@ -171,7 +171,7 @@
         pub gid: crate::gid_t,
         pub cuid: crate::uid_t,
         pub cgid: crate::gid_t,
-        pub mode: crate::mode_t,
+        pub mode: mode_t,
         pub __seq: c_int,
         __unused1: c_long,
         __unused2: c_long,
@@ -229,7 +229,7 @@
         __st_dev_padding: c_int,
         #[cfg(emscripten_old_stat_abi)]
         __st_ino_truncated: c_long,
-        pub st_mode: crate::mode_t,
+        pub st_mode: mode_t,
         pub st_nlink: crate::nlink_t,
         pub st_uid: crate::uid_t,
         pub st_gid: crate::gid_t,
@@ -403,17 +403,6 @@
             }
         }
         impl Eq for dirent {}
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_ino", &self.d_ino)
-                    .field("d_off", &self.d_off)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_type", &self.d_type)
-                    // FIXME(debug): .field("d_name", &self.d_name)
-                    .finish()
-            }
-        }
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_ino.hash(state);
@@ -447,26 +436,6 @@
             }
         }
         impl Eq for sysinfo {}
-        impl fmt::Debug for sysinfo {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sysinfo")
-                    .field("uptime", &self.uptime)
-                    .field("loads", &self.loads)
-                    .field("totalram", &self.totalram)
-                    .field("freeram", &self.freeram)
-                    .field("sharedram", &self.sharedram)
-                    .field("bufferram", &self.bufferram)
-                    .field("totalswap", &self.totalswap)
-                    .field("freeswap", &self.freeswap)
-                    .field("procs", &self.procs)
-                    .field("pad", &self.pad)
-                    .field("totalhigh", &self.totalhigh)
-                    .field("freehigh", &self.freehigh)
-                    .field("mem_unit", &self.mem_unit)
-                    // FIXME(debug): .field("__reserved", &self.__reserved)
-                    .finish()
-            }
-        }
         impl hash::Hash for sysinfo {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uptime.hash(state);
@@ -495,16 +464,6 @@
             }
         }
         impl Eq for mq_attr {}
-        impl fmt::Debug for mq_attr {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mq_attr")
-                    .field("mq_flags", &self.mq_flags)
-                    .field("mq_maxmsg", &self.mq_maxmsg)
-                    .field("mq_msgsize", &self.mq_msgsize)
-                    .field("mq_curmsgs", &self.mq_curmsgs)
-                    .finish()
-            }
-        }
         impl hash::Hash for mq_attr {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.mq_flags.hash(state);
@@ -520,13 +479,6 @@
             }
         }
         impl Eq for pthread_cond_t {}
-        impl fmt::Debug for pthread_cond_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_cond_t")
-                    // FIXME(debug): .field("size", &self.size)
-                    .finish()
-            }
-        }
         impl hash::Hash for pthread_cond_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.size.hash(state);
@@ -1412,12 +1364,12 @@
 f! {
     pub fn CMSG_NXTHDR(mhdr: *const msghdr, cmsg: *const cmsghdr) -> *mut cmsghdr {
         if ((*cmsg).cmsg_len as usize) < mem::size_of::<cmsghdr>() {
-            return 0 as *mut cmsghdr;
+            return core::ptr::null_mut::<cmsghdr>();
         };
         let next = (cmsg as usize + super::CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr;
         let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize;
         if (next.offset(1)) as usize > max {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         } else {
             next as *mut cmsghdr
         }
@@ -1530,7 +1482,7 @@
     ) -> c_int;
     pub fn getloadavg(loadavg: *mut c_double, nelem: c_int) -> c_int;
 
-    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int;
+    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int;
     pub fn if_nameindex() -> *mut if_nameindex;
     pub fn if_freenameindex(ptr: *mut if_nameindex);
 
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/generic/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/generic/mod.rs
index ec3179b..465cedd 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/generic/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/generic/mod.rs
@@ -1,5 +1,5 @@
 use crate::prelude::*;
-use crate::{Ioctl, _IOR, _IOW};
+use crate::Ioctl;
 
 s! {
     pub struct termios2 {
@@ -40,8 +40,6 @@
 pub const SO_PEERCRED: c_int = 17;
 pub const SO_RCVLOWAT: c_int = 18;
 pub const SO_SNDLOWAT: c_int = 19;
-const SO_RCVTIMEO_OLD: c_int = 20;
-const SO_SNDTIMEO_OLD: c_int = 21;
 pub const SO_SECURITY_AUTHENTICATION: c_int = 22;
 pub const SO_SECURITY_ENCRYPTION_TRANSPORT: c_int = 23;
 pub const SO_SECURITY_ENCRYPTION_NETWORK: c_int = 24;
@@ -50,9 +48,6 @@
 pub const SO_DETACH_FILTER: c_int = 27;
 pub const SO_GET_FILTER: c_int = SO_ATTACH_FILTER;
 pub const SO_PEERNAME: c_int = 28;
-const SO_TIMESTAMP_OLD: c_int = 29;
-const SO_TIMESTAMPNS_OLD: c_int = 35;
-const SO_TIMESTAMPING_OLD: c_int = 37;
 
 cfg_if! {
     if #[cfg(all(
@@ -76,6 +71,12 @@
         pub const SO_RCVTIMEO: c_int = 66;
         pub const SO_SNDTIMEO: c_int = 67;
     } else {
+        const SO_TIMESTAMP_OLD: c_int = 29;
+        const SO_TIMESTAMPNS_OLD: c_int = 35;
+        const SO_TIMESTAMPING_OLD: c_int = 37;
+        const SO_RCVTIMEO_OLD: c_int = 20;
+        const SO_SNDTIMEO_OLD: c_int = 21;
+
         pub const SO_TIMESTAMP: c_int = SO_TIMESTAMP_OLD;
         pub const SO_TIMESTAMPNS: c_int = SO_TIMESTAMPNS_OLD;
         pub const SO_TIMESTAMPING: c_int = SO_TIMESTAMPING_OLD;
@@ -158,9 +159,6 @@
 pub const SO_DEVMEM_DMABUF: c_int = 79;
 pub const SO_DEVMEM_DONTNEED: c_int = 80;
 
-pub const FICLONE: Ioctl = _IOW::<c_int>(0x94, 9) as Ioctl;
-pub const FICLONERANGE: Ioctl = _IOW::<crate::file_clone_range>(0x94, 13) as Ioctl;
-
 // Defined in unix/linux_like/mod.rs
 // pub const SCM_TIMESTAMP: c_int = SO_TIMESTAMP;
 pub const SCM_TIMESTAMPNS: c_int = SO_TIMESTAMPNS;
@@ -251,47 +249,6 @@
 pub const BLKIOOPT: Ioctl = 0x1279;
 pub const BLKSSZGET: Ioctl = 0x1268;
 pub const BLKPBSZGET: Ioctl = 0x127B;
-// linux/if_tun.h
-pub const TUNSETNOCSUM: Ioctl = 0x400454c8;
-pub const TUNSETDEBUG: Ioctl = 0x400454c9;
-pub const TUNSETIFF: Ioctl = 0x400454ca;
-pub const TUNSETPERSIST: Ioctl = 0x400454cb;
-pub const TUNSETOWNER: Ioctl = 0x400454cc;
-pub const TUNSETLINK: Ioctl = 0x400454cd;
-pub const TUNSETGROUP: Ioctl = 0x400454ce;
-pub const TUNGETFEATURES: Ioctl = 0x800454cf;
-pub const TUNSETOFFLOAD: Ioctl = 0x400454d0;
-pub const TUNSETTXFILTER: Ioctl = 0x400454d1;
-pub const TUNGETIFF: Ioctl = 0x800454d2;
-pub const TUNGETSNDBUF: Ioctl = 0x800454d3;
-pub const TUNSETSNDBUF: Ioctl = 0x400454d4;
-pub const TUNGETVNETHDRSZ: Ioctl = 0x800454d7;
-pub const TUNSETVNETHDRSZ: Ioctl = 0x400454d8;
-pub const TUNSETQUEUE: Ioctl = 0x400454d9;
-pub const TUNSETIFINDEX: Ioctl = 0x400454da;
-pub const TUNSETVNETLE: Ioctl = 0x400454dc;
-pub const TUNGETVNETLE: Ioctl = 0x800454dd;
-/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on
- * little-endian hosts. Not all kernel configurations support them, but all
- * configurations that support SET also support GET.
- */
-pub const TUNSETVNETBE: Ioctl = 0x400454de;
-pub const TUNGETVNETBE: Ioctl = 0x800454df;
-pub const TUNSETSTEERINGEBPF: Ioctl = 0x800454e0;
-pub const TUNSETFILTEREBPF: Ioctl = 0x800454e1;
-
-pub const FS_IOC_GETFLAGS: Ioctl = _IOR::<c_long>('f' as u32, 1) as Ioctl;
-pub const FS_IOC_SETFLAGS: Ioctl = _IOW::<c_long>('f' as u32, 2) as Ioctl;
-pub const FS_IOC_GETVERSION: Ioctl = _IOR::<c_long>('v' as u32, 1) as Ioctl;
-pub const FS_IOC_SETVERSION: Ioctl = _IOW::<c_long>('v' as u32, 2) as Ioctl;
-pub const FS_IOC32_GETFLAGS: Ioctl = _IOR::<c_int>('f' as u32, 1) as Ioctl;
-pub const FS_IOC32_SETFLAGS: Ioctl = _IOW::<c_int>('f' as u32, 2) as Ioctl;
-pub const FS_IOC32_GETVERSION: Ioctl = _IOR::<c_int>('v' as u32, 1) as Ioctl;
-pub const FS_IOC32_SETVERSION: Ioctl = _IOW::<c_int>('v' as u32, 2) as Ioctl;
-
-pub const TUNATTACHFILTER: Ioctl = _IOW::<crate::sock_fprog>('T' as u32, 213) as Ioctl;
-pub const TUNDETACHFILTER: Ioctl = _IOW::<crate::sock_fprog>('T' as u32, 214) as Ioctl;
-pub const TUNGETFILTER: Ioctl = _IOR::<crate::sock_fprog>('T' as u32, 219) as Ioctl;
 
 cfg_if! {
     if #[cfg(any(target_arch = "arm", target_arch = "s390x"))] {
@@ -357,9 +314,6 @@
         pub const RLIMIT_RTPRIO: c_int = 14;
         pub const RLIMIT_RTTIME: c_int = 15;
         #[deprecated(since = "0.2.64", note = "Not stable across OS versions")]
-        #[cfg(not(target_arch = "loongarch64"))]
-        pub const RLIM_NLIMITS: c_int = 15;
-        #[cfg(target_arch = "loongarch64")]
         pub const RLIM_NLIMITS: c_int = 16;
         #[allow(deprecated)]
         #[deprecated(since = "0.2.64", note = "Not stable across OS versions")]
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/mips/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/mips/mod.rs
index eee7cc8..ba68894 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/mips/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/mips/mod.rs
@@ -33,16 +33,17 @@
 pub const SO_RCVBUF: c_int = 0x1002;
 pub const SO_SNDLOWAT: c_int = 0x1003;
 pub const SO_RCVLOWAT: c_int = 0x1004;
-// NOTE: These definitions are now being renamed with _OLD postfix,
-// but CI haven't support them yet.
-// Some related consts could be found in b32.rs and b64.rs
-const SO_SNDTIMEO_OLD: c_int = 0x1005;
-const SO_RCVTIMEO_OLD: c_int = 0x1006;
 cfg_if! {
     if #[cfg(linux_time_bits64)] {
+        const SO_RCVTIMEO_NEW: c_int = 66;
+        const SO_SNDTIMEO_NEW: c_int = 67;
+
         pub const SO_SNDTIMEO: c_int = SO_SNDTIMEO_NEW;
         pub const SO_RCVTIMEO: c_int = SO_RCVTIMEO_NEW;
     } else {
+        const SO_SNDTIMEO_OLD: c_int = 0x1005;
+        const SO_RCVTIMEO_OLD: c_int = 0x1006;
+
         pub const SO_SNDTIMEO: c_int = SO_SNDTIMEO_OLD;
         pub const SO_RCVTIMEO: c_int = SO_RCVTIMEO_OLD;
     }
@@ -95,28 +96,27 @@
 pub const SO_TXTIME: c_int = 61;
 pub const SCM_TXTIME: c_int = SO_TXTIME;
 pub const SO_BINDTOIFINDEX: c_int = 62;
-// NOTE: These definitions are now being renamed with _OLD postfix,
-// but CI haven't support them yet.
-// Some related consts could be found in b32.rs and b64.rs
-const SO_TIMESTAMP_OLD: c_int = 29;
-const SO_RCVTIMEO_NEW: c_int = 66;
-const SO_SNDTIMEO_NEW: c_int = 67;
-const SO_TIMESTAMPNS_OLD: c_int = 35;
-const SO_TIMESTAMPING_OLD: c_int = 37;
-const SO_TIMESTAMP_NEW: c_int = 63;
-const SO_TIMESTAMPNS_NEW: c_int = 64;
-const SO_TIMESTAMPING_NEW: c_int = 65;
+
 cfg_if! {
     if #[cfg(linux_time_bits64)] {
+        const SO_TIMESTAMP_NEW: c_int = 63;
+        const SO_TIMESTAMPNS_NEW: c_int = 64;
+        const SO_TIMESTAMPING_NEW: c_int = 65;
+
         pub const SO_TIMESTAMP: c_int = SO_TIMESTAMP_NEW;
         pub const SO_TIMESTAMPNS: c_int = SO_TIMESTAMPNS_NEW;
         pub const SO_TIMESTAMPING: c_int = SO_TIMESTAMPING_NEW;
     } else {
+        const SO_TIMESTAMP_OLD: c_int = 29;
+        const SO_TIMESTAMPNS_OLD: c_int = 35;
+        const SO_TIMESTAMPING_OLD: c_int = 37;
+
         pub const SO_TIMESTAMP: c_int = SO_TIMESTAMP_OLD;
         pub const SO_TIMESTAMPNS: c_int = SO_TIMESTAMPNS_OLD;
         pub const SO_TIMESTAMPING: c_int = SO_TIMESTAMPING_OLD;
     }
 }
+
 // pub const SO_DETACH_REUSEPORT_BPF: c_int = 68;
 pub const SO_PREFER_BUSY_POLL: c_int = 69;
 pub const SO_BUSY_POLL_BUDGET: c_int = 70;
@@ -131,9 +131,6 @@
 pub const SO_DEVMEM_DMABUF: c_int = 79;
 pub const SO_DEVMEM_DONTNEED: c_int = 80;
 
-pub const FICLONE: c_ulong = 0x80049409;
-pub const FICLONERANGE: c_ulong = 0x8020940D;
-
 // Defined in unix/linux_like/mod.rs
 // pub const SCM_TIMESTAMP: c_int = SO_TIMESTAMP;
 pub const SCM_TIMESTAMPNS: c_int = SO_TIMESTAMPNS;
@@ -223,68 +220,6 @@
 pub const BLKIOOPT: Ioctl = 0x20001279;
 pub const BLKSSZGET: Ioctl = 0x20001268;
 pub const BLKPBSZGET: Ioctl = 0x2000127B;
-// linux/if_tun.h
-pub const TUNSETNOCSUM: Ioctl = 0x800454c8;
-pub const TUNSETDEBUG: Ioctl = 0x800454c9;
-pub const TUNSETIFF: Ioctl = 0x800454ca;
-pub const TUNSETPERSIST: Ioctl = 0x800454cb;
-pub const TUNSETOWNER: Ioctl = 0x800454cc;
-pub const TUNSETLINK: Ioctl = 0x800454cd;
-pub const TUNSETGROUP: Ioctl = 0x800454ce;
-pub const TUNGETFEATURES: Ioctl = 0x400454cf;
-pub const TUNSETOFFLOAD: Ioctl = 0x800454d0;
-pub const TUNSETTXFILTER: Ioctl = 0x800454d1;
-pub const TUNGETIFF: Ioctl = 0x400454d2;
-pub const TUNGETSNDBUF: Ioctl = 0x400454d3;
-pub const TUNSETSNDBUF: Ioctl = 0x800454d4;
-pub const TUNGETVNETHDRSZ: Ioctl = 0x400454d7;
-pub const TUNSETVNETHDRSZ: Ioctl = 0x800454d8;
-pub const TUNSETQUEUE: Ioctl = 0x800454d9;
-pub const TUNSETIFINDEX: Ioctl = 0x800454da;
-pub const TUNSETVNETLE: Ioctl = 0x800454dc;
-pub const TUNGETVNETLE: Ioctl = 0x400454dd;
-/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on
- * little-endian hosts. Not all kernel configurations support them, but all
- * configurations that support SET also support GET.
- */
-pub const TUNSETVNETBE: Ioctl = 0x800454de;
-pub const TUNGETVNETBE: Ioctl = 0x400454df;
-pub const TUNSETSTEERINGEBPF: Ioctl = 0x400454e0;
-pub const TUNSETFILTEREBPF: Ioctl = 0x400454e1;
-
-cfg_if! {
-    // Those type are constructed using the _IOC macro
-    // DD-SS_SSSS_SSSS_SSSS-TTTT_TTTT-NNNN_NNNN
-    // where D stands for direction (either None (00), Read (01) or Write (11))
-    // where S stands for size (int, long, struct...)
-    // where T stands for type ('f','v','X'...)
-    // where N stands for NR (NumbeR)
-    if #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] {
-        pub const FS_IOC_GETFLAGS: Ioctl = 0x40046601;
-        pub const FS_IOC_SETFLAGS: Ioctl = 0x80046602;
-        pub const FS_IOC_GETVERSION: Ioctl = 0x40047601;
-        pub const FS_IOC_SETVERSION: Ioctl = 0x80047602;
-        pub const FS_IOC32_GETFLAGS: Ioctl = 0x40046601;
-        pub const FS_IOC32_SETFLAGS: Ioctl = 0x80046602;
-        pub const FS_IOC32_GETVERSION: Ioctl = 0x40047601;
-        pub const FS_IOC32_SETVERSION: Ioctl = 0x80047602;
-        pub const TUNATTACHFILTER: Ioctl = 0x800854d5;
-        pub const TUNDETACHFILTER: Ioctl = 0x800854d6;
-        pub const TUNGETFILTER: Ioctl = 0x400854db;
-    } else if #[cfg(any(target_arch = "mips64", target_arch = "mips64r6"))] {
-        pub const FS_IOC_GETFLAGS: Ioctl = 0x40086601;
-        pub const FS_IOC_SETFLAGS: Ioctl = 0x80086602;
-        pub const FS_IOC_GETVERSION: Ioctl = 0x40087601;
-        pub const FS_IOC_SETVERSION: Ioctl = 0x80087602;
-        pub const FS_IOC32_GETFLAGS: Ioctl = 0x40046601;
-        pub const FS_IOC32_SETFLAGS: Ioctl = 0x80046602;
-        pub const FS_IOC32_GETVERSION: Ioctl = 0x40047601;
-        pub const FS_IOC32_SETVERSION: Ioctl = 0x80047602;
-        pub const TUNATTACHFILTER: Ioctl = 0x801054d5;
-        pub const TUNDETACHFILTER: Ioctl = 0x801054d6;
-        pub const TUNGETFILTER: Ioctl = 0x401054db;
-    }
-}
 
 cfg_if! {
     if #[cfg(target_env = "musl")] {
@@ -349,7 +284,7 @@
         pub const RLIMIT_RTPRIO: c_int = 14;
         pub const RLIMIT_RTTIME: c_int = 15;
         #[deprecated(since = "0.2.64", note = "Not stable across OS versions")]
-        pub const RLIM_NLIMITS: c_int = 15;
+        pub const RLIM_NLIMITS: c_int = 16;
         #[allow(deprecated)]
         #[deprecated(since = "0.2.64", note = "Not stable across OS versions")]
         pub const RLIMIT_NLIMITS: c_int = RLIM_NLIMITS;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/powerpc/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/powerpc/mod.rs
index 588b99a..3249a9f 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/powerpc/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/powerpc/mod.rs
@@ -24,17 +24,23 @@
 // powerpc only differs in these
 pub const SO_RCVLOWAT: c_int = 16;
 pub const SO_SNDLOWAT: c_int = 17;
+
 cfg_if! {
     if #[cfg(linux_time_bits64)] {
-        pub const SO_SNDTIMEO: c_int = 67;
-        pub const SO_RCVTIMEO: c_int = 66;
+        const SO_RCVTIMEO_NEW: c_int = 66;
+        const SO_SNDTIMEO_NEW: c_int = 67;
+
+        pub const SO_RCVTIMEO: c_int = SO_RCVTIMEO_NEW;
+        pub const SO_SNDTIMEO: c_int = SO_SNDTIMEO_NEW;
     } else {
-        pub const SO_SNDTIMEO: c_int = 19;
-        pub const SO_RCVTIMEO: c_int = 18;
+        const SO_RCVTIMEO_OLD: c_int = 18;
+        const SO_SNDTIMEO_OLD: c_int = 19;
+
+        pub const SO_RCVTIMEO: c_int = SO_RCVTIMEO_OLD;
+        pub const SO_SNDTIMEO: c_int = SO_SNDTIMEO_OLD;
     }
 }
-// pub const SO_RCVTIMEO_OLD: c_int = 18;
-// pub const SO_SNDTIMEO_OLD: c_int = 19;
+
 pub const SO_PASSCRED: c_int = 20;
 pub const SO_PEERCRED: c_int = 21;
 // end
@@ -48,18 +54,23 @@
 pub const SO_PEERNAME: c_int = 28;
 cfg_if! {
     if #[cfg(linux_time_bits64)] {
+        const SO_TIMESTAMP_NEW: c_int = 63;
+        const SO_TIMESTAMPNS_NEW: c_int = 64;
+        const SO_TIMESTAMPING_NEW: c_int = 65;
+
         pub const SO_TIMESTAMP: c_int = SO_TIMESTAMP_NEW;
         pub const SO_TIMESTAMPNS: c_int = SO_TIMESTAMPNS_NEW;
         pub const SO_TIMESTAMPING: c_int = SO_TIMESTAMPING_NEW;
     } else {
+        const SO_TIMESTAMP_OLD: c_int = 29;
+        const SO_TIMESTAMPNS_OLD: c_int = 35;
+        const SO_TIMESTAMPING_OLD: c_int = 37;
+
         pub const SO_TIMESTAMP: c_int = SO_TIMESTAMP_OLD;
         pub const SO_TIMESTAMPNS: c_int = SO_TIMESTAMPNS_OLD;
         pub const SO_TIMESTAMPING: c_int = SO_TIMESTAMPING_OLD;
     }
 }
-const SO_TIMESTAMP_OLD: c_int = 29;
-const SO_TIMESTAMPNS_OLD: c_int = 35;
-const SO_TIMESTAMPING_OLD: c_int = 37;
 pub const SO_ACCEPTCONN: c_int = 30;
 pub const SO_PEERSEC: c_int = 31;
 pub const SO_SNDBUFFORCE: c_int = 32;
@@ -94,11 +105,6 @@
 pub const SO_TXTIME: c_int = 61;
 pub const SCM_TXTIME: c_int = SO_TXTIME;
 pub const SO_BINDTOIFINDEX: c_int = 62;
-const SO_TIMESTAMP_NEW: c_int = 63;
-const SO_TIMESTAMPNS_NEW: c_int = 64;
-const SO_TIMESTAMPING_NEW: c_int = 65;
-const SO_RCVTIMEO_NEW: c_int = 66;
-const SO_SNDTIMEO_NEW: c_int = 67;
 // pub const SO_DETACH_REUSEPORT_BPF: c_int = 68;
 pub const SO_PREFER_BUSY_POLL: c_int = 69;
 pub const SO_BUSY_POLL_BUDGET: c_int = 70;
@@ -113,9 +119,6 @@
 pub const SO_DEVMEM_DMABUF: c_int = 79;
 pub const SO_DEVMEM_DONTNEED: c_int = 80;
 
-pub const FICLONE: c_ulong = 0x80049409;
-pub const FICLONERANGE: c_ulong = 0x8020940D;
-
 // Defined in unix/linux_like/mod.rs
 // pub const SCM_TIMESTAMP: c_int = SO_TIMESTAMP;
 pub const SCM_TIMESTAMPNS: c_int = SO_TIMESTAMPNS;
@@ -209,68 +212,6 @@
 pub const BLKSSZGET: Ioctl = 0x20001268;
 pub const BLKPBSZGET: Ioctl = 0x2000127B;
 //pub const FIOQSIZE: Ioctl = 0x40086680;
-// linux/if_tun.h
-pub const TUNSETNOCSUM: Ioctl = 0x800454c8;
-pub const TUNSETDEBUG: Ioctl = 0x800454c9;
-pub const TUNSETIFF: Ioctl = 0x800454ca;
-pub const TUNSETPERSIST: Ioctl = 0x800454cb;
-pub const TUNSETOWNER: Ioctl = 0x800454cc;
-pub const TUNSETLINK: Ioctl = 0x800454cd;
-pub const TUNSETGROUP: Ioctl = 0x800454ce;
-pub const TUNGETFEATURES: Ioctl = 0x400454cf;
-pub const TUNSETOFFLOAD: Ioctl = 0x800454d0;
-pub const TUNSETTXFILTER: Ioctl = 0x800454d1;
-pub const TUNGETIFF: Ioctl = 0x400454d2;
-pub const TUNGETSNDBUF: Ioctl = 0x400454d3;
-pub const TUNSETSNDBUF: Ioctl = 0x800454d4;
-pub const TUNGETVNETHDRSZ: Ioctl = 0x400454d7;
-pub const TUNSETVNETHDRSZ: Ioctl = 0x800454d8;
-pub const TUNSETQUEUE: Ioctl = 0x800454d9;
-pub const TUNSETIFINDEX: Ioctl = 0x800454da;
-pub const TUNSETVNETLE: Ioctl = 0x800454dc;
-pub const TUNGETVNETLE: Ioctl = 0x400454dd;
-/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on
- * little-endian hosts. Not all kernel configurations support them, but all
- * configurations that support SET also support GET.
- */
-pub const TUNSETVNETBE: Ioctl = 0x800454de;
-pub const TUNGETVNETBE: Ioctl = 0x400454df;
-pub const TUNSETSTEERINGEBPF: Ioctl = 0x400454e0;
-pub const TUNSETFILTEREBPF: Ioctl = 0x400454e1;
-
-cfg_if! {
-    // Those type are constructed using the _IOC macro
-    // DD-SS_SSSS_SSSS_SSSS-TTTT_TTTT-NNNN_NNNN
-    // where D stands for direction (either None (00), Read (01) or Write (11))
-    // where S stands for size (int, long, struct...)
-    // where T stands for type ('f','v','X'...)
-    // where N stands for NR (NumbeR)
-    if #[cfg(target_arch = "powerpc")] {
-        pub const FS_IOC_GETFLAGS: Ioctl = 0x40046601;
-        pub const FS_IOC_SETFLAGS: Ioctl = 0x80046602;
-        pub const FS_IOC_GETVERSION: Ioctl = 0x40047601;
-        pub const FS_IOC_SETVERSION: Ioctl = 0x80047602;
-        pub const FS_IOC32_GETFLAGS: Ioctl = 0x40046601;
-        pub const FS_IOC32_SETFLAGS: Ioctl = 0x80046602;
-        pub const FS_IOC32_GETVERSION: Ioctl = 0x40047601;
-        pub const FS_IOC32_SETVERSION: Ioctl = 0x80047602;
-        pub const TUNATTACHFILTER: Ioctl = 0x800854d5;
-        pub const TUNDETACHFILTER: Ioctl = 0x800854d6;
-        pub const TUNGETFILTER: Ioctl = 0x400854db;
-    } else if #[cfg(target_arch = "powerpc64")] {
-        pub const FS_IOC_GETFLAGS: Ioctl = 0x40086601;
-        pub const FS_IOC_SETFLAGS: Ioctl = 0x80086602;
-        pub const FS_IOC_GETVERSION: Ioctl = 0x40087601;
-        pub const FS_IOC_SETVERSION: Ioctl = 0x80087602;
-        pub const FS_IOC32_GETFLAGS: Ioctl = 0x40046601;
-        pub const FS_IOC32_SETFLAGS: Ioctl = 0x80046602;
-        pub const FS_IOC32_GETVERSION: Ioctl = 0x40047601;
-        pub const FS_IOC32_SETVERSION: Ioctl = 0x80047602;
-        pub const TUNATTACHFILTER: Ioctl = 0x801054d5;
-        pub const TUNDETACHFILTER: Ioctl = 0x801054d6;
-        pub const TUNGETFILTER: Ioctl = 0x401054db;
-    }
-}
 
 pub const TIOCM_LE: c_int = 0x001;
 pub const TIOCM_DTR: c_int = 0x002;
@@ -330,7 +271,7 @@
         pub const RLIMIT_RTPRIO: c_int = 14;
         pub const RLIMIT_RTTIME: c_int = 15;
         #[deprecated(since = "0.2.64", note = "Not stable across OS versions")]
-        pub const RLIM_NLIMITS: c_int = 15;
+        pub const RLIM_NLIMITS: c_int = 16;
         #[allow(deprecated)]
         #[deprecated(since = "0.2.64", note = "Not stable across OS versions")]
         pub const RLIMIT_NLIMITS: c_int = RLIM_NLIMITS;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/sparc/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/sparc/mod.rs
index 86af2ad..4c108ba7 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/sparc/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/sparc/mod.rs
@@ -199,35 +199,6 @@
 //pub const TIOCGRS485: Ioctl = 0x40205441;
 //pub const TIOCSRS485: Ioctl = 0xc0205442;
 
-// linux/if_tun.h
-pub const TUNSETNOCSUM: Ioctl = 0x800454c8;
-pub const TUNSETDEBUG: Ioctl = 0x800454c9;
-pub const TUNSETIFF: Ioctl = 0x800454ca;
-pub const TUNSETPERSIST: Ioctl = 0x800454cb;
-pub const TUNSETOWNER: Ioctl = 0x800454cc;
-pub const TUNSETLINK: Ioctl = 0x800454cd;
-pub const TUNSETGROUP: Ioctl = 0x800454ce;
-pub const TUNGETFEATURES: Ioctl = 0x400454cf;
-pub const TUNSETOFFLOAD: Ioctl = 0x800454d0;
-pub const TUNSETTXFILTER: Ioctl = 0x800454d1;
-pub const TUNGETIFF: Ioctl = 0x400454d2;
-pub const TUNGETSNDBUF: Ioctl = 0x400454d3;
-pub const TUNSETSNDBUF: Ioctl = 0x800454d4;
-pub const TUNGETVNETHDRSZ: Ioctl = 0x400454d7;
-pub const TUNSETVNETHDRSZ: Ioctl = 0x800454d8;
-pub const TUNSETQUEUE: Ioctl = 0x800454d9;
-pub const TUNSETIFINDEX: Ioctl = 0x800454da;
-pub const TUNSETVNETLE: Ioctl = 0x800454dc;
-pub const TUNGETVNETLE: Ioctl = 0x400454dd;
-/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on
- * little-endian hosts. Not all kernel configurations support them, but all
- * configurations that support SET also support GET.
- */
-pub const TUNSETVNETBE: Ioctl = 0x800454de;
-pub const TUNGETVNETBE: Ioctl = 0x400454df;
-pub const TUNSETSTEERINGEBPF: Ioctl = 0x400454e0;
-pub const TUNSETFILTEREBPF: Ioctl = 0x400454e1;
-
 pub const TIOCM_LE: c_int = 0x001;
 pub const TIOCM_DTR: c_int = 0x002;
 pub const TIOCM_RTS: c_int = 0x004;
@@ -274,37 +245,3 @@
         pub const RLIM_INFINITY: crate::rlim_t = 0x7fffffff;
     }
 }
-
-cfg_if! {
-    // Those type are constructed using the _IOC macro
-    // DD-SS_SSSS_SSSS_SSSS-TTTT_TTTT-NNNN_NNNN
-    // where D stands for direction (either None (00), Read (01) or Write (11))
-    // where S stands for size (int, long, struct...)
-    // where T stands for type ('f','v','X'...)
-    // where N stands for NR (NumbeR)
-    if #[cfg(target_arch = "sparc")] {
-        pub const FS_IOC_GETFLAGS: Ioctl = 0x40046601;
-        pub const FS_IOC_SETFLAGS: Ioctl = 0x80046602;
-        pub const FS_IOC_GETVERSION: Ioctl = 0x40047601;
-        pub const FS_IOC_SETVERSION: Ioctl = 0x80047602;
-        pub const FS_IOC32_GETFLAGS: Ioctl = 0x40046601;
-        pub const FS_IOC32_SETFLAGS: Ioctl = 0x80046602;
-        pub const FS_IOC32_GETVERSION: Ioctl = 0x40047601;
-        pub const FS_IOC32_SETVERSION: Ioctl = 0x80047602;
-        pub const TUNATTACHFILTER: Ioctl = 0x800854d5;
-        pub const TUNDETACHFILTER: Ioctl = 0x800854d6;
-        pub const TUNGETFILTER: Ioctl = 0x400854db;
-    } else if #[cfg(target_arch = "sparc64")] {
-        pub const FS_IOC_GETFLAGS: Ioctl = 0x40086601;
-        pub const FS_IOC_SETFLAGS: Ioctl = 0x80086602;
-        pub const FS_IOC_GETVERSION: Ioctl = 0x40087601;
-        pub const FS_IOC_SETVERSION: Ioctl = 0x80087602;
-        pub const FS_IOC32_GETFLAGS: Ioctl = 0x40046601;
-        pub const FS_IOC32_SETFLAGS: Ioctl = 0x80046602;
-        pub const FS_IOC32_GETVERSION: Ioctl = 0x40047601;
-        pub const FS_IOC32_SETVERSION: Ioctl = 0x80047602;
-        pub const TUNATTACHFILTER: Ioctl = 0x801054d5;
-        pub const TUNDETACHFILTER: Ioctl = 0x801054d6;
-        pub const TUNGETFILTER: Ioctl = 0x401054db;
-    }
-}
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/arm/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/arm/mod.rs
index 2dd4a88..80d7be38 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/arm/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/arm/mod.rs
@@ -60,23 +60,35 @@
 
     pub struct stat64 {
         pub st_dev: crate::dev_t,
+        #[cfg(not(gnu_time_bits64))]
         __pad1: c_uint,
+        #[cfg(not(gnu_time_bits64))]
         __st_ino: c_ulong,
+        #[cfg(gnu_time_bits64)]
+        pub st_ino: crate::ino_t,
         pub st_mode: crate::mode_t,
         pub st_nlink: crate::nlink_t,
         pub st_uid: crate::uid_t,
         pub st_gid: crate::gid_t,
         pub st_rdev: crate::dev_t,
+        #[cfg(not(gnu_time_bits64))]
         __pad2: c_uint,
         pub st_size: off64_t,
         pub st_blksize: crate::blksize_t,
         pub st_blocks: crate::blkcnt64_t,
         pub st_atime: crate::time_t,
         pub st_atime_nsec: c_long,
+        #[cfg(gnu_time_bits64)]
+        _atime_pad: c_int,
         pub st_mtime: crate::time_t,
         pub st_mtime_nsec: c_long,
+        #[cfg(gnu_time_bits64)]
+        _mtime_pad: c_int,
         pub st_ctime: crate::time_t,
         pub st_ctime_nsec: c_long,
+        #[cfg(gnu_time_bits64)]
+        _ctime_pad: c_int,
+        #[cfg(not(gnu_time_bits64))]
         pub st_ino: crate::ino64_t,
     }
 
@@ -115,10 +127,13 @@
         pub shm_perm: crate::ipc_perm,
         pub shm_segsz: size_t,
         pub shm_atime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __unused1: c_ulong,
         pub shm_dtime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __unused2: c_ulong,
         pub shm_ctime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __unused3: c_ulong,
         pub shm_cpid: crate::pid_t,
         pub shm_lpid: crate::pid_t,
@@ -130,10 +145,13 @@
     pub struct msqid_ds {
         pub msg_perm: crate::ipc_perm,
         pub msg_stime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved1: c_ulong,
         pub msg_rtime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved2: c_ulong,
         pub msg_ctime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved3: c_ulong,
         pub __msg_cbytes: c_ulong,
         pub msg_qnum: crate::msgqnum_t,
@@ -242,17 +260,6 @@
             }
         }
         impl Eq for ucontext_t {}
-        impl fmt::Debug for ucontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ucontext_t")
-                    .field("uc_flags", &self.uc_link)
-                    .field("uc_link", &self.uc_link)
-                    .field("uc_stack", &self.uc_stack)
-                    .field("uc_mcontext", &self.uc_mcontext)
-                    .field("uc_sigmask", &self.uc_sigmask)
-                    .finish()
-            }
-        }
         impl hash::Hash for ucontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mips/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mips/mod.rs
index 649a8e0..6581d729 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mips/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mips/mod.rs
@@ -5,8 +5,12 @@
 
 s! {
     pub struct stat {
+        #[cfg(not(gnu_time_bits64))]
         pub st_dev: c_ulong,
+        #[cfg(gnu_time_bits64)]
+        pub st_dev: crate::dev_t,
 
+        #[cfg(not(gnu_time_bits64))]
         st_pad1: [c_long; 3],
 
         pub st_ino: crate::ino_t,
@@ -16,11 +20,14 @@
         pub st_uid: crate::uid_t,
         pub st_gid: crate::gid_t,
 
+        #[cfg(not(gnu_time_bits64))]
         pub st_rdev: c_ulong,
+        #[cfg(gnu_time_bits64)]
+        pub st_rdev: crate::dev_t,
 
         #[cfg(not(gnu_file_offset_bits64))]
         st_pad2: [c_long; 2],
-        #[cfg(gnu_file_offset_bits64)]
+        #[cfg(all(not(gnu_time_bits64), gnu_file_offset_bits64))]
         st_pad2: [c_long; 3],
 
         pub st_size: off_t,
@@ -28,40 +35,84 @@
         #[cfg(not(gnu_file_offset_bits64))]
         st_pad3: c_long,
 
+        #[cfg(gnu_time_bits64)]
+        pub st_blksize: crate::blksize_t,
+        #[cfg(gnu_time_bits64)]
+        pub st_blocks: crate::blkcnt_t,
+
         pub st_atime: crate::time_t,
+        #[cfg(gnu_time_bits64)]
+        _atime_pad: c_int,
         pub st_atime_nsec: c_long,
         pub st_mtime: crate::time_t,
+        #[cfg(gnu_time_bits64)]
+        _mtime_pad: c_int,
         pub st_mtime_nsec: c_long,
         pub st_ctime: crate::time_t,
+        #[cfg(gnu_time_bits64)]
+        _ctime_pad: c_int,
         pub st_ctime_nsec: c_long,
 
+        #[cfg(not(gnu_time_bits64))]
         pub st_blksize: crate::blksize_t,
-        #[cfg(gnu_file_offset_bits64)]
+        #[cfg(all(not(gnu_time_bits64), gnu_file_offset_bits64))]
         st_pad4: c_long,
+        #[cfg(not(gnu_time_bits64))]
         pub st_blocks: crate::blkcnt_t,
+        #[cfg(not(gnu_time_bits64))]
         st_pad5: [c_long; 14],
     }
 
     pub struct stat64 {
+        #[cfg(not(gnu_time_bits64))]
         pub st_dev: c_ulong,
+        #[cfg(gnu_time_bits64)]
+        pub st_dev: crate::dev_t,
+
+        #[cfg(not(gnu_time_bits64))]
         st_pad1: [c_long; 3],
+
         pub st_ino: crate::ino64_t,
         pub st_mode: crate::mode_t,
         pub st_nlink: crate::nlink_t,
         pub st_uid: crate::uid_t,
         pub st_gid: crate::gid_t,
+
+        #[cfg(not(gnu_time_bits64))]
         pub st_rdev: c_ulong,
+        #[cfg(gnu_time_bits64)]
+        pub st_rdev: crate::dev_t,
+
+        #[cfg(not(gnu_time_bits64))]
         st_pad2: [c_long; 3],
+
         pub st_size: off64_t,
+
+        #[cfg(gnu_time_bits64)]
+        pub st_blksize: crate::blksize_t,
+        #[cfg(gnu_time_bits64)]
+        pub st_blocks: crate::blkcnt_t,
+
         pub st_atime: crate::time_t,
+        #[cfg(gnu_time_bits64)]
+        _atime_pad: c_int,
         pub st_atime_nsec: c_long,
         pub st_mtime: crate::time_t,
+        #[cfg(gnu_time_bits64)]
+        _mtime_pad: c_int,
         pub st_mtime_nsec: c_long,
         pub st_ctime: crate::time_t,
+        #[cfg(gnu_time_bits64)]
+        _ctime_pad: c_int,
         pub st_ctime_nsec: c_long,
+
+        #[cfg(not(gnu_time_bits64))]
         pub st_blksize: crate::blksize_t,
+        #[cfg(not(gnu_time_bits64))]
         st_pad3: c_long,
+        #[cfg(not(gnu_time_bits64))]
         pub st_blocks: crate::blkcnt64_t,
+        #[cfg(not(gnu_time_bits64))]
         st_pad5: [c_long; 14],
     }
 
@@ -161,22 +212,22 @@
 
     pub struct msqid_ds {
         pub msg_perm: crate::ipc_perm,
-        #[cfg(target_endian = "big")]
+        #[cfg(all(not(gnu_time_bits64), target_endian = "big"))]
         __glibc_reserved1: c_ulong,
         pub msg_stime: crate::time_t,
-        #[cfg(target_endian = "little")]
+        #[cfg(all(not(gnu_time_bits64), target_endian = "little"))]
         __glibc_reserved1: c_ulong,
-        #[cfg(target_endian = "big")]
+        #[cfg(all(not(gnu_time_bits64), target_endian = "big"))]
         __glibc_reserved2: c_ulong,
         pub msg_rtime: crate::time_t,
-        #[cfg(target_endian = "little")]
+        #[cfg(all(not(gnu_time_bits64), target_endian = "little"))]
         __glibc_reserved2: c_ulong,
-        #[cfg(target_endian = "big")]
+        #[cfg(all(not(gnu_time_bits64), target_endian = "big"))]
         __glibc_reserved3: c_ulong,
         pub msg_ctime: crate::time_t,
         #[cfg(target_endian = "little")]
         __glibc_reserved3: c_ulong,
-        pub __msg_cbytes: c_ulong,
+        __msg_cbytes: c_ulong,
         pub msg_qnum: crate::msgqnum_t,
         pub msg_qbytes: crate::msglen_t,
         pub msg_lspid: crate::pid_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mod.rs
index e9a9584..fe843a7 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mod.rs
@@ -15,6 +15,7 @@
 pub type fsblkcnt64_t = u64;
 pub type fsfilcnt64_t = u64;
 pub type __syscall_ulong_t = c_ulong;
+pub type __suseconds64_t = i64;
 
 cfg_if! {
     if #[cfg(target_arch = "riscv32")] {
@@ -29,6 +30,18 @@
         pub type fsfilcnt_t = u64;
         pub type rlim_t = u64;
         pub type blksize_t = i64;
+    } else if #[cfg(gnu_time_bits64)] {
+        pub type time_t = i64;
+        pub type suseconds_t = i32;
+        type __ino_t = c_ulong;
+        type __ino64_t = u64;
+        pub type ino_t = __ino64_t;
+        pub type off_t = i64;
+        pub type blkcnt_t = i64;
+        pub type fsblkcnt_t = u64;
+        pub type fsfilcnt_t = u64;
+        pub type rlim_t = u64;
+        pub type blksize_t = i32;
     } else if #[cfg(gnu_file_offset_bits64)] {
         pub type time_t = i32;
         pub type suseconds_t = i32;
@@ -67,11 +80,12 @@
             pub struct stat {
                 pub st_dev: crate::dev_t,
 
+                #[cfg(not(gnu_time_bits64))]
                 __pad1: c_uint,
 
-                #[cfg(not(gnu_file_offset_bits64))]
+                #[cfg(any(gnu_time_bits64, not(gnu_file_offset_bits64)))]
                 pub st_ino: crate::ino_t,
-                #[cfg(all(gnu_file_offset_bits64))]
+                #[cfg(all(not(gnu_time_bits64), gnu_file_offset_bits64))]
                 __st_ino: __ino_t,
 
                 pub st_mode: crate::mode_t,
@@ -81,6 +95,7 @@
 
                 pub st_rdev: crate::dev_t,
 
+                #[cfg(not(gnu_time_bits64))]
                 __pad2: c_uint,
 
                 pub st_size: off_t,
@@ -90,16 +105,22 @@
 
                 pub st_atime: crate::time_t,
                 pub st_atime_nsec: c_long,
+                #[cfg(gnu_time_bits64)]
+                _atime_pad: c_int,
                 pub st_mtime: crate::time_t,
                 pub st_mtime_nsec: c_long,
+                #[cfg(gnu_time_bits64)]
+                _mtime_pad: c_int,
                 pub st_ctime: crate::time_t,
                 pub st_ctime_nsec: c_long,
+                #[cfg(gnu_time_bits64)]
+                _ctime_pad: c_int,
 
                 #[cfg(not(gnu_file_offset_bits64))]
                 __glibc_reserved4: c_long,
                 #[cfg(not(gnu_file_offset_bits64))]
                 __glibc_reserved5: c_long,
-                #[cfg(gnu_file_offset_bits64)]
+                #[cfg(all(not(gnu_time_bits64), gnu_file_offset_bits64))]
                 pub st_ino: crate::ino_t,
             }
         }
@@ -154,28 +175,114 @@
 
     pub struct semid_ds {
         pub sem_perm: ipc_perm,
-        #[cfg(target_arch = "powerpc")]
+        #[cfg(all(not(gnu_time_bits64), target_arch = "powerpc"))]
         __reserved: crate::__syscall_ulong_t,
         pub sem_otime: crate::time_t,
         #[cfg(not(any(
+            gnu_time_bits64,
             target_arch = "mips",
             target_arch = "mips32r6",
             target_arch = "powerpc"
         )))]
         __reserved: crate::__syscall_ulong_t,
-        #[cfg(target_arch = "powerpc")]
+        #[cfg(all(not(gnu_time_bits64), target_arch = "powerpc"))]
         __reserved2: crate::__syscall_ulong_t,
         pub sem_ctime: crate::time_t,
         #[cfg(not(any(
+            gnu_time_bits64,
             target_arch = "mips",
             target_arch = "mips32r6",
             target_arch = "powerpc"
         )))]
         __reserved2: crate::__syscall_ulong_t,
         pub sem_nsems: crate::__syscall_ulong_t,
+        #[cfg(all(
+            gnu_time_bits64,
+            not(any(
+                target_arch = "mips",
+                target_arch = "mips32r6",
+                target_arch = "powerpc",
+                target_arch = "arm",
+                target_arch = "x86"
+            ))
+        ))]
+        __reserved2: crate::__syscall_ulong_t,
         __glibc_reserved3: crate::__syscall_ulong_t,
         __glibc_reserved4: crate::__syscall_ulong_t,
     }
+
+    #[cfg(gnu_time_bits64)]
+    pub struct timex {
+        pub modes: c_uint,
+        _pad1: c_int,
+        pub offset: c_longlong,
+        pub freq: c_longlong,
+        pub maxerror: c_longlong,
+        pub esterror: c_longlong,
+        pub status: c_int,
+        _pad2: c_int,
+        pub constant: c_longlong,
+        pub precision: c_longlong,
+        pub tolerance: c_longlong,
+        pub time: crate::timeval,
+        pub tick: c_longlong,
+        pub ppsfreq: c_longlong,
+        pub jitter: c_longlong,
+        pub shift: c_int,
+        _pad3: c_int,
+        pub stabil: c_longlong,
+        pub jitcnt: c_longlong,
+        pub calcnt: c_longlong,
+        pub errcnt: c_longlong,
+        pub stbcnt: c_longlong,
+        pub tai: c_int,
+        pub __unused1: i32,
+        pub __unused2: i32,
+        pub __unused3: i32,
+        pub __unused4: i32,
+        pub __unused5: i32,
+        pub __unused6: i32,
+        pub __unused7: i32,
+        pub __unused8: i32,
+        pub __unused9: i32,
+        pub __unused10: i32,
+        pub __unused11: i32,
+    }
+
+    #[cfg(not(gnu_time_bits64))]
+    pub struct timex {
+        pub modes: c_uint,
+        pub offset: c_long,
+        pub freq: c_long,
+        pub maxerror: c_long,
+        pub esterror: c_long,
+        pub status: c_int,
+        pub constant: c_long,
+        pub precision: c_long,
+        pub tolerance: c_long,
+        pub time: crate::timeval,
+        pub tick: c_long,
+        pub ppsfreq: c_long,
+        pub jitter: c_long,
+        pub shift: c_int,
+        pub stabil: c_long,
+        pub jitcnt: c_long,
+        pub calcnt: c_long,
+        pub errcnt: c_long,
+        pub stbcnt: c_long,
+        pub tai: c_int,
+        pub __unused1: i32,
+        pub __unused2: i32,
+        pub __unused3: i32,
+        pub __unused4: i32,
+        pub __unused5: i32,
+        pub __unused6: i32,
+        pub __unused7: i32,
+        pub __unused8: i32,
+        pub __unused9: i32,
+        pub __unused10: i32,
+        pub __unused11: i32,
+    }
 }
 
 pub const POSIX_FADV_DONTNEED: c_int = 4;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/powerpc.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/powerpc.rs
index 36da977..d562aac 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/powerpc.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/powerpc.rs
@@ -67,17 +67,26 @@
         pub st_uid: crate::uid_t,
         pub st_gid: crate::gid_t,
         pub st_rdev: crate::dev_t,
+        #[cfg(not(gnu_time_bits64))]
         __pad2: c_ushort,
         pub st_size: off_t,
         pub st_blksize: crate::blksize_t,
         pub st_blocks: crate::blkcnt_t,
         pub st_atime: crate::time_t,
+        #[cfg(gnu_time_bits64)]
+        _atime_pad: c_int,
         pub st_atime_nsec: c_long,
         pub st_mtime: crate::time_t,
+        #[cfg(gnu_time_bits64)]
+        _mtime_pad: c_int,
         pub st_mtime_nsec: c_long,
         pub st_ctime: crate::time_t,
+        #[cfg(gnu_time_bits64)]
+        _ctime_pad: c_int,
         pub st_ctime_nsec: c_long,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved4: c_ulong,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved5: c_ulong,
     }
 
@@ -89,17 +98,26 @@
         pub st_uid: crate::uid_t,
         pub st_gid: crate::gid_t,
         pub st_rdev: crate::dev_t,
+        #[cfg(not(gnu_time_bits64))]
         __pad2: c_ushort,
         pub st_size: off64_t,
         pub st_blksize: crate::blksize_t,
         pub st_blocks: crate::blkcnt64_t,
         pub st_atime: crate::time_t,
+        #[cfg(gnu_time_bits64)]
+        _atime_pad: c_int,
         pub st_atime_nsec: c_long,
         pub st_mtime: crate::time_t,
+        #[cfg(gnu_time_bits64)]
+        _mtime_pad: c_int,
         pub st_mtime_nsec: c_long,
         pub st_ctime: crate::time_t,
+        #[cfg(gnu_time_bits64)]
+        _ctime_pad: c_int,
         pub st_ctime_nsec: c_long,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved4: c_ulong,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved5: c_ulong,
     }
 
@@ -136,13 +154,20 @@
 
     pub struct shmid_ds {
         pub shm_perm: crate::ipc_perm,
+        #[cfg(gnu_time_bits64)]
+        pub shm_segsz: size_t,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved1: c_uint,
         pub shm_atime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved2: c_uint,
         pub shm_dtime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved3: c_uint,
         pub shm_ctime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved4: c_uint,
+        #[cfg(not(gnu_time_bits64))]
         pub shm_segsz: size_t,
         pub shm_cpid: crate::pid_t,
         pub shm_lpid: crate::pid_t,
@@ -153,10 +178,13 @@
 
     pub struct msqid_ds {
         pub msg_perm: crate::ipc_perm,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved1: c_uint,
         pub msg_stime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved2: c_uint,
         pub msg_rtime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved3: c_uint,
         pub msg_ctime: crate::time_t,
         pub __msg_cbytes: c_ulong,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs
index 7533ad6..03760e72 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs
@@ -154,12 +154,18 @@
 
     pub struct shmid_ds {
         pub shm_perm: crate::ipc_perm,
+        #[cfg(gnu_time_bits64)]
+        pub shm_segsz: size_t,
+        #[cfg(not(gnu_time_bits64))]
         __pad1: c_uint,
         pub shm_atime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __pad2: c_uint,
         pub shm_dtime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __pad3: c_uint,
         pub shm_ctime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         pub shm_segsz: size_t,
         pub shm_cpid: crate::pid_t,
         pub shm_lpid: crate::pid_t,
@@ -170,19 +176,22 @@
 
     pub struct msqid_ds {
         pub msg_perm: crate::ipc_perm,
+        #[cfg(not(gnu_time_bits64))]
         __pad1: c_uint,
         pub msg_stime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __pad2: c_uint,
         pub msg_rtime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __pad3: c_uint,
         pub msg_ctime: crate::time_t,
-        pub __msg_cbytes: c_ushort,
+        pub __msg_cbytes: c_ulong,
         pub msg_qnum: crate::msgqnum_t,
         pub msg_qbytes: crate::msglen_t,
         pub msg_lspid: crate::pid_t,
         pub msg_lrpid: crate::pid_t,
-        __glibc_reserved1: c_ulong,
-        __glibc_reserved2: c_ulong,
+        __glibc_reserved4: c_ulong,
+        __glibc_reserved5: c_ulong,
     }
 }
 
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/x86/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/x86/mod.rs
index c0eb9e8..0f23f003 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/x86/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/x86/mod.rs
@@ -134,23 +134,35 @@
 
     pub struct stat64 {
         pub st_dev: crate::dev_t,
+        #[cfg(not(gnu_time_bits64))]
         __pad1: c_uint,
+        #[cfg(not(gnu_time_bits64))]
         __st_ino: c_ulong,
+        #[cfg(gnu_time_bits64)]
+        pub st_ino: crate::ino_t,
         pub st_mode: crate::mode_t,
         pub st_nlink: crate::nlink_t,
         pub st_uid: crate::uid_t,
         pub st_gid: crate::gid_t,
         pub st_rdev: crate::dev_t,
+        #[cfg(not(gnu_time_bits64))]
         __pad2: c_uint,
         pub st_size: off64_t,
         pub st_blksize: crate::blksize_t,
         pub st_blocks: crate::blkcnt64_t,
         pub st_atime: crate::time_t,
         pub st_atime_nsec: c_long,
+        #[cfg(gnu_time_bits64)]
+        _atime_pad: c_int,
         pub st_mtime: crate::time_t,
         pub st_mtime_nsec: c_long,
+        #[cfg(gnu_time_bits64)]
+        _mtime_pad: c_int,
         pub st_ctime: crate::time_t,
         pub st_ctime_nsec: c_long,
+        #[cfg(gnu_time_bits64)]
+        _ctime_pad: c_int,
+        #[cfg(not(gnu_time_bits64))]
         pub st_ino: crate::ino64_t,
     }
 
@@ -189,10 +201,13 @@
         pub shm_perm: crate::ipc_perm,
         pub shm_segsz: size_t,
         pub shm_atime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __unused1: c_ulong,
         pub shm_dtime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __unused2: c_ulong,
         pub shm_ctime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __unused3: c_ulong,
         pub shm_cpid: crate::pid_t,
         pub shm_lpid: crate::pid_t,
@@ -204,10 +219,13 @@
     pub struct msqid_ds {
         pub msg_perm: crate::ipc_perm,
         pub msg_stime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved1: c_ulong,
         pub msg_rtime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved2: c_ulong,
         pub msg_ctime: crate::time_t,
+        #[cfg(not(gnu_time_bits64))]
         __glibc_reserved3: c_ulong,
         pub __msg_cbytes: c_ulong,
         pub msg_qnum: crate::msgqnum_t,
@@ -296,26 +314,6 @@
 
         impl Eq for user_fpxregs_struct {}
 
-        impl fmt::Debug for user_fpxregs_struct {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("user_fpxregs_struct")
-                    .field("cwd", &self.cwd)
-                    .field("swd", &self.swd)
-                    .field("twd", &self.twd)
-                    .field("fop", &self.fop)
-                    .field("fip", &self.fip)
-                    .field("fcs", &self.fcs)
-                    .field("foo", &self.foo)
-                    .field("fos", &self.fos)
-                    .field("mxcsr", &self.mxcsr)
-                    // Ignore __reserved field
-                    .field("st_space", &self.st_space)
-                    .field("xmm_space", &self.xmm_space)
-                    // Ignore padding field
-                    .finish()
-            }
-        }
-
         impl hash::Hash for user_fpxregs_struct {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.cwd.hash(state);
@@ -347,19 +345,6 @@
 
         impl Eq for ucontext_t {}
 
-        impl fmt::Debug for ucontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ucontext_t")
-                    .field("uc_flags", &self.uc_flags)
-                    .field("uc_link", &self.uc_link)
-                    .field("uc_stack", &self.uc_stack)
-                    .field("uc_mcontext", &self.uc_mcontext)
-                    .field("uc_sigmask", &self.uc_sigmask)
-                    // Ignore __private field
-                    .finish()
-            }
-        }
-
         impl hash::Hash for ucontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/mod.rs
index 9d7608f6..ba5678b 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/mod.rs
@@ -97,6 +97,85 @@
         __glibc_reserved3: crate::__syscall_ulong_t,
         __glibc_reserved4: crate::__syscall_ulong_t,
     }
+
+    pub struct timex {
+        pub modes: c_uint,
+        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
+        pub offset: i64,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub offset: c_long,
+        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
+        pub freq: i64,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub freq: c_long,
+        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
+        pub maxerror: i64,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub maxerror: c_long,
+        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
+        pub esterror: i64,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub esterror: c_long,
+        pub status: c_int,
+        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
+        pub constant: i64,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub constant: c_long,
+        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
+        pub precision: i64,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub precision: c_long,
+        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
+        pub tolerance: i64,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub tolerance: c_long,
+        pub time: crate::timeval,
+        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
+        pub tick: i64,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub tick: c_long,
+        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
+        pub ppsfreq: i64,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub ppsfreq: c_long,
+        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
+        pub jitter: i64,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub jitter: c_long,
+        pub shift: c_int,
+        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
+        pub stabil: i64,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub stabil: c_long,
+        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
+        pub jitcnt: i64,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub jitcnt: c_long,
+        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
+        pub calcnt: i64,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub calcnt: c_long,
+        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
+        pub errcnt: i64,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub errcnt: c_long,
+        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
+        pub stbcnt: i64,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub stbcnt: c_long,
+        pub tai: c_int,
+        pub __unused1: i32,
+        pub __unused2: i32,
+        pub __unused3: i32,
+        pub __unused4: i32,
+        pub __unused5: i32,
+        pub __unused6: i32,
+        pub __unused7: i32,
+        pub __unused8: i32,
+        pub __unused9: i32,
+        pub __unused10: i32,
+        pub __unused11: i32,
+    }
 }
 
 pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8;
@@ -119,7 +198,7 @@
     } else if #[cfg(any(target_arch = "s390x"))] {
         mod s390x;
         pub use self::s390x::*;
-    } else if #[cfg(any(target_arch = "x86_64"))] {
+    } else if #[cfg(target_arch = "x86_64")] {
         mod x86_64;
         pub use self::x86_64::*;
     } else if #[cfg(any(target_arch = "riscv64"))] {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs
index 578057c..d689bb1 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs
@@ -601,6 +601,7 @@
 
 pub const COMPAT_HWCAP_ISA_I: c_ulong = 1 << (b'I' - b'A');
 pub const COMPAT_HWCAP_ISA_M: c_ulong = 1 << (b'M' - b'A');
+#[allow(clippy::eq_op)]
 pub const COMPAT_HWCAP_ISA_A: c_ulong = 1 << (b'A' - b'A');
 pub const COMPAT_HWCAP_ISA_F: c_ulong = 1 << (b'F' - b'A');
 pub const COMPAT_HWCAP_ISA_D: c_ulong = 1 << (b'D' - b'A');
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/s390x.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/s390x.rs
index c08e1210..aa42a02 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/s390x.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/s390x.rs
@@ -227,15 +227,9 @@
 
         impl Eq for fpreg_t {}
 
-        impl fmt::Debug for fpreg_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("fpreg_t").field("d", &self.d).finish()
-            }
-        }
-
         impl hash::Hash for fpreg_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
-                let d: u64 = unsafe { mem::transmute(self.d) };
+                let d: u64 = self.d.to_bits();
                 d.hash(state);
             }
         }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs
index 9bcc271..e76ae751 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs
@@ -346,23 +346,6 @@
 
         impl Eq for user_fpregs_struct {}
 
-        impl fmt::Debug for user_fpregs_struct {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("user_fpregs_struct")
-                    .field("cwd", &self.cwd)
-                    .field("ftw", &self.ftw)
-                    .field("fop", &self.fop)
-                    .field("rip", &self.rip)
-                    .field("rdp", &self.rdp)
-                    .field("mxcsr", &self.mxcsr)
-                    .field("mxcr_mask", &self.mxcr_mask)
-                    .field("st_space", &self.st_space)
-                    // FIXME(debug): .field("xmm_space", &self.xmm_space)
-                    // Ignore padding field
-                    .finish()
-            }
-        }
-
         impl hash::Hash for user_fpregs_struct {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.cwd.hash(state);
@@ -391,19 +374,6 @@
 
         impl Eq for ucontext_t {}
 
-        impl fmt::Debug for ucontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ucontext_t")
-                    .field("uc_flags", &self.uc_flags)
-                    .field("uc_link", &self.uc_link)
-                    .field("uc_stack", &self.uc_stack)
-                    .field("uc_mcontext", &self.uc_mcontext)
-                    .field("uc_sigmask", &self.uc_sigmask)
-                    // Ignore __private field
-                    .finish()
-            }
-        }
-
         impl hash::Hash for ucontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/mod.rs
index 823f495..4fc9a0aa 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/mod.rs
@@ -174,85 +174,6 @@
         pub rt_irtt: c_ushort,
     }
 
-    pub struct timex {
-        pub modes: c_uint,
-        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
-        pub offset: i64,
-        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
-        pub offset: c_long,
-        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
-        pub freq: i64,
-        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
-        pub freq: c_long,
-        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
-        pub maxerror: i64,
-        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
-        pub maxerror: c_long,
-        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
-        pub esterror: i64,
-        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
-        pub esterror: c_long,
-        pub status: c_int,
-        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
-        pub constant: i64,
-        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
-        pub constant: c_long,
-        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
-        pub precision: i64,
-        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
-        pub precision: c_long,
-        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
-        pub tolerance: i64,
-        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
-        pub tolerance: c_long,
-        pub time: crate::timeval,
-        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
-        pub tick: i64,
-        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
-        pub tick: c_long,
-        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
-        pub ppsfreq: i64,
-        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
-        pub ppsfreq: c_long,
-        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
-        pub jitter: i64,
-        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
-        pub jitter: c_long,
-        pub shift: c_int,
-        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
-        pub stabil: i64,
-        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
-        pub stabil: c_long,
-        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
-        pub jitcnt: i64,
-        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
-        pub jitcnt: c_long,
-        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
-        pub calcnt: i64,
-        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
-        pub calcnt: c_long,
-        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
-        pub errcnt: i64,
-        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
-        pub errcnt: c_long,
-        #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
-        pub stbcnt: i64,
-        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
-        pub stbcnt: c_long,
-        pub tai: c_int,
-        pub __unused1: i32,
-        pub __unused2: i32,
-        pub __unused3: i32,
-        pub __unused4: i32,
-        pub __unused5: i32,
-        pub __unused6: i32,
-        pub __unused7: i32,
-        pub __unused8: i32,
-        pub __unused9: i32,
-        pub __unused10: i32,
-        pub __unused11: i32,
-    }
-
     pub struct ntptimeval {
         pub time: crate::timeval,
         pub maxerror: c_long,
@@ -436,6 +357,18 @@
         __pos: off64_t,
         __state: crate::mbstate_t,
     }
+
+    // linux x32 compatibility
+    // See https://sourceware.org/bugzilla/show_bug.cgi?id=16437
+    pub struct timespec {
+        pub tv_sec: time_t,
+        #[cfg(all(gnu_time_bits64, target_endian = "big"))]
+        __pad: i32,
+        #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
+        pub tv_nsec: c_long,
+        #[cfg(all(gnu_time_bits64, target_endian = "little"))]
+        __pad: i32,
+    }
 }
 
 impl siginfo_t {
@@ -447,7 +380,7 @@
             _si_code: c_int,
             si_addr: *mut c_void,
         }
-        (*(self as *const siginfo_t as *const siginfo_sigfault)).si_addr
+        (*(self as *const siginfo_t).cast::<siginfo_sigfault>()).si_addr
     }
 
     pub unsafe fn si_value(&self) -> crate::sigval {
@@ -460,7 +393,7 @@
             _si_overrun: c_int,
             si_sigval: crate::sigval,
         }
-        (*(self as *const siginfo_t as *const siginfo_timer)).si_sigval
+        (*(self as *const siginfo_t).cast::<siginfo_timer>()).si_sigval
     }
 }
 
@@ -498,7 +431,7 @@
 
 impl siginfo_t {
     unsafe fn sifields(&self) -> &sifields {
-        &(*(self as *const siginfo_t as *const siginfo_f)).sifields
+        &(*(self as *const siginfo_t).cast::<siginfo_f>()).sifields
     }
 
     pub unsafe fn si_pid(&self) -> crate::pid_t {
@@ -522,19 +455,13 @@
     }
 }
 
-pub union __c_anonymous_ptrace_syscall_info_data {
-    pub entry: __c_anonymous_ptrace_syscall_info_entry,
-    pub exit: __c_anonymous_ptrace_syscall_info_exit,
-    pub seccomp: __c_anonymous_ptrace_syscall_info_seccomp,
-}
-impl Copy for __c_anonymous_ptrace_syscall_info_data {}
-impl Clone for __c_anonymous_ptrace_syscall_info_data {
-    fn clone(&self) -> __c_anonymous_ptrace_syscall_info_data {
-        *self
-    }
-}
-
 s_no_extra_traits! {
+    pub union __c_anonymous_ptrace_syscall_info_data {
+        pub entry: __c_anonymous_ptrace_syscall_info_entry,
+        pub exit: __c_anonymous_ptrace_syscall_info_exit,
+        pub seccomp: __c_anonymous_ptrace_syscall_info_seccomp,
+    }
+
     pub struct utmpx {
         pub ut_type: c_short,
         pub ut_pid: crate::pid_t,
@@ -604,24 +531,6 @@
 
         impl Eq for utmpx {}
 
-        impl fmt::Debug for utmpx {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utmpx")
-                    .field("ut_type", &self.ut_type)
-                    .field("ut_pid", &self.ut_pid)
-                    .field("ut_line", &self.ut_line)
-                    .field("ut_id", &self.ut_id)
-                    .field("ut_user", &self.ut_user)
-                    // FIXME(debug): .field("ut_host", &self.ut_host)
-                    .field("ut_exit", &self.ut_exit)
-                    .field("ut_session", &self.ut_session)
-                    .field("ut_tv", &self.ut_tv)
-                    .field("ut_addr_v6", &self.ut_addr_v6)
-                    .field("__glibc_reserved", &self.__glibc_reserved)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for utmpx {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ut_type.hash(state);
@@ -650,18 +559,6 @@
 
         impl Eq for __c_anonymous_ptrace_syscall_info_data {}
 
-        impl fmt::Debug for __c_anonymous_ptrace_syscall_info_data {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                unsafe {
-                    f.debug_struct("__c_anonymous_ptrace_syscall_info_data")
-                        .field("entry", &self.entry)
-                        .field("exit", &self.exit)
-                        .field("seccomp", &self.seccomp)
-                        .finish()
-                }
-            }
-        }
-
         impl hash::Hash for __c_anonymous_ptrace_syscall_info_data {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 unsafe {
@@ -751,7 +648,6 @@
 pub const RTLD_DI_TLS_DATA: c_int = 10;
 
 pub const SOCK_NONBLOCK: c_int = O_NONBLOCK;
-pub const PIDFD_NONBLOCK: c_uint = O_NONBLOCK as c_uint;
 
 pub const SOL_RXRPC: c_int = 272;
 pub const SOL_PPPOL2TP: c_int = 273;
@@ -943,15 +839,6 @@
 pub const PTRACE_SET_SYSCALL_USER_DISPATCH_CONFIG: crate::__u8 = 0x4210;
 pub const PTRACE_GET_SYSCALL_USER_DISPATCH_CONFIG: crate::__u8 = 0x4211;
 
-// linux/fs.h
-
-// Flags for preadv2/pwritev2
-pub const RWF_HIPRI: c_int = 0x00000001;
-pub const RWF_DSYNC: c_int = 0x00000002;
-pub const RWF_SYNC: c_int = 0x00000004;
-pub const RWF_NOWAIT: c_int = 0x00000008;
-pub const RWF_APPEND: c_int = 0x00000010;
-
 // linux/rtnetlink.h
 pub const TCA_PAD: c_ushort = 9;
 pub const TCA_DUMP_INVISIBLE: c_ushort = 10;
@@ -1159,33 +1046,6 @@
 pub const REG_ESIZE: c_int = 15;
 pub const REG_ERPAREN: c_int = 16;
 
-cfg_if! {
-    if #[cfg(any(
-        target_arch = "x86",
-        target_arch = "x86_64",
-        target_arch = "arm",
-        target_arch = "aarch64",
-        target_arch = "loongarch64",
-        target_arch = "riscv64",
-        target_arch = "s390x"
-    ))] {
-        pub const TUNSETCARRIER: Ioctl = 0x400454e2;
-        pub const TUNGETDEVNETNS: Ioctl = 0x54e3;
-    } else if #[cfg(any(
-        target_arch = "mips",
-        target_arch = "mips64",
-        target_arch = "powerpc",
-        target_arch = "powerpc64",
-        target_arch = "sparc",
-        target_arch = "sparc64"
-    ))] {
-        pub const TUNSETCARRIER: Ioctl = 0x800454e2;
-        pub const TUNGETDEVNETNS: Ioctl = 0x200054e3;
-    } else {
-        // Unknown target_arch
-    }
-}
-
 extern "C" {
     pub fn fgetspent_r(
         fp: *mut crate::FILE,
@@ -1214,12 +1074,14 @@
         compar: Option<unsafe extern "C" fn(*const c_void, *const c_void, *mut c_void) -> c_int>,
         arg: *mut c_void,
     );
+    #[cfg_attr(gnu_time_bits64, link_name = "__sendmmsg64")]
     pub fn sendmmsg(
         sockfd: c_int,
         msgvec: *mut crate::mmsghdr,
         vlen: c_uint,
         flags: c_int,
     ) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__recvmmsg64")]
     pub fn recvmmsg(
         sockfd: c_int,
         msgvec: *mut crate::mmsghdr,
@@ -1258,15 +1120,20 @@
     pub fn endutxent();
     pub fn getpt() -> c_int;
     pub fn mallopt(param: c_int, value: c_int) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__gettimeofday64")]
     pub fn gettimeofday(tp: *mut crate::timeval, tz: *mut crate::timezone) -> c_int;
     pub fn getentropy(buf: *mut c_void, buflen: size_t) -> c_int;
     pub fn getrandom(buf: *mut c_void, buflen: size_t, flags: c_uint) -> ssize_t;
     pub fn getauxval(type_: c_ulong) -> c_ulong;
 
+    #[cfg_attr(gnu_time_bits64, link_name = "___adjtimex64")]
     pub fn adjtimex(buf: *mut timex) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "___adjtimex64")]
     pub fn ntp_adjtime(buf: *mut timex) -> c_int;
-    #[link_name = "ntp_gettimex"]
+    #[cfg_attr(not(gnu_time_bits64), link_name = "ntp_gettimex")]
+    #[cfg_attr(gnu_time_bits64, link_name = "__ntp_gettime64")]
     pub fn ntp_gettime(buf: *mut ntptimeval) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__clock_adjtime64")]
     pub fn clock_adjtime(clk_id: crate::clockid_t, buf: *mut crate::timex) -> c_int;
 
     pub fn fanotify_mark(
@@ -1321,12 +1188,14 @@
 
     pub fn ctermid(s: *mut c_char) -> *mut c_char;
     pub fn backtrace(buf: *mut *mut c_void, sz: c_int) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__glob64_time64")]
     pub fn glob64(
         pattern: *const c_char,
         flags: c_int,
         errfunc: Option<extern "C" fn(epath: *const c_char, errno: c_int) -> c_int>,
         pglob: *mut glob64_t,
     ) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__globfree64_time64")]
     pub fn globfree64(pglob: *mut glob64_t);
     pub fn ptrace(request: c_uint, ...) -> c_long;
     pub fn pthread_attr_getaffinity_np(
@@ -1394,6 +1263,7 @@
     pub fn eaccess(pathname: *const c_char, mode: c_int) -> c_int;
 
     pub fn asctime_r(tm: *const crate::tm, buf: *mut c_char) -> *mut c_char;
+    #[cfg_attr(gnu_time_bits64, link_name = "__ctime64_r")]
     pub fn ctime_r(timep: *const time_t, buf: *mut c_char) -> *mut c_char;
 
     pub fn dirname(path: *mut c_char) -> *mut c_char;
@@ -1458,6 +1328,7 @@
 
     pub fn mq_notify(mqdes: crate::mqd_t, sevp: *const crate::sigevent) -> c_int;
 
+    #[cfg_attr(gnu_time_bits64, link_name = "__epoll_pwait2_time64")]
     pub fn epoll_pwait2(
         epfd: c_int,
         events: *mut crate::epoll_event,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/mod.rs
index 5be701be..9439ce2 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/mod.rs
@@ -3,6 +3,7 @@
 use core::mem::size_of;
 
 use crate::prelude::*;
+use crate::{sock_filter, _IO, _IOR, _IOW, _IOWR};
 
 pub type useconds_t = u32;
 pub type dev_t = u64;
@@ -93,6 +94,16 @@
     }
 }
 
+c_enum! {
+    pid_type {
+        PIDTYPE_PID,
+        PIDTYPE_TGID,
+        PIDTYPE_PGID,
+        PIDTYPE_SID,
+        PIDTYPE_MAX,
+    }
+}
+
 s! {
     pub struct glob_t {
         pub gl_pathc: size_t,
@@ -748,19 +759,6 @@
         pub addr_mask: u8,
     }
 
-    // linux/filter.h
-    pub struct sock_filter {
-        pub code: __u16,
-        pub jt: __u8,
-        pub jf: __u8,
-        pub k: __u32,
-    }
-
-    pub struct sock_fprog {
-        pub len: c_ushort,
-        pub filter: *mut sock_filter,
-    }
-
     // linux/seccomp.h
     pub struct seccomp_data {
         pub nr: c_int,
@@ -815,13 +813,6 @@
         pub nla_type: u16,
     }
 
-    pub struct file_clone_range {
-        pub src_fd: crate::__s64,
-        pub src_offset: crate::__u64,
-        pub src_length: crate::__u64,
-        pub dest_offset: crate::__u64,
-    }
-
     pub struct __c_anonymous_ifru_map {
         pub mem_start: c_ulong,
         pub mem_end: c_ulong,
@@ -1366,6 +1357,32 @@
         pub userns_fd: crate::__u64,
     }
 
+    // linux/nsfs.h
+    pub struct mnt_ns_info {
+        pub size: crate::__u32,
+        pub nr_mounts: crate::__u32,
+        pub mnt_ns_id: crate::__u64,
+    }
+
+    // linux/pidfd.h
+
+    pub struct pidfd_info {
+        mask: crate::__u64,
+        cgroupid: crate::__u64,
+        pid: crate::__u32,
+        tgid: crate::__u32,
+        ppid: crate::__u32,
+        ruid: crate::__u32,
+        rgid: crate::__u32,
+        euid: crate::__u32,
+        egid: crate::__u32,
+        suid: crate::__u32,
+        sgid: crate::__u32,
+        fsuid: crate::__u32,
+        fsgid: crate::__u32,
+        exit_code: crate::__s32,
+    }
+
     // linux/uio.h
 
     pub struct dmabuf_cmsg {
@@ -1863,15 +1880,6 @@
             }
         }
         impl Eq for sockaddr_nl {}
-        impl fmt::Debug for sockaddr_nl {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_nl")
-                    .field("nl_family", &self.nl_family)
-                    .field("nl_pid", &self.nl_pid)
-                    .field("nl_groups", &self.nl_groups)
-                    .finish()
-            }
-        }
         impl hash::Hash for sockaddr_nl {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.nl_family.hash(state);
@@ -1896,18 +1904,6 @@
 
         impl Eq for dirent {}
 
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_ino", &self.d_ino)
-                    .field("d_off", &self.d_off)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_type", &self.d_type)
-                    // FIXME(debug): .field("d_name", &self.d_name)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_ino.hash(state);
@@ -1934,18 +1930,6 @@
 
         impl Eq for dirent64 {}
 
-        impl fmt::Debug for dirent64 {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent64")
-                    .field("d_ino", &self.d_ino)
-                    .field("d_off", &self.d_off)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_type", &self.d_type)
-                    // FIXME(debug): .field("d_name", &self.d_name)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for dirent64 {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_ino.hash(state);
@@ -1964,14 +1948,6 @@
 
         impl Eq for pthread_cond_t {}
 
-        impl fmt::Debug for pthread_cond_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_cond_t")
-                    // FIXME(debug): .field("size", &self.size)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for pthread_cond_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.size.hash(state);
@@ -1986,14 +1962,6 @@
 
         impl Eq for pthread_mutex_t {}
 
-        impl fmt::Debug for pthread_mutex_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_mutex_t")
-                    // FIXME(debug): .field("size", &self.size)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for pthread_mutex_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.size.hash(state);
@@ -2008,14 +1976,6 @@
 
         impl Eq for pthread_rwlock_t {}
 
-        impl fmt::Debug for pthread_rwlock_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_rwlock_t")
-                    // FIXME(debug): .field("size", &self.size)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for pthread_rwlock_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.size.hash(state);
@@ -2030,14 +1990,6 @@
 
         impl Eq for pthread_barrier_t {}
 
-        impl fmt::Debug for pthread_barrier_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_barrier_t")
-                    .field("size", &self.size)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for pthread_barrier_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.size.hash(state);
@@ -2064,18 +2016,6 @@
 
         impl Eq for sockaddr_alg {}
 
-        impl fmt::Debug for sockaddr_alg {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_alg")
-                    .field("salg_family", &self.salg_family)
-                    .field("salg_type", &self.salg_type)
-                    .field("salg_feat", &self.salg_feat)
-                    .field("salg_mask", &self.salg_mask)
-                    .field("salg_name", &&self.salg_name[..])
-                    .finish()
-            }
-        }
-
         impl hash::Hash for sockaddr_alg {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.salg_family.hash(state);
@@ -2095,16 +2035,6 @@
         }
         impl Eq for uinput_setup {}
 
-        impl fmt::Debug for uinput_setup {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("uinput_setup")
-                    .field("id", &self.id)
-                    .field("name", &&self.name[..])
-                    .field("ff_effects_max", &self.ff_effects_max)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for uinput_setup {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.id.hash(state);
@@ -2126,20 +2056,6 @@
         }
         impl Eq for uinput_user_dev {}
 
-        impl fmt::Debug for uinput_user_dev {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("uinput_setup")
-                    .field("name", &&self.name[..])
-                    .field("id", &self.id)
-                    .field("ff_effects_max", &self.ff_effects_max)
-                    .field("absmax", &&self.absmax[..])
-                    .field("absmin", &&self.absmin[..])
-                    .field("absfuzz", &&self.absfuzz[..])
-                    .field("absflat", &&self.absflat[..])
-                    .finish()
-            }
-        }
-
         impl hash::Hash for uinput_user_dev {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.name.hash(state);
@@ -2170,15 +2086,6 @@
         impl Eq for af_alg_iv {}
 
         #[allow(deprecated)]
-        impl fmt::Debug for af_alg_iv {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("af_alg_iv")
-                    .field("ivlen", &self.ivlen)
-                    .finish()
-            }
-        }
-
-        #[allow(deprecated)]
         impl hash::Hash for af_alg_iv {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.as_slice().hash(state);
@@ -2194,16 +2101,6 @@
             }
         }
         impl Eq for mq_attr {}
-        impl fmt::Debug for mq_attr {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mq_attr")
-                    .field("mq_flags", &self.mq_flags)
-                    .field("mq_maxmsg", &self.mq_maxmsg)
-                    .field("mq_msgsize", &self.mq_msgsize)
-                    .field("mq_curmsgs", &self.mq_curmsgs)
-                    .finish()
-            }
-        }
         impl hash::Hash for mq_attr {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.mq_flags.hash(state);
@@ -2212,31 +2109,6 @@
                 self.mq_curmsgs.hash(state);
             }
         }
-        impl fmt::Debug for ifreq {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ifreq")
-                    .field("ifr_name", &self.ifr_name)
-                    .field("ifr_ifru", &self.ifr_ifru)
-                    .finish()
-            }
-        }
-        impl fmt::Debug for ifconf {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ifconf")
-                    .field("ifc_len", &self.ifc_len)
-                    .field("ifc_ifcu", &self.ifc_ifcu)
-                    .finish()
-            }
-        }
-        impl fmt::Debug for hwtstamp_config {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("hwtstamp_config")
-                    .field("flags", &self.flags)
-                    .field("tx_type", &self.tx_type)
-                    .field("rx_filter", &self.rx_filter)
-                    .finish()
-            }
-        }
         impl PartialEq for hwtstamp_config {
             fn eq(&self, other: &hwtstamp_config) -> bool {
                 self.flags == other.flags
@@ -2253,20 +2125,6 @@
             }
         }
 
-        impl fmt::Debug for sched_attr {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sched_attr")
-                    .field("size", &self.size)
-                    .field("sched_policy", &self.sched_policy)
-                    .field("sched_flags", &self.sched_flags)
-                    .field("sched_nice", &self.sched_nice)
-                    .field("sched_priority", &self.sched_priority)
-                    .field("sched_runtime", &self.sched_runtime)
-                    .field("sched_deadline", &self.sched_deadline)
-                    .field("sched_period", &self.sched_period)
-                    .finish()
-            }
-        }
         impl PartialEq for sched_attr {
             fn eq(&self, other: &sched_attr) -> bool {
                 self.size == other.size
@@ -2292,25 +2150,6 @@
                 self.sched_period.hash(state);
             }
         }
-
-        impl fmt::Debug for iw_event {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("iw_event")
-                    .field("len", &self.len)
-                    .field("cmd", &self.cmd)
-                    .field("u", &self.u)
-                    .finish()
-            }
-        }
-
-        impl fmt::Debug for iwreq {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("iwreq")
-                    .field("ifr_ifrn", &self.ifr_ifrn)
-                    .field("u", &self.u)
-                    .finish()
-            }
-        }
     }
 }
 
@@ -2861,6 +2700,18 @@
 pub const IFA_F_MCAUTOJOIN: u32 = 0x400;
 pub const IFA_F_STABLE_PRIVACY: u32 = 0x800;
 
+// linux/fs.h
+
+// Flags for preadv2/pwritev2
+pub const RWF_HIPRI: c_int = 0x00000001;
+pub const RWF_DSYNC: c_int = 0x00000002;
+pub const RWF_SYNC: c_int = 0x00000004;
+pub const RWF_NOWAIT: c_int = 0x00000008;
+pub const RWF_APPEND: c_int = 0x00000010;
+pub const RWF_NOAPPEND: c_int = 0x00000020;
+pub const RWF_ATOMIC: c_int = 0x00000040;
+pub const RWF_DONTCACHE: c_int = 0x00000080;
+
 // linux/if_link.h
 pub const IFLA_UNSPEC: c_ushort = 0;
 pub const IFLA_ADDRESS: c_ushort = 1;
@@ -2933,46 +2784,6 @@
 pub const IFLA_INFO_SLAVE_KIND: c_ushort = 4;
 pub const IFLA_INFO_SLAVE_DATA: c_ushort = 5;
 
-// linux/if_tun.h
-/* TUNSETIFF ifr flags */
-pub const IFF_TUN: c_int = 0x0001;
-pub const IFF_TAP: c_int = 0x0002;
-pub const IFF_NAPI: c_int = 0x0010;
-pub const IFF_NAPI_FRAGS: c_int = 0x0020;
-// Used in TUNSETIFF to bring up tun/tap without carrier
-pub const IFF_NO_CARRIER: c_int = 0x0040;
-pub const IFF_NO_PI: c_int = 0x1000;
-// Read queue size
-pub const TUN_READQ_SIZE: c_short = 500;
-// TUN device type flags: deprecated. Use IFF_TUN/IFF_TAP instead.
-pub const TUN_TUN_DEV: c_short = crate::IFF_TUN as c_short;
-pub const TUN_TAP_DEV: c_short = crate::IFF_TAP as c_short;
-pub const TUN_TYPE_MASK: c_short = 0x000f;
-// This flag has no real effect
-pub const IFF_ONE_QUEUE: c_int = 0x2000;
-pub const IFF_VNET_HDR: c_int = 0x4000;
-pub const IFF_TUN_EXCL: c_int = 0x8000;
-pub const IFF_MULTI_QUEUE: c_int = 0x0100;
-pub const IFF_ATTACH_QUEUE: c_int = 0x0200;
-pub const IFF_DETACH_QUEUE: c_int = 0x0400;
-// read-only flag
-pub const IFF_PERSIST: c_int = 0x0800;
-pub const IFF_NOFILTER: c_int = 0x1000;
-// Socket options
-pub const TUN_TX_TIMESTAMP: c_int = 1;
-// Features for GSO (TUNSETOFFLOAD)
-pub const TUN_F_CSUM: c_uint = 0x01;
-pub const TUN_F_TSO4: c_uint = 0x02;
-pub const TUN_F_TSO6: c_uint = 0x04;
-pub const TUN_F_TSO_ECN: c_uint = 0x08;
-pub const TUN_F_UFO: c_uint = 0x10;
-pub const TUN_F_USO4: c_uint = 0x20;
-pub const TUN_F_USO6: c_uint = 0x40;
-// Protocol info prepended to the packets (when IFF_NO_PI is not set)
-pub const TUN_PKT_STRIP: c_int = 0x0001;
-// Accept all multicast packets
-pub const TUN_FLT_ALLMULTI: c_int = 0x0001;
-
 // Since Linux 3.1
 pub const SEEK_DATA: c_int = 3;
 pub const SEEK_HOLE: c_int = 4;
@@ -3182,6 +2993,56 @@
 pub const MREMAP_FIXED: c_int = 2;
 pub const MREMAP_DONTUNMAP: c_int = 4;
 
+// linux/nsfs.h
+const NSIO: c_uint = 0xb7;
+
+pub const NS_GET_USERNS: Ioctl = _IO(NSIO, 0x1);
+pub const NS_GET_PARENT: Ioctl = _IO(NSIO, 0x2);
+pub const NS_GET_NSTYPE: Ioctl = _IO(NSIO, 0x3);
+pub const NS_GET_OWNER_UID: Ioctl = _IO(NSIO, 0x4);
+
+pub const NS_GET_MNTNS_ID: Ioctl = _IOR::<__u64>(NSIO, 0x5);
+
+pub const NS_GET_PID_FROM_PIDNS: Ioctl = _IOR::<c_int>(NSIO, 0x6);
+pub const NS_GET_TGID_FROM_PIDNS: Ioctl = _IOR::<c_int>(NSIO, 0x7);
+pub const NS_GET_PID_IN_PIDNS: Ioctl = _IOR::<c_int>(NSIO, 0x8);
+pub const NS_GET_TGID_IN_PIDNS: Ioctl = _IOR::<c_int>(NSIO, 0x9);
+
+pub const MNT_NS_INFO_SIZE_VER0: Ioctl = 16;
+
+pub const NS_MNT_GET_INFO: Ioctl = _IOR::<mnt_ns_info>(NSIO, 10);
+pub const NS_MNT_GET_NEXT: Ioctl = _IOR::<mnt_ns_info>(NSIO, 11);
+pub const NS_MNT_GET_PREV: Ioctl = _IOR::<mnt_ns_info>(NSIO, 12);
+
+// linux/pidfd.h
+pub const PIDFD_NONBLOCK: c_uint = O_NONBLOCK as c_uint;
+pub const PIDFD_THREAD: c_uint = O_EXCL as c_uint;
+
+pub const PIDFD_SIGNAL_THREAD: c_uint = 1 << 0;
+pub const PIDFD_SIGNAL_THREAD_GROUP: c_uint = 1 << 1;
+pub const PIDFD_SIGNAL_PROCESS_GROUP: c_uint = 1 << 2;
+
+pub const PIDFD_INFO_PID: c_uint = 1 << 0;
+pub const PIDFD_INFO_CREDS: c_uint = 1 << 1;
+pub const PIDFD_INFO_CGROUPID: c_uint = 1 << 2;
+pub const PIDFD_INFO_EXIT: c_uint = 1 << 3;
+
+pub const PIDFD_INFO_SIZE_VER0: c_uint = 64;
+
+const PIDFS_IOCTL_MAGIC: c_uint = 0xFF;
+pub const PIDFD_GET_CGROUP_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 1);
+pub const PIDFD_GET_IPC_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 2);
+pub const PIDFD_GET_MNT_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 3);
+pub const PIDFD_GET_NET_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 4);
+pub const PIDFD_GET_PID_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 5);
+pub const PIDFD_GET_PID_FOR_CHILDREN_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 6);
+pub const PIDFD_GET_TIME_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 7);
+pub const PIDFD_GET_TIME_FOR_CHILDREN_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 8);
+pub const PIDFD_GET_USER_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 9);
+pub const PIDFD_GET_UTS_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 10);
+pub const PIDFD_GET_INFO: Ioctl = _IOWR::<pidfd_info>(PIDFS_IOCTL_MAGIC, 11);
+
+// linux/prctl.h
 pub const PR_SET_PDEATHSIG: c_int = 1;
 pub const PR_GET_PDEATHSIG: c_int = 2;
 
@@ -3284,6 +3145,11 @@
 pub const PR_SET_NO_NEW_PRIVS: c_int = 38;
 pub const PR_GET_NO_NEW_PRIVS: c_int = 39;
 
+pub const PR_SET_MDWE: c_int = 65;
+pub const PR_GET_MDWE: c_int = 66;
+pub const PR_MDWE_REFUSE_EXEC_GAIN: c_uint = 1 << 0;
+pub const PR_MDWE_NO_INHERIT: c_uint = 1 << 1;
+
 pub const PR_GET_TID_ADDRESS: c_int = 40;
 
 pub const PR_SET_THP_DISABLE: c_int = 41;
@@ -3830,6 +3696,7 @@
 pub const PACKET_TIMESTAMP: c_int = 17;
 pub const PACKET_FANOUT: c_int = 18;
 pub const PACKET_QDISC_BYPASS: c_int = 20;
+pub const PACKET_IGNORE_OUTGOING: c_int = 23;
 
 pub const PACKET_FANOUT_HASH: c_uint = 0;
 pub const PACKET_FANOUT_LB: c_uint = 1;
@@ -4689,6 +4556,51 @@
 pub const RTNLGRP_TUNNEL: c_uint = 0x23;
 pub const RTNLGRP_STATS: c_uint = 0x24;
 
+// linux/cn_proc.h
+c_enum! {
+    proc_cn_mcast_op {
+        PROC_CN_MCAST_LISTEN = 1,
+        PROC_CN_MCAST_IGNORE = 2,
+    }
+}
+
+c_enum! {
+    proc_cn_event {
+        PROC_EVENT_NONE = 0x00000000,
+        PROC_EVENT_FORK = 0x00000001,
+        PROC_EVENT_EXEC = 0x00000002,
+        PROC_EVENT_UID = 0x00000004,
+        PROC_EVENT_GID = 0x00000040,
+        PROC_EVENT_SID = 0x00000080,
+        PROC_EVENT_PTRACE = 0x00000100,
+        PROC_EVENT_COMM = 0x00000200,
+        PROC_EVENT_NONZERO_EXIT = 0x20000000,
+        PROC_EVENT_COREDUMP = 0x40000000,
+        PROC_EVENT_EXIT = 0x80000000,
+    }
+}
+
+// linux/connector.h
+pub const CN_IDX_PROC: c_uint = 0x1;
+pub const CN_VAL_PROC: c_uint = 0x1;
+pub const CN_IDX_CIFS: c_uint = 0x2;
+pub const CN_VAL_CIFS: c_uint = 0x1;
+pub const CN_W1_IDX: c_uint = 0x3;
+pub const CN_W1_VAL: c_uint = 0x1;
+pub const CN_IDX_V86D: c_uint = 0x4;
+pub const CN_VAL_V86D_UVESAFB: c_uint = 0x1;
+pub const CN_IDX_BB: c_uint = 0x5;
+pub const CN_DST_IDX: c_uint = 0x6;
+pub const CN_DST_VAL: c_uint = 0x1;
+pub const CN_IDX_DM: c_uint = 0x7;
+pub const CN_VAL_DM_USERSPACE_LOG: c_uint = 0x1;
+pub const CN_IDX_DRBD: c_uint = 0x8;
+pub const CN_VAL_DRBD: c_uint = 0x1;
+pub const CN_KVP_IDX: c_uint = 0x9;
+pub const CN_KVP_VAL: c_uint = 0x1;
+pub const CN_VSS_IDX: c_uint = 0xA;
+pub const CN_VSS_VAL: c_uint = 0x1;
+
 // linux/module.h
 pub const MODULE_INIT_IGNORE_MODVERSIONS: c_uint = 0x0001;
 pub const MODULE_INIT_IGNORE_VERMAGIC: c_uint = 0x0002;
@@ -4742,25 +4654,25 @@
 
 const PTP_CLK_MAGIC: u32 = b'=' as u32;
 
-pub const PTP_CLOCK_GETCAPS: c_uint = _IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 1);
-pub const PTP_EXTTS_REQUEST: c_uint = _IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 2);
-pub const PTP_PEROUT_REQUEST: c_uint = _IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 3);
-pub const PTP_ENABLE_PPS: c_uint = _IOW::<c_int>(PTP_CLK_MAGIC, 4);
-pub const PTP_SYS_OFFSET: c_uint = _IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 5);
-pub const PTP_PIN_GETFUNC: c_uint = _IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 6);
-pub const PTP_PIN_SETFUNC: c_uint = _IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 7);
-pub const PTP_SYS_OFFSET_PRECISE: c_uint = _IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 8);
-pub const PTP_SYS_OFFSET_EXTENDED: c_uint = _IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 9);
+pub const PTP_CLOCK_GETCAPS: Ioctl = _IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 1);
+pub const PTP_EXTTS_REQUEST: Ioctl = _IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 2);
+pub const PTP_PEROUT_REQUEST: Ioctl = _IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 3);
+pub const PTP_ENABLE_PPS: Ioctl = _IOW::<c_int>(PTP_CLK_MAGIC, 4);
+pub const PTP_SYS_OFFSET: Ioctl = _IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 5);
+pub const PTP_PIN_GETFUNC: Ioctl = _IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 6);
+pub const PTP_PIN_SETFUNC: Ioctl = _IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 7);
+pub const PTP_SYS_OFFSET_PRECISE: Ioctl = _IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 8);
+pub const PTP_SYS_OFFSET_EXTENDED: Ioctl = _IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 9);
 
-pub const PTP_CLOCK_GETCAPS2: c_uint = _IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 10);
-pub const PTP_EXTTS_REQUEST2: c_uint = _IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 11);
-pub const PTP_PEROUT_REQUEST2: c_uint = _IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 12);
-pub const PTP_ENABLE_PPS2: c_uint = _IOW::<c_int>(PTP_CLK_MAGIC, 13);
-pub const PTP_SYS_OFFSET2: c_uint = _IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 14);
-pub const PTP_PIN_GETFUNC2: c_uint = _IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 15);
-pub const PTP_PIN_SETFUNC2: c_uint = _IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 16);
-pub const PTP_SYS_OFFSET_PRECISE2: c_uint = _IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 17);
-pub const PTP_SYS_OFFSET_EXTENDED2: c_uint = _IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 18);
+pub const PTP_CLOCK_GETCAPS2: Ioctl = _IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 10);
+pub const PTP_EXTTS_REQUEST2: Ioctl = _IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 11);
+pub const PTP_PEROUT_REQUEST2: Ioctl = _IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 12);
+pub const PTP_ENABLE_PPS2: Ioctl = _IOW::<c_int>(PTP_CLK_MAGIC, 13);
+pub const PTP_SYS_OFFSET2: Ioctl = _IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 14);
+pub const PTP_PIN_GETFUNC2: Ioctl = _IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 15);
+pub const PTP_PIN_SETFUNC2: Ioctl = _IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 16);
+pub const PTP_SYS_OFFSET_PRECISE2: Ioctl = _IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 17);
+pub const PTP_SYS_OFFSET_EXTENDED2: Ioctl = _IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 18);
 
 // enum ptp_pin_function
 pub const PTP_PF_NONE: c_uint = 0;
@@ -5989,26 +5901,6 @@
 pub const SI_DETHREAD: c_int = -7;
 pub const TRAP_PERF: c_int = 6;
 
-/// Build an ioctl number for an argumentless ioctl.
-pub const fn _IO(ty: u32, nr: u32) -> u32 {
-    super::_IOC(super::_IOC_NONE, ty, nr, 0)
-}
-
-/// Build an ioctl number for an read-only ioctl.
-pub const fn _IOR<T>(ty: u32, nr: u32) -> u32 {
-    super::_IOC(super::_IOC_READ, ty, nr, size_of::<T>())
-}
-
-/// Build an ioctl number for an write-only ioctl.
-pub const fn _IOW<T>(ty: u32, nr: u32) -> u32 {
-    super::_IOC(super::_IOC_WRITE, ty, nr, size_of::<T>())
-}
-
-/// Build an ioctl number for a read-write ioctl.
-pub const fn _IOWR<T>(ty: u32, nr: u32) -> u32 {
-    super::_IOC(super::_IOC_READ | super::_IOC_WRITE, ty, nr, size_of::<T>())
-}
-
 f! {
     pub fn NLA_ALIGN(len: c_int) -> c_int {
         return ((len) + NLA_ALIGNTO - 1) & !(NLA_ALIGNTO - 1);
@@ -6016,16 +5908,16 @@
 
     pub fn CMSG_NXTHDR(mhdr: *const msghdr, cmsg: *const cmsghdr) -> *mut cmsghdr {
         if ((*cmsg).cmsg_len as usize) < size_of::<cmsghdr>() {
-            return 0 as *mut cmsghdr;
-        };
+            return core::ptr::null_mut::<cmsghdr>();
+        }
         let next = (cmsg as usize + super::CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr;
         let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize;
         if (next.wrapping_offset(1)) as usize > max
             || next as usize + super::CMSG_ALIGN((*next).cmsg_len as usize) > max
         {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         } else {
-            next as *mut cmsghdr
+            next
         }
     }
 
@@ -6036,7 +5928,7 @@
     }
 
     pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () {
-        for slot in cpuset.bits.iter_mut() {
+        for slot in &mut cpuset.bits {
             *slot = 0;
         }
     }
@@ -6045,14 +5937,12 @@
         let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc
         let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits);
         cpuset.bits[idx] |= 1 << offset;
-        ()
     }
 
     pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () {
         let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc
         let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits);
         cpuset.bits[idx] &= !(1 << offset);
-        ()
     }
 
     pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool {
@@ -6064,7 +5954,7 @@
     pub fn CPU_COUNT_S(size: usize, cpuset: &cpu_set_t) -> c_int {
         let mut s: u32 = 0;
         let size_of_mask = mem::size_of_val(&cpuset.bits[0]);
-        for i in cpuset.bits[..(size / size_of_mask)].iter() {
+        for i in &cpuset.bits[..(size / size_of_mask)] {
             s += i.count_ones();
         }
         s as c_int
@@ -6079,7 +5969,7 @@
     }
 
     pub fn SCTP_PR_INDEX(policy: c_int) -> c_int {
-        policy >> 4 - 1
+        policy >> (4 - 1)
     }
 
     pub fn SCTP_PR_POLICY(policy: c_int) -> c_int {
@@ -6089,7 +5979,6 @@
     pub fn SCTP_PR_SET_POLICY(flags: &mut c_int, policy: c_int) -> () {
         *flags &= !SCTP_PR_SCTP_MASK;
         *flags |= policy;
-        ()
     }
 
     pub fn IPTOS_TOS(tos: u8) -> u8 {
@@ -6150,20 +6039,15 @@
 
     pub fn BPF_STMT(code: __u16, k: __u32) -> sock_filter {
         sock_filter {
-            code: code,
+            code,
             jt: 0,
             jf: 0,
-            k: k,
+            k,
         }
     }
 
     pub fn BPF_JUMP(code: __u16, k: __u32, jt: __u8, jf: __u8) -> sock_filter {
-        sock_filter {
-            code: code,
-            jt: jt,
-            jf: jf,
-            k: k,
-        }
+        sock_filter { code, jt, jf, k }
     }
 
     pub fn ELF32_R_SYM(val: Elf32_Word) -> Elf32_Word {
@@ -6175,7 +6059,7 @@
     }
 
     pub fn ELF32_R_INFO(sym: Elf32_Word, t: Elf32_Word) -> Elf32_Word {
-        sym << 8 + t & 0xff
+        sym << (8 + t) & 0xff
     }
 
     pub fn ELF64_R_SYM(val: Elf64_Xword) -> Elf64_Xword {
@@ -6187,7 +6071,7 @@
     }
 
     pub fn ELF64_R_INFO(sym: Elf64_Xword, t: Elf64_Xword) -> Elf64_Xword {
-        sym << 32 + t
+        sym << (32 + t)
     }
 }
 
@@ -6254,6 +6138,7 @@
             pub fn aio_error(aiocbp: *const aiocb) -> c_int;
             #[cfg_attr(gnu_file_offset_bits64, link_name = "aio_return64")]
             pub fn aio_return(aiocbp: *mut aiocb) -> ssize_t;
+            #[cfg_attr(gnu_time_bits64, link_name = "__aio_suspend_time64")]
             pub fn aio_suspend(
                 aiocb_list: *const *const aiocb,
                 nitems: c_int,
@@ -6315,6 +6200,7 @@
                 riovcnt: c_ulong,
                 flags: c_ulong,
             ) -> isize;
+            #[cfg_attr(gnu_time_bits64, link_name = "__futimes64")]
             pub fn futimes(fd: c_int, times: *const crate::timeval) -> c_int;
         }
     }
@@ -6344,6 +6230,7 @@
                 msg_len: size_t,
                 msg_prio: *mut c_uint,
             ) -> ssize_t;
+            #[cfg_attr(gnu_time_bits64, link_name = "__mq_timedreceive_time64")]
             pub fn mq_timedreceive(
                 mqd: crate::mqd_t,
                 msg_ptr: *mut c_char,
@@ -6357,6 +6244,7 @@
                 msg_len: size_t,
                 msg_prio: c_uint,
             ) -> c_int;
+            #[cfg_attr(gnu_time_bits64, link_name = "__mq_timedsend_time64")]
             pub fn mq_timedsend(
                 mqd: crate::mqd_t,
                 msg_ptr: *const c_char,
@@ -6407,6 +6295,7 @@
     pub fn seed48(xseed: *mut c_ushort) -> *mut c_ushort;
     pub fn lcong48(p: *mut c_ushort);
 
+    #[cfg_attr(gnu_time_bits64, link_name = "__lutimes64")]
     pub fn lutimes(file: *const c_char, times: *const crate::timeval) -> c_int;
 
     pub fn setpwent();
@@ -6428,11 +6317,14 @@
     pub fn shmget(key: crate::key_t, size: size_t, shmflg: c_int) -> c_int;
     pub fn shmat(shmid: c_int, shmaddr: *const c_void, shmflg: c_int) -> *mut c_void;
     pub fn shmdt(shmaddr: *const c_void) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__shmctl64")]
     pub fn shmctl(shmid: c_int, cmd: c_int, buf: *mut crate::shmid_ds) -> c_int;
     pub fn ftok(pathname: *const c_char, proj_id: c_int) -> crate::key_t;
     pub fn semget(key: crate::key_t, nsems: c_int, semflag: c_int) -> c_int;
     pub fn semop(semid: c_int, sops: *mut crate::sembuf, nsops: size_t) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__semctl64")]
     pub fn semctl(semid: c_int, semnum: c_int, cmd: c_int, ...) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__msgctl64")]
     pub fn msgctl(msqid: c_int, cmd: c_int, buf: *mut msqid_ds) -> c_int;
     pub fn msgget(key: crate::key_t, msgflg: c_int) -> c_int;
     pub fn msgrcv(
@@ -6499,7 +6391,9 @@
     pub fn fremovexattr(filedes: c_int, name: *const c_char) -> c_int;
     pub fn signalfd(fd: c_int, mask: *const crate::sigset_t, flags: c_int) -> c_int;
     pub fn timerfd_create(clockid: crate::clockid_t, flags: c_int) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__timerfd_gettime64")]
     pub fn timerfd_gettime(fd: c_int, curr_value: *mut itimerspec) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__timerfd_settime64")]
     pub fn timerfd_settime(
         fd: c_int,
         flags: c_int,
@@ -6515,6 +6409,7 @@
         sigmask: *const crate::sigset_t,
     ) -> c_int;
     pub fn dup3(oldfd: c_int, newfd: c_int, flags: c_int) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__sigtimedwait64")]
     pub fn sigtimedwait(
         set: *const sigset_t,
         info: *mut siginfo_t,
@@ -6544,7 +6439,7 @@
     pub fn setfsuid(uid: crate::uid_t) -> c_int;
 
     // Not available now on Android
-    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int;
+    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int;
     pub fn if_nameindex() -> *mut if_nameindex;
     pub fn if_freenameindex(ptr: *mut if_nameindex);
     pub fn sync_file_range(fd: c_int, offset: off64_t, nbytes: off64_t, flags: c_uint) -> c_int;
@@ -6556,14 +6451,22 @@
         ...
     ) -> *mut c_void;
 
-    #[cfg_attr(gnu_file_offset_bits64, link_name = "glob64")]
+    #[cfg_attr(gnu_time_bits64, link_name = "__glob64_time64")]
+    #[cfg_attr(
+        all(not(gnu_time_bits64), gnu_file_offset_bits64),
+        link_name = "glob64"
+    )]
     pub fn glob(
         pattern: *const c_char,
         flags: c_int,
         errfunc: Option<extern "C" fn(epath: *const c_char, errno: c_int) -> c_int>,
         pglob: *mut crate::glob_t,
     ) -> c_int;
-    #[cfg_attr(gnu_file_offset_bits64, link_name = "globfree64")]
+    #[cfg_attr(gnu_time_bits64, link_name = "__globfree64_time64")]
+    #[cfg_attr(
+        all(not(gnu_time_bits64), gnu_file_offset_bits64),
+        link_name = "globfree64"
+    )]
     pub fn globfree(pglob: *mut crate::glob_t);
 
     pub fn posix_madvise(addr: *mut c_void, len: size_t, advice: c_int) -> c_int;
@@ -6626,6 +6529,7 @@
     pub fn umount(target: *const c_char) -> c_int;
     pub fn sched_get_priority_max(policy: c_int) -> c_int;
     pub fn tee(fd_in: c_int, fd_out: c_int, len: size_t, flags: c_uint) -> ssize_t;
+    #[cfg_attr(gnu_time_bits64, link_name = "__settimeofday64")]
     pub fn settimeofday(tv: *const crate::timeval, tz: *const crate::timezone) -> c_int;
     pub fn splice(
         fd_in: c_int,
@@ -6639,7 +6543,9 @@
     pub fn eventfd_read(fd: c_int, value: *mut eventfd_t) -> c_int;
     pub fn eventfd_write(fd: c_int, value: eventfd_t) -> c_int;
 
+    #[cfg_attr(gnu_time_bits64, link_name = "__sched_rr_get_interval64")]
     pub fn sched_rr_get_interval(pid: crate::pid_t, tp: *mut crate::timespec) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__sem_timedwait64")]
     pub fn sem_timedwait(sem: *mut sem_t, abstime: *const crate::timespec) -> c_int;
     pub fn sem_getvalue(sem: *mut sem_t, sval: *mut c_int) -> c_int;
     pub fn sched_setparam(pid: crate::pid_t, param: *const crate::sched_param) -> c_int;
@@ -6655,8 +6561,10 @@
         data: *const c_void,
     ) -> c_int;
     pub fn personality(persona: c_ulong) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__prctl_time64")]
     pub fn prctl(option: c_int, ...) -> c_int;
     pub fn sched_getparam(pid: crate::pid_t, param: *mut crate::sched_param) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__ppoll64")]
     pub fn ppoll(
         fds: *mut crate::pollfd,
         nfds: nfds_t,
@@ -6669,6 +6577,7 @@
     ) -> c_int;
     pub fn pthread_mutexattr_setprotocol(attr: *mut pthread_mutexattr_t, protocol: c_int) -> c_int;
 
+    #[cfg_attr(gnu_time_bits64, link_name = "__pthread_mutex_timedlock64")]
     pub fn pthread_mutex_timedlock(
         lock: *mut pthread_mutex_t,
         abstime: *const crate::timespec,
@@ -6703,6 +6612,7 @@
         ...
     ) -> c_int;
     pub fn sched_getscheduler(pid: crate::pid_t) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__clock_nanosleep_time64")]
     pub fn clock_nanosleep(
         clk_id: crate::clockid_t,
         flags: c_int,
@@ -6899,7 +6809,7 @@
         fd: c_int,
         path: *const c_char,
         oflag: c_int,
-        mode: crate::mode_t,
+        mode: mode_t,
     ) -> c_int;
     pub fn posix_spawn_file_actions_addclose(
         actions: *mut posix_spawn_file_actions_t,
@@ -6960,7 +6870,9 @@
     ) -> c_int;
     pub fn timer_delete(timerid: crate::timer_t) -> c_int;
     pub fn timer_getoverrun(timerid: crate::timer_t) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__timer_gettime64")]
     pub fn timer_gettime(timerid: crate::timer_t, curr_value: *mut crate::itimerspec) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__timer_settime64")]
     pub fn timer_settime(
         timerid: crate::timer_t,
         flags: c_int,
@@ -7001,8 +6913,6 @@
     ) -> ssize_t;
 
     pub fn klogctl(syslog_type: c_int, bufp: *mut c_char, len: c_int) -> c_int;
-
-    pub fn ioctl(fd: c_int, request: Ioctl, ...) -> c_int;
 }
 
 // LFS64 extensions
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/arm/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/arm/mod.rs
index 292585fc..b9be033a 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/arm/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/arm/mod.rs
@@ -55,6 +55,14 @@
     }
 
     pub struct ipc_perm {
+        #[cfg(musl_v1_2_3)]
+        pub __key: crate::key_t,
+        #[cfg(not(musl_v1_2_3))]
+        #[deprecated(
+            since = "0.2.173",
+            note = "This field is incorrectly named and will be changed
+                to __key in a future release."
+        )]
         pub __ipc_perm_key: crate::key_t,
         pub uid: crate::uid_t,
         pub gid: crate::gid_t,
@@ -154,17 +162,6 @@
             }
         }
         impl Eq for ucontext_t {}
-        impl fmt::Debug for ucontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ucontext_t")
-                    .field("uc_flags", &self.uc_link)
-                    .field("uc_link", &self.uc_link)
-                    .field("uc_stack", &self.uc_stack)
-                    .field("uc_mcontext", &self.uc_mcontext)
-                    .field("uc_sigmask", &self.uc_sigmask)
-                    .finish()
-            }
-        }
         impl hash::Hash for ucontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/hexagon.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/hexagon.rs
index 4aab076..b6879535 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/hexagon.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/hexagon.rs
@@ -34,6 +34,14 @@
     }
 
     pub struct ipc_perm {
+        #[cfg(musl_v1_2_3)]
+        pub __key: crate::key_t,
+        #[cfg(not(musl_v1_2_3))]
+        #[deprecated(
+            since = "0.2.173",
+            note = "This field is incorrectly named and will be changed
+                to __key in a future release"
+        )]
         pub __ipc_perm_key: crate::key_t,
         pub uid: crate::uid_t,
         pub gid: crate::gid_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/mips/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/mips/mod.rs
index e0b35b6..3f2b73d 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/mips/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/mips/mod.rs
@@ -57,6 +57,14 @@
     }
 
     pub struct ipc_perm {
+        #[cfg(musl_v1_2_3)]
+        pub __key: crate::key_t,
+        #[cfg(not(musl_v1_2_3))]
+        #[deprecated(
+            since = "0.2.173",
+            note = "This field is incorrectly named and will be changed
+                to __key in a future release."
+        )]
         pub __ipc_perm_key: crate::key_t,
         pub uid: crate::uid_t,
         pub gid: crate::gid_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/powerpc.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/powerpc.rs
index 0de40b1..460b2d8 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/powerpc.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/powerpc.rs
@@ -53,6 +53,14 @@
     }
 
     pub struct ipc_perm {
+        #[cfg(musl_v1_2_3)]
+        pub __key: crate::key_t,
+        #[cfg(not(musl_v1_2_3))]
+        #[deprecated(
+            since = "0.2.173",
+            note = "This field is incorrectly named and will be changed
+                to __key in a future release."
+        )]
         pub __ipc_perm_key: crate::key_t,
         pub uid: crate::uid_t,
         pub gid: crate::gid_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs
index 9c0525c..9b761059 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs
@@ -246,6 +246,7 @@
 pub const O_DIRECTORY: c_int = 65536;
 pub const O_LARGEFILE: c_int = 0o0100000;
 pub const O_NOFOLLOW: c_int = 131072;
+pub const MADV_SOFT_OFFLINE: c_int = 101;
 pub const MAP_HUGETLB: c_int = 262144;
 pub const MAP_LOCKED: c_int = 8192;
 pub const MAP_NORESERVE: c_int = 16384;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/x86/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/x86/mod.rs
index 22befbb0..583e0a51e 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/x86/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/x86/mod.rs
@@ -59,6 +59,14 @@
     }
 
     pub struct ipc_perm {
+        #[cfg(musl_v1_2_3)]
+        pub __key: crate::key_t,
+        #[cfg(not(musl_v1_2_3))]
+        #[deprecated(
+            since = "0.2.173",
+            note = "This field is incorrectly named and will be changed
+                to __key in a future release."
+        )]
         pub __ipc_perm_key: crate::key_t,
         pub uid: crate::uid_t,
         pub gid: crate::gid_t,
@@ -159,26 +167,6 @@
 
         impl Eq for user_fpxregs_struct {}
 
-        impl fmt::Debug for user_fpxregs_struct {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("user_fpxregs_struct")
-                    .field("cwd", &self.cwd)
-                    .field("swd", &self.swd)
-                    .field("twd", &self.twd)
-                    .field("fop", &self.fop)
-                    .field("fip", &self.fip)
-                    .field("fcs", &self.fcs)
-                    .field("foo", &self.foo)
-                    .field("fos", &self.fos)
-                    .field("mxcsr", &self.mxcsr)
-                    // Ignore __reserved field
-                    .field("st_space", &self.st_space)
-                    .field("xmm_space", &self.xmm_space)
-                    // Ignore padding field
-                    .finish()
-            }
-        }
-
         impl hash::Hash for user_fpxregs_struct {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.cwd.hash(state);
@@ -214,19 +202,6 @@
 
         impl Eq for ucontext_t {}
 
-        impl fmt::Debug for ucontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ucontext_t")
-                    .field("uc_flags", &self.uc_flags)
-                    .field("uc_link", &self.uc_link)
-                    .field("uc_stack", &self.uc_stack)
-                    .field("uc_mcontext", &self.uc_mcontext)
-                    .field("uc_sigmask", &self.uc_sigmask)
-                    // Ignore __private field
-                    .finish()
-            }
-        }
-
         impl hash::Hash for ucontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs
index e84b9f5..243247e 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs
@@ -60,15 +60,32 @@
     }
 
     pub struct ipc_perm {
+        #[cfg(musl_v1_2_3)]
+        pub __key: crate::key_t,
+        #[cfg(not(musl_v1_2_3))]
+        #[deprecated(
+            since = "0.2.173",
+            note = "This field is incorrectly named and will be changed
+                to __key in a future release."
+        )]
         pub __ipc_perm_key: crate::key_t,
         pub uid: crate::uid_t,
         pub gid: crate::gid_t,
         pub cuid: crate::uid_t,
         pub cgid: crate::gid_t,
         pub mode: crate::mode_t,
+
+        #[cfg(musl_v1_2_3)]
+        pub __seq: c_int,
+        #[cfg(not(musl_v1_2_3))]
+        #[deprecated(
+            since = "0.2.173",
+            note = "The type of this field has changed from c_ushort to c_int,
+                we'll follow that change in the future release."
+        )]
         pub __seq: c_ushort,
-        __unused1: c_ulong,
-        __unused2: c_ulong,
+        __unused1: c_long,
+        __unused2: c_long,
     }
 
     pub struct ucontext_t {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs
index 36f05e1..17724b5 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs
@@ -7,8 +7,6 @@
 
 pub type nlink_t = c_uint;
 pub type blksize_t = c_int;
-pub type fsblkcnt64_t = c_ulong;
-pub type fsfilcnt64_t = c_ulong;
 pub type __u64 = c_ulonglong;
 pub type __s64 = c_longlong;
 
@@ -65,7 +63,6 @@
         pub cgid: crate::gid_t,
         pub mode: c_uint,
         pub __seq: c_int,
-        __pad2: c_ushort,
         __unused1: c_ulong,
         __unused2: c_ulong,
     }
@@ -533,6 +530,8 @@
 pub const EHWPOISON: c_int = 133;
 pub const ERFKILL: c_int = 132;
 
+pub const MADV_SOFT_OFFLINE: c_int = 101;
+
 pub const SA_ONSTACK: c_int = 0x08000000;
 pub const SA_SIGINFO: c_int = 0x00000004;
 pub const SA_NOCLDWAIT: c_int = 0x00000002;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/mips64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/mips64.rs
index 33afe4e..5cef5723 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/mips64.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/mips64.rs
@@ -57,6 +57,14 @@
     }
 
     pub struct ipc_perm {
+        #[cfg(musl_v1_2_3)]
+        pub __key: crate::key_t,
+        #[cfg(not(musl_v1_2_3))]
+        #[deprecated(
+            since = "0.2.173",
+            note = "This field is incorrectly named and will be changed
+                to __key in a future release."
+        )]
         pub __ipc_perm_key: crate::key_t,
         pub uid: crate::uid_t,
         pub gid: crate::gid_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/powerpc64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/powerpc64.rs
index fb9653bc..4f3c081f 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/powerpc64.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/powerpc64.rs
@@ -51,6 +51,14 @@
     }
 
     pub struct ipc_perm {
+        #[cfg(musl_v1_2_3)]
+        pub __key: crate::key_t,
+        #[cfg(not(musl_v1_2_3))]
+        #[deprecated(
+            since = "0.2.173",
+            note = "This field is incorrectly named and will be changed
+                to __key in a future release."
+        )]
         pub __ipc_perm_key: crate::key_t,
         pub uid: crate::uid_t,
         pub gid: crate::gid_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs
index 2b9b394..cf851c4 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs
@@ -432,7 +432,7 @@
 pub const O_APPEND: c_int = 1024;
 pub const O_DIRECT: c_int = 0x4000;
 pub const O_DIRECTORY: c_int = 0x10000;
-pub const O_LARGEFILE: c_int = 0;
+pub const O_LARGEFILE: c_int = 0o100000;
 pub const O_NOFOLLOW: c_int = 0x20000;
 pub const O_CREAT: c_int = 64;
 pub const O_EXCL: c_int = 128;
@@ -572,6 +572,7 @@
 pub const SOCK_STREAM: c_int = 1;
 pub const SOCK_DGRAM: c_int = 2;
 
+pub const MADV_SOFT_OFFLINE: c_int = 101;
 pub const MAP_ANON: c_int = 0x0020;
 pub const MAP_GROWSDOWN: c_int = 0x0100;
 pub const MAP_DENYWRITE: c_int = 0x0800;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/s390x.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/s390x.rs
index b992a2c..0f10628 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/s390x.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/s390x.rs
@@ -10,6 +10,14 @@
 
 s! {
     pub struct ipc_perm {
+        #[cfg(musl_v1_2_3)]
+        pub __key: crate::key_t,
+        #[cfg(not(musl_v1_2_3))]
+        #[deprecated(
+            since = "0.2.173",
+            note = "This field is incorrectly named and will be changed
+                to __key in a future release."
+        )]
         pub __ipc_perm_key: crate::key_t,
         pub uid: crate::uid_t,
         pub gid: crate::gid_t,
@@ -80,15 +88,9 @@
 
         impl Eq for fpreg_t {}
 
-        impl fmt::Debug for fpreg_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("fpreg_t").field("d", &self.d).finish()
-            }
-        }
-
         impl hash::Hash for fpreg_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
-                let d: u64 = unsafe { mem::transmute(self.d) };
+                let d: u64 = self.d.to_bits();
                 d.hash(state);
             }
         }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/wasm32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/wasm32/mod.rs
index 3ac15b8a..3f7a609 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/wasm32/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/wasm32/mod.rs
@@ -53,6 +53,14 @@
     }
 
     pub struct ipc_perm {
+        #[cfg(musl_v1_2_3)]
+        pub __key: crate::key_t,
+        #[cfg(not(musl_v1_2_3))]
+        #[deprecated(
+            since = "0.2.173",
+            note = "This field is incorrectly named and will be changed
+                to __key in a future release."
+        )]
         pub __ipc_perm_key: crate::key_t,
         pub uid: crate::uid_t,
         pub gid: crate::gid_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs
index b44b54de..17a9f6c 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs
@@ -112,6 +112,14 @@
     }
 
     pub struct ipc_perm {
+        #[cfg(musl_v1_2_3)]
+        pub __key: crate::key_t,
+        #[cfg(not(musl_v1_2_3))]
+        #[deprecated(
+            since = "0.2.173",
+            note = "This field is incorrectly named and will be changed
+                to __key in a future release."
+        )]
         pub __ipc_perm_key: crate::key_t,
         pub uid: crate::uid_t,
         pub gid: crate::gid_t,
@@ -194,23 +202,6 @@
 
         impl Eq for user_fpregs_struct {}
 
-        impl fmt::Debug for user_fpregs_struct {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("user_fpregs_struct")
-                    .field("cwd", &self.cwd)
-                    .field("ftw", &self.ftw)
-                    .field("fop", &self.fop)
-                    .field("rip", &self.rip)
-                    .field("rdp", &self.rdp)
-                    .field("mxcsr", &self.mxcsr)
-                    .field("mxcr_mask", &self.mxcr_mask)
-                    .field("st_space", &self.st_space)
-                    // FIXME(debug): .field("xmm_space", &self.xmm_space)
-                    // Ignore padding field
-                    .finish()
-            }
-        }
-
         impl hash::Hash for user_fpregs_struct {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.cwd.hash(state);
@@ -243,19 +234,6 @@
 
         impl Eq for ucontext_t {}
 
-        impl fmt::Debug for ucontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ucontext_t")
-                    .field("uc_flags", &self.uc_flags)
-                    .field("uc_link", &self.uc_link)
-                    .field("uc_stack", &self.uc_stack)
-                    .field("uc_mcontext", &self.uc_mcontext)
-                    .field("uc_sigmask", &self.uc_sigmask)
-                    // Ignore __private field
-                    .finish()
-            }
-        }
-
         impl hash::Hash for ucontext_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uc_flags.hash(state);
@@ -701,7 +679,7 @@
 pub const O_APPEND: c_int = 1024;
 pub const O_DIRECT: c_int = 0x4000;
 pub const O_DIRECTORY: c_int = 0x10000;
-pub const O_LARGEFILE: c_int = 0;
+pub const O_LARGEFILE: c_int = 0o0100000;
 pub const O_NOFOLLOW: c_int = 0x20000;
 pub const O_CREAT: c_int = 64;
 pub const O_EXCL: c_int = 128;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/mod.rs
index f850849..fb083fd 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/mod.rs
@@ -323,16 +323,11 @@
         pub tcpi_probes: u8,
         pub tcpi_backoff: u8,
         pub tcpi_options: u8,
-        /*
-         * FIXME(musl): enable on all targets once musl headers are more up to date
-         */
         /// This contains the bitfields `tcpi_snd_wscale` and `tcpi_rcv_wscale`.
         /// Each is 4 bits.
-        #[cfg(target_arch = "loongarch64")]
         pub tcpi_snd_rcv_wscale: u8,
         /// This contains the bitfields `tcpi_delivery_rate_app_limited` (1 bit) and
         /// `tcpi_fastopen_client_fail` (2 bits).
-        #[cfg(target_arch = "loongarch64")]
         pub tcpi_delivery_fastopen_bitfields: u8,
         pub tcpi_rto: u32,
         pub tcpi_ato: u32,
@@ -378,10 +373,7 @@
         pub tcpi_bytes_retrans: u64,
         pub tcpi_dsack_dups: u32,
         pub tcpi_reord_seen: u32,
-        // FIXME(musl): enable on all targets once CI musl is updated
-        #[cfg(target_arch = "loongarch64")]
         pub tcpi_rcv_ooopack: u32,
-        #[cfg(target_arch = "loongarch64")]
         pub tcpi_snd_wnd: u32,
     }
 
@@ -438,13 +430,6 @@
         pub __reserved: [c_char; 256],
     }
 
-    // FIXME(musl): musl added paddings and adjusted
-    // layout in 1.2.0 but our CI is still 1.1.24.
-    // So, I'm leaving some fields as cfg for now.
-    // ref. https://github.com/bminor/musl/commit/
-    // 1e7f0fcd7ff2096904fd93a2ee6d12a2392be392
-    //
-    // OpenHarmony uses the musl 1.2 layout.
     pub struct utmpx {
         pub ut_type: c_short,
         __ut_pad1: c_short,
@@ -455,32 +440,25 @@
         pub ut_host: [c_char; 256],
         pub ut_exit: __exit_status,
 
-        #[cfg(target_env = "musl")]
-        #[cfg(not(target_arch = "loongarch64"))]
+        #[cfg(not(musl_v1_2_3))]
+        #[deprecated(
+            since = "0.2.173",
+            note = "The ABI of this field has changed from c_long to c_int with padding, \
+                we'll follow that change in the future release. See #4443 for more info."
+        )]
         pub ut_session: c_long,
 
-        #[cfg(target_env = "musl")]
-        #[cfg(target_arch = "loongarch64")]
-        pub ut_session: c_int,
-
-        #[cfg(target_env = "musl")]
-        #[cfg(target_arch = "loongarch64")]
-        __ut_pad2: c_int,
-
-        #[cfg(target_env = "ohos")]
-        #[cfg(target_endian = "little")]
-        pub ut_session: c_int,
-        #[cfg(target_env = "ohos")]
-        #[cfg(target_endian = "little")]
-        __ut_pad2: c_int,
-
-        #[cfg(target_env = "ohos")]
+        #[cfg(musl_v1_2_3)]
         #[cfg(not(target_endian = "little"))]
         __ut_pad2: c_int,
-        #[cfg(target_env = "ohos")]
-        #[cfg(not(target_endian = "little"))]
+
+        #[cfg(musl_v1_2_3)]
         pub ut_session: c_int,
 
+        #[cfg(musl_v1_2_3)]
+        #[cfg(target_endian = "little")]
+        __ut_pad2: c_int,
+
         pub ut_tv: crate::timeval,
         pub ut_addr_v6: [c_uint; 4],
         __unused: [c_char; 20],
@@ -514,27 +492,6 @@
 
         impl Eq for sysinfo {}
 
-        impl fmt::Debug for sysinfo {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sysinfo")
-                    .field("uptime", &self.uptime)
-                    .field("loads", &self.loads)
-                    .field("totalram", &self.totalram)
-                    .field("freeram", &self.freeram)
-                    .field("sharedram", &self.sharedram)
-                    .field("bufferram", &self.bufferram)
-                    .field("totalswap", &self.totalswap)
-                    .field("freeswap", &self.freeswap)
-                    .field("procs", &self.procs)
-                    .field("pad", &self.pad)
-                    .field("totalhigh", &self.totalhigh)
-                    .field("freehigh", &self.freehigh)
-                    .field("mem_unit", &self.mem_unit)
-                    // FIXME(debug): .field("__reserved", &self.__reserved)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for sysinfo {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.uptime.hash(state);
@@ -555,6 +512,7 @@
         }
 
         impl PartialEq for utmpx {
+            #[allow(deprecated)]
             fn eq(&self, other: &utmpx) -> bool {
                 self.ut_type == other.ut_type
                     //&& self.__ut_pad1 == other.__ut_pad1
@@ -578,27 +536,8 @@
 
         impl Eq for utmpx {}
 
-        impl fmt::Debug for utmpx {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utmpx")
-                    .field("ut_type", &self.ut_type)
-                    //.field("__ut_pad1", &self.__ut_pad1)
-                    .field("ut_pid", &self.ut_pid)
-                    .field("ut_line", &self.ut_line)
-                    .field("ut_id", &self.ut_id)
-                    .field("ut_user", &self.ut_user)
-                    //FIXME(debug): .field("ut_host", &self.ut_host)
-                    .field("ut_exit", &self.ut_exit)
-                    .field("ut_session", &self.ut_session)
-                    //.field("__ut_pad2", &self.__ut_pad2)
-                    .field("ut_tv", &self.ut_tv)
-                    .field("ut_addr_v6", &self.ut_addr_v6)
-                    .field("__unused", &self.__unused)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for utmpx {
+            #[allow(deprecated)]
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ut_type.hash(state);
                 //self.__ut_pad1.hash(state);
@@ -766,12 +705,6 @@
 pub const PTRACE_GETSIGMASK: c_uint = 0x420a;
 pub const PTRACE_SETSIGMASK: c_uint = 0x420b;
 
-pub const RWF_HIPRI: c_int = 0x00000001;
-pub const RWF_DSYNC: c_int = 0x00000002;
-pub const RWF_SYNC: c_int = 0x00000004;
-pub const RWF_NOWAIT: c_int = 0x00000008;
-pub const RWF_APPEND: c_int = 0x00000010;
-
 pub const AF_IB: c_int = 27;
 pub const AF_MPLS: c_int = 28;
 pub const AF_NFC: c_int = 39;
@@ -787,8 +720,6 @@
 
 pub const SFD_NONBLOCK: c_int = crate::O_NONBLOCK;
 
-pub const PIDFD_NONBLOCK: c_uint = O_NONBLOCK as c_uint;
-
 pub const TCSANOW: c_int = 0;
 pub const TCSADRAIN: c_int = 1;
 pub const TCSAFLUSH: c_int = 2;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/arm/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/arm/mod.rs
index 634161e..7a517f49 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/arm/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/arm/mod.rs
@@ -475,7 +475,6 @@
 pub const POLLWRNORM: c_short = 0x100;
 pub const PTHREAD_STACK_MIN: size_t = 16384;
 pub const RTLD_GLOBAL: c_int = 0x00100;
-pub const PIDFD_NONBLOCK: c_int = 0x800;
 
 // These are typed unsigned to match sigaction
 pub const SA_NOCLDSTOP: c_ulong = 0x1;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mips/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mips/mod.rs
index f1934c3..0ad572a9 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mips/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mips/mod.rs
@@ -57,7 +57,6 @@
 pub const O_NDELAY: c_int = 0x80;
 
 pub const SOCK_NONBLOCK: c_int = 128;
-pub const PIDFD_NONBLOCK: c_int = 128;
 
 pub const EDEADLK: c_int = 45;
 pub const ENAMETOOLONG: c_int = 78;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mod.rs
index b7a34dd..4fef82e 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mod.rs
@@ -1,3 +1,6 @@
+// FIXME(ulibc): this module has definitions that are redundant with the parent
+#![allow(dead_code)]
+
 use crate::off64_t;
 use crate::prelude::*;
 
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/x86_64/mod.rs
index 3a4ee0d..4a6c19f 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/x86_64/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/x86_64/mod.rs
@@ -342,7 +342,6 @@
 pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8;
 pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32;
 pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4;
-pub const PIDFD_NONBLOCK: c_int = 0o4000;
 
 cfg_if! {
     if #[cfg(target_os = "l4re")] {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/mod.rs
index 64481a67..a2969e85 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/mod.rs
@@ -208,6 +208,32 @@
 }
 
 cfg_if! {
+    if #[cfg(not(target_os = "emscripten"))] {
+        s! {
+            pub struct file_clone_range {
+                pub src_fd: crate::__s64,
+                pub src_offset: crate::__u64,
+                pub src_length: crate::__u64,
+                pub dest_offset: crate::__u64,
+            }
+
+            // linux/filter.h
+            pub struct sock_filter {
+                pub code: __u16,
+                pub jt: __u8,
+                pub jf: __u8,
+                pub k: __u32,
+            }
+
+            pub struct sock_fprog {
+                pub len: c_ushort,
+                pub filter: *mut sock_filter,
+            }
+        }
+    }
+}
+
+cfg_if! {
     if #[cfg(any(target_env = "gnu", target_os = "android"))] {
         s! {
             pub struct statx {
@@ -308,16 +334,6 @@
             }
         }
         impl Eq for epoll_event {}
-        impl fmt::Debug for epoll_event {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let events = self.events;
-                let u64 = self.u64;
-                f.debug_struct("epoll_event")
-                    .field("events", &events)
-                    .field("u64", &u64)
-                    .finish()
-            }
-        }
         impl hash::Hash for epoll_event {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let events = self.events;
@@ -338,14 +354,6 @@
             }
         }
         impl Eq for sockaddr_un {}
-        impl fmt::Debug for sockaddr_un {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_un")
-                    .field("sun_family", &self.sun_family)
-                    // FIXME(debug): .field("sun_path", &self.sun_path)
-                    .finish()
-            }
-        }
         impl hash::Hash for sockaddr_un {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sun_family.hash(state);
@@ -366,16 +374,6 @@
 
         impl Eq for sockaddr_storage {}
 
-        impl fmt::Debug for sockaddr_storage {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_storage")
-                    .field("ss_family", &self.ss_family)
-                    .field("__ss_align", &self.__ss_align)
-                    // FIXME(debug): .field("__ss_pad2", &self.__ss_pad2)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for sockaddr_storage {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ss_family.hash(state);
@@ -419,19 +417,6 @@
 
         impl Eq for utsname {}
 
-        impl fmt::Debug for utsname {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utsname")
-                    // FIXME(debug): .field("sysname", &self.sysname)
-                    // FIXME(debug): .field("nodename", &self.nodename)
-                    // FIXME(debug): .field("release", &self.release)
-                    // FIXME(debug): .field("version", &self.version)
-                    // FIXME(debug): .field("machine", &self.machine)
-                    // FIXME(debug): .field("domainname", &self.domainname)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for utsname {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sysname.hash(state);
@@ -452,16 +437,6 @@
             }
         }
         impl Eq for sigevent {}
-        impl fmt::Debug for sigevent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sigevent")
-                    .field("sigev_value", &self.sigev_value)
-                    .field("sigev_signo", &self.sigev_signo)
-                    .field("sigev_notify", &self.sigev_notify)
-                    .field("sigev_notify_thread_id", &self.sigev_notify_thread_id)
-                    .finish()
-            }
-        }
         impl hash::Hash for sigevent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sigev_value.hash(state);
@@ -545,26 +520,26 @@
 
 pub const SOCK_CLOEXEC: c_int = O_CLOEXEC;
 
-pub const S_IFIFO: crate::mode_t = 0o1_0000;
-pub const S_IFCHR: crate::mode_t = 0o2_0000;
-pub const S_IFBLK: crate::mode_t = 0o6_0000;
-pub const S_IFDIR: crate::mode_t = 0o4_0000;
-pub const S_IFREG: crate::mode_t = 0o10_0000;
-pub const S_IFLNK: crate::mode_t = 0o12_0000;
-pub const S_IFSOCK: crate::mode_t = 0o14_0000;
-pub const S_IFMT: crate::mode_t = 0o17_0000;
-pub const S_IRWXU: crate::mode_t = 0o0700;
-pub const S_IXUSR: crate::mode_t = 0o0100;
-pub const S_IWUSR: crate::mode_t = 0o0200;
-pub const S_IRUSR: crate::mode_t = 0o0400;
-pub const S_IRWXG: crate::mode_t = 0o0070;
-pub const S_IXGRP: crate::mode_t = 0o0010;
-pub const S_IWGRP: crate::mode_t = 0o0020;
-pub const S_IRGRP: crate::mode_t = 0o0040;
-pub const S_IRWXO: crate::mode_t = 0o0007;
-pub const S_IXOTH: crate::mode_t = 0o0001;
-pub const S_IWOTH: crate::mode_t = 0o0002;
-pub const S_IROTH: crate::mode_t = 0o0004;
+pub const S_IFIFO: mode_t = 0o1_0000;
+pub const S_IFCHR: mode_t = 0o2_0000;
+pub const S_IFBLK: mode_t = 0o6_0000;
+pub const S_IFDIR: mode_t = 0o4_0000;
+pub const S_IFREG: mode_t = 0o10_0000;
+pub const S_IFLNK: mode_t = 0o12_0000;
+pub const S_IFSOCK: mode_t = 0o14_0000;
+pub const S_IFMT: mode_t = 0o17_0000;
+pub const S_IRWXU: mode_t = 0o0700;
+pub const S_IXUSR: mode_t = 0o0100;
+pub const S_IWUSR: mode_t = 0o0200;
+pub const S_IRUSR: mode_t = 0o0400;
+pub const S_IRWXG: mode_t = 0o0070;
+pub const S_IXGRP: mode_t = 0o0010;
+pub const S_IWGRP: mode_t = 0o0020;
+pub const S_IRGRP: mode_t = 0o0040;
+pub const S_IRWXO: mode_t = 0o0007;
+pub const S_IXOTH: mode_t = 0o0001;
+pub const S_IWOTH: mode_t = 0o0002;
+pub const S_IROTH: mode_t = 0o0004;
 pub const F_OK: c_int = 0;
 pub const R_OK: c_int = 4;
 pub const W_OK: c_int = 2;
@@ -1483,6 +1458,93 @@
 pub const ARPHRD_NONE: u16 = 0xFFFE;
 
 cfg_if! {
+    if #[cfg(not(target_os = "emscripten"))] {
+        // linux/if_tun.h
+        /* TUNSETIFF ifr flags */
+        pub const IFF_TUN: c_int = 0x0001;
+        pub const IFF_TAP: c_int = 0x0002;
+        pub const IFF_NAPI: c_int = 0x0010;
+        pub const IFF_NAPI_FRAGS: c_int = 0x0020;
+        // Used in TUNSETIFF to bring up tun/tap without carrier
+        pub const IFF_NO_CARRIER: c_int = 0x0040;
+        pub const IFF_NO_PI: c_int = 0x1000;
+        // Read queue size
+        pub const TUN_READQ_SIZE: c_short = 500;
+        // TUN device type flags: deprecated. Use IFF_TUN/IFF_TAP instead.
+        pub const TUN_TUN_DEV: c_short = crate::IFF_TUN as c_short;
+        pub const TUN_TAP_DEV: c_short = crate::IFF_TAP as c_short;
+        pub const TUN_TYPE_MASK: c_short = 0x000f;
+        // This flag has no real effect
+        pub const IFF_ONE_QUEUE: c_int = 0x2000;
+        pub const IFF_VNET_HDR: c_int = 0x4000;
+        pub const IFF_TUN_EXCL: c_int = 0x8000;
+        pub const IFF_MULTI_QUEUE: c_int = 0x0100;
+        pub const IFF_ATTACH_QUEUE: c_int = 0x0200;
+        pub const IFF_DETACH_QUEUE: c_int = 0x0400;
+        // read-only flag
+        pub const IFF_PERSIST: c_int = 0x0800;
+        pub const IFF_NOFILTER: c_int = 0x1000;
+        // Socket options
+        pub const TUN_TX_TIMESTAMP: c_int = 1;
+        // Features for GSO (TUNSETOFFLOAD)
+        pub const TUN_F_CSUM: c_uint = 0x01;
+        pub const TUN_F_TSO4: c_uint = 0x02;
+        pub const TUN_F_TSO6: c_uint = 0x04;
+        pub const TUN_F_TSO_ECN: c_uint = 0x08;
+        pub const TUN_F_UFO: c_uint = 0x10;
+        pub const TUN_F_USO4: c_uint = 0x20;
+        pub const TUN_F_USO6: c_uint = 0x40;
+        // Protocol info prepended to the packets (when IFF_NO_PI is not set)
+        pub const TUN_PKT_STRIP: c_int = 0x0001;
+        // Accept all multicast packets
+        pub const TUN_FLT_ALLMULTI: c_int = 0x0001;
+        // Ioctl operation codes
+        const T_TYPE: u32 = b'T' as u32;
+        pub const TUNSETNOCSUM: Ioctl = _IOW::<c_int>(T_TYPE, 200);
+        pub const TUNSETDEBUG: Ioctl = _IOW::<c_int>(T_TYPE, 201);
+        pub const TUNSETIFF: Ioctl = _IOW::<c_int>(T_TYPE, 202);
+        pub const TUNSETPERSIST: Ioctl = _IOW::<c_int>(T_TYPE, 203);
+        pub const TUNSETOWNER: Ioctl = _IOW::<c_int>(T_TYPE, 204);
+        pub const TUNSETLINK: Ioctl = _IOW::<c_int>(T_TYPE, 205);
+        pub const TUNSETGROUP: Ioctl = _IOW::<c_int>(T_TYPE, 206);
+        pub const TUNGETFEATURES: Ioctl = _IOR::<c_int>(T_TYPE, 207);
+        pub const TUNSETOFFLOAD: Ioctl = _IOW::<c_int>(T_TYPE, 208);
+        pub const TUNSETTXFILTER: Ioctl = _IOW::<c_int>(T_TYPE, 209);
+        pub const TUNGETIFF: Ioctl = _IOR::<c_int>(T_TYPE, 210);
+        pub const TUNGETSNDBUF: Ioctl = _IOR::<c_int>(T_TYPE, 211);
+        pub const TUNSETSNDBUF: Ioctl = _IOW::<c_int>(T_TYPE, 212);
+        pub const TUNATTACHFILTER: Ioctl = _IOW::<sock_fprog>(T_TYPE, 213);
+        pub const TUNDETACHFILTER: Ioctl = _IOW::<sock_fprog>(T_TYPE, 214);
+        pub const TUNGETVNETHDRSZ: Ioctl = _IOR::<c_int>(T_TYPE, 215);
+        pub const TUNSETVNETHDRSZ: Ioctl = _IOW::<c_int>(T_TYPE, 216);
+        pub const TUNSETQUEUE: Ioctl = _IOW::<c_int>(T_TYPE, 217);
+        pub const TUNSETIFINDEX: Ioctl = _IOW::<c_int>(T_TYPE, 218);
+        pub const TUNGETFILTER: Ioctl = _IOR::<sock_fprog>(T_TYPE, 219);
+        pub const TUNSETVNETLE: Ioctl = _IOW::<c_int>(T_TYPE, 220);
+        pub const TUNGETVNETLE: Ioctl = _IOR::<c_int>(T_TYPE, 221);
+        pub const TUNSETVNETBE: Ioctl = _IOW::<c_int>(T_TYPE, 222);
+        pub const TUNGETVNETBE: Ioctl = _IOR::<c_int>(T_TYPE, 223);
+        pub const TUNSETSTEERINGEBPF: Ioctl = _IOR::<c_int>(T_TYPE, 224);
+        pub const TUNSETFILTEREBPF: Ioctl = _IOR::<c_int>(T_TYPE, 225);
+        pub const TUNSETCARRIER: Ioctl = _IOW::<c_int>(T_TYPE, 226);
+        pub const TUNGETDEVNETNS: Ioctl = _IO(T_TYPE, 227);
+
+        // linux/fs.h
+        pub const FS_IOC_GETFLAGS: Ioctl = _IOR::<c_long>('f' as u32, 1);
+        pub const FS_IOC_SETFLAGS: Ioctl = _IOW::<c_long>('f' as u32, 2);
+        pub const FS_IOC_GETVERSION: Ioctl = _IOR::<c_long>('v' as u32, 1);
+        pub const FS_IOC_SETVERSION: Ioctl = _IOW::<c_long>('v' as u32, 2);
+        pub const FS_IOC32_GETFLAGS: Ioctl = _IOR::<c_int>('f' as u32, 1);
+        pub const FS_IOC32_SETFLAGS: Ioctl = _IOW::<c_int>('f' as u32, 2);
+        pub const FS_IOC32_GETVERSION: Ioctl = _IOR::<c_int>('v' as u32, 1);
+        pub const FS_IOC32_SETVERSION: Ioctl = _IOW::<c_int>('v' as u32, 2);
+
+        pub const FICLONE: Ioctl = _IOW::<c_int>(0x94, 9);
+        pub const FICLONERANGE: Ioctl = _IOW::<crate::file_clone_range>(0x94, 13);
+    }
+}
+
+cfg_if! {
     if #[cfg(target_os = "emscripten")] {
         // Emscripten does not define any `*_SUPER_MAGIC` constants.
     } else if #[cfg(not(target_arch = "s390x"))] {
@@ -1633,11 +1695,7 @@
 
 // https://github.com/search?q=repo%3Atorvalds%2Flinux+%22%23define+_IOC_NONE%22&type=code
 cfg_if! {
-    if #[cfg(any(
-        target_os = "linux",
-        target_os = "android",
-        target_os = "l4re"
-    ))] {
+    if #[cfg(not(target_os = "emscripten"))] {
         const _IOC_NRBITS: u32 = 8;
         const _IOC_TYPEBITS: u32 = 8;
 
@@ -1681,7 +1739,7 @@
         // adapted from https://github.com/torvalds/linux/blob/8a696a29c6905594e4abf78eaafcb62165ac61f1/rust/kernel/ioctl.rs
 
         /// Build an ioctl number, analogous to the C macro of the same name.
-        const fn _IOC(dir: u32, ty: u32, nr: u32, size: usize) -> u32 {
+        const fn _IOC(dir: u32, ty: u32, nr: u32, size: usize) -> Ioctl {
             // FIXME(ctest) the `garando_syntax` crate (used by ctest in the CI test suite)
             // cannot currently parse these `debug_assert!`s
             //
@@ -1690,26 +1748,51 @@
             // debug_assert!(nr <= _IOC_NRMASK);
             // debug_assert!(size <= (_IOC_SIZEMASK as usize));
 
-            (dir << _IOC_DIRSHIFT)
+            ((dir << _IOC_DIRSHIFT)
                 | (ty << _IOC_TYPESHIFT)
                 | (nr << _IOC_NRSHIFT)
-                | ((size as u32) << _IOC_SIZESHIFT)
+                | ((size as u32) << _IOC_SIZESHIFT)) as Ioctl
+        }
+
+        /// Build an ioctl number for an argumentless ioctl.
+        pub const fn _IO(ty: u32, nr: u32) -> Ioctl {
+            _IOC(_IOC_NONE, ty, nr, 0)
+        }
+
+        /// Build an ioctl number for an read-only ioctl.
+        pub const fn _IOR<T>(ty: u32, nr: u32) -> Ioctl {
+            _IOC(_IOC_READ, ty, nr, mem::size_of::<T>())
+        }
+
+        /// Build an ioctl number for an write-only ioctl.
+        pub const fn _IOW<T>(ty: u32, nr: u32) -> Ioctl {
+            _IOC(_IOC_WRITE, ty, nr, mem::size_of::<T>())
+        }
+
+        /// Build an ioctl number for a read-write ioctl.
+        pub const fn _IOWR<T>(ty: u32, nr: u32) -> Ioctl {
+            _IOC(_IOC_READ | _IOC_WRITE, ty, nr, mem::size_of::<T>())
+        }
+
+        extern "C" {
+            #[cfg_attr(gnu_time_bits64, link_name = "__ioctl_time64")]
+            pub fn ioctl(fd: c_int, request: Ioctl, ...) -> c_int;
         }
     }
 }
 
 const_fn! {
     {const} fn CMSG_ALIGN(len: usize) -> usize {
-        len + mem::size_of::<usize>() - 1 & !(mem::size_of::<usize>() - 1)
+        (len + mem::size_of::<usize>() - 1) & !(mem::size_of::<usize>() - 1)
     }
 }
 
 f! {
     pub fn CMSG_FIRSTHDR(mhdr: *const msghdr) -> *mut cmsghdr {
         if (*mhdr).msg_controllen as usize >= mem::size_of::<cmsghdr>() {
-            (*mhdr).msg_control as *mut cmsghdr
+            (*mhdr).msg_control.cast::<cmsghdr>()
         } else {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         }
     }
 
@@ -1746,7 +1829,7 @@
     }
 
     pub fn FD_ZERO(set: *mut fd_set) -> () {
-        for slot in (*set).fds_bits.iter_mut() {
+        for slot in &mut (*set).fds_bits {
             *slot = 0;
         }
     }
@@ -1838,8 +1921,11 @@
     pub fn fdatasync(fd: c_int) -> c_int;
     pub fn mincore(addr: *mut c_void, len: size_t, vec: *mut c_uchar) -> c_int;
 
+    #[cfg_attr(gnu_time_bits64, link_name = "__clock_getres64")]
     pub fn clock_getres(clk_id: crate::clockid_t, tp: *mut crate::timespec) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__clock_gettime64")]
     pub fn clock_gettime(clk_id: crate::clockid_t, tp: *mut crate::timespec) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__clock_settime64")]
     pub fn clock_settime(clk_id: crate::clockid_t, tp: *const crate::timespec) -> c_int;
     pub fn clock_getcpuclockid(pid: crate::pid_t, clk_id: *mut crate::clockid_t) -> c_int;
 
@@ -1866,7 +1952,9 @@
     pub fn memrchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void;
     #[cfg_attr(gnu_file_offset_bits64, link_name = "posix_fadvise64")]
     pub fn posix_fadvise(fd: c_int, offset: off_t, len: off_t, advise: c_int) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__futimens64")]
     pub fn futimens(fd: c_int, times: *const crate::timespec) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__utimensat64")]
     pub fn utimensat(
         dirfd: c_int,
         path: *const c_char,
@@ -1877,8 +1965,7 @@
     pub fn freelocale(loc: crate::locale_t);
     pub fn newlocale(mask: c_int, locale: *const c_char, base: crate::locale_t) -> crate::locale_t;
     pub fn uselocale(loc: crate::locale_t) -> crate::locale_t;
-    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t)
-        -> c_int;
+    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int;
     pub fn pthread_condattr_getclock(
         attr: *const pthread_condattr_t,
         clock_id: *mut clockid_t,
@@ -1922,6 +2009,7 @@
     pub fn vfork() -> crate::pid_t;
     pub fn setresgid(rgid: crate::gid_t, egid: crate::gid_t, sgid: crate::gid_t) -> c_int;
     pub fn setresuid(ruid: crate::uid_t, euid: crate::uid_t, suid: crate::uid_t) -> c_int;
+    #[cfg_attr(gnu_time_bits64, link_name = "__wait4_time64")]
     pub fn wait4(
         pid: crate::pid_t,
         status: *mut c_int,
@@ -1949,7 +2037,9 @@
     pub fn writev(fd: c_int, iov: *const crate::iovec, iovcnt: c_int) -> ssize_t;
     pub fn readv(fd: c_int, iov: *const crate::iovec, iovcnt: c_int) -> ssize_t;
 
+    #[cfg_attr(gnu_time_bits64, link_name = "__sendmsg64")]
     pub fn sendmsg(fd: c_int, msg: *const crate::msghdr, flags: c_int) -> ssize_t;
+    #[cfg_attr(gnu_time_bits64, link_name = "__recvmsg64")]
     pub fn recvmsg(fd: c_int, msg: *mut crate::msghdr, flags: c_int) -> ssize_t;
     pub fn uname(buf: *mut crate::utsname) -> c_int;
 
@@ -1991,7 +2081,9 @@
             pub fn fstatvfs64(fd: c_int, buf: *mut statvfs64) -> c_int;
             pub fn statfs64(path: *const c_char, buf: *mut statfs64) -> c_int;
             pub fn creat64(path: *const c_char, mode: mode_t) -> c_int;
+            #[cfg_attr(gnu_time_bits64, link_name = "__fstat64_time64")]
             pub fn fstat64(fildes: c_int, buf: *mut stat64) -> c_int;
+            #[cfg_attr(gnu_time_bits64, link_name = "__fstatat64_time64")]
             pub fn fstatat64(
                 dirfd: c_int,
                 pathname: *const c_char,
@@ -2000,6 +2092,7 @@
             ) -> c_int;
             pub fn ftruncate64(fd: c_int, length: off64_t) -> c_int;
             pub fn lseek64(fd: c_int, offset: off64_t, whence: c_int) -> off64_t;
+            #[cfg_attr(gnu_time_bits64, link_name = "__lstat64_time64")]
             pub fn lstat64(path: *const c_char, buf: *mut stat64) -> c_int;
             pub fn mmap64(
                 addr: *mut c_void,
@@ -2030,6 +2123,7 @@
                 entry: *mut crate::dirent64,
                 result: *mut *mut crate::dirent64,
             ) -> c_int;
+            #[cfg_attr(gnu_time_bits64, link_name = "__stat64_time64")]
             pub fn stat64(path: *const c_char, buf: *mut stat64) -> c_int;
             pub fn truncate64(path: *const c_char, length: off64_t) -> c_int;
         }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/mod.rs
index 433eeec9..96209e7 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/mod.rs
@@ -56,14 +56,19 @@
         pub modtime: time_t,
     }
 
-    // FIXME(time): Needs updates at least for glibc _TIME_BITS=64
     pub struct timeval {
         pub tv_sec: time_t,
+        #[cfg(not(gnu_time_bits64))]
         pub tv_usec: suseconds_t,
+        // For 64 bit time on 32 bit linux glibc, suseconds_t is still
+        // a 32 bit type.  Use __suseconds64_t instead
+        #[cfg(gnu_time_bits64)]
+        pub tv_usec: __suseconds64_t,
     }
 
     // linux x32 compatibility
     // See https://sourceware.org/bugzilla/show_bug.cgi?id=16437
+    #[cfg(not(target_env = "gnu"))]
     pub struct timespec {
         pub tv_sec: time_t,
         #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
@@ -155,6 +160,7 @@
         pub revents: c_short,
     }
 
+    #[cfg(not(target_os = "aix"))]
     pub struct winsize {
         pub ws_row: c_ushort,
         pub ws_col: c_ushort,
@@ -220,7 +226,7 @@
 pub const SIG_ERR: sighandler_t = !0 as sighandler_t;
 
 cfg_if! {
-    if #[cfg(not(target_os = "nto"))] {
+    if #[cfg(all(not(target_os = "nto"), not(target_os = "aix")))] {
         pub const DT_UNKNOWN: u8 = 0;
         pub const DT_FIFO: u8 = 1;
         pub const DT_CHR: u8 = 2;
@@ -245,9 +251,9 @@
 }
 pub const SIGIOT: c_int = 6;
 
-pub const S_ISUID: crate::mode_t = 0o4000;
-pub const S_ISGID: crate::mode_t = 0o2000;
-pub const S_ISVTX: crate::mode_t = 0o1000;
+pub const S_ISUID: mode_t = 0o4000;
+pub const S_ISGID: mode_t = 0o2000;
+pub const S_ISVTX: mode_t = 0o1000;
 
 cfg_if! {
     if #[cfg(not(any(
@@ -335,7 +341,7 @@
 pub const ATF_USETRAILERS: c_int = 0x10;
 
 cfg_if! {
-    if #[cfg(target_os = "nto")] {
+    if #[cfg(any(target_os = "nto", target_os = "aix"))] {
         pub const FNM_PERIOD: c_int = 1 << 1;
     } else {
         pub const FNM_PERIOD: c_int = 1 << 2;
@@ -346,7 +352,7 @@
 cfg_if! {
     if #[cfg(any(target_os = "illumos", target_os = "solaris",))] {
         pub const FNM_CASEFOLD: c_int = 1 << 3;
-    } else {
+    } else if #[cfg(not(target_os = "aix"))] {
         pub const FNM_CASEFOLD: c_int = 1 << 4;
     }
 }
@@ -375,6 +381,8 @@
         pub const FNM_NOESCAPE: c_int = 1 << 0;
     } else if #[cfg(target_os = "nto")] {
         pub const FNM_NOESCAPE: c_int = 1 << 2;
+    } else if #[cfg(target_os = "aix")] {
+        pub const FNM_NOESCAPE: c_int = 1 << 3;
     } else {
         pub const FNM_NOESCAPE: c_int = 1 << 1;
     }
@@ -559,7 +567,7 @@
 }
 
 cfg_if! {
-    if #[cfg(not(target_env = "gnu"))] {
+    if #[cfg(not(all(target_os = "linux", target_env = "gnu")))] {
         missing! {
             #[cfg_attr(feature = "extra_traits", derive(Debug))]
             pub enum fpos_t {} // FIXME(unix): fill this out with a struct
@@ -666,7 +674,9 @@
     pub fn strtoll(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_longlong;
     pub fn strtoul(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulong;
     pub fn strtoull(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulonglong;
+    #[cfg_attr(target_os = "aix", link_name = "vec_calloc")]
     pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void;
+    #[cfg_attr(target_os = "aix", link_name = "vec_malloc")]
     pub fn malloc(size: size_t) -> *mut c_void;
     pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void;
     pub fn free(p: *mut c_void);
@@ -778,6 +788,7 @@
         link_name = "accept$UNIX2003"
     )]
     #[cfg_attr(target_os = "espidf", link_name = "lwip_accept")]
+    #[cfg_attr(target_os = "aix", link_name = "naccept")]
     pub fn accept(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t) -> c_int;
     #[cfg(not(all(target_arch = "powerpc", target_vendor = "nintendo")))]
     #[cfg_attr(
@@ -785,6 +796,7 @@
         link_name = "getpeername$UNIX2003"
     )]
     #[cfg_attr(target_os = "espidf", link_name = "lwip_getpeername")]
+    #[cfg_attr(target_os = "aix", link_name = "ngetpeername")]
     pub fn getpeername(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t)
         -> c_int;
     #[cfg(not(all(target_arch = "powerpc", target_vendor = "nintendo")))]
@@ -793,9 +805,11 @@
         link_name = "getsockname$UNIX2003"
     )]
     #[cfg_attr(target_os = "espidf", link_name = "lwip_getsockname")]
+    #[cfg_attr(target_os = "aix", link_name = "ngetsockname")]
     pub fn getsockname(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t)
         -> c_int;
     #[cfg_attr(target_os = "espidf", link_name = "lwip_setsockopt")]
+    #[cfg_attr(gnu_time_bits64, link_name = "__setsockopt64")]
     pub fn setsockopt(
         socket: c_int,
         level: c_int,
@@ -858,7 +872,11 @@
         all(target_os = "freebsd", any(freebsd11, freebsd10)),
         link_name = "fstat@FBSD_1.0"
     )]
-    #[cfg_attr(gnu_file_offset_bits64, link_name = "fstat64")]
+    #[cfg_attr(gnu_time_bits64, link_name = "__fstat64_time64")]
+    #[cfg_attr(
+        all(not(gnu_time_bits64), gnu_file_offset_bits64),
+        link_name = "fstat64"
+    )]
     pub fn fstat(fildes: c_int, buf: *mut stat) -> c_int;
 
     pub fn mkdir(path: *const c_char, mode: mode_t) -> c_int;
@@ -872,7 +890,11 @@
         all(target_os = "freebsd", any(freebsd11, freebsd10)),
         link_name = "stat@FBSD_1.0"
     )]
-    #[cfg_attr(gnu_file_offset_bits64, link_name = "stat64")]
+    #[cfg_attr(gnu_time_bits64, link_name = "__stat64_time64")]
+    #[cfg_attr(
+        all(not(gnu_time_bits64), gnu_file_offset_bits64),
+        link_name = "stat64"
+    )]
     pub fn stat(path: *const c_char, buf: *mut stat) -> c_int;
 
     pub fn pclose(stream: *mut crate::FILE) -> c_int;
@@ -899,7 +921,11 @@
         all(target_os = "macos", target_arch = "x86"),
         link_name = "fcntl$UNIX2003"
     )]
-    #[cfg_attr(gnu_file_offset_bits64, link_name = "__fcntl_time64")]
+    #[cfg_attr(gnu_time_bits64, link_name = "__fcntl_time64")]
+    #[cfg_attr(
+        all(not(gnu_time_bits64), gnu_file_offset_bits64),
+        link_name = "__fcntl_time64"
+    )]
     pub fn fcntl(fd: c_int, cmd: c_int, ...) -> c_int;
 
     #[cfg_attr(
@@ -939,12 +965,7 @@
     )]
     pub fn rewinddir(dirp: *mut crate::DIR);
 
-    pub fn fchmodat(
-        dirfd: c_int,
-        pathname: *const c_char,
-        mode: crate::mode_t,
-        flags: c_int,
-    ) -> c_int;
+    pub fn fchmodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, flags: c_int) -> c_int;
     pub fn fchown(fd: c_int, owner: crate::uid_t, group: crate::gid_t) -> c_int;
     pub fn fchownat(
         dirfd: c_int,
@@ -961,7 +982,11 @@
         all(target_os = "freebsd", any(freebsd11, freebsd10)),
         link_name = "fstatat@FBSD_1.1"
     )]
-    #[cfg_attr(gnu_file_offset_bits64, link_name = "fstatat64")]
+    #[cfg_attr(gnu_time_bits64, link_name = "__fstatat64_time64")]
+    #[cfg_attr(
+        all(not(gnu_time_bits64), gnu_file_offset_bits64),
+        link_name = "fstatat64"
+    )]
     pub fn fstatat(dirfd: c_int, pathname: *const c_char, buf: *mut stat, flags: c_int) -> c_int;
     pub fn linkat(
         olddirfd: c_int,
@@ -1066,6 +1091,7 @@
         link_name = "nanosleep$UNIX2003"
     )]
     #[cfg_attr(target_os = "netbsd", link_name = "__nanosleep50")]
+    #[cfg_attr(gnu_time_bits64, link_name = "__nanosleep64")]
     pub fn nanosleep(rqtp: *const timespec, rmtp: *mut timespec) -> c_int;
     pub fn tcgetpgrp(fd: c_int) -> pid_t;
     pub fn tcsetpgrp(fd: c_int, pgrp: crate::pid_t) -> c_int;
@@ -1110,6 +1136,7 @@
     pub fn umask(mask: mode_t) -> mode_t;
 
     #[cfg_attr(target_os = "netbsd", link_name = "__utime50")]
+    #[cfg_attr(gnu_time_bits64, link_name = "__utime64")]
     pub fn utime(file: *const c_char, buf: *const utimbuf) -> c_int;
 
     #[cfg_attr(
@@ -1159,7 +1186,11 @@
         all(target_os = "freebsd", any(freebsd11, freebsd10)),
         link_name = "lstat@FBSD_1.0"
     )]
-    #[cfg_attr(gnu_file_offset_bits64, link_name = "lstat64")]
+    #[cfg_attr(gnu_time_bits64, link_name = "__lstat64_time64")]
+    #[cfg_attr(
+        all(not(gnu_time_bits64), gnu_file_offset_bits64),
+        link_name = "lstat64"
+    )]
     pub fn lstat(path: *const c_char, buf: *mut stat) -> c_int;
 
     #[cfg_attr(
@@ -1190,6 +1221,7 @@
     pub fn signal(signum: c_int, handler: sighandler_t) -> sighandler_t;
 
     #[cfg_attr(target_os = "netbsd", link_name = "__getrusage50")]
+    #[cfg_attr(gnu_time_bits64, link_name = "__getrusage64")]
     pub fn getrusage(resource: c_int, usage: *mut rusage) -> c_int;
 
     #[cfg_attr(
@@ -1265,6 +1297,7 @@
         all(target_os = "macos", target_arch = "x86"),
         link_name = "pthread_cond_timedwait$UNIX2003"
     )]
+    #[cfg_attr(gnu_time_bits64, link_name = "__pthread_cond_timedwait64")]
     pub fn pthread_cond_timedwait(
         cond: *mut pthread_cond_t,
         lock: *mut pthread_mutex_t,
@@ -1321,6 +1354,7 @@
         link_name = "__xnet_getsockopt"
     )]
     #[cfg_attr(target_os = "espidf", link_name = "lwip_getsockopt")]
+    #[cfg_attr(gnu_time_bits64, link_name = "__getsockopt64")]
     pub fn getsockopt(
         sockfd: c_int,
         level: c_int,
@@ -1331,6 +1365,7 @@
     pub fn raise(signum: c_int) -> c_int;
 
     #[cfg_attr(target_os = "netbsd", link_name = "__utimes50")]
+    #[cfg_attr(gnu_time_bits64, link_name = "__utimes64")]
     pub fn utimes(filename: *const c_char, times: *const crate::timeval) -> c_int;
     pub fn dlopen(filename: *const c_char, flag: c_int) -> *mut c_void;
     pub fn dlerror() -> *mut c_char;
@@ -1377,15 +1412,18 @@
         ),
         link_name = "res_9_init"
     )]
+    #[cfg_attr(target_os = "aix", link_name = "_res_init")]
     pub fn res_init() -> c_int;
 
     #[cfg_attr(target_os = "netbsd", link_name = "__gmtime_r50")]
     #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))]
     // FIXME(time): for `time_t`
+    #[cfg_attr(gnu_time_bits64, link_name = "__gmtime64_r")]
     pub fn gmtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm;
     #[cfg_attr(target_os = "netbsd", link_name = "__localtime_r50")]
     #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))]
     // FIXME(time): for `time_t`
+    #[cfg_attr(gnu_time_bits64, link_name = "__localtime64_r")]
     pub fn localtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm;
     #[cfg_attr(
         all(target_os = "macos", target_arch = "x86"),
@@ -1394,26 +1432,33 @@
     #[cfg_attr(target_os = "netbsd", link_name = "__mktime50")]
     #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))]
     // FIXME: for `time_t`
+    #[cfg_attr(gnu_time_bits64, link_name = "__mktime64")]
     pub fn mktime(tm: *mut tm) -> time_t;
     #[cfg_attr(target_os = "netbsd", link_name = "__time50")]
     #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))]
     // FIXME: for `time_t`
+    #[cfg_attr(gnu_time_bits64, link_name = "__time64")]
     pub fn time(time: *mut time_t) -> time_t;
     #[cfg_attr(target_os = "netbsd", link_name = "__gmtime50")]
     #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))]
     // FIXME(time): for `time_t`
+    #[cfg_attr(gnu_time_bits64, link_name = "__gmtime64")]
     pub fn gmtime(time_p: *const time_t) -> *mut tm;
     #[cfg_attr(target_os = "netbsd", link_name = "__locatime50")]
     #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))]
     // FIXME(time): for `time_t`
+    #[cfg_attr(gnu_time_bits64, link_name = "__localtime64")]
     pub fn localtime(time_p: *const time_t) -> *mut tm;
     #[cfg_attr(target_os = "netbsd", link_name = "__difftime50")]
     #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))]
     // FIXME(time): for `time_t`
+    #[cfg_attr(gnu_time_bits64, link_name = "__difftime64")]
     pub fn difftime(time1: time_t, time0: time_t) -> c_double;
+    #[cfg(not(target_os = "aix"))]
     #[cfg_attr(target_os = "netbsd", link_name = "__timegm50")]
     #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))]
     // FIXME(time): for `time_t`
+    #[cfg_attr(gnu_time_bits64, link_name = "__timegm64")]
     pub fn timegm(tm: *mut crate::tm) -> time_t;
 
     #[cfg_attr(target_os = "netbsd", link_name = "__mknod50")]
@@ -1421,7 +1466,7 @@
         all(target_os = "freebsd", any(freebsd11, freebsd10)),
         link_name = "mknod@FBSD_1.0"
     )]
-    pub fn mknod(pathname: *const c_char, mode: crate::mode_t, dev: crate::dev_t) -> c_int;
+    pub fn mknod(pathname: *const c_char, mode: mode_t, dev: crate::dev_t) -> c_int;
     pub fn gethostname(name: *mut c_char, len: size_t) -> c_int;
     pub fn endservent();
     pub fn getservbyname(name: *const c_char, proto: *const c_char) -> *mut servent;
@@ -1471,6 +1516,8 @@
         link_name = "select$UNIX2003"
     )]
     #[cfg_attr(target_os = "netbsd", link_name = "__select50")]
+    #[cfg_attr(target_os = "aix", link_name = "__fd_select")]
+    #[cfg_attr(gnu_time_bits64, link_name = "__select64")]
     pub fn select(
         nfds: c_int,
         readfds: *mut fd_set,
@@ -1556,6 +1603,7 @@
     pub fn ptsname(fd: c_int) -> *mut c_char;
     pub fn unlockpt(fd: c_int) -> c_int;
 
+    #[cfg(not(target_os = "aix"))]
     pub fn strcasestr(cs: *const c_char, ct: *const c_char) -> *mut c_char;
     pub fn getline(lineptr: *mut *mut c_char, n: *mut size_t, stream: *mut FILE) -> ssize_t;
 
@@ -1588,9 +1636,11 @@
         target_os = "haiku",
         target_os = "nto",
         target_os = "solaris",
-        target_os = "cygwin"
+        target_os = "cygwin",
+        target_os = "aix",
     )))] {
         extern "C" {
+            #[cfg_attr(gnu_time_bits64, link_name = "__adjtime64")]
             pub fn adjtime(delta: *const timeval, olddelta: *mut timeval) -> c_int;
         }
     } else if #[cfg(target_os = "solaris")] {
@@ -1659,7 +1709,7 @@
             )]
             pub fn pause() -> c_int;
 
-            pub fn mkdirat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int;
+            pub fn mkdirat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int;
             #[cfg_attr(gnu_file_offset_bits64, link_name = "openat64")]
             pub fn openat(dirfd: c_int, pathname: *const c_char, flags: c_int, ...) -> c_int;
 
@@ -1744,6 +1794,7 @@
                 link_name = "pselect$UNIX2003"
             )]
             #[cfg_attr(target_os = "netbsd", link_name = "__pselect50")]
+            #[cfg_attr(gnu_time_bits64, link_name = "__pselect64")]
             pub fn pselect(
                 nfds: c_int,
                 readfds: *mut fd_set,
@@ -1757,7 +1808,12 @@
 }
 
 cfg_if! {
-    if #[cfg(not(any(
+    if #[cfg(target_os = "aix")] {
+        extern "C" {
+            pub fn cfmakeraw(termios: *mut crate::termios) -> c_int;
+            pub fn cfsetspeed(termios: *mut crate::termios, speed: crate::speed_t) -> c_int;
+        }
+    } else if #[cfg(not(any(
         target_os = "solaris",
         target_os = "illumos",
         target_os = "nto",
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/newlib/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/newlib/mod.rs
index ae118b4..d49bdb3 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/newlib/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/newlib/mod.rs
@@ -568,28 +568,28 @@
 pub const FIOCLEX: c_ulong = 0x20006601;
 pub const FIONCLEX: c_ulong = 0x20006602;
 
-pub const S_BLKSIZE: crate::mode_t = 1024;
-pub const S_IREAD: crate::mode_t = 0o0400;
-pub const S_IWRITE: crate::mode_t = 0o0200;
-pub const S_IEXEC: crate::mode_t = 0o0100;
-pub const S_ENFMT: crate::mode_t = 0o2000;
-pub const S_IFMT: crate::mode_t = 0o17_0000;
-pub const S_IFDIR: crate::mode_t = 0o4_0000;
-pub const S_IFCHR: crate::mode_t = 0o2_0000;
-pub const S_IFBLK: crate::mode_t = 0o6_0000;
-pub const S_IFREG: crate::mode_t = 0o10_0000;
-pub const S_IFLNK: crate::mode_t = 0o12_0000;
-pub const S_IFSOCK: crate::mode_t = 0o14_0000;
-pub const S_IFIFO: crate::mode_t = 0o1_0000;
-pub const S_IRUSR: crate::mode_t = 0o0400;
-pub const S_IWUSR: crate::mode_t = 0o0200;
-pub const S_IXUSR: crate::mode_t = 0o0100;
-pub const S_IRGRP: crate::mode_t = 0o0040;
-pub const S_IWGRP: crate::mode_t = 0o0020;
-pub const S_IXGRP: crate::mode_t = 0o0010;
-pub const S_IROTH: crate::mode_t = 0o0004;
-pub const S_IWOTH: crate::mode_t = 0o0002;
-pub const S_IXOTH: crate::mode_t = 0o0001;
+pub const S_BLKSIZE: mode_t = 1024;
+pub const S_IREAD: mode_t = 0o0400;
+pub const S_IWRITE: mode_t = 0o0200;
+pub const S_IEXEC: mode_t = 0o0100;
+pub const S_ENFMT: mode_t = 0o2000;
+pub const S_IFMT: mode_t = 0o17_0000;
+pub const S_IFDIR: mode_t = 0o4_0000;
+pub const S_IFCHR: mode_t = 0o2_0000;
+pub const S_IFBLK: mode_t = 0o6_0000;
+pub const S_IFREG: mode_t = 0o10_0000;
+pub const S_IFLNK: mode_t = 0o12_0000;
+pub const S_IFSOCK: mode_t = 0o14_0000;
+pub const S_IFIFO: mode_t = 0o1_0000;
+pub const S_IRUSR: mode_t = 0o0400;
+pub const S_IWUSR: mode_t = 0o0200;
+pub const S_IXUSR: mode_t = 0o0100;
+pub const S_IRGRP: mode_t = 0o0040;
+pub const S_IWGRP: mode_t = 0o0020;
+pub const S_IXGRP: mode_t = 0o0010;
+pub const S_IROTH: mode_t = 0o0004;
+pub const S_IWOTH: mode_t = 0o0002;
+pub const S_IXOTH: mode_t = 0o0001;
 
 pub const SOL_TCP: c_int = 6;
 
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nto/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nto/mod.rs
index e0a1c9b..581b99e6 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nto/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nto/mod.rs
@@ -98,7 +98,7 @@
         pub __old_st_mtime: crate::_Time32t,
         pub __old_st_atime: crate::_Time32t,
         pub __old_st_ctime: crate::_Time32t,
-        pub st_mode: crate::mode_t,
+        pub st_mode: mode_t,
         pub st_nlink: crate::nlink_t,
         pub st_blocksize: crate::blksize_t,
         pub st_nblocks: i32,
@@ -563,7 +563,7 @@
         pub gid: crate::gid_t,
         pub cuid: crate::uid_t,
         pub cgid: crate::gid_t,
-        pub mode: crate::mode_t,
+        pub mode: mode_t,
         pub seq: c_uint,
         pub key: crate::key_t,
         _reserved: [c_int; 4],
@@ -811,16 +811,6 @@
             }
         }
         impl Eq for sigevent {}
-        impl fmt::Debug for sigevent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sigevent")
-                    .field("sigev_notify", &self.sigev_notify)
-                    .field("sigev_signo", &self.sigev_signo)
-                    .field("sigev_value", &self.sigev_value)
-                    .field("__sigev_un2", &self.__sigev_un2)
-                    .finish()
-            }
-        }
         impl hash::Hash for sigevent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sigev_notify.hash(state);
@@ -842,15 +832,6 @@
             }
         }
         impl Eq for sockaddr_un {}
-        impl fmt::Debug for sockaddr_un {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_un")
-                    .field("sun_len", &self.sun_len)
-                    .field("sun_family", &self.sun_family)
-                    // FIXME(debug): .field("sun_path", &self.sun_path)
-                    .finish()
-            }
-        }
 
         impl hash::Hash for sockaddr_un {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
@@ -867,13 +848,6 @@
             }
         }
         impl Eq for sigset_t {}
-        impl fmt::Debug for sigset_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sigset_t")
-                    .field("__val", &self.__val)
-                    .finish()
-            }
-        }
         impl hash::Hash for sigset_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.__val.hash(state);
@@ -881,50 +855,10 @@
         }
 
         // msg
-        impl fmt::Debug for msg {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("msg")
-                    .field("msg_next", &self.msg_next)
-                    .field("msg_type", &self.msg_type)
-                    .field("msg_ts", &self.msg_ts)
-                    .field("msg_spot", &self.msg_spot)
-                    .finish()
-            }
-        }
 
         // msqid_ds
-        impl fmt::Debug for msqid_ds {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("msqid_ds")
-                    .field("msg_perm", &self.msg_perm)
-                    .field("msg_first", &self.msg_first)
-                    .field("msg_cbytes", &self.msg_cbytes)
-                    .field("msg_qnum", &self.msg_qnum)
-                    .field("msg_qbytes", &self.msg_qbytes)
-                    .field("msg_lspid", &self.msg_lspid)
-                    .field("msg_lrpid", &self.msg_lrpid)
-                    .field("msg_stime", &self.msg_stime)
-                    .field("msg_rtime", &self.msg_rtime)
-                    .field("msg_ctime", &self.msg_ctime)
-                    .finish()
-            }
-        }
 
         // sockaddr_dl
-        impl fmt::Debug for sockaddr_dl {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_dl")
-                    .field("sdl_len", &self.sdl_len)
-                    .field("sdl_family", &self.sdl_family)
-                    .field("sdl_index", &self.sdl_index)
-                    .field("sdl_type", &self.sdl_type)
-                    .field("sdl_nlen", &self.sdl_nlen)
-                    .field("sdl_alen", &self.sdl_alen)
-                    .field("sdl_slen", &self.sdl_slen)
-                    .field("sdl_data", &self.sdl_data)
-                    .finish()
-            }
-        }
         impl PartialEq for sockaddr_dl {
             fn eq(&self, other: &sockaddr_dl) -> bool {
                 self.sdl_len == other.sdl_len
@@ -955,73 +889,6 @@
             }
         }
 
-        // sync_t
-        impl fmt::Debug for sync_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sync_t")
-                    .field("__owner", &self.__owner)
-                    .field("__u", &self.__u)
-                    .finish()
-            }
-        }
-
-        // pthread_barrier_t
-        impl fmt::Debug for pthread_barrier_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_barrier_t")
-                    .field("__pad", &self.__pad)
-                    .finish()
-            }
-        }
-
-        // pthread_rwlock_t
-        impl fmt::Debug for pthread_rwlock_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("pthread_rwlock_t")
-                    .field("__active", &self.__active)
-                    .field("__blockedwriters", &self.__blockedwriters)
-                    .field("__blockedreaders", &self.__blockedreaders)
-                    .field("__heavy", &self.__heavy)
-                    .field("__lock", &self.__lock)
-                    .field("__rcond", &self.__rcond)
-                    .field("__wcond", &self.__wcond)
-                    .field("__owner", &self.__owner)
-                    .field("__spare", &self.__spare)
-                    .finish()
-            }
-        }
-
-        // syspage_entry
-        impl fmt::Debug for syspage_entry {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("syspage_entry")
-                    .field("size", &self.size)
-                    .field("total_size", &self.total_size)
-                    .field("type_", &self.type_)
-                    .field("num_cpu", &self.num_cpu)
-                    .field("system_private", &self.system_private)
-                    .field("old_asinfo", &self.old_asinfo)
-                    .field("hwinfo", &self.hwinfo)
-                    .field("old_cpuinfo", &self.old_cpuinfo)
-                    .field("old_cacheattr", &self.old_cacheattr)
-                    .field("qtime", &self.qtime)
-                    .field("callout", &self.callout)
-                    .field("callin", &self.callin)
-                    .field("typed_strings", &self.typed_strings)
-                    .field("strings", &self.strings)
-                    .field("old_intrinfo", &self.old_intrinfo)
-                    .field("smp", &self.smp)
-                    .field("pminfo", &self.pminfo)
-                    .field("old_mdriver", &self.old_mdriver)
-                    .field("new_asinfo", &self.new_asinfo)
-                    .field("new_cpuinfo", &self.new_cpuinfo)
-                    .field("new_cacheattr", &self.new_cacheattr)
-                    .field("new_intrinfo", &self.new_intrinfo)
-                    .field("new_mdriver", &self.new_mdriver)
-                    .finish()
-            }
-        }
-
         impl PartialEq for utsname {
             fn eq(&self, other: &utsname) -> bool {
                 self.sysname
@@ -1053,18 +920,6 @@
 
         impl Eq for utsname {}
 
-        impl fmt::Debug for utsname {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utsname")
-                    // FIXME(debug): .field("sysname", &self.sysname)
-                    // FIXME(debug): .field("nodename", &self.nodename)
-                    // FIXME(debug): .field("release", &self.release)
-                    // FIXME(debug): .field("version", &self.version)
-                    // FIXME(debug): .field("machine", &self.machine)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for utsname {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sysname.hash(state);
@@ -1089,19 +944,6 @@
 
         impl Eq for mq_attr {}
 
-        impl fmt::Debug for mq_attr {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mq_attr")
-                    .field("mq_maxmsg", &self.mq_maxmsg)
-                    .field("mq_msgsize", &self.mq_msgsize)
-                    .field("mq_flags", &self.mq_flags)
-                    .field("mq_curmsgs", &self.mq_curmsgs)
-                    .field("mq_msgsize", &self.mq_msgsize)
-                    .field("mq_sendwait", &self.mq_sendwait)
-                    .field("mq_recvwait", &self.mq_recvwait)
-                    .finish()
-            }
-        }
         impl hash::Hash for mq_attr {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.mq_maxmsg.hash(state);
@@ -1129,18 +971,6 @@
 
         impl Eq for sockaddr_storage {}
 
-        impl fmt::Debug for sockaddr_storage {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_storage")
-                    .field("ss_len", &self.ss_len)
-                    .field("ss_family", &self.ss_family)
-                    .field("__ss_pad1", &self.__ss_pad1)
-                    .field("__ss_align", &self.__ss_align)
-                    // FIXME(debug): .field("__ss_pad2", &self.__ss_pad2)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for sockaddr_storage {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ss_len.hash(state);
@@ -1166,18 +996,6 @@
 
         impl Eq for dirent {}
 
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_ino", &self.d_ino)
-                    .field("d_offset", &self.d_offset)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_namelen", &self.d_namelen)
-                    .field("d_name", &&self.d_name[..self.d_namelen as _])
-                    .finish()
-            }
-        }
-
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_ino.hash(state);
@@ -2175,27 +1993,27 @@
 pub const S_IWRITE: mode_t = crate::S_IWUSR;
 pub const S_IREAD: mode_t = crate::S_IRUSR;
 
-pub const S_IFIFO: crate::mode_t = 0o1_0000;
-pub const S_IFCHR: crate::mode_t = 0o2_0000;
-pub const S_IFDIR: crate::mode_t = 0o4_0000;
-pub const S_IFBLK: crate::mode_t = 0o6_0000;
-pub const S_IFREG: crate::mode_t = 0o10_0000;
-pub const S_IFLNK: crate::mode_t = 0o12_0000;
-pub const S_IFSOCK: crate::mode_t = 0o14_0000;
-pub const S_IFMT: crate::mode_t = 0o17_0000;
+pub const S_IFIFO: mode_t = 0o1_0000;
+pub const S_IFCHR: mode_t = 0o2_0000;
+pub const S_IFDIR: mode_t = 0o4_0000;
+pub const S_IFBLK: mode_t = 0o6_0000;
+pub const S_IFREG: mode_t = 0o10_0000;
+pub const S_IFLNK: mode_t = 0o12_0000;
+pub const S_IFSOCK: mode_t = 0o14_0000;
+pub const S_IFMT: mode_t = 0o17_0000;
 
-pub const S_IXOTH: crate::mode_t = 0o0001;
-pub const S_IWOTH: crate::mode_t = 0o0002;
-pub const S_IROTH: crate::mode_t = 0o0004;
-pub const S_IRWXO: crate::mode_t = 0o0007;
-pub const S_IXGRP: crate::mode_t = 0o0010;
-pub const S_IWGRP: crate::mode_t = 0o0020;
-pub const S_IRGRP: crate::mode_t = 0o0040;
-pub const S_IRWXG: crate::mode_t = 0o0070;
-pub const S_IXUSR: crate::mode_t = 0o0100;
-pub const S_IWUSR: crate::mode_t = 0o0200;
-pub const S_IRUSR: crate::mode_t = 0o0400;
-pub const S_IRWXU: crate::mode_t = 0o0700;
+pub const S_IXOTH: mode_t = 0o0001;
+pub const S_IWOTH: mode_t = 0o0002;
+pub const S_IROTH: mode_t = 0o0004;
+pub const S_IRWXO: mode_t = 0o0007;
+pub const S_IXGRP: mode_t = 0o0010;
+pub const S_IWGRP: mode_t = 0o0020;
+pub const S_IRGRP: mode_t = 0o0040;
+pub const S_IRWXG: mode_t = 0o0070;
+pub const S_IXUSR: mode_t = 0o0100;
+pub const S_IWUSR: mode_t = 0o0200;
+pub const S_IRUSR: mode_t = 0o0400;
+pub const S_IRWXU: mode_t = 0o0700;
 
 pub const F_LOCK: c_int = 1;
 pub const F_TEST: c_int = 3;
@@ -2802,7 +2620,7 @@
         if (*mhdr).msg_controllen as usize >= mem::size_of::<cmsghdr>() {
             (*mhdr).msg_control as *mut cmsghdr
         } else {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         }
     }
 
@@ -2810,7 +2628,7 @@
         let msg = _CMSG_ALIGN((*cmsg).cmsg_len as usize);
         let next = cmsg as usize + msg + _CMSG_ALIGN(mem::size_of::<cmsghdr>());
         if next > (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         } else {
             (cmsg as usize + msg) as *mut cmsghdr
         }
@@ -2982,13 +2800,8 @@
     pub fn fdatasync(fd: c_int) -> c_int;
     pub fn getpriority(which: c_int, who: crate::id_t) -> c_int;
     pub fn setpriority(which: c_int, who: crate::id_t, prio: c_int) -> c_int;
-    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int;
-    pub fn mknodat(
-        __fd: c_int,
-        pathname: *const c_char,
-        mode: crate::mode_t,
-        dev: crate::dev_t,
-    ) -> c_int;
+    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int;
+    pub fn mknodat(__fd: c_int, pathname: *const c_char, mode: mode_t, dev: crate::dev_t) -> c_int;
 
     pub fn clock_getres(clk_id: crate::clockid_t, tp: *mut crate::timespec) -> c_int;
     pub fn clock_gettime(clk_id: crate::clockid_t, tp: *mut crate::timespec) -> c_int;
@@ -3361,7 +3174,7 @@
         fd: c_int,
         path: *const c_char,
         oflag: c_int,
-        mode: crate::mode_t,
+        mode: mode_t,
     ) -> c_int;
     pub fn posix_spawn_file_actions_addclose(
         actions: *mut posix_spawn_file_actions_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nuttx/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nuttx/mod.rs
index 015a2ba..de734f9e 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nuttx/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nuttx/mod.rs
@@ -591,4 +591,6 @@
     pub fn pthread_setname_np(thread: pthread_t, name: *const c_char) -> i32;
     pub fn pthread_getname_np(thread: pthread_t, name: *mut c_char, len: usize) -> i32;
     pub fn getrandom(buf: *mut c_void, buflen: usize, flags: u32) -> isize;
+    pub fn arc4random() -> u32;
+    pub fn arc4random_buf(bytes: *mut c_void, nbytes: usize);
 }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/redox/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/redox/mod.rs
index d7ed748..859cdccd 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/redox/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/redox/mod.rs
@@ -196,7 +196,7 @@
         pub st_dev: crate::dev_t,
         pub st_ino: crate::ino_t,
         pub st_nlink: crate::nlink_t,
-        pub st_mode: crate::mode_t,
+        pub st_mode: mode_t,
         pub st_uid: crate::uid_t,
         pub st_gid: crate::gid_t,
         pub st_rdev: crate::dev_t,
@@ -661,14 +661,14 @@
 pub const SIGSYS: c_int = 31;
 pub const NSIG: c_int = 32;
 
-pub const SA_NOCLDSTOP: c_ulong = 0x00000001;
-pub const SA_NOCLDWAIT: c_ulong = 0x00000002;
-pub const SA_SIGINFO: c_ulong = 0x00000004;
-pub const SA_RESTORER: c_ulong = 0x04000000;
-pub const SA_ONSTACK: c_ulong = 0x08000000;
-pub const SA_RESTART: c_ulong = 0x10000000;
-pub const SA_NODEFER: c_ulong = 0x40000000;
-pub const SA_RESETHAND: c_ulong = 0x80000000;
+pub const SA_NOCLDWAIT: c_ulong = 0x0000_0002;
+pub const SA_RESTORER: c_ulong = 0x0000_0004; // FIXME(redox): remove after relibc removes it
+pub const SA_SIGINFO: c_ulong = 0x0200_0000;
+pub const SA_ONSTACK: c_ulong = 0x0400_0000;
+pub const SA_RESTART: c_ulong = 0x0800_0000;
+pub const SA_NODEFER: c_ulong = 0x1000_0000;
+pub const SA_RESETHAND: c_ulong = 0x2000_0000;
+pub const SA_NOCLDSTOP: c_ulong = 0x4000_0000;
 
 // sys/file.h
 pub const LOCK_SH: c_int = 1;
@@ -782,6 +782,7 @@
 pub const MSG_TRUNC: c_int = 32;
 pub const MSG_DONTWAIT: c_int = 64;
 pub const MSG_WAITALL: c_int = 256;
+pub const SCM_RIGHTS: c_int = 1;
 pub const SHUT_RD: c_int = 0;
 pub const SHUT_WR: c_int = 1;
 pub const SHUT_RDWR: c_int = 2;
@@ -1014,8 +1015,19 @@
 pub const PRIO_PGRP: c_int = 1;
 pub const PRIO_USER: c_int = 2;
 
-// wait.h
 f! {
+    //sys/socket.h
+    pub {const} fn CMSG_ALIGN(len: size_t) -> size_t {
+        (len + mem::size_of::<size_t>() - 1) & !(mem::size_of::<size_t>() - 1)
+    }
+    pub {const} fn CMSG_LEN(length: c_uint) -> c_uint {
+        (CMSG_ALIGN(mem::size_of::<cmsghdr>()) + length as usize) as c_uint
+    }
+    pub {const} fn CMSG_SPACE(len: c_uint) -> c_uint {
+        (CMSG_ALIGN(len as size_t) + CMSG_ALIGN(mem::size_of::<cmsghdr>())) as c_uint
+    }
+
+    // wait.h
     pub fn FD_CLR(fd: c_int, set: *mut fd_set) -> () {
         let fd = fd as usize;
         let size = mem::size_of_val(&(*set).fds_bits[0]) * 8;
@@ -1228,12 +1240,9 @@
     pub fn setrlimit(resource: c_int, rlim: *const crate::rlimit) -> c_int;
 
     // sys/socket.h
-    pub fn CMSG_ALIGN(len: size_t) -> size_t;
     pub fn CMSG_DATA(cmsg: *const cmsghdr) -> *mut c_uchar;
     pub fn CMSG_FIRSTHDR(mhdr: *const msghdr) -> *mut cmsghdr;
-    pub fn CMSG_LEN(len: c_uint) -> c_uint;
     pub fn CMSG_NXTHDR(mhdr: *const msghdr, cmsg: *const cmsghdr) -> *mut cmsghdr;
-    pub fn CMSG_SPACE(len: c_uint) -> c_uint;
     pub fn bind(
         socket: c_int,
         address: *const crate::sockaddr,
@@ -1249,31 +1258,13 @@
     ) -> ssize_t;
     pub fn recvmsg(socket: c_int, msg: *mut msghdr, flags: c_int) -> ssize_t;
     pub fn sendmsg(socket: c_int, msg: *const msghdr, flags: c_int) -> ssize_t;
-    pub fn sendto(
-        socket: c_int,
-        buf: *const c_void,
-        len: size_t,
-        flags: c_int,
-        addr: *const crate::sockaddr,
-        addrlen: crate::socklen_t,
-    ) -> ssize_t;
 
     // sys/stat.h
     pub fn futimens(fd: c_int, times: *const crate::timespec) -> c_int;
 
     // sys/uio.h
-    pub fn preadv(
-        fd: c_int,
-        iov: *const crate::iovec,
-        iovcnt: c_int,
-        offset: off_t,
-    ) -> ssize_t;
-    pub fn pwritev(
-        fd: c_int,
-        iov: *const crate::iovec,
-        iovcnt: c_int,
-        offset: off_t,
-    ) -> ssize_t;
+    pub fn preadv(fd: c_int, iov: *const crate::iovec, iovcnt: c_int, offset: off_t) -> ssize_t;
+    pub fn pwritev(fd: c_int, iov: *const crate::iovec, iovcnt: c_int, offset: off_t) -> ssize_t;
     pub fn readv(fd: c_int, iov: *const crate::iovec, iovcnt: c_int) -> ssize_t;
     pub fn writev(fd: c_int, iov: *const crate::iovec, iovcnt: c_int) -> ssize_t;
 
@@ -1306,18 +1297,6 @@
 
         impl Eq for dirent {}
 
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_ino", &self.d_ino)
-                    .field("d_off", &self.d_off)
-                    .field("d_reclen", &self.d_reclen)
-                    .field("d_type", &self.d_type)
-                    // FIXME(debug): .field("d_name", &self.d_name)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for dirent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.d_ino.hash(state);
@@ -1341,15 +1320,6 @@
 
         impl Eq for sockaddr_un {}
 
-        impl fmt::Debug for sockaddr_un {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_un")
-                    .field("sun_family", &self.sun_family)
-                    // FIXME(debug): .field("sun_path", &self.sun_path)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for sockaddr_un {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sun_family.hash(state);
@@ -1371,16 +1341,6 @@
 
         impl Eq for sockaddr_storage {}
 
-        impl fmt::Debug for sockaddr_storage {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_storage")
-                    .field("ss_family", &self.ss_family)
-                    .field("__ss_align", &self.__ss_align)
-                    // FIXME(debug): .field("__ss_padding", &self.__ss_padding)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for sockaddr_storage {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ss_family.hash(state);
@@ -1425,19 +1385,6 @@
 
         impl Eq for utsname {}
 
-        impl fmt::Debug for utsname {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utsname")
-                    // FIXME(debug): .field("sysname", &self.sysname)
-                    // FIXME(debug): .field("nodename", &self.nodename)
-                    // FIXME(debug): .field("release", &self.release)
-                    // FIXME(debug): .field("version", &self.version)
-                    // FIXME(debug): .field("machine", &self.machine)
-                    // FIXME(debug): .field("domainname", &self.domainname)
-                    .finish()
-            }
-        }
-
         impl hash::Hash for utsname {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sysname.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/compat.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/compat.rs
index 649d6ac..22bcf12e 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/compat.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/compat.rs
@@ -5,9 +5,6 @@
 use crate::unix::solarish::*;
 use crate::{c_char, c_int, size_t};
 
-const PTEM: &[u8] = b"ptem\0";
-const LDTERM: &[u8] = b"ldterm\0";
-
 pub unsafe fn cfmakeraw(termios: *mut crate::termios) {
     (*termios).c_iflag &=
         !(IMAXBEL | IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
@@ -41,6 +38,7 @@
     0
 }
 
+#[cfg(target_os = "illumos")]
 unsafe fn bail(fdm: c_int, fds: c_int) -> c_int {
     let e = *___errno();
     if fds >= 0 {
@@ -50,7 +48,7 @@
         crate::close(fdm);
     }
     *___errno() = e;
-    return -1;
+    -1
 }
 
 #[cfg(target_os = "illumos")]
@@ -61,6 +59,9 @@
     termp: *const termios,
     winp: *const crate::winsize,
 ) -> c_int {
+    const PTEM: &[u8] = b"ptem\0";
+    const LDTERM: &[u8] = b"ldterm\0";
+
     // Open the main pseudo-terminal device, making sure not to set it as the
     // controlling terminal for this process:
     let fdm = crate::posix_openpt(O_RDWR | O_NOCTTY);
@@ -184,7 +185,7 @@
 ) -> c_int {
     let old_errno = *crate::___errno();
     *crate::___errno() = 0;
-    *result = native_getpwent_r(pwd, buf, min(buflen, c_int::max_value() as size_t) as c_int);
+    *result = native_getpwent_r(pwd, buf, min(buflen, c_int::MAX as size_t) as c_int);
 
     let ret = if (*result).is_null() {
         *crate::___errno()
@@ -204,7 +205,7 @@
 ) -> c_int {
     let old_errno = *crate::___errno();
     *crate::___errno() = 0;
-    *result = native_getgrent_r(grp, buf, min(buflen, c_int::max_value() as size_t) as c_int);
+    *result = native_getgrent_r(grp, buf, min(buflen, c_int::MAX as size_t) as c_int);
 
     let ret = if (*result).is_null() {
         *crate::___errno()
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/illumos.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/illumos.rs
index 3cb68e4..fbeadaf 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/illumos.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/illumos.rs
@@ -89,24 +89,6 @@
 
         impl Eq for utmpx {}
 
-        impl fmt::Debug for utmpx {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utmpx")
-                    .field("ut_user", &self.ut_user)
-                    .field("ut_id", &self.ut_id)
-                    .field("ut_line", &self.ut_line)
-                    .field("ut_pid", &self.ut_pid)
-                    .field("ut_type", &self.ut_type)
-                    .field("ut_exit", &self.ut_exit)
-                    .field("ut_tv", &self.ut_tv)
-                    .field("ut_session", &self.ut_session)
-                    .field("ut_pad", &self.ut_pad)
-                    .field("ut_syslen", &self.ut_syslen)
-                    .field("ut_host", &&self.ut_host[..])
-                    .finish()
-            }
-        }
-
         impl hash::Hash for utmpx {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ut_user.hash(state);
@@ -129,16 +111,6 @@
             }
         }
         impl Eq for epoll_event {}
-        impl fmt::Debug for epoll_event {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                let events = self.events;
-                let u64 = self.u64;
-                f.debug_struct("epoll_event")
-                    .field("events", &events)
-                    .field("u64", &u64)
-                    .finish()
-            }
-        }
         impl hash::Hash for epoll_event {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 let events = self.events;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/mod.rs
index 3ddde8d..9f90c4c 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/mod.rs
@@ -96,7 +96,7 @@
         pub gid: crate::gid_t,
         pub cuid: crate::uid_t,
         pub cgid: crate::gid_t,
-        pub mode: crate::mode_t,
+        pub mode: mode_t,
         pub seq: c_uint,
         pub key: crate::key_t,
     }
@@ -328,7 +328,7 @@
     pub struct stat {
         pub st_dev: crate::dev_t,
         pub st_ino: crate::ino_t,
-        pub st_mode: crate::mode_t,
+        pub st_mode: mode_t,
         pub st_nlink: crate::nlink_t,
         pub st_uid: crate::uid_t,
         pub st_gid: crate::gid_t,
@@ -585,14 +585,6 @@
             }
         }
         impl Eq for sockaddr_un {}
-        impl fmt::Debug for sockaddr_un {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_un")
-                    .field("sun_family", &self.sun_family)
-                    // FIXME(debug): .field("sun_path", &self.sun_path)
-                    .finish()
-            }
-        }
         impl hash::Hash for sockaddr_un {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sun_family.hash(state);
@@ -629,17 +621,6 @@
             }
         }
         impl Eq for utsname {}
-        impl fmt::Debug for utsname {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utsname")
-                    // FIXME(debug): .field("sysname", &self.sysname)
-                    // FIXME(debug): .field("nodename", &self.nodename)
-                    // FIXME(debug): .field("release", &self.release)
-                    // FIXME(debug): .field("version", &self.version)
-                    // FIXME(debug): .field("machine", &self.machine)
-                    .finish()
-            }
-        }
         impl hash::Hash for utsname {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sysname.hash(state);
@@ -659,13 +640,6 @@
             }
         }
         impl Eq for fd_set {}
-        impl fmt::Debug for fd_set {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("fd_set")
-                    // FIXME(debug): .field("fds_bits", &self.fds_bits)
-                    .finish()
-            }
-        }
         impl hash::Hash for fd_set {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.fds_bits.hash(state);
@@ -685,16 +659,6 @@
             }
         }
         impl Eq for sockaddr_storage {}
-        impl fmt::Debug for sockaddr_storage {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_storage")
-                    .field("ss_family", &self.ss_family)
-                    .field("__ss_pad1", &self.__ss_pad1)
-                    .field("__ss_align", &self.__ss_align)
-                    // FIXME(debug): .field("__ss_pad2", &self.__ss_pad2)
-                    .finish()
-            }
-        }
         impl hash::Hash for sockaddr_storage {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ss_family.hash(state);
@@ -754,16 +718,6 @@
             }
         }
         impl Eq for siginfo_t {}
-        impl fmt::Debug for siginfo_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("siginfo_t")
-                    .field("si_signo", &self.si_signo)
-                    .field("si_code", &self.si_code)
-                    .field("si_errno", &self.si_errno)
-                    // FIXME(debug): .field("__pad", &self.__pad)
-                    .finish()
-            }
-        }
         impl hash::Hash for siginfo_t {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.si_signo.hash(state);
@@ -794,19 +748,6 @@
             }
         }
         impl Eq for sockaddr_dl {}
-        impl fmt::Debug for sockaddr_dl {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_dl")
-                    .field("sdl_family", &self.sdl_family)
-                    .field("sdl_index", &self.sdl_index)
-                    .field("sdl_type", &self.sdl_type)
-                    .field("sdl_nlen", &self.sdl_nlen)
-                    .field("sdl_alen", &self.sdl_alen)
-                    .field("sdl_slen", &self.sdl_slen)
-                    // FIXME(debug): .field("sdl_data", &self.sdl_data)
-                    .finish()
-            }
-        }
         impl hash::Hash for sockaddr_dl {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sdl_family.hash(state);
@@ -829,17 +770,6 @@
             }
         }
         impl Eq for sigevent {}
-        impl fmt::Debug for sigevent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sigevent")
-                    .field("sigev_notify", &self.sigev_notify)
-                    .field("sigev_signo", &self.sigev_signo)
-                    .field("sigev_value", &self.sigev_value)
-                    .field("ss_sp", &self.ss_sp)
-                    .field("sigev_notify_attributes", &self.sigev_notify_attributes)
-                    .finish()
-            }
-        }
         impl hash::Hash for sigevent {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.sigev_notify.hash(state);
@@ -2483,7 +2413,7 @@
 
     pub fn CMSG_FIRSTHDR(mhdr: *const crate::msghdr) -> *mut cmsghdr {
         if ((*mhdr).msg_controllen as usize) < size_of::<cmsghdr>() {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         } else {
             (*mhdr).msg_control as *mut cmsghdr
         }
@@ -2497,7 +2427,7 @@
             _CMSG_HDR_ALIGN(cmsg as usize + (*cmsg).cmsg_len as usize + size_of::<cmsghdr>());
         let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize;
         if next > max {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         } else {
             _CMSG_HDR_ALIGN(cmsg as usize + (*cmsg).cmsg_len as usize) as *mut cmsghdr
         }
@@ -2648,9 +2578,8 @@
     pub fn getpriority(which: c_int, who: c_int) -> c_int;
     pub fn setpriority(which: c_int, who: c_int, prio: c_int) -> c_int;
 
-    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t)
-        -> c_int;
-    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int;
+    pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int;
+    pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int;
     pub fn sethostname(name: *const c_char, len: c_int) -> c_int;
     pub fn if_nameindex() -> *mut if_nameindex;
     pub fn if_freenameindex(ptr: *mut if_nameindex);
@@ -2727,7 +2656,7 @@
         fildes: c_int,
         path: *const c_char,
         oflag: c_int,
-        mode: crate::mode_t,
+        mode: mode_t,
     ) -> c_int;
     pub fn posix_spawn_file_actions_addclose(
         file_actions: *mut posix_spawn_file_actions_t,
@@ -2810,7 +2739,7 @@
 
     pub fn shmget(key: key_t, size: size_t, shmflg: c_int) -> c_int;
 
-    pub fn shm_open(name: *const c_char, oflag: c_int, mode: crate::mode_t) -> c_int;
+    pub fn shm_open(name: *const c_char, oflag: c_int, mode: mode_t) -> c_int;
     pub fn shm_unlink(name: *const c_char) -> c_int;
 
     pub fn seekdir(dirp: *mut crate::DIR, loc: c_long);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/solaris.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/solaris.rs
index 7baa8a1..097ff1c 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/solaris.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/solaris.rs
@@ -125,24 +125,6 @@
 
         impl Eq for utmpx {}
 
-        impl fmt::Debug for utmpx {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("utmpx")
-                    .field("ut_user", &self.ut_user)
-                    .field("ut_id", &self.ut_id)
-                    .field("ut_line", &self.ut_line)
-                    .field("ut_pid", &self.ut_pid)
-                    .field("ut_type", &self.ut_type)
-                    .field("ut_exit", &self.ut_exit)
-                    .field("ut_tv", &self.ut_tv)
-                    .field("ut_session", &self.ut_session)
-                    .field("pad", &self.pad)
-                    .field("ut_syslen", &self.ut_syslen)
-                    .field("ut_host", &&self.ut_host[..])
-                    .finish()
-            }
-        }
-
         impl hash::Hash for utmpx {
             fn hash<H: hash::Hasher>(&self, state: &mut H) {
                 self.ut_user.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/x86_64.rs
index 4deaac0f..a45ca4b7 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/x86_64.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/x86_64.rs
@@ -91,7 +91,9 @@
         #[cfg(target_os = "solaris")]
         pub uc_xrs: solaris::xrs_t,
         #[cfg(target_os = "solaris")]
-        pub uc_filler: [c_long; 3],
+        pub uc_lwpid: c_uint,
+        #[cfg(target_os = "solaris")]
+        pub uc_filler: [c_long; 2],
     }
 }
 
@@ -116,27 +118,12 @@
             }
         }
         impl Eq for fpregset_t {}
-        impl fmt::Debug for fpregset_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("fpregset_t")
-                    .field("fp_reg_set", &self.fp_reg_set)
-                    .finish()
-            }
-        }
         impl PartialEq for mcontext_t {
             fn eq(&self, other: &mcontext_t) -> bool {
                 self.gregs == other.gregs && self.fpregs == other.fpregs
             }
         }
         impl Eq for mcontext_t {}
-        impl fmt::Debug for mcontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("mcontext_t")
-                    .field("gregs", &self.gregs)
-                    .field("fpregs", &self.fpregs)
-                    .finish()
-            }
-        }
         impl PartialEq for ucontext_t {
             fn eq(&self, other: &ucontext_t) -> bool {
                 self.uc_flags == other.uc_flags
@@ -148,18 +135,6 @@
             }
         }
         impl Eq for ucontext_t {}
-        impl fmt::Debug for ucontext_t {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("ucontext_t")
-                    .field("uc_flags", &self.uc_flags)
-                    .field("uc_link", &self.uc_link)
-                    .field("uc_sigmask", &self.uc_sigmask)
-                    .field("uc_stack", &self.uc_stack)
-                    .field("uc_mcontext", &self.uc_mcontext)
-                    .field("uc_filler", &self.uc_filler)
-                    .finish()
-            }
-        }
     }
 }
 
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/vxworks/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/vxworks/mod.rs
index 3a44adc..deef310d 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/vxworks/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/vxworks/mod.rs
@@ -220,7 +220,7 @@
     pub struct stat {
         pub st_dev: crate::dev_t,
         pub st_ino: crate::ino_t,
-        pub st_mode: crate::mode_t,
+        pub st_mode: mode_t,
         pub st_nlink: crate::nlink_t,
         pub st_uid: crate::uid_t,
         pub st_gid: crate::gid_t,
@@ -454,53 +454,6 @@
 
 cfg_if! {
     if #[cfg(feature = "extra_traits")] {
-        impl fmt::Debug for dirent {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("dirent")
-                    .field("d_ino", &self.d_ino)
-                    .field("d_name", &&self.d_name[..])
-                    .field("d_type", &self.d_type)
-                    .finish()
-            }
-        }
-
-        impl fmt::Debug for sockaddr_un {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_un")
-                    .field("sun_len", &self.sun_len)
-                    .field("sun_family", &self.sun_family)
-                    .field("sun_path", &&self.sun_path[..])
-                    .finish()
-            }
-        }
-
-        impl fmt::Debug for RTP_DESC {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("RTP_DESC")
-                    .field("status", &self.status)
-                    .field("options", &self.options)
-                    .field("entrAddr", &self.entrAddr)
-                    .field("initTaskId", &self.initTaskId)
-                    .field("parentId", &self.parentId)
-                    .field("pathName", &&self.pathName[..])
-                    .field("taskCnt", &self.taskCnt)
-                    .field("textStart", &self.textStart)
-                    .field("textEnd", &self.textEnd)
-                    .finish()
-            }
-        }
-        impl fmt::Debug for sockaddr_storage {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.debug_struct("sockaddr_storage")
-                    .field("ss_len", &self.ss_len)
-                    .field("ss_family", &self.ss_family)
-                    .field("__ss_pad1", &&self.__ss_pad1[..])
-                    .field("__ss_align", &self.__ss_align)
-                    .field("__ss_pad2", &&self.__ss_pad2[..])
-                    .finish()
-            }
-        }
-
         impl PartialEq for sa_u_t {
             fn eq(&self, other: &sa_u_t) -> bool {
                 unsafe {
@@ -745,6 +698,7 @@
 
 // FIXME(vxworks): could also be useful for TASK_DESC type
 pub const VX_TASK_NAME_LENGTH: c_int = 31;
+pub const VX_TASK_RENAME_LENGTH: c_int = 16;
 
 // semLibCommon.h
 pub const S_semLib_INVALID_STATE: c_int = semErrorBase + 0x0065;
@@ -806,6 +760,9 @@
 pub const S_IXOTH: c_int = 0o0001;
 pub const S_IRWXO: c_int = 0o0007;
 
+pub const UTIME_OMIT: c_long = 0x3ffffffe;
+pub const UTIME_NOW: c_long = 0x3fffffff;
+
 // socket.h
 pub const SOL_SOCKET: c_int = 0xffff;
 pub const SOMAXCONN: c_int = 128;
@@ -1128,7 +1085,7 @@
         if next <= max {
             (cmsg as usize + CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr
         } else {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         }
     }
 
@@ -1136,7 +1093,7 @@
         if (*mhdr).msg_controllen as usize > 0 {
             (*mhdr).msg_control as *mut cmsghdr
         } else {
-            0 as *mut cmsghdr
+            core::ptr::null_mut::<cmsghdr>()
         }
     }
 
@@ -1299,7 +1256,7 @@
     pub fn msync(addr: *mut c_void, len: size_t, flags: c_int) -> c_int;
 
     pub fn truncate(path: *const c_char, length: off_t) -> c_int;
-    pub fn shm_open(name: *const c_char, oflag: c_int, mode: crate::mode_t) -> c_int;
+    pub fn shm_open(name: *const c_char, oflag: c_int, mode: mode_t) -> c_int;
     pub fn shm_unlink(name: *const c_char) -> c_int;
 
     pub fn gettimeofday(tp: *mut crate::timeval, tz: *mut c_void) -> c_int;
@@ -1810,13 +1767,13 @@
     pub fn rmdir(path: *const c_char) -> c_int;
 
     // stat.h
-    pub fn mkdir(dirName: *const c_char, mode: crate::mode_t) -> c_int;
+    pub fn mkdir(dirName: *const c_char, mode: mode_t) -> c_int;
 
     // stat.h
-    pub fn chmod(path: *const c_char, mode: crate::mode_t) -> c_int;
+    pub fn chmod(path: *const c_char, mode: mode_t) -> c_int;
 
     // stat.h
-    pub fn fchmod(attr1: c_int, attr2: crate::mode_t) -> c_int;
+    pub fn fchmod(attr1: c_int, attr2: mode_t) -> c_int;
 
     // unistd.h
     pub fn fsync(fd: c_int) -> c_int;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/wasi/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/wasi/mod.rs
index 035ff895..61061918 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/wasi/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/wasi/mod.rs
@@ -653,7 +653,7 @@
         newpath: *const c_char,
         flags: c_int,
     ) -> c_int;
-    pub fn mkdirat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int;
+    pub fn mkdirat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int;
     pub fn readlinkat(
         dirfd: c_int,
         pathname: *const c_char,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/windows/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/windows/mod.rs
index 06cab0e5..5cafc85 100644
--- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/windows/mod.rs
+++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/windows/mod.rs
@@ -382,12 +382,30 @@
     pub fn signal(signum: c_int, handler: sighandler_t) -> sighandler_t;
     pub fn raise(signum: c_int) -> c_int;
 
+    pub fn clock() -> clock_t;
+    pub fn ctime(sourceTime: *const time_t) -> *mut c_char;
+    pub fn difftime(timeEnd: time_t, timeStart: time_t) -> c_double;
     #[link_name = "_gmtime64_s"]
     pub fn gmtime_s(destTime: *mut tm, srcTime: *const time_t) -> c_int;
+    #[link_name = "_get_daylight"]
+    pub fn get_daylight(hours: *mut c_int) -> errno_t;
+    #[link_name = "_get_dstbias"]
+    pub fn get_dstbias(seconds: *mut c_long) -> errno_t;
+    #[link_name = "_get_timezone"]
+    pub fn get_timezone(seconds: *mut c_long) -> errno_t;
+    #[link_name = "_get_tzname"]
+    pub fn get_tzname(
+        p_return_value: *mut size_t,
+        time_zone_name: *mut c_char,
+        size_in_bytes: size_t,
+        index: c_int,
+    ) -> errno_t;
     #[link_name = "_localtime64_s"]
     pub fn localtime_s(tmDest: *mut tm, sourceTime: *const time_t) -> crate::errno_t;
     #[link_name = "_time64"]
     pub fn time(destTime: *mut time_t) -> time_t;
+    #[link_name = "_tzset"]
+    pub fn tzset();
     #[link_name = "_chmod"]
     pub fn chmod(path: *const c_char, mode: c_int) -> c_int;
     #[link_name = "_wchmod"]
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/syn-v2/.cargo_vcs_info.json
index 26a2a29..a20d321 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-v2/.cargo_vcs_info.json
+++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/.cargo_vcs_info.json
@@ -1,6 +1,6 @@
 {
   "git": {
-    "sha1": "b1cc55995dc2ff30ffdf10fc428f9df0bb85f28d"
+    "sha1": "85d427679f81de7abba97bedf6be990417ce77cc"
   },
   "path_in_vcs": ""
 }
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.lock
index 7d156136..f03e04f8 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.lock
@@ -43,7 +43,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.101",
+ "syn 2.0.102",
 ]
 
 [[package]]
@@ -170,7 +170,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.101",
+ "syn 2.0.102",
 ]
 
 [[package]]
@@ -326,7 +326,7 @@
 dependencies = [
  "cfg-if",
  "libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
+ "wasi 0.11.1+wasi-snapshot-preview1",
 ]
 
 [[package]]
@@ -687,9 +687,9 @@
 
 [[package]]
 name = "memchr"
-version = "2.7.4"
+version = "2.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
+checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
 
 [[package]]
 name = "mime"
@@ -713,7 +713,7 @@
 checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
 dependencies = [
  "libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
+ "wasi 0.11.1+wasi-snapshot-preview1",
  "windows-sys 0.59.0",
 ]
 
@@ -772,7 +772,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.101",
+ "syn 2.0.102",
 ]
 
 [[package]]
@@ -872,9 +872,9 @@
 
 [[package]]
 name = "redox_syscall"
-version = "0.5.12"
+version = "0.5.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af"
+checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6"
 dependencies = [
  "bitflags",
 ]
@@ -896,14 +896,14 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.101",
+ "syn 2.0.102",
 ]
 
 [[package]]
 name = "reqwest"
-version = "0.12.19"
+version = "0.12.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2f8e5513d63f2e5b386eb5106dc67eaf3f84e95258e210489136b8b92ad6119"
+checksum = "eabf4c97d9130e2bf606614eb937e86edac8292eaa6f422f995d7e8de1eb1813"
 dependencies = [
  "base64",
  "bytes",
@@ -919,12 +919,10 @@
  "hyper-rustls",
  "hyper-tls",
  "hyper-util",
- "ipnet",
  "js-sys",
  "log",
  "mime",
  "native-tls",
- "once_cell",
  "percent-encoding",
  "pin-project-lite",
  "rustls-pki-types",
@@ -1079,7 +1077,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.101",
+ "syn 2.0.102",
 ]
 
 [[package]]
@@ -1157,9 +1155,9 @@
 
 [[package]]
 name = "syn"
-version = "2.0.101"
+version = "2.0.102"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
+checksum = "f6397daf94fa90f058bd0fd88429dd9e5738999cca8d701813c80723add80462"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1168,7 +1166,7 @@
 
 [[package]]
 name = "syn"
-version = "2.0.102"
+version = "2.0.103"
 dependencies = [
  "anyhow",
  "automod",
@@ -1210,7 +1208,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.101",
+ "syn 2.0.102",
 ]
 
 [[package]]
@@ -1451,9 +1449,9 @@
 
 [[package]]
 name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
+version = "0.11.1+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
 
 [[package]]
 name = "wasi"
@@ -1486,7 +1484,7 @@
  "log",
  "proc-macro2",
  "quote",
- "syn 2.0.101",
+ "syn 2.0.102",
  "wasm-bindgen-shared",
 ]
 
@@ -1521,7 +1519,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.101",
+ "syn 2.0.102",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -1556,9 +1554,9 @@
 
 [[package]]
 name = "windows-link"
-version = "0.1.1"
+version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
+checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
 
 [[package]]
 name = "windows-registry"
@@ -1716,7 +1714,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.101",
+ "syn 2.0.102",
  "synstructure",
 ]
 
@@ -1737,7 +1735,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.101",
+ "syn 2.0.102",
  "synstructure",
 ]
 
@@ -1777,5 +1775,5 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.101",
+ "syn 2.0.102",
 ]
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml
index d704b49e..9af47ea 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml
@@ -13,7 +13,7 @@
 edition = "2021"
 rust-version = "1.61"
 name = "syn"
-version = "2.0.102"
+version = "2.0.103"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 build = false
 include = [
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml.orig
index 218cd928..9317df48 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "syn"
-version = "2.0.102"
+version = "2.0.103"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 categories = ["development-tools::procedural-macro-helpers", "parser-implementations"]
 description = "Parser for Rust source code"
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/src/expr.rs b/third_party/rust/chromium_crates_io/vendor/syn-v2/src/expr.rs
index b59bc76a..551a3f33 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-v2/src/expr.rs
+++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/src/expr.rs
@@ -3287,17 +3287,35 @@
     }
 
     #[cfg(feature = "full")]
-    fn print_expr_assign(e: &ExprAssign, tokens: &mut TokenStream, fixup: FixupContext) {
+    fn print_expr_assign(e: &ExprAssign, tokens: &mut TokenStream, mut fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
-        let (left_prec, left_fixup) =
-            fixup.leftmost_subexpression_with_operator(&e.left, false, false, Precedence::Assign);
-        print_subexpression(&e.left, left_prec <= Precedence::Range, tokens, left_fixup);
-        e.eq_token.to_tokens(tokens);
-        print_expr(
-            &e.right,
-            tokens,
-            fixup.rightmost_subexpression_fixup(false, false, Precedence::Assign),
-        );
+
+        let needs_group = !e.attrs.is_empty();
+        if needs_group {
+            fixup = FixupContext::NONE;
+        }
+
+        let do_print_expr = |tokens: &mut TokenStream| {
+            let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator(
+                &e.left,
+                false,
+                false,
+                Precedence::Assign,
+            );
+            print_subexpression(&e.left, left_prec <= Precedence::Range, tokens, left_fixup);
+            e.eq_token.to_tokens(tokens);
+            print_expr(
+                &e.right,
+                tokens,
+                fixup.rightmost_subexpression_fixup(false, false, Precedence::Assign),
+            );
+        };
+
+        if needs_group {
+            token::Paren::default().surround(tokens, do_print_expr);
+        } else {
+            do_print_expr(tokens);
+        }
     }
 
     #[cfg(feature = "full")]
@@ -3340,51 +3358,64 @@
         }
     }
 
-    fn print_expr_binary(e: &ExprBinary, tokens: &mut TokenStream, fixup: FixupContext) {
+    fn print_expr_binary(e: &ExprBinary, tokens: &mut TokenStream, mut fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
 
-        let binop_prec = Precedence::of_binop(&e.op);
-        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator(
-            &e.left,
-            #[cfg(feature = "full")]
-            match &e.op {
-                BinOp::Sub(_)
-                | BinOp::Mul(_)
-                | BinOp::And(_)
-                | BinOp::Or(_)
-                | BinOp::BitAnd(_)
-                | BinOp::BitOr(_)
-                | BinOp::Shl(_)
-                | BinOp::Lt(_) => true,
-                _ => false,
-            },
-            match &e.op {
-                BinOp::Shl(_) | BinOp::Lt(_) => true,
-                _ => false,
-            },
-            #[cfg(feature = "full")]
-            binop_prec,
-        );
-        let left_needs_group = match binop_prec {
-            Precedence::Assign => left_prec <= Precedence::Range,
-            Precedence::Compare => left_prec <= binop_prec,
-            _ => left_prec < binop_prec,
+        let needs_group = !e.attrs.is_empty();
+        if needs_group {
+            fixup = FixupContext::NONE;
+        }
+
+        let do_print_expr = |tokens: &mut TokenStream| {
+            let binop_prec = Precedence::of_binop(&e.op);
+            let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator(
+                &e.left,
+                #[cfg(feature = "full")]
+                match &e.op {
+                    BinOp::Sub(_)
+                    | BinOp::Mul(_)
+                    | BinOp::And(_)
+                    | BinOp::Or(_)
+                    | BinOp::BitAnd(_)
+                    | BinOp::BitOr(_)
+                    | BinOp::Shl(_)
+                    | BinOp::Lt(_) => true,
+                    _ => false,
+                },
+                match &e.op {
+                    BinOp::Shl(_) | BinOp::Lt(_) => true,
+                    _ => false,
+                },
+                #[cfg(feature = "full")]
+                binop_prec,
+            );
+            let left_needs_group = match binop_prec {
+                Precedence::Assign => left_prec <= Precedence::Range,
+                Precedence::Compare => left_prec <= binop_prec,
+                _ => left_prec < binop_prec,
+            };
+
+            let right_fixup = fixup.rightmost_subexpression_fixup(
+                #[cfg(feature = "full")]
+                false,
+                #[cfg(feature = "full")]
+                false,
+                #[cfg(feature = "full")]
+                binop_prec,
+            );
+            let right_needs_group = binop_prec != Precedence::Assign
+                && right_fixup.rightmost_subexpression_precedence(&e.right) <= binop_prec;
+
+            print_subexpression(&e.left, left_needs_group, tokens, left_fixup);
+            e.op.to_tokens(tokens);
+            print_subexpression(&e.right, right_needs_group, tokens, right_fixup);
         };
 
-        let right_fixup = fixup.rightmost_subexpression_fixup(
-            #[cfg(feature = "full")]
-            false,
-            #[cfg(feature = "full")]
-            false,
-            #[cfg(feature = "full")]
-            binop_prec,
-        );
-        let right_needs_group = binop_prec != Precedence::Assign
-            && right_fixup.rightmost_subexpression_precedence(&e.right) <= binop_prec;
-
-        print_subexpression(&e.left, left_needs_group, tokens, left_fixup);
-        e.op.to_tokens(tokens);
-        print_subexpression(&e.right, right_needs_group, tokens, right_fixup);
+        if needs_group {
+            token::Paren::default().surround(tokens, do_print_expr);
+        } else {
+            do_print_expr(tokens);
+        }
     }
 
     #[cfg(feature = "full")]
@@ -3462,19 +3493,33 @@
         }
     }
 
-    fn print_expr_cast(e: &ExprCast, tokens: &mut TokenStream, fixup: FixupContext) {
+    fn print_expr_cast(e: &ExprCast, tokens: &mut TokenStream, mut fixup: FixupContext) {
         outer_attrs_to_tokens(&e.attrs, tokens);
-        let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator(
-            &e.expr,
-            #[cfg(feature = "full")]
-            false,
-            false,
-            #[cfg(feature = "full")]
-            Precedence::Cast,
-        );
-        print_subexpression(&e.expr, left_prec < Precedence::Cast, tokens, left_fixup);
-        e.as_token.to_tokens(tokens);
-        e.ty.to_tokens(tokens);
+
+        let needs_group = !e.attrs.is_empty();
+        if needs_group {
+            fixup = FixupContext::NONE;
+        }
+
+        let do_print_expr = |tokens: &mut TokenStream| {
+            let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator(
+                &e.expr,
+                #[cfg(feature = "full")]
+                false,
+                false,
+                #[cfg(feature = "full")]
+                Precedence::Cast,
+            );
+            print_subexpression(&e.expr, left_prec < Precedence::Cast, tokens, left_fixup);
+            e.as_token.to_tokens(tokens);
+            e.ty.to_tokens(tokens);
+        };
+
+        if needs_group {
+            token::Paren::default().surround(tokens, do_print_expr);
+        } else {
+            do_print_expr(tokens);
+        }
     }
 
     #[cfg(feature = "full")]
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/src/fixup.rs b/third_party/rust/chromium_crates_io/vendor/syn-v2/src/fixup.rs
index b0973df2..5dfc257 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-v2/src/fixup.rs
+++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/src/fixup.rs
@@ -510,7 +510,7 @@
         return consume_by_precedence;
     }
     match expr {
-        Expr::Assign(e) => {
+        Expr::Assign(e) if e.attrs.is_empty() => {
             if match fixup.next_operator {
                 Precedence::Unambiguous => fail_offset >= 2,
                 _ => bailout_offset >= 1,
@@ -536,7 +536,7 @@
                 Scan::Bailout
             }
         }
-        Expr::Binary(e) => {
+        Expr::Binary(e) if e.attrs.is_empty() => {
             if match fixup.next_operator {
                 Precedence::Unambiguous => {
                     fail_offset >= 2
@@ -732,8 +732,10 @@
             }
         }
         Expr::Array(_)
+        | Expr::Assign(_)
         | Expr::Async(_)
         | Expr::Await(_)
+        | Expr::Binary(_)
         | Expr::Block(_)
         | Expr::Call(_)
         | Expr::Cast(_)
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/syn-v2/src/lib.rs
index b2fe1f8c..7e88f58 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-v2/src/lib.rs
+++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/src/lib.rs
@@ -249,7 +249,7 @@
 //!   dynamic library libproc_macro from rustc toolchain.
 
 // Syn types in rustdoc of other crates get linked to here.
-#![doc(html_root_url = "https://docs.rs/syn/2.0.102")]
+#![doc(html_root_url = "https://docs.rs/syn/2.0.103")]
 #![cfg_attr(docsrs, feature(doc_cfg))]
 #![deny(unsafe_op_in_unsafe_fn)]
 #![allow(non_camel_case_types)]
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/common/visit.rs b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/common/visit.rs
index b4ae5ec..2d2a6c5 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/common/visit.rs
+++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/common/visit.rs
@@ -3,9 +3,23 @@
 use syn::visit_mut::{self, VisitMut};
 use syn::{Expr, File, Generics, LifetimeParam, MacroDelimiter, Stmt, StmtMacro, TypeParam};
 
-pub struct FlattenParens;
+pub struct FlattenParens {
+    discard_paren_attrs: bool,
+}
 
 impl FlattenParens {
+    pub fn discard_attrs() -> Self {
+        FlattenParens {
+            discard_paren_attrs: true,
+        }
+    }
+
+    pub fn combine_attrs() -> Self {
+        FlattenParens {
+            discard_paren_attrs: false,
+        }
+    }
+
     pub fn visit_token_stream_mut(tokens: &mut TokenStream) {
         *tokens = mem::take(tokens)
             .into_iter()
@@ -30,7 +44,18 @@
 impl VisitMut for FlattenParens {
     fn visit_expr_mut(&mut self, e: &mut Expr) {
         while let Expr::Paren(paren) = e {
+            let paren_attrs = mem::take(&mut paren.attrs);
             *e = mem::replace(&mut *paren.expr, Expr::PLACEHOLDER);
+            if !paren_attrs.is_empty() && !self.discard_paren_attrs {
+                let nested_attrs = match e {
+                    Expr::Assign(e) => &mut e.attrs,
+                    Expr::Binary(e) => &mut e.attrs,
+                    Expr::Cast(e) => &mut e.attrs,
+                    _ => unimplemented!(),
+                };
+                assert!(nested_attrs.is_empty());
+                *nested_attrs = paren_attrs;
+            }
         }
         visit_mut::visit_expr_mut(self, e);
     }
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_expr.rs b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_expr.rs
index 5203ec0..100b8a8 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_expr.rs
+++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_expr.rs
@@ -830,6 +830,11 @@
         quote! { (1 < 2) == (3 < 4) },
         quote! { { (let _ = ()) } },
         quote! { (#[attr] thing).field },
+        quote! { #[attr] (1 + 1) },
+        quote! { #[attr] (x = 1) },
+        quote! { #[attr] (x += 1) },
+        quote! { #[attr] (1 as T) },
+        quote! { (return #[attr] (x + ..)).field },
         quote! { (self.f)() },
         quote! { (return)..=return },
         quote! { 1 + (return)..=1 + return },
@@ -838,7 +843,7 @@
         let original: Expr = syn::parse2(tokens).unwrap();
 
         let mut flat = original.clone();
-        FlattenParens.visit_expr_mut(&mut flat);
+        FlattenParens::combine_attrs().visit_expr_mut(&mut flat);
         let reconstructed: Expr = match syn::parse2(flat.to_token_stream()) {
             Ok(reconstructed) => reconstructed,
             Err(err) => panic!("failed to parse `{}`: {}", flat.to_token_stream(), err),
@@ -1615,7 +1620,7 @@
             );
         };
         AsIfPrinted.visit_expr_mut(&mut original);
-        FlattenParens.visit_expr_mut(&mut parsed);
+        FlattenParens::combine_attrs().visit_expr_mut(&mut parsed);
         if original != parsed {
             fail!(
                 "before: {}\n{:#?}\nafter: {}\n{:#?}",
@@ -1629,7 +1634,7 @@
         FlattenParens::visit_token_stream_mut(&mut tokens_no_paren);
         if tokens.to_string() != tokens_no_paren.to_string() {
             if let Ok(mut parsed2) = syn::parse2::<Expr>(tokens_no_paren) {
-                FlattenParens.visit_expr_mut(&mut parsed2);
+                FlattenParens::combine_attrs().visit_expr_mut(&mut parsed2);
                 if original == parsed2 {
                     fail!("redundant parens: {}", tokens);
                 }
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_round_trip.rs b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_round_trip.rs
index 42869ed0..3657da2 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_round_trip.rs
+++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_round_trip.rs
@@ -27,10 +27,9 @@
 use crate::common::eq::SpanlessEq;
 use quote::quote;
 use rustc_ast::ast::{
-    AngleBracketedArg, AngleBracketedArgs, Crate, GenericArg, GenericParamKind, Generics,
-    WhereClause,
+    AngleBracketedArg, Crate, GenericArg, GenericArgs, GenericParamKind, Generics,
 };
-use rustc_ast::mut_visit::MutVisitor;
+use rustc_ast::mut_visit::{self, MutVisitor};
 use rustc_ast_pretty::pprust;
 use rustc_data_structures::flat_map_in_place::FlatMapInPlace;
 use rustc_error_messages::{DiagMessage, LazyFallbackBundle};
@@ -207,28 +206,23 @@
     struct NormalizeVisitor;
 
     impl MutVisitor for NormalizeVisitor {
-        fn visit_angle_bracketed_parameter_data(&mut self, e: &mut AngleBracketedArgs) {
-            #[derive(Ord, PartialOrd, Eq, PartialEq)]
-            enum Group {
-                Lifetimes,
-                TypesAndConsts,
-                Constraints,
-            }
-            e.args.sort_by_key(|arg| match arg {
-                AngleBracketedArg::Arg(arg) => match arg {
-                    GenericArg::Lifetime(_) => Group::Lifetimes,
-                    GenericArg::Type(_) | GenericArg::Const(_) => Group::TypesAndConsts,
-                },
-                AngleBracketedArg::Constraint(_) => Group::Constraints,
-            });
-            for arg in &mut e.args {
-                match arg {
-                    AngleBracketedArg::Arg(arg) => self.visit_generic_arg(arg),
-                    AngleBracketedArg::Constraint(constraint) => {
-                        self.visit_assoc_item_constraint(constraint);
-                    }
+        fn visit_generic_args(&mut self, e: &mut GenericArgs) {
+            if let GenericArgs::AngleBracketed(e) = e {
+                #[derive(Ord, PartialOrd, Eq, PartialEq)]
+                enum Group {
+                    Lifetimes,
+                    TypesAndConsts,
+                    Constraints,
                 }
+                e.args.sort_by_key(|arg| match arg {
+                    AngleBracketedArg::Arg(arg) => match arg {
+                        GenericArg::Lifetime(_) => Group::Lifetimes,
+                        GenericArg::Type(_) | GenericArg::Const(_) => Group::TypesAndConsts,
+                    },
+                    AngleBracketedArg::Constraint(_) => Group::Constraints,
+                });
             }
+            mut_visit::walk_generic_args(self, e);
         }
 
         fn visit_generics(&mut self, e: &mut Generics) {
@@ -245,12 +239,8 @@
             });
             e.params
                 .flat_map_in_place(|param| self.flat_map_generic_param(param));
-            self.visit_where_clause(&mut e.where_clause);
-        }
-
-        fn visit_where_clause(&mut self, e: &mut WhereClause) {
-            if e.predicates.is_empty() {
-                e.has_where_token = false;
+            if e.where_clause.predicates.is_empty() {
+                e.where_clause.has_where_token = false;
             }
         }
     }
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_unparenthesize.rs b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_unparenthesize.rs
index ece2c2e..5fa2e59e 100644
--- a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_unparenthesize.rs
+++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_unparenthesize.rs
@@ -43,10 +43,10 @@
 
     match panic::catch_unwind(|| -> syn::Result<()> {
         let mut before = syn::parse_file(&content)?;
-        FlattenParens.visit_file_mut(&mut before);
+        FlattenParens::discard_attrs().visit_file_mut(&mut before);
         let printed = before.to_token_stream();
         let mut after = syn::parse2::<syn::File>(printed.clone())?;
-        FlattenParens.visit_file_mut(&mut after);
+        FlattenParens::discard_attrs().visit_file_mut(&mut after);
         // Normalize features that we expect Syn not to print.
         AsIfPrinted.visit_file_mut(&mut before);
         if before != after {
diff --git a/third_party/rust/libc/v0_2/BUILD.gn b/third_party/rust/libc/v0_2/BUILD.gn
index b36fbef..8143cbf 100644
--- a/third_party/rust/libc/v0_2/BUILD.gn
+++ b/third_party/rust/libc/v0_2/BUILD.gn
@@ -203,7 +203,7 @@
   cargo_pkg_authors = "The Rust Project Developers"
   cargo_pkg_name = "libc"
   cargo_pkg_description = "Raw FFI bindings to platform libraries like libc."
-  cargo_pkg_version = "0.2.172"
+  cargo_pkg_version = "0.2.173"
 
   allow_unsafe = true
 
diff --git a/third_party/rust/libc/v0_2/README.chromium b/third_party/rust/libc/v0_2/README.chromium
index 07a3567..eb12c98 100644
--- a/third_party/rust/libc/v0_2/README.chromium
+++ b/third_party/rust/libc/v0_2/README.chromium
@@ -1,11 +1,10 @@
 Name: libc
 URL: https://crates.io/crates/libc
-Version: 0.2.172
-Revision: a5eab581f9c9c03f29e3edd4a4d4f850d748f2e9
+Version: 0.2.173
+Revision: 9288ec0123086439f27ea47a2b120345e6007e24
 License: Apache-2.0
 License File: //third_party/rust/chromium_crates_io/vendor/libc-v0_2/LICENSE-APACHE
 Shipped: yes
 Security Critical: yes
 
 Description: Raw FFI bindings to platform libraries like libc.
-
diff --git a/third_party/rust/syn/v2/BUILD.gn b/third_party/rust/syn/v2/BUILD.gn
index db797d8a..4e9b925 100644
--- a/third_party/rust/syn/v2/BUILD.gn
+++ b/third_party/rust/syn/v2/BUILD.gn
@@ -77,7 +77,7 @@
   cargo_pkg_authors = "David Tolnay <dtolnay@gmail.com>"
   cargo_pkg_name = "syn"
   cargo_pkg_description = "Parser for Rust source code"
-  cargo_pkg_version = "2.0.102"
+  cargo_pkg_version = "2.0.103"
 
   allow_unsafe = true
 
diff --git a/third_party/rust/syn/v2/README.chromium b/third_party/rust/syn/v2/README.chromium
index 4177b6c..b15e391 100644
--- a/third_party/rust/syn/v2/README.chromium
+++ b/third_party/rust/syn/v2/README.chromium
@@ -1,7 +1,7 @@
 Name: syn
 URL: https://crates.io/crates/syn
-Version: 2.0.102
-Revision: b1cc55995dc2ff30ffdf10fc428f9df0bb85f28d
+Version: 2.0.103
+Revision: 85d427679f81de7abba97bedf6be990417ce77cc
 License: Apache-2.0
 License File: //third_party/rust/chromium_crates_io/vendor/syn-v2/LICENSE-APACHE
 Shipped: yes
diff --git a/third_party/skia b/third_party/skia
index dc1958e..6d29cd6 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit dc1958e7118c351cef5adae548337f7f11746b95
+Subproject commit 6d29cd66e2059acd5491a733c2c7dfd3c4f8b2f6
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps
index 3395378..8d1a39b 160000
--- a/third_party/vulkan-deps
+++ b/third_party/vulkan-deps
@@ -1 +1 @@
-Subproject commit 3395378f6990e79066b5f1647f6f8ac5de07e26d
+Subproject commit 8d1a39bd39e47a078f784e038d4561d2cfdc5f21
diff --git a/third_party/vulkan-loader/src b/third_party/vulkan-loader/src
index 22c0f13..7ef1581 160000
--- a/third_party/vulkan-loader/src
+++ b/third_party/vulkan-loader/src
@@ -1 +1 @@
-Subproject commit 22c0f133e6675f9313c12fb5e58337f8fa9b9195
+Subproject commit 7ef1581a996ba3ac58ae739fd7bfcf24d3bf2a57
diff --git a/third_party/vulkan-validation-layers/src b/third_party/vulkan-validation-layers/src
index 3fa19fc..1c9f820 160000
--- a/third_party/vulkan-validation-layers/src
+++ b/third_party/vulkan-validation-layers/src
@@ -1 +1 @@
-Subproject commit 3fa19fccc75171a6b607f95510c37739c606b809
+Subproject commit 1c9f8202b87119b23c81dad7f44cba2b8bc79180
diff --git a/third_party/webpagereplay b/third_party/webpagereplay
index 18172a3..e463cb4 160000
--- a/third_party/webpagereplay
+++ b/third_party/webpagereplay
@@ -1 +1 @@
-Subproject commit 18172a359f6dab8e3f70b6c5c8c7c55d3e97537a
+Subproject commit e463cb47fd355a21463d0f567ee78c0316e198d6
diff --git a/third_party/webrtc b/third_party/webrtc
index 2f61be1..b98efd4 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit 2f61be11629916ec0d3f083ef16b85113ee1db54
+Subproject commit b98efd4b57d927b119a0c5fd70181c423d179339
diff --git a/tools/binary_size/sizes.gni b/tools/binary_size/sizes.gni
index 7a99c11..b9053d8a 100644
--- a/tools/binary_size/sizes.gni
+++ b/tools/binary_size/sizes.gni
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/clang/clang.gni")
 import("//build/util/generate_wrapper.gni")
 if (is_mac) {
   import("//build/config/mac/mac_sdk.gni")
@@ -26,16 +27,21 @@
     if (defined(invoker.executable_args)) {
       executable_args += invoker.executable_args
     }
+
+    if (!defined(data)) {
+      data = []
+    }
+    data += [
+      "${clang_base_path}/bin/llvm-strip",
+      "${clang_base_path}/bin/llvm-objcopy",
+    ]
+
     if (is_mac) {
       executable_args += [
         "--size-path",
         mac_bin_path + "size",
       ]
 
-      if (!defined(data)) {
-        data = []
-      }
-
       # 'size' is a symlink to 'llvm-size', so throw both in there, but don't
       # add the entire bin path since it's large.
       data += [
diff --git a/tools/binary_size/sizes.py b/tools/binary_size/sizes.py
index 77abc008..0daccb64 100755
--- a/tools/binary_size/sizes.py
+++ b/tools/binary_size/sizes.py
@@ -59,17 +59,16 @@
 
 
 def get_linux_stripped_size(filename):
-  EU_STRIP_NAME = 'eu-strip'
   # Assumes |filename| is in out/Release
-  # build/linux/bin/eu-strip'
   src_dir = os.path.dirname(os.path.dirname(os.path.dirname(filename)))
-  eu_strip_path = os.path.join(src_dir, 'build', 'linux', 'bin', EU_STRIP_NAME)
-  if (platform.architecture()[0] == '64bit'
-      or not os.path.exists(eu_strip_path)):
-    eu_strip_path = EU_STRIP_NAME
+  llvm_strip_path = os.path.join(src_dir, 'third_party', 'llvm-build',
+                                 'Release+Asserts', 'bin', 'llvm-strip')
 
   with tempfile.NamedTemporaryFile() as stripped_file:
-    strip_cmd = [eu_strip_path, '-o', stripped_file.name, filename]
+    strip_cmd = [
+        llvm_strip_path, '--strip-unneeded', '--strip-debug', '-o',
+        stripped_file.name, filename
+    ]
     result = 0
     result, _ = run_process(result, strip_cmd)
     if result != 0:
diff --git a/tools/crates/create_update_cl.md b/tools/crates/create_update_cl.md
index a76abeb..29d1dd9 100644
--- a/tools/crates/create_update_cl.md
+++ b/tools/crates/create_update_cl.md
@@ -114,7 +114,7 @@
 updates):
 
 ```sh
-$ tools/crates/run_cargo.py -Zunstable-options -C third_party/rust/chromium_crates_io -Zbindeps update --dry-run --verbose
+$ tools/crates/run_gnrt.py update -- --verbose --dry-run
 ...
    Unchanged serde_json_lenient v0.1.8 (latest: v0.2.0)
    Unchanged syn v1.0.109 (latest: v2.0.53)
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 946f7100..d50a765 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -44766,6 +44766,36 @@
   </description>
 </action>
 
+<action name="TabGroups.ArchivedTabGroupManualCloseOnInactiveSurface">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <description>
+    Recorded when archived tab group is closed due to user manually clicking the
+    X button of the tab group in the inactive pane.
+  </description>
+</action>
+
+<action name="TabGroups.RestoreFromTabGroupPane">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <description>
+    Recorded when an archived tab group is restored when the user opens the same
+    tab group from the tab group pane.
+  </description>
+</action>
+
+<action name="TabGroups.RestoreSingleTabGroup">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <description>
+    Recorded when archived tab group is restored due to user manually clicking
+    into the tab group in the inactive pane.
+  </description>
+</action>
+
 <action name="TabGroups.Shared.SwitchGroupedTab">
   <owner>dljames@chromium.org</owner>
   <owner>top-chrome-desktop-ui@google.com</owner>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 4c2c206..b9b45c1 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -8249,6 +8249,7 @@
   <int value="-2117169027" label="UpdateHoverAtBeginFrame:enabled"/>
   <int value="-2117048251" label="MediaApp:enabled"/>
   <int value="-2116440101" label="EnablePenetratingImageSelection:enabled"/>
+  <int value="-2116226068" label="ReaderModeDistillInApp:disabled"/>
   <int value="-2116063296" label="DesktopPartialTranslate:disabled"/>
   <int value="-2115072824"
       label="EnableLogControllerForDiagnosticsApp:disabled"/>
@@ -12070,6 +12071,7 @@
   <int value="-703851482" label="AudioPeripheralVolumeGranularity:enabled"/>
   <int value="-703552662" label="PrefetchAndroidFonts:disabled"/>
   <int value="-703519655" label="SystemLiveCaption:enabled"/>
+  <int value="-702783087" label="ReaderModeDistillInApp:enabled"/>
   <int value="-702477233" label="ContentFullscreen:enabled"/>
   <int value="-700762821" label="RequestDesktopSiteForTablets:disabled"/>
   <int value="-700490514" label="DeviceBoundSessionsRefreshQuota:enabled"/>
@@ -21397,7 +21399,8 @@
   <int value="0" label="Success"/>
   <int value="1" label="Key Not Found"/>
   <int value="2" label="Key Decode Failure"/>
-  <int value="4" label="Invalid Key Header"/>
+  <int value="3" label="Invalid Key Header"/>
+  <int value="4" label="Key Too Short"/>
 </enum>
 
 <enum name="OSCryptDPAPIKeyStatus">
diff --git a/tools/metrics/histograms/metadata/actor/enums.xml b/tools/metrics/histograms/metadata/actor/enums.xml
index db39848c..56c46bf5 100644
--- a/tools/metrics/histograms/metadata/actor/enums.xml
+++ b/tools/metrics/histograms/metadata/actor/enums.xml
@@ -43,6 +43,7 @@
   <int value="22" label="ArgumentsInvalid"/>
   <int value="23" label="TaskPaused"/>
   <int value="24" label="kExecutorDestroyed"/>
+  <int value="25" label="kWindowWentAway"/>
   <int value="100" label="NavigateInvalidUrl"/>
   <int value="200" label="ClickSuppressed"/>
   <int value="300" label="DragAndReleaseFromOffscreen"/>
diff --git a/tools/metrics/histograms/metadata/ash_growth/histograms.xml b/tools/metrics/histograms/metadata/ash_growth/histograms.xml
index f8d65065..8c4d7d4 100644
--- a/tools/metrics/histograms/metadata/ash_growth/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash_growth/histograms.xml
@@ -30,7 +30,7 @@
 </variants>
 
 <histogram name="Ash.Growth.CampaignsComponent.DownloadDurationInOobe"
-    units="ms" expires_after="2025-08-31">
+    units="ms" expires_after="2026-05-22">
   <owner>llin@google.com</owner>
   <owner>cros-growth@google.com</owner>
   <summary>
@@ -42,7 +42,7 @@
 </histogram>
 
 <histogram name="Ash.Growth.CampaignsComponent.DownloadDurationSessionStart"
-    units="ms" expires_after="2025-06-29">
+    units="ms" expires_after="2026-05-22">
   <owner>llin@google.com</owner>
   <owner>cros-growth@google.com</owner>
   <summary>
@@ -54,7 +54,7 @@
 </histogram>
 
 <histogram name="Ash.Growth.CampaignsComponent.ParseDuration" units="ms"
-    expires_after="2025-11-02">
+    expires_after="2026-05-22">
   <owner>llin@google.com</owner>
   <owner>cros-growth@google.com</owner>
   <summary>
@@ -64,7 +64,7 @@
 </histogram>
 
 <histogram name="Ash.Growth.CampaignsManager.Error"
-    enum="CampaignsManagerError" expires_after="2025-11-02">
+    enum="CampaignsManagerError" expires_after="2026-05-22">
   <owner>llin@google.com</owner>
   <owner>cros-growth@google.com</owner>
   <summary>
@@ -84,7 +84,7 @@
 </histogram>
 
 <histogram name="Ash.Growth.CampaignsManager.GetCampaignBySlot.Attempt"
-    enum="CampaignSlot" expires_after="2025-12-07">
+    enum="CampaignSlot" expires_after="2026-05-22">
   <owner>llin@google.com</owner>
   <owner>cros-growth@google.com</owner>
   <summary>
@@ -94,7 +94,7 @@
 </histogram>
 
 <histogram name="Ash.Growth.CampaignsManager.GetCampaignBySlot.Campaigns500"
-    units="int" expires_after="2025-12-07">
+    units="int" expires_after="2026-05-22">
   <owner>wutao@chromium.org</owner>
   <owner>cros-growth@google.com</owner>
   <summary>
@@ -105,7 +105,7 @@
 </histogram>
 
 <histogram name="Ash.Growth.CampaignsManager.MatchDuration" units="ms"
-    expires_after="2025-06-29">
+    expires_after="2026-05-22">
   <owner>llin@google.com</owner>
   <owner>cros-growth@google.com</owner>
   <summary>
@@ -116,7 +116,7 @@
 </histogram>
 
 <histogram name="Ash.Growth.Ui.ButtonPressed.Button{ButtonId}.Campaigns500"
-    units="int" expires_after="2025-11-09">
+    units="int" expires_after="2026-05-22">
   <owner>wutao@chromium.org</owner>
   <owner>cros-growth@google.com</owner>
   <summary>
@@ -128,7 +128,7 @@
 </histogram>
 
 <histogram name="Ash.Growth.Ui.Dismissed.Campaigns500" units="int"
-    expires_after="2025-11-09">
+    expires_after="2026-05-22">
   <owner>wutao@chromium.org</owner>
   <owner>cros-growth@google.com</owner>
   <summary>
@@ -138,7 +138,7 @@
 </histogram>
 
 <histogram name="Ash.Growth.Ui.Impression.Campaigns500" units="int"
-    expires_after="2025-11-09">
+    expires_after="2026-05-22">
   <owner>wutao@chromium.org</owner>
   <owner>cros-growth@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/data/histograms.xml b/tools/metrics/histograms/metadata/data/histograms.xml
index f457201..c324db21 100644
--- a/tools/metrics/histograms/metadata/data/histograms.xml
+++ b/tools/metrics/histograms/metadata/data/histograms.xml
@@ -141,7 +141,7 @@
 </histogram>
 
 <histogram name="DataUse.TrafficSize.User{DataUse_Dimensions}" units="bytes"
-    expires_after="2025-03-25">
+    expires_after="2026-06-13">
   <owner>spelchat@chromium.org</owner>
   <owner>curranmax@chromium.org</owner>
   <owner>chrome-brapp-loading@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/enterprise/enums.xml b/tools/metrics/histograms/metadata/enterprise/enums.xml
index 65e9479b9..d4000246 100644
--- a/tools/metrics/histograms/metadata/enterprise/enums.xml
+++ b/tools/metrics/histograms/metadata/enterprise/enums.xml
@@ -2236,6 +2236,7 @@
   <int value="1365" label="PrefetchWithServiceWorkerEnabled"/>
   <int value="1367" label="AIModeSettings"/>
   <int value="1368" label="WatermarkStyle"/>
+  <int value="1369" label="KioskApplicationLogCollectionEnabled"/>
 </enum>
 
 <enum name="EnterprisePoliciesSources">
diff --git a/tools/metrics/histograms/metadata/magic_stack/histograms.xml b/tools/metrics/histograms/metadata/magic_stack/histograms.xml
index 1290678..a46d3a81 100644
--- a/tools/metrics/histograms/metadata/magic_stack/histograms.xml
+++ b/tools/metrics/histograms/metadata/magic_stack/histograms.xml
@@ -120,7 +120,7 @@
 
 <histogram
     name="MagicStack.Clank.NewTabPage.Module.FetchDataTimeoutDurationMs.{ModuleType}"
-    units="ms" expires_after="2025-06-16">
+    units="ms" expires_after="2025-11-26">
   <owner>hanxi@chromium.org</owner>
   <owner>xinyiji@chromium.org</owner>
   <summary>
@@ -132,7 +132,7 @@
 </histogram>
 
 <histogram name="MagicStack.Clank.NewTabPage.Module.FetchDataTimeoutTypeV2"
-    enum="ModuleType" expires_after="2025-06-22">
+    enum="ModuleType" expires_after="2025-11-26">
   <owner>hanxi@chromium.org</owner>
   <owner>xinyiji@chromium.org</owner>
   <summary>
@@ -143,7 +143,7 @@
 </histogram>
 
 <histogram name="MagicStack.Clank.NewTabPage.Module.FirstModuleShownDurationMs"
-    units="ms" expires_after="2025-06-16">
+    units="ms" expires_after="2025-11-26">
   <owner>hanxi@chromium.org</owner>
   <owner>xinyiji@chromium.org</owner>
   <summary>
@@ -155,7 +155,7 @@
 </histogram>
 
 <histogram name="MagicStack.Clank.NewTabPage.Module.ProfileReadyDelayMs"
-    units="ms" expires_after="2025-06-16">
+    units="ms" expires_after="2025-11-26">
   <owner>hanxi@chromium.org</owner>
   <owner>xinyiji@chromium.org</owner>
   <summary>
@@ -176,7 +176,7 @@
 </histogram>
 
 <histogram name="MagicStack.Clank.NewTabPage.NotScrollable" units="count"
-    expires_after="2025-06-16">
+    expires_after="2025-11-26">
   <owner>hanxi@chromium.org</owner>
   <owner>xinyiji@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index 427d720..c4358e1 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -4544,7 +4544,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.CanContactUser"
-    enum="FeedbackAppContactUserConsentType" expires_after="2025-07-30">
+    enum="FeedbackAppContactUserConsentType" expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4555,7 +4555,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.DescriptionLength" units="characters"
-    expires_after="2025-07-30">
+    expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4566,7 +4566,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.Duration.GetBigFeedbackLogs" units="ms"
-    expires_after="2025-11-03">
+    expires_after="2026-07-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -4579,7 +4579,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.ExitPath" enum="FeedbackAppExitPath"
-    expires_after="2026-05-25">
+    expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4596,7 +4596,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.GetBigFeedbackLogs.EmptyCount"
-    units="logs" expires_after="2025-11-03">
+    units="logs" expires_after="2026-07-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -4608,7 +4608,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.GetBigFeedbackLogs.NotAvailableCount"
-    units="logs" expires_after="2025-11-03">
+    units="logs" expires_after="2026-07-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -4620,7 +4620,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.GetBigFeedbackLogs.OtherCount"
-    units="logs" expires_after="2025-11-03">
+    units="logs" expires_after="2026-07-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -4632,7 +4632,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.GetBigFeedbackLogs.Success"
-    enum="Boolean" expires_after="2025-11-03">
+    enum="Boolean" expires_after="2026-07-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -4644,7 +4644,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.GetFeedbackLogsV2.DBusResult"
-    enum="GetFeedbackLogsV2DbusResult" expires_after="2025-11-03">
+    enum="GetFeedbackLogsV2DbusResult" expires_after="2026-07-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -4656,7 +4656,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.HelpContentOutcome"
-    enum="FeedbackAppHelpContentOutcome" expires_after="2025-09-28">
+    enum="FeedbackAppHelpContentOutcome" expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4668,7 +4668,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.HelpContentSearchResultCount"
-    units="numbers" expires_after="2025-07-30">
+    units="numbers" expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4679,7 +4679,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.IncludedEmail" enum="Boolean"
-    expires_after="2025-07-30">
+    expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4690,7 +4690,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.IncludedFile" enum="Boolean"
-    expires_after="2025-07-30">
+    expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4701,7 +4701,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.IncludedScreenshot" enum="Boolean"
-    expires_after="2025-07-30">
+    expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4712,7 +4712,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.IncludedSystemInfo" enum="Boolean"
-    expires_after="2025-07-30">
+    expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4723,7 +4723,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.IncludedUrl" enum="Boolean"
-    expires_after="2025-07-30">
+    expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4734,7 +4734,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.Openduration" units="ms"
-    expires_after="2025-07-30">
+    expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4745,7 +4745,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.PostSubmitAction"
-    enum="FeedbackAppPostSubmitAction" expires_after="2025-07-30">
+    enum="FeedbackAppPostSubmitAction" expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4757,7 +4757,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.TimeOnPage.{FeedbackAppPage}" units="s"
-    expires_after="2025-07-30">
+    expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4774,7 +4774,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.ViewedHelpContent" enum="Boolean"
-    expires_after="2025-07-30">
+    expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4785,7 +4785,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.ViewedImage" enum="Boolean"
-    expires_after="2025-07-30">
+    expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4796,7 +4796,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.ViewedMetrics" enum="Boolean"
-    expires_after="2025-07-30">
+    expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4807,7 +4807,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.ViewedScreenshot" enum="Boolean"
-    expires_after="2025-07-30">
+    expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4818,7 +4818,7 @@
 </histogram>
 
 <histogram name="Feedback.ChromeOSApp.ViewedSystemAndAppInfo" enum="Boolean"
-    expires_after="2025-07-30">
+    expires_after="2026-07-30">
   <owner>longbowei@google.com</owner>
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4829,7 +4829,7 @@
 </histogram>
 
 <histogram name="Feedback.Duration.FetchSystemInformation" units="ms"
-    expires_after="2025-11-03">
+    expires_after="2026-07-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>fernandex@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4841,7 +4841,7 @@
 </histogram>
 
 <histogram name="Feedback.Duration.FormOpenToSubmit" units="ms"
-    expires_after="2025-07-30">
+    expires_after="2026-07-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>fernandex@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -4866,7 +4866,7 @@
 </histogram>
 
 <histogram name="Feedback.Duration.FormSubmitToSendQueue" units="ms"
-    expires_after="2025-07-30">
+    expires_after="2026-07-30">
   <owner>xiangdongkong@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -6231,6 +6231,7 @@
     <variant name="GpuMain"/>
     <variant name="NetworkService"/>
     <variant name="RendererMain"/>
+    <variant name="VizCompositor"/>
   </token>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index ca29724..0f27140 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -713,7 +713,7 @@
 
 <histogram
     name="PageLoad.Clients.AMP.Experimental.PageTiming.InputToNavigation.Subframe"
-    units="ms" expires_after="2025-11-30">
+    units="ms" expires_after="2026-07-03">
   <owner>iclelland@chromium.org</owner>
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -730,7 +730,7 @@
 
 <histogram
     name="PageLoad.Clients.AMP.InteractiveTiming.NumInteractions.Subframe"
-    units="Count" expires_after="2025-11-09">
+    units="Count" expires_after="2026-07-03">
   <owner>iclelland@chromium.org</owner>
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -743,7 +743,7 @@
 
 <histogram
     name="PageLoad.Clients.AMP.InteractiveTiming.{NormalizedResponsivenessMetric}.{UserInteractionLatency}.Subframe{FullNavigation}"
-    units="ms" expires_after="2025-07-03">
+    units="ms" expires_after="2026-07-03">
   <owner>iclelland@chromium.org</owner>
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -802,7 +802,7 @@
 
 <histogram
     name="PageLoad.Clients.AMP.LayoutInstability.MaxCumulativeShiftScore.Subframe.{Navigation}{Window}.Gap{Gap}.Max{MaxWindowSize}"
-    units="scorex10" expires_after="2025-07-03">
+    units="scorex10" expires_after="2026-07-03">
   <owner>iclelland@chromium.org</owner>
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -834,7 +834,7 @@
 
 <histogram
     name="PageLoad.Clients.AMP.PaintTiming.InputToFirstContentfulPaint.Subframe"
-    units="ms" expires_after="2025-11-09">
+    units="ms" expires_after="2026-07-03">
   <owner>iclelland@chromium.org</owner>
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -850,7 +850,7 @@
 
 <histogram
     name="PageLoad.Clients.AMP.PaintTiming.InputToFirstContentfulPaint.Subframe.FullNavigation"
-    units="ms" expires_after="2025-07-03">
+    units="ms" expires_after="2026-07-03">
   <owner>iclelland@chromium.org</owner>
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -865,7 +865,7 @@
 
 <histogram
     name="PageLoad.Clients.AMP.PaintTiming.InputToLargestContentfulPaint.Subframe"
-    units="ms" expires_after="2025-09-07">
+    units="ms" expires_after="2026-07-03">
   <owner>iclelland@chromium.org</owner>
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -887,7 +887,7 @@
 
 <histogram
     name="PageLoad.Clients.AMP.PaintTiming.InputToLargestContentfulPaint.Subframe.FullNavigation"
-    units="ms" expires_after="2025-07-03">
+    units="ms" expires_after="2026-07-03">
   <owner>iclelland@chromium.org</owner>
   <owner>sullivan@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -2299,7 +2299,7 @@
 
 <histogram
     name="PageLoad.Clients.PrivacySandboxAds.LayoutInstability.MaxCumulativeShiftScore.SessionWindow.Gap1000ms.Max5000ms2.{PrivacySandboxAdsApi}"
-    units="ms" expires_after="2025-07-06">
+    units="ms" expires_after="2025-12-02">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml
index d9781a30..6609595b 100644
--- a/tools/metrics/histograms/metadata/password/histograms.xml
+++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -2378,7 +2378,7 @@
 </histogram>
 
 <histogram name="PasswordManager.MediationConditional"
-    enum="CredentialManagerGetResult" expires_after="2025-06-22">
+    enum="CredentialManagerGetResult" expires_after="2025-11-22">
   <owner>goto@google.com</owner>
   <owner>markusheintz@google.com</owner>
   <owner>yigu@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml
index 555219b..50dc38e 100644
--- a/tools/metrics/histograms/metadata/sync/histograms.xml
+++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -175,7 +175,7 @@
 </histogram>
 
 <histogram name="Sync.AssociateWindowsTime.On{Type}" units="ms"
-    expires_after="2025-06-22">
+    expires_after="2026-06-01">
   <owner>skym@chromium.org</owner>
   <owner>ckitagawa@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml
index ab3a7af..89160436 100644
--- a/tools/metrics/histograms/metadata/tab/histograms.xml
+++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -798,6 +798,74 @@
   </summary>
 </histogram>
 
+<histogram
+    name="TabGroups.ArchivedTabGroupManualCloseOnInactiveSurface.TabGroupTabCount"
+    units="tabs" expires_after="2025-11-09">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <summary>
+    Records number of tabs within an archived tab group closed by pressing the X
+    button on the tab group in the inactive surface.
+  </summary>
+</histogram>
+
+<histogram name="TabGroups.CloseAllArchivedTabGroups.TabGroupCount"
+    units="groups" expires_after="2025-11-09">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <summary>
+    Records when archived tab groups are closed through the &quot;Close all
+    inactive tabs&quot; button in inactive pane.
+  </summary>
+</histogram>
+
+<histogram name="TabGroups.CloseAllArchivedTabGroups.TabGroupTabCount"
+    units="tabs" expires_after="2025-11-09">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <summary>
+    Records number of tabs within archived tab groups closed through the
+    &quot;Close all inactive tabs&quot; button in inactive pane.
+  </summary>
+</histogram>
+
+<histogram name="TabGroups.CloseArchivedTabsMenuItem.TabGroupCount"
+    units="groups" expires_after="2025-11-09">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <summary>
+    Records when archived tab groups are closed through the &quot;Close
+    tab&quot; menu item after user selects which tab groups to be closed.
+  </summary>
+</histogram>
+
+<histogram name="TabGroups.CloseArchivedTabsMenuItem.TabGroupTabCount"
+    units="tabs" expires_after="2025-11-09">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <summary>
+    Records number of tabs within archived tab groups closed through the
+    &quot;Close tab&quot; menu item after user selects which tab groups to be
+    closed.
+  </summary>
+</histogram>
+
+<histogram name="TabGroups.CloseTabGroupsDeletedRemotely" units="groups"
+    expires_after="2025-11-09">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <summary>
+    Records when tab groups are closed locally due to the synced tab group being
+    deleted elsewhere (e.g. another device logged into same account).
+  </summary>
+</histogram>
+
 <histogram name="TabGroups.CollapsedGroupCountPerLoad" units="groups"
     expires_after="2025-09-28">
   <owner>dpenning@chromium.org</owner>
@@ -864,6 +932,72 @@
   </summary>
 </histogram>
 
+<histogram name="TabGroups.RestoreAllArchivedTabsMenuItem.TabGroupCount"
+    units="groups" expires_after="2025-11-09">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <summary>
+    Records when archived tab groups are restored through the &quot;Restore
+    all&quot; option menu item.
+  </summary>
+</histogram>
+
+<histogram name="TabGroups.RestoreAllArchivedTabsMenuItem.TabGroupTabCount"
+    units="tabs" expires_after="2025-11-09">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <summary>
+    Records number of tabs within archived tab groups restored by the
+    &quot;Restore all&quot; option menu item.
+  </summary>
+</histogram>
+
+<histogram name="TabGroups.RestoreArchivedTabsMenuItem.TabGroupCount"
+    units="groups" expires_after="2025-11-09">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <summary>
+    Records when archived tab groups are restored through the &quot;Restore
+    tab&quot; menu option after user selects which tab groups to restore.
+  </summary>
+</histogram>
+
+<histogram name="TabGroups.RestoreArchivedTabsMenuItem.TabGroupTabCount"
+    units="tabs" expires_after="2025-11-09">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <summary>
+    Records number of tabs within archived tab groups restored by user selecting
+    tab groups and using the &quot;Restore tab&quot; menu option.
+  </summary>
+</histogram>
+
+<histogram name="TabGroups.RestoreFromTabGroupPane.TabCount" units="tabs"
+    expires_after="2025-11-09">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <summary>
+    Records number of tabs within an archived tab group restored by user opening
+    the synced tab group from the tab group pane.
+  </summary>
+</histogram>
+
+<histogram name="TabGroups.RestoreSingleTabGroup.TabGroupTabCount" units="tabs"
+    expires_after="2025-11-09">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <summary>
+    Records number of tabs within archived tab groups restored by user manually
+    clicking into the tab group in the inactive surface.
+  </summary>
+</histogram>
+
 <histogram name="TabGroups.SavedTabGroupActiveCount" units="groups"
     expires_after="2025-10-26">
   <owner>dljames@chromium.org</owner>
@@ -1579,6 +1713,27 @@
   </summary>
 </histogram>
 
+<histogram name="TabGroups.TabGroupDeclutter.ArchivedTabGroups" units="groups"
+    expires_after="2025-11-09">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <summary>
+    Records number of tab groups that are archived due to tab group declutter.
+  </summary>
+</histogram>
+
+<histogram name="TabGroups.TabGroupDeclutter.ArchivedTabGroupTabCount"
+    units="tabs" expires_after="2025-11-09">
+  <owner>wylieb@google.com</owner>
+  <owner>evanluo@google.com</owner>
+  <owner>clank-tab-dev@google.com</owner>
+  <summary>
+    Records number of tabs within each archived tab group that are archived when
+    the tab group is archived.
+  </summary>
+</histogram>
+
 <histogram name="TabGroups.TabsPerGroupCountAtStartup" units="tabs"
     expires_after="2025-10-26">
   <owner>gambard@chromium.org</owner>
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py
index df9a4e6..e6bda5e 100644
--- a/tools/perf/core/bot_platforms.py
+++ b/tools/perf/core/bot_platforms.py
@@ -561,7 +561,9 @@
         arguments=[
             '--wpr=crossbench_android_loading_000.wprgo',
             '--probe=chrome_histograms:{"baseline":false,"metrics":'
-            '{"Android.WebView.Startup.CreationTime.StartChromiumLocked":["mean"]}}',
+            '{"Android.WebView.Startup.CreationTime.StartChromiumLocked":["mean"],'
+            '"Android.WebView.Startup.CreationTime.Stage1.FactoryInit":["mean"],'
+            '"PageLoad.PaintTiming.NavigationToFirstContentfulPaint":["mean"]}}',
             '--repetitions=50',
             '--stories=cnn',
         ]
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index b131e2b..26efaa7 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/v50.1/linux-arm64/trace_processor_shell"
         },
         "win": {
-            "hash": "ca5569771bdaf64998daa87da60550e4351b79b8",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/167e1f0dab2691a4b2a911e001317353405d83d9/trace_processor_shell.exe"
+            "hash": "9896fe58e66ba405cca1b1cebdb90c83a347d833",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/9a55fc8a8e2598fc924db3643d9b47a2e3d0480e/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "99f971ca131f6d11c73f4b918099d434bdd8093c",
@@ -21,8 +21,8 @@
             "full_remote_path": "perfetto-luci-artifacts/v50.1/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "873b0054b9679de17bf8de3ba8bbc665cb00e8f1",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/167e1f0dab2691a4b2a911e001317353405d83d9/trace_processor_shell"
+            "hash": "e1fbcf7a7c7ae7ab3737c3d1e04c85a899e58e8f",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/9a55fc8a8e2598fc924db3643d9b47a2e3d0480e/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/perf/core/shard_maps/android-pixel4_webview-perf-pgo_map.json b/tools/perf/core/shard_maps/android-pixel4_webview-perf-pgo_map.json
index a9b3166..1250168f 100644
--- a/tools/perf/core/shard_maps/android-pixel4_webview-perf-pgo_map.json
+++ b/tools/perf/core/shard_maps/android-pixel4_webview-perf-pgo_map.json
@@ -8,7 +8,7 @@
                 "abridged": false
             },
             "blink_perf.bindings": {
-                "end": 45,
+                "end": 46,
                 "abridged": false
             },
             "speedometer2": {
@@ -22,14 +22,14 @@
     "1": {
         "benchmarks": {
             "blink_perf.bindings": {
-                "begin": 45,
+                "begin": 46,
                 "abridged": false
             },
             "blink_perf.css": {
                 "abridged": false
             },
             "blink_perf.dom": {
-                "end": 1,
+                "end": 3,
                 "abridged": false
             },
             "speedometer2": {
@@ -43,7 +43,7 @@
     "2": {
         "benchmarks": {
             "blink_perf.dom": {
-                "begin": 1,
+                "begin": 3,
                 "abridged": false
             },
             "blink_perf.events": {
@@ -53,7 +53,7 @@
                 "abridged": false
             },
             "blink_perf.layout": {
-                "end": 24,
+                "end": 25,
                 "abridged": false
             },
             "speedometer2": {
@@ -67,8 +67,8 @@
     "3": {
         "benchmarks": {
             "blink_perf.layout": {
-                "begin": 24,
-                "end": 97,
+                "begin": 25,
+                "end": 99,
                 "abridged": false
             },
             "speedometer2": {
@@ -82,7 +82,7 @@
     "4": {
         "benchmarks": {
             "blink_perf.layout": {
-                "begin": 97,
+                "begin": 99,
                 "abridged": false
             },
             "blink_perf.owp_storage": {
@@ -92,7 +92,7 @@
                 "abridged": false
             },
             "blink_perf.shadow_dom": {
-                "end": 29,
+                "end": 37,
                 "abridged": false
             },
             "speedometer2": {
@@ -106,7 +106,7 @@
     "5": {
         "benchmarks": {
             "blink_perf.shadow_dom": {
-                "begin": 29,
+                "begin": 37,
                 "abridged": false
             },
             "blink_perf.webaudio": {
@@ -134,7 +134,7 @@
                 "abridged": false
             },
             "rasterize_and_record_micro.top_25": {
-                "end": 3,
+                "end": 12,
                 "abridged": false
             },
             "speedometer2": {
@@ -149,7 +149,7 @@
                 "display_name": "loading.crossbench",
                 "arguments": [
                     "--wpr=crossbench_android_loading_000.wprgo",
-                    "--probe=chrome_histograms:{\"baseline\":false,\"metrics\":{\"Android.WebView.Startup.CreationTime.StartChromiumLocked\":[\"mean\"]}}",
+                    "--probe=chrome_histograms:{\"baseline\":false,\"metrics\":{\"Android.WebView.Startup.CreationTime.StartChromiumLocked\":[\"mean\"],\"Android.WebView.Startup.CreationTime.Stage1.FactoryInit\":[\"mean\"],\"PageLoad.PaintTiming.NavigationToFirstContentfulPaint\":[\"mean\"]}}",
                     "--repetitions=50",
                     "--stories=cnn"
                 ]
@@ -159,11 +159,11 @@
     "6": {
         "benchmarks": {
             "rasterize_and_record_micro.top_25": {
-                "begin": 3,
+                "begin": 12,
                 "abridged": false
             },
             "rendering.mobile": {
-                "end": 42,
+                "end": 46,
                 "abridged": false
             },
             "speedometer2": {
@@ -177,8 +177,8 @@
     "7": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 42,
-                "end": 94,
+                "begin": 46,
+                "end": 96,
                 "abridged": false
             },
             "speedometer2": {
@@ -192,8 +192,8 @@
     "8": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 94,
-                "end": 152,
+                "begin": 96,
+                "end": 155,
                 "abridged": false
             },
             "speedometer2": {
@@ -207,8 +207,8 @@
     "9": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 152,
-                "end": 203,
+                "begin": 155,
+                "end": 208,
                 "abridged": false
             },
             "speedometer2": {
@@ -222,8 +222,8 @@
     "10": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 203,
-                "end": 262,
+                "begin": 208,
+                "end": 267,
                 "abridged": false
             },
             "speedometer2": {
@@ -237,8 +237,8 @@
     "11": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 262,
-                "end": 327,
+                "begin": 267,
+                "end": 328,
                 "abridged": false
             },
             "speedometer2": {
@@ -252,8 +252,8 @@
     "12": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 327,
-                "end": 378,
+                "begin": 328,
+                "end": 377,
                 "abridged": false
             },
             "speedometer2": {
@@ -267,7 +267,7 @@
     "13": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 378,
+                "begin": 377,
                 "abridged": false
             },
             "rendering.mobile.notracing": {
@@ -295,7 +295,7 @@
                 "abridged": false
             },
             "system_health.common_mobile": {
-                "end": 23,
+                "end": 22,
                 "abridged": false
             }
         }
@@ -303,7 +303,7 @@
     "14": {
         "benchmarks": {
             "system_health.common_mobile": {
-                "begin": 23,
+                "begin": 22,
                 "abridged": false
             },
             "system_health.memory_mobile": {
@@ -322,7 +322,7 @@
         "benchmarks": {
             "system_health.memory_mobile": {
                 "begin": 3,
-                "end": 24,
+                "end": 25,
                 "abridged": false
             },
             "speedometer2": {
@@ -336,8 +336,8 @@
     "16": {
         "benchmarks": {
             "system_health.memory_mobile": {
-                "begin": 24,
-                "end": 42,
+                "begin": 25,
+                "end": 43,
                 "abridged": false
             },
             "speedometer2": {
@@ -351,7 +351,7 @@
     "17": {
         "benchmarks": {
             "system_health.memory_mobile": {
-                "begin": 42,
+                "begin": 43,
                 "end": 60,
                 "abridged": false
             },
@@ -369,6 +369,9 @@
                 "begin": 60,
                 "abridged": false
             },
+            "system_health.webview_startup": {
+                "abridged": false
+            },
             "speedometer2": {
                 "abridged": false
             },
@@ -379,9 +382,6 @@
     },
     "19": {
         "benchmarks": {
-            "system_health.webview_startup": {
-                "abridged": false
-            },
             "v8.browsing_mobile": {
                 "abridged": false
             },
@@ -400,30 +400,30 @@
         }
     },
     "extra_infos": {
-        "num_stories": 1114,
-        "predicted_min_shard_time": 2448.0,
-        "predicted_min_shard_index": 18,
-        "predicted_max_shard_time": 3660.0,
-        "predicted_max_shard_index": 19,
-        "shard #0": 3012.0,
-        "shard #1": 3029.0,
-        "shard #2": 3026.0,
-        "shard #3": 3030.0,
-        "shard #4": 3019.0,
-        "shard #5": 3001.0,
-        "shard #6": 3008.0,
-        "shard #7": 3018.0,
-        "shard #8": 3033.0,
-        "shard #9": 2980.0,
-        "shard #10": 3026.0,
-        "shard #11": 3006.0,
-        "shard #12": 3022.0,
-        "shard #13": 3036.0,
-        "shard #14": 2984.0,
-        "shard #15": 2970.0,
-        "shard #16": 2970.0,
-        "shard #17": 2991.0,
-        "shard #18": 2448.0,
-        "shard #19": 3660.0
+        "num_stories": 1115,
+        "predicted_min_shard_time": 2510.0,
+        "predicted_min_shard_index": 19,
+        "predicted_max_shard_time": 3490.0,
+        "predicted_max_shard_index": 18,
+        "shard #0": 3075.0,
+        "shard #1": 3045.0,
+        "shard #2": 3087.0,
+        "shard #3": 3065.0,
+        "shard #4": 3080.0,
+        "shard #5": 3081.0,
+        "shard #6": 3061.0,
+        "shard #7": 3074.0,
+        "shard #8": 3077.0,
+        "shard #9": 3078.0,
+        "shard #10": 3047.0,
+        "shard #11": 3107.0,
+        "shard #12": 3073.0,
+        "shard #13": 3041.0,
+        "shard #14": 3078.0,
+        "shard #15": 3190.0,
+        "shard #16": 3052.0,
+        "shard #17": 3010.0,
+        "shard #18": 3490.0,
+        "shard #19": 2510.0
     }
 }
diff --git a/tools/perf/core/shard_maps/android-pixel4_webview-perf_map.json b/tools/perf/core/shard_maps/android-pixel4_webview-perf_map.json
index 0e5bb071..cb1a52a 100644
--- a/tools/perf/core/shard_maps/android-pixel4_webview-perf_map.json
+++ b/tools/perf/core/shard_maps/android-pixel4_webview-perf_map.json
@@ -8,7 +8,7 @@
                 "abridged": false
             },
             "blink_perf.bindings": {
-                "end": 41,
+                "end": 33,
                 "abridged": false
             },
             "speedometer2": {
@@ -22,7 +22,7 @@
     "1": {
         "benchmarks": {
             "blink_perf.bindings": {
-                "begin": 41,
+                "begin": 33,
                 "abridged": false
             },
             "blink_perf.css": {
@@ -50,7 +50,7 @@
                 "abridged": false
             },
             "blink_perf.image_decoder": {
-                "end": 4,
+                "end": 2,
                 "abridged": false
             },
             "speedometer2": {
@@ -64,11 +64,11 @@
     "3": {
         "benchmarks": {
             "blink_perf.image_decoder": {
-                "begin": 4,
+                "begin": 2,
                 "abridged": false
             },
             "blink_perf.layout": {
-                "end": 59,
+                "end": 51,
                 "abridged": false
             },
             "speedometer2": {
@@ -82,11 +82,8 @@
     "4": {
         "benchmarks": {
             "blink_perf.layout": {
-                "begin": 59,
-                "abridged": false
-            },
-            "blink_perf.owp_storage": {
-                "end": 4,
+                "begin": 51,
+                "end": 110,
                 "abridged": false
             },
             "speedometer2": {
@@ -99,15 +96,18 @@
     },
     "5": {
         "benchmarks": {
+            "blink_perf.layout": {
+                "begin": 110,
+                "abridged": false
+            },
             "blink_perf.owp_storage": {
-                "begin": 4,
                 "abridged": false
             },
             "blink_perf.parser": {
                 "abridged": false
             },
             "blink_perf.shadow_dom": {
-                "end": 31,
+                "end": 18,
                 "abridged": false
             },
             "speedometer2": {
@@ -121,7 +121,7 @@
     "6": {
         "benchmarks": {
             "blink_perf.shadow_dom": {
-                "begin": 31,
+                "begin": 18,
                 "abridged": false
             },
             "blink_perf.webaudio": {
@@ -148,17 +148,6 @@
             "speedometer3": {
                 "abridged": false
             }
-        },
-        "crossbench": {
-            "loading": {
-                "display_name": "loading.crossbench",
-                "arguments": [
-                    "--wpr=crossbench_android_loading_000.wprgo",
-                    "--probe=chrome_histograms:{\"baseline\":false,\"metrics\":{\"Android.WebView.Startup.CreationTime.StartChromiumLocked\":[\"mean\"]}}",
-                    "--repetitions=50",
-                    "--stories=cnn"
-                ]
-            }
         }
     },
     "7": {
@@ -173,7 +162,7 @@
                 "abridged": false
             },
             "rendering.mobile": {
-                "end": 22,
+                "end": 4,
                 "abridged": false
             },
             "speedometer2": {
@@ -182,13 +171,24 @@
             "speedometer3": {
                 "abridged": false
             }
+        },
+        "crossbench": {
+            "loading": {
+                "display_name": "loading.crossbench",
+                "arguments": [
+                    "--wpr=crossbench_android_loading_000.wprgo",
+                    "--probe=chrome_histograms:{\"baseline\":false,\"metrics\":{\"Android.WebView.Startup.CreationTime.StartChromiumLocked\":[\"mean\"],\"Android.WebView.Startup.CreationTime.Stage1.FactoryInit\":[\"mean\"],\"PageLoad.PaintTiming.NavigationToFirstContentfulPaint\":[\"mean\"]}}",
+                    "--repetitions=50",
+                    "--stories=cnn"
+                ]
+            }
         }
     },
     "8": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 22,
-                "end": 67,
+                "begin": 4,
+                "end": 50,
                 "abridged": false
             },
             "speedometer2": {
@@ -202,8 +202,8 @@
     "9": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 67,
-                "end": 110,
+                "begin": 50,
+                "end": 99,
                 "abridged": false
             },
             "speedometer2": {
@@ -217,8 +217,8 @@
     "10": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 110,
-                "end": 160,
+                "begin": 99,
+                "end": 144,
                 "abridged": false
             },
             "speedometer2": {
@@ -232,8 +232,8 @@
     "11": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 160,
-                "end": 204,
+                "begin": 144,
+                "end": 189,
                 "abridged": false
             },
             "speedometer2": {
@@ -247,8 +247,8 @@
     "12": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 204,
-                "end": 265,
+                "begin": 189,
+                "end": 247,
                 "abridged": false
             },
             "speedometer2": {
@@ -262,8 +262,8 @@
     "13": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 265,
-                "end": 328,
+                "begin": 247,
+                "end": 317,
                 "abridged": false
             },
             "speedometer2": {
@@ -277,8 +277,8 @@
     "14": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 328,
-                "end": 381,
+                "begin": 317,
+                "end": 365,
                 "abridged": false
             },
             "speedometer2": {
@@ -292,7 +292,7 @@
     "15": {
         "benchmarks": {
             "rendering.mobile": {
-                "begin": 381,
+                "begin": 365,
                 "abridged": false
             },
             "rendering.mobile.notracing": {
@@ -320,7 +320,7 @@
                 "abridged": false
             },
             "system_health.common_mobile": {
-                "end": 19,
+                "end": 5,
                 "abridged": false
             }
         }
@@ -328,7 +328,8 @@
     "16": {
         "benchmarks": {
             "system_health.common_mobile": {
-                "begin": 19,
+                "begin": 5,
+                "end": 62,
                 "abridged": false
             },
             "speedometer2": {
@@ -341,8 +342,12 @@
     },
     "17": {
         "benchmarks": {
+            "system_health.common_mobile": {
+                "begin": 62,
+                "abridged": false
+            },
             "system_health.memory_mobile": {
-                "end": 19,
+                "end": 13,
                 "abridged": false
             },
             "speedometer2": {
@@ -356,8 +361,8 @@
     "18": {
         "benchmarks": {
             "system_health.memory_mobile": {
-                "begin": 19,
-                "end": 29,
+                "begin": 13,
+                "end": 26,
                 "abridged": false
             },
             "speedometer2": {
@@ -371,8 +376,8 @@
     "19": {
         "benchmarks": {
             "system_health.memory_mobile": {
-                "begin": 29,
-                "end": 47,
+                "begin": 26,
+                "end": 45,
                 "abridged": false
             },
             "speedometer2": {
@@ -386,8 +391,8 @@
     "20": {
         "benchmarks": {
             "system_health.memory_mobile": {
-                "begin": 47,
-                "end": 66,
+                "begin": 45,
+                "end": 62,
                 "abridged": false
             }
         }
@@ -395,7 +400,7 @@
     "21": {
         "benchmarks": {
             "system_health.memory_mobile": {
-                "begin": 66,
+                "begin": 62,
                 "abridged": false
             },
             "system_health.webview_startup": {
@@ -417,33 +422,33 @@
         }
     },
     "extra_infos": {
-        "num_stories": 1114,
-        "predicted_min_shard_time": 1860.0,
+        "num_stories": 1115,
+        "predicted_min_shard_time": 1814.0,
         "predicted_min_shard_index": 22,
-        "predicted_max_shard_time": 2460.0,
+        "predicted_max_shard_time": 2327.0,
         "predicted_max_shard_index": 21,
-        "shard #0": 2147.0,
-        "shard #1": 2145.0,
-        "shard #2": 2147.0,
-        "shard #3": 2144.0,
-        "shard #4": 2156.0,
-        "shard #5": 2138.0,
-        "shard #6": 2335.0,
-        "shard #7": 2105.0,
-        "shard #8": 2138.0,
-        "shard #9": 2147.0,
+        "shard #0": 2113.0,
+        "shard #1": 2116.0,
+        "shard #2": 2124.0,
+        "shard #3": 2137.0,
+        "shard #4": 2138.0,
+        "shard #5": 2114.0,
+        "shard #6": 1998.0,
+        "shard #7": 2100.0,
+        "shard #8": 2136.0,
+        "shard #9": 2152.0,
         "shard #10": 2125.0,
-        "shard #11": 2130.0,
-        "shard #12": 2129.0,
-        "shard #13": 2134.0,
-        "shard #14": 2125.0,
-        "shard #15": 2141.0,
-        "shard #16": 2099.0,
-        "shard #17": 2152.0,
-        "shard #18": 2128.0,
-        "shard #19": 2116.0,
-        "shard #20": 2088.0,
-        "shard #21": 2460.0,
-        "shard #22": 1860.0
+        "shard #11": 2125.0,
+        "shard #12": 2130.0,
+        "shard #13": 2150.0,
+        "shard #14": 2131.0,
+        "shard #15": 2120.0,
+        "shard #16": 2139.0,
+        "shard #17": 2156.0,
+        "shard #18": 2199.0,
+        "shard #19": 2166.0,
+        "shard #20": 2139.0,
+        "shard #21": 2327.0,
+        "shard #22": 1814.0
     }
 }
diff --git a/tools/pgo/generate_profile.py b/tools/pgo/generate_profile.py
index eb3eca06..246ed35 100755
--- a/tools/pgo/generate_profile.py
+++ b/tools/pgo/generate_profile.py
@@ -462,6 +462,7 @@
         '--print-only=stories',
         '--print-only-runnable',  # This is essential to skip filtered stories.
         f'--browser={args.android_browser}',
+        '-vv',
     ]
     _LOGGER.debug(f"Running command: {' '.join(print_stories_cmd)}")
 
diff --git a/ui/accessibility/platform/ax_platform_node_cocoa.h b/ui/accessibility/platform/ax_platform_node_cocoa.h
index 8a5a3aeb..1a953530 100644
--- a/ui/accessibility/platform/ax_platform_node_cocoa.h
+++ b/ui/accessibility/platform/ax_platform_node_cocoa.h
@@ -42,9 +42,6 @@
 // Determines if this object is alive, i.e. it hasn't been detached.
 - (BOOL)instanceActive;
 
-// Returns true if this accessible element should be included into the ax tree.
-- (BOOL)isIncludedInPlatformTree;
-
 // Returns true if this object should expose its accessible name using
 // accessibilityLabel (legacy AXDescription attribute).
 - (BOOL)isNameFromLabel;
diff --git a/ui/accessibility/platform/ax_platform_node_cocoa.mm b/ui/accessibility/platform/ax_platform_node_cocoa.mm
index 1f10479..3a04af375 100644
--- a/ui/accessibility/platform/ax_platform_node_cocoa.mm
+++ b/ui/accessibility/platform/ax_platform_node_cocoa.mm
@@ -537,14 +537,6 @@
   return _node != nullptr;
 }
 
-- (BOOL)isIncludedInPlatformTree {
-  // TODO(accessibility): Do we really need to have invisible objects in
-  // the platform tree?
-  return [self instanceActive] &&
-         ![[self AXRole] isEqualToString:NSAccessibilityUnknownRole] &&
-         !_node->IsInvisibleOrIgnored();
-}
-
 - (id)titleUIElement {
   // True only if it's a control, if there's a single label, and the label has
   // nonempty text.
@@ -835,8 +827,6 @@
       return NSAccessibilityButtonRole;
     case ax::mojom::Role::kCanvas:
       return NSAccessibilityImageRole;
-    case ax::mojom::Role::kCaret:
-      return NSAccessibilityUnknownRole;
     case ax::mojom::Role::kCell:
       return @"AXCell";
     case ax::mojom::Role::kCheckBox:
@@ -893,14 +883,10 @@
       return @"AXHeading";
     case ax::mojom::Role::kImage:
       return NSAccessibilityImageRole;
-    case ax::mojom::Role::kImeCandidate:
-      return NSAccessibilityUnknownRole;
     case ax::mojom::Role::kInlineTextBox:
       return NSAccessibilityStaticTextRole;
     case ax::mojom::Role::kInputTime:
       return @"AXTimeField";
-    case ax::mojom::Role::kKeyboard:
-      return NSAccessibilityUnknownRole;
     case ax::mojom::Role::kLink:
       return NSAccessibilityLinkRole;
     case ax::mojom::Role::kList:
@@ -945,8 +931,6 @@
       return NSAccessibilityRowRole;
     case ax::mojom::Role::kRowHeader:
       return @"AXCell";
-    case ax::mojom::Role::kRubyAnnotation:
-      return NSAccessibilityUnknownRole;
     case ax::mojom::Role::kScrollBar:
       return NSAccessibilityScrollBarRole;
     case ax::mojom::Role::kScrollView:
@@ -986,18 +970,25 @@
     case ax::mojom::Role::kTreeItem:
       return NSAccessibilityRowRole;
     case ax::mojom::Role::kUnknown:
-      return NSAccessibilityUnknownRole;
+      // This occurs in the case where a View has no widget, and while this will
+      // not be exposed to users, it allows isAccessibilityElement() to have
+      // fewer rules.
+      return NSAccessibilityGroupRole;
     case ax::mojom::Role::kWindow:
       // Use the group role as the BrowserNativeWidgetWindow already provides
       // a kWindow role, and having extra window roles, which are treated
       // specially by screen readers, can break their ability to find the
       // content window. See http://crbug.com/875843 for more information.
       return NSAccessibilityGroupRole;
+    case ax::mojom::Role::kCaret:
     case ax::mojom::Role::kDescriptionListTermDeprecated:
     case ax::mojom::Role::kDescriptionListDetailDeprecated:
     case ax::mojom::Role::kDirectoryDeprecated:
+    case ax::mojom::Role::kImeCandidate:
+    case ax::mojom::Role::kKeyboard:
     case ax::mojom::Role::kPreDeprecated:
     case ax::mojom::Role::kPortalDeprecated:
+    case ax::mojom::Role::kRubyAnnotation:
       NOTREACHED();
   }
 }
@@ -1052,19 +1043,15 @@
 }
 
 - (ax::mojom::Role)internalRole {
-  if ([self instanceActive]) {
-    ax::mojom::Role role = static_cast<ax::mojom::Role>(_node->GetRole());
-    // Make sure to use Role::kPopupButton instead of Role::kButton for all
-    // values of kHasPopup. This is normally already true, but the default
-    // implementation does not use kPopupButton if aria-haspopup="dialog".
-    if (role == ax::mojom::Role::kButton &&
-        _node->HasIntAttribute(ax::mojom::IntAttribute::kHasPopup)) {
-      return ax::mojom::Role::kPopUpButton;
-    }
-    return role;
+  ax::mojom::Role role = static_cast<ax::mojom::Role>(_node->GetRole());
+  // Make sure to use Role::kPopupButton instead of Role::kButton for all
+  // values of kHasPopup. This is normally already true, but the default
+  // implementation does not use kPopupButton if aria-haspopup="dialog".
+  if (role == ax::mojom::Role::kButton &&
+      _node->HasIntAttribute(ax::mojom::IntAttribute::kHasPopup)) {
+    return ax::mojom::Role::kPopUpButton;
   }
-
-  return ax::mojom::Role::kUnknown;
+  return role;
 }
 
 - (BOOL)hasAction:(ax::mojom::Action)action {
@@ -1095,8 +1082,7 @@
   bool has_image_semantics =
       ui::IsImage(_node->GetRole()) &&
       !_node->GetBoolAttribute(ax::mojom::BoolAttribute::kCanvasHasFallback) &&
-      !_node->GetChildCount() &&
-      _node->GetNameFrom() != ax::mojom::NameFrom::kAttributeExplicitlyEmpty;
+      !_node->GetChildCount();
 #if DCHECK_IS_ON()
   bool is_native_image =
       [[self accessibilityRole] isEqualToString:NSAccessibilityImageRole];
@@ -2340,14 +2326,7 @@
   for (auto child_iterator_ptr = _node->GetDelegate()->ChildrenBegin();
        *child_iterator_ptr != *_node->GetDelegate()->ChildrenEnd();
        ++(*child_iterator_ptr)) {
-    ui::AXPlatformNodeDelegate* child = child_iterator_ptr->get();
-    if (child && child->IsInvisibleOrIgnored()) {
-      [children
-          addObjectsFromArray:[child_iterator_ptr->GetNativeViewAccessible()
-                                      .Get() accessibilityChildren]];
-    } else {
-      [children addObject:child_iterator_ptr->GetNativeViewAccessible().Get()];
-    }
+    [children addObject:child_iterator_ptr->GetNativeViewAccessible().Get()];
   }
   return NSAccessibilityUnignoredChildren(children);
 }
@@ -2619,12 +2598,27 @@
 
 // NSAccessibility: Configuring Accessibility.
 - (BOOL)isAccessibilityElement {
-  if (![self instanceActive])
+  if (!_node) {
     return NO;
+  }
+  DCHECK(_node->GetDelegate());
+  DCHECK([self instanceActive]);
 
-  return (![[[self class] nativeRoleFromAXRole:_node->GetRole()]
-              isEqualToString:NSAccessibilityUnknownRole] &&
-          !_node->GetDelegate()->IsIgnored());
+  // After ViewsAX lands, we should be able to add this DCHECK.
+  // DCHECK(!_node->GetDelegate()->IsIgnored())
+  //     << "Ignored nodes should be removed by PlatformGet*() methods:"
+  //     << _node->GetDelegate()->ToString();
+
+  if (_node->GetDelegate()->IsInvisibleOrIgnored()) {
+    return NO;
+  }
+
+  if ([self internalRole] == ax::mojom::Role::kImage &&
+      _node->GetData().GetNameFrom() ==
+          ax::mojom::NameFrom::kAttributeExplicitlyEmpty) {
+    return NO;
+  }
+  return YES;
 }
 
 - (BOOL)isAccessibilityEnabled {
diff --git a/ui/accessibility/platform/browser_accessibility_cocoa.mm b/ui/accessibility/platform/browser_accessibility_cocoa.mm
index a2b8ef2..403d4aa2 100644
--- a/ui/accessibility/platform/browser_accessibility_cocoa.mm
+++ b/ui/accessibility/platform/browser_accessibility_cocoa.mm
@@ -630,10 +630,7 @@
       AXPlatformNodeCocoa* child =
           base::apple::ObjCCastStrict<AXPlatformNodeCocoa>(
               it->GetNativeViewAccessible().Get());
-      if ([child isIncludedInPlatformTree])
-        [_children addObject:child];
-      else
-        [_children addObjectsFromArray:[child accessibilityChildren]];
+      [_children addObject:child];
     }
 
     // Also, add indirect children (if any).
@@ -649,7 +646,7 @@
       }
     }
   }
-  return _children;
+  return NSAccessibilityUnignoredChildren(_children);
 }
 
 - (void)childrenChanged {
@@ -660,14 +657,12 @@
     return;
   }
   _children = nil;
-  if (![self isIncludedInPlatformTree]) {
-    BrowserAccessibility* parent = _owner->PlatformGetParent();
-    if (parent) {
-      BrowserAccessibilityCocoa* parentCocoa =
-          base::apple::ObjCCastStrict<BrowserAccessibilityCocoa>(
-              parent->GetNativeViewAccessible().Get());
-      [parentCocoa childrenChanged];
-    }
+  BrowserAccessibility* parent = _owner->PlatformGetParent();
+  if (parent) {
+    BrowserAccessibilityCocoa* parentCocoa =
+        base::apple::ObjCCastStrict<BrowserAccessibilityCocoa>(
+            parent->GetNativeViewAccessible().Get());
+    [parentCocoa childrenChanged];
   }
 }
 
@@ -1178,9 +1173,6 @@
   } else if (ui::IsImage(_owner->GetRole()) && _owner->GetChildCount()) {
     // An image map is an image with children, and exposed on Mac as a group.
     cocoa_role = NSAccessibilityGroupRole;
-  } else if (ui::IsImage(_owner->GetRole()) &&
-             _owner->HasExplicitlyEmptyName()) {
-    cocoa_role = NSAccessibilityUnknownRole;
   } else if (_owner->IsRootWebAreaForPresentationalIframe()) {
     cocoa_role = NSAccessibilityGroupRole;
   } else if (role == ax::mojom::Role::kListBoxOption && _owner->IsWebContent()) {
@@ -1196,6 +1188,7 @@
 
   TRACE_EVENT1("accessibility", "BrowserAccessibilityCocoa::role",
                "role=", base::SysNSStringToUTF8(cocoa_role));
+  DCHECK(cocoa_role != NSAccessibilityUnknownRole);
   return cocoa_role;
 }
 
@@ -2957,16 +2950,4 @@
   return _owner;
 }
 
-- (BOOL)isAccessibilityElement {
-  if (![self instanceActive])
-    return NO;
-
-  if ([self internalRole] == ax::mojom::Role::kImage &&
-      _owner->HasExplicitlyEmptyName()) {
-    return NO;
-  }
-
-  return [super isAccessibilityElement];
-}
-
 @end
diff --git a/ui/accessibility/platform/browser_accessibility_manager_mac.mm b/ui/accessibility/platform/browser_accessibility_manager_mac.mm
index 3e38738..7dd52ce4 100644
--- a/ui/accessibility/platform/browser_accessibility_manager_mac.mm
+++ b/ui/accessibility/platform/browser_accessibility_manager_mac.mm
@@ -369,6 +369,10 @@
       mac_notification = NSAccessibilityTitleChangedNotification;
       break;
 
+    case AXEventGenerator::Event::CHILDREN_CHANGED:
+      [native_node childrenChanged];
+      return;
+
     // Currently unused events on this platform.
     case AXEventGenerator::Event::NONE:
     case AXEventGenerator::Event::ACCESS_KEY_CHANGED:
@@ -379,7 +383,6 @@
     case AXEventGenerator::Event::AUTOFILL_AVAILABILITY_CHANGED:
     case AXEventGenerator::Event::CARET_BOUNDS_CHANGED:
     case AXEventGenerator::Event::CHECKED_STATE_DESCRIPTION_CHANGED:
-    case AXEventGenerator::Event::CHILDREN_CHANGED:
     case AXEventGenerator::Event::CONTROLS_CHANGED:
     case AXEventGenerator::Event::DETAILS_CHANGED:
     case AXEventGenerator::Event::DESCRIBED_BY_CHANGED:
@@ -528,13 +531,12 @@
   BrowserAccessibilityMac* node =
       static_cast<BrowserAccessibilityMac*>(GetFromID(new_node_data.id));
   CHECK(node);
-  if (!features::IsMacAccessibilityOptimizeChildrenChangedEnabled() ||
-      (old_node_data.child_ids == new_node_data.child_ids &&
-       !node->node()->GetExtraMacNodes())) {
-    return;
+  if (old_node_data.GetIntListAttribute(
+          ax::mojom::IntListAttribute::kIndirectChildIds) !=
+      new_node_data.GetIntListAttribute(
+          ax::mojom::IntListAttribute::kIndirectChildIds)) {
+    [node->GetNativeWrapper() childrenChanged];
   }
-
-  [node->GetNativeWrapper() childrenChanged];
 }
 
 NSDictionary* BrowserAccessibilityManagerMac::
diff --git a/ui/accessibility/platform/inspect/ax_event_recorder_mac.mm b/ui/accessibility/platform/inspect/ax_event_recorder_mac.mm
index 9879f71..7a86ac7 100644
--- a/ui/accessibility/platform/inspect/ax_event_recorder_mac.mm
+++ b/ui/accessibility/platform/inspect/ax_event_recorder_mac.mm
@@ -17,7 +17,9 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/sys_string_conversions.h"
+#include "ui/accessibility/platform/ax_platform_node.h"
 #include "ui/accessibility/platform/ax_platform_tree_manager.h"
+#include "ui/accessibility/platform/ax_private_attributes_mac.h"
 #include "ui/accessibility/platform/ax_private_webkit_constants_mac.h"
 #include "ui/accessibility/platform/inspect/ax_inspect_utils_mac.h"
 #include "ui/accessibility/platform/inspect/ax_tree_formatter_mac.h"
@@ -150,6 +152,17 @@
     return;
   }
 
+#if DCHECK_IS_ON()
+  // Log the AXNodeData for incoming events, for easier debugging.
+  AXElementWrapper wrapper((__bridge id)element);
+  NSString* chrome_node_id =
+      *wrapper.GetAttributeValue(NSAccessibilityChromeAXNodeIdAttribute);
+  AXPlatformNode* ax_platform_node =
+      manager_->GetPlatformNodeFromTree([chrome_node_id intValue]);
+  DVLOG(1) << "Receiving event: " << notification_str
+           << " with AXNodeData: " << ax_platform_node->ToString();
+#endif
+
   auto formatter = AXTreeFormatterMac();
   formatter.SetPropertyFilters(property_filters_,
                                AXTreeFormatter::kFiltersDefaultSet);
diff --git a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
index b3c1e07..6bdba56 100644
--- a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
+++ b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
@@ -4,6 +4,8 @@
 
 package org.chromium.ui.base;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.ClipData;
 import android.content.Context;
 import android.graphics.Bitmap;
@@ -44,18 +46,15 @@
     private static @Nullable DragAndDropDelegate sDragAndDropDelegateForTesting;
     private final DragAndDropDelegateImpl mDragAndDropDelegateImpl;
 
-    /**
-     * The current container view. This view can be updated with
-     * {@link #setContainerView()}.
-     */
-    protected ViewGroup mContainerView;
+    /** The current container view. This view can be updated with {@link #setContainerView()}. */
+    protected @Nullable ViewGroup mContainerView;
 
     // Temporary storage for use as a parameter of getLocationOnScreen().
     private final int[] mTemporaryContainerLocation = new int[2];
 
     /** Notifies the observer when container view is updated. */
     public interface ContainerViewObserver {
-        void onUpdateContainerView(ViewGroup view);
+        void onUpdateContainerView(@Nullable ViewGroup view);
     }
 
     private final ObserverList<ContainerViewObserver> mContainerViewObservers =
@@ -87,14 +86,15 @@
 
     /**
      * Create and return a basic implementation of {@link ViewAndroidDelegate}.
+     *
      * @param containerView {@link ViewGroup} to be used as a container view.
      * @return a new instance of {@link ViewAndroidDelegate}.
      */
-    public static ViewAndroidDelegate createBasicDelegate(ViewGroup containerView) {
+    public static ViewAndroidDelegate createBasicDelegate(@Nullable ViewGroup containerView) {
         return new ViewAndroidDelegate(containerView);
     }
 
-    protected ViewAndroidDelegate(ViewGroup containerView) {
+    protected ViewAndroidDelegate(@Nullable ViewGroup containerView) {
         mContainerView = containerView;
         mDragAndDropDelegateImpl = new DragAndDropDelegateImpl();
     }
@@ -134,22 +134,23 @@
     /**
      * Updates the current container view to which this class delegates.
      *
-     * <p>WARNING: This method can also be used to replace the existing container view,
-     * but you should only do it if you have a very good reason to. Replacing the
-     * container view has been designed to support fullscreen in the Webview so it
-     * might not be appropriate for other use cases.
+     * <p>WARNING: This method can also be used to replace the existing container view, but you
+     * should only do it if you have a very good reason to. Replacing the container view has been
+     * designed to support fullscreen in the Webview so it might not be appropriate for other use
+     * cases.
      *
-     * <p>This method only performs a small part of replacing the container view and
-     * embedders are responsible for:
+     * <p>This method only performs a small part of replacing the container view and embedders are
+     * responsible for:
+     *
      * <ul>
-     *     <li>Disconnecting the old container view from all the references</li>
-     *     <li>Updating the InternalAccessDelegate</li>
-     *     <li>Reconciling the state with the new container view</li>
-     *     <li>Tearing down and recreating the native GL rendering where appropriate</li>
-     *     <li>etc.</li>
+     *   <li>Disconnecting the old container view from all the references
+     *   <li>Updating the InternalAccessDelegate
+     *   <li>Reconciling the state with the new container view
+     *   <li>Tearing down and recreating the native GL rendering where appropriate
+     *   <li>etc.
      * </ul>
      */
-    public final void setContainerView(ViewGroup containerView) {
+    public final void setContainerView(@Nullable ViewGroup containerView) {
         ViewGroup oldContainerView = mContainerView;
         mContainerView = containerView;
         updateAnchorViews(oldContainerView);
@@ -183,7 +184,7 @@
      *
      * @param oldContainerView Old container view just replaced by a new one.
      */
-    public void updateAnchorViews(ViewGroup oldContainerView) {}
+    public void updateAnchorViews(@Nullable ViewGroup oldContainerView) {}
 
     /**
      * @return An anchor view that can be used to anchor decoration views like Autofill popup.
@@ -296,7 +297,7 @@
     public void onCursorChangedToCustom(Bitmap customCursorBitmap, int hotspotX, int hotspotY) {
         PointerIcon icon = PointerIcon.create(customCursorBitmap, hotspotX, hotspotY);
 
-        getContainerViewGroup().setPointerIcon(icon);
+        assumeNonNull(getContainerViewGroup()).setPointerIcon(icon);
     }
 
     @VisibleForTesting
@@ -423,6 +424,7 @@
                 break;
         }
         ViewGroup containerView = getContainerViewGroup();
+        assumeNonNull(containerView);
         PointerIcon icon = PointerIcon.getSystemIcon(containerView.getContext(), pointerIconType);
 
         containerView.setPointerIcon(icon);
@@ -492,12 +494,11 @@
      * @return container view that the anchor views are added to. May be null.
      */
     @CalledByNative
-    @Nullable
-    public final View getContainerView() {
+    public final @Nullable View getContainerView() {
         return mContainerView;
     }
 
-    protected final ViewGroup getContainerViewGroup() {
+    protected final @Nullable ViewGroup getContainerViewGroup() {
         return mContainerView;
     }
 
diff --git a/ui/android/java/src/org/chromium/ui/insets/InsetObserver.java b/ui/android/java/src/org/chromium/ui/insets/InsetObserver.java
index 400124f4c..240b1ac 100644
--- a/ui/android/java/src/org/chromium/ui/insets/InsetObserver.java
+++ b/ui/android/java/src/org/chromium/ui/insets/InsetObserver.java
@@ -62,6 +62,9 @@
     private @Nullable WindowInsetsCompat mLastSeenRawWindowInset;
     private static @Nullable WindowInsetsCompat sInitialRawWindowInsetsForTesting;
 
+    // Edge-to-edge investigations
+    private boolean mHasSeenNonZeroNavBar;
+
     /** Allows observing changes to the window insets from Android system UI. */
     public interface WindowInsetObserver {
         /**
@@ -317,9 +320,28 @@
         return mWindowInsetsAnimationProxyCallback;
     }
 
+    private void checkForNavigationBar(WindowInsetsCompat insets) {
+        Insets navigationBarInsets =
+                insets.getInsetsIgnoringVisibility(WindowInsetsCompat.Type.navigationBars());
+        boolean nonZeroNavBarInsets =
+                navigationBarInsets.left > 0
+                        || navigationBarInsets.bottom > 0
+                        || navigationBarInsets.right > 0;
+        mHasSeenNonZeroNavBar |= nonZeroNavBarInsets;
+    }
+
+    /**
+     * Returns whether the InsetObserver has observed non-zero navigation bar insets (ignoring
+     * visibility).
+     */
+    public boolean hasSeenNonZeroNavigationBarInsets() {
+        return mHasSeenNonZeroNavBar;
+    }
+
     @Override
     public WindowInsetsCompat onApplyWindowInsets(View view, WindowInsetsCompat insets) {
         mLastSeenRawWindowInset = insets;
+        checkForNavigationBar(insets);
 
         updateDisplayCutoutRect(insets);
         insets = forwardToInsetConsumers(insets);
diff --git a/ui/android/junit/src/org/chromium/ui/insets/InsetObserverTest.java b/ui/android/junit/src/org/chromium/ui/insets/InsetObserverTest.java
index c735134..7fe537d 100644
--- a/ui/android/junit/src/org/chromium/ui/insets/InsetObserverTest.java
+++ b/ui/android/junit/src/org/chromium/ui/insets/InsetObserverTest.java
@@ -76,6 +76,9 @@
 
     private static final Insets SYSTEM_GESTURES_INSETS_MODIFIED = Insets.of(1, 1, 1, 2);
 
+    private static final Insets NAVIGATION_BAR_INSETS = Insets.of(0, 0, 0, 1);
+    private static final Insets NAVIGATION_BAR_INSETS_MODIFIED = Insets.of(0, 0, 0, 2);
+
     @Mock private InsetObserver.WindowInsetObserver mObserver;
 
     @Mock private WindowInsetsCompat mInsets;
@@ -111,6 +114,12 @@
                 .onApplyWindowInsets(mModifiedNonCompatInsets);
 
         doReturn(SYSTEM_BAR_INSETS).when(mInsets).getInsets(WindowInsetsCompat.Type.systemBars());
+        doReturn(NAVIGATION_BAR_INSETS)
+                .when(mInsets)
+                .getInsets(WindowInsetsCompat.Type.navigationBars());
+        doReturn(NAVIGATION_BAR_INSETS)
+                .when(mInsets)
+                .getInsetsIgnoringVisibility(WindowInsetsCompat.Type.navigationBars());
         doReturn(SYSTEM_BAR_INSETS_MODIFIED)
                 .when(mModifiedInsets)
                 .getInsets(WindowInsetsCompat.Type.systemBars());
@@ -120,6 +129,12 @@
         doReturn(SYSTEM_GESTURES_INSETS_MODIFIED)
                 .when(mModifiedInsets)
                 .getInsets(WindowInsetsCompat.Type.systemGestures());
+        doReturn(NAVIGATION_BAR_INSETS_MODIFIED)
+                .when(mModifiedInsets)
+                .getInsets(WindowInsetsCompat.Type.navigationBars());
+        doReturn(NAVIGATION_BAR_INSETS_MODIFIED)
+                .when(mModifiedInsets)
+                .getInsetsIgnoringVisibility(WindowInsetsCompat.Type.navigationBars());
 
         mInsetObserver =
                 new InsetObserver(
diff --git a/ui/base/ui_base_features.cc b/ui/base/ui_base_features.cc
index 19f4980..20a312a6 100644
--- a/ui/base/ui_base_features.cc
+++ b/ui/base/ui_base_features.cc
@@ -156,7 +156,7 @@
 // See https://crbug.com/412608405 for context.
 BASE_FEATURE(kXInput2KeyEvents,
              "XInput2KeyEvents",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Update of the virtual keyboard settings UI as described in
 // https://crbug.com/876901.
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing.cc b/ui/ozone/platform/wayland/host/wayland_buffer_backing.cc
index 8d34a506..98a9b186 100644
--- a/ui/ozone/platform/wayland/host/wayland_buffer_backing.cc
+++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing.cc
@@ -13,11 +13,13 @@
 WaylandBufferBacking::WaylandBufferBacking(const WaylandConnection* connection,
                                            uint32_t buffer_id,
                                            const gfx::Size& size,
+                                           BufferBackingType type,
                                            uint32_t format)
     : connection_(connection),
       format_(format),
       buffer_id_(buffer_id),
-      size_(size) {
+      size_(size),
+      type_(type) {
   DCHECK(connection_);
   DCHECK_NE(buffer_id_, kInvalidBufferId);
 }
@@ -25,7 +27,8 @@
 WaylandBufferBacking::~WaylandBufferBacking() = default;
 
 bool WaylandBufferBacking::UseExplicitSyncRelease() const {
-  return connection_->SupportsExplicitSync();
+  return connection_->SupportsExplicitSync() &&
+         type() == BufferBackingType::kDmabuf;
 }
 
 WaylandBufferHandle* WaylandBufferBacking::EnsureBufferHandle(
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing.h b/ui/ozone/platform/wayland/host/wayland_buffer_backing.h
index 50e38ca3..4175757 100644
--- a/ui/ozone/platform/wayland/host/wayland_buffer_backing.h
+++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing.h
@@ -30,8 +30,7 @@
   enum class BufferBackingType {
     kShm = 0,
     kDmabuf = 1,
-    kSolidColor = 2,
-    kSinglePixel = 3,
+    kSinglePixel = 2,
   };
 
   WaylandBufferBacking() = delete;
@@ -40,6 +39,7 @@
   WaylandBufferBacking(const WaylandConnection* connection,
                        uint32_t buffer_id,
                        const gfx::Size& size,
+                       BufferBackingType type,
                        uint32_t format = DRM_FORMAT_INVALID);
   virtual ~WaylandBufferBacking();
 
@@ -60,7 +60,7 @@
   WaylandBufferHandle* GetBufferHandle(WaylandSurface* requestor);
 
   // Returns type of the backing. See BufferBackingType.
-  virtual BufferBackingType GetBackingType() const = 0;
+  BufferBackingType type() const { return type_; }
 
  private:
   // Non-owned pointer to the main connection.
@@ -83,6 +83,8 @@
   // Actual buffer size in pixels.
   const gfx::Size size_;
 
+  const BufferBackingType type_;
+
   // Collection of wl_buffers objects backed by this backing. Maintains the
   // relationship of wl_surfaces to wl_buffers, corresponding to the
   // wl_surface.attach(wl_buffer) request. |buffer_handles_[nullptr]| represents
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.cc b/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.cc
index c2b529a..5837867 100644
--- a/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.cc
+++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.cc
@@ -19,7 +19,11 @@
     uint32_t format,
     uint32_t planes_count,
     uint32_t buffer_id)
-    : WaylandBufferBacking(connection, buffer_id, size, format),
+    : WaylandBufferBacking(connection,
+                           buffer_id,
+                           size,
+                           BufferBackingType::kDmabuf,
+                           format),
       fd_(std::move(fd)),
       strides_(std::move(strides)),
       offsets_(std::move(offsets)),
@@ -40,9 +44,4 @@
     auto close = std::move(fd_);
 }
 
-WaylandBufferBacking::BufferBackingType
-WaylandBufferBackingDmabuf::GetBackingType() const {
-  return WaylandBufferBacking::BufferBackingType::kDmabuf;
-}
-
 }  // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.h b/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.h
index 61b7bd8b..44064c6 100644
--- a/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.h
+++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.h
@@ -32,7 +32,6 @@
   // WaylandBufferBacking override:
   void RequestBufferHandle(
       base::OnceCallback<void(wl::Object<wl_buffer>)> callback) override;
-  BufferBackingType GetBackingType() const override;
 
   base::ScopedFD fd_;
   const std::vector<uint32_t> strides_;
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc b/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc
index b1dbc4b..d0b6182 100644
--- a/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc
+++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc
@@ -15,7 +15,10 @@
     uint64_t length,
     const gfx::Size& size,
     uint32_t buffer_id)
-    : WaylandBufferBacking(connection, buffer_id, size),
+    : WaylandBufferBacking(connection,
+                           buffer_id,
+                           size,
+                           BufferBackingType::kShm),
       fd_(std::move(fd)),
       length_(length) {}
 
@@ -32,9 +35,4 @@
     auto close = std::move(fd_);
 }
 
-WaylandBufferBacking::BufferBackingType
-WaylandBufferBackingShm::GetBackingType() const {
-  return WaylandBufferBacking::BufferBackingType::kShm;
-}
-
 }  // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.h b/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.h
index 82ee7b29a..877bcf70 100644
--- a/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.h
+++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.h
@@ -27,7 +27,6 @@
   // WaylandBufferBacking override:
   void RequestBufferHandle(
       base::OnceCallback<void(wl::Object<wl_buffer>)> callback) override;
-  BufferBackingType GetBackingType() const override;
 
   base::ScopedFD fd_;
   const uint64_t length_;
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.cc b/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.cc
index f88209e..2b1be81 100644
--- a/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.cc
+++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.cc
@@ -13,7 +13,10 @@
     const WaylandConnection* connection,
     SkColor4f color,
     uint32_t buffer_id)
-    : WaylandBufferBacking(connection, buffer_id, gfx::Size(1, 1)),
+    : WaylandBufferBacking(connection,
+                           buffer_id,
+                           gfx::Size(1, 1),
+                           BufferBackingType::kSinglePixel),
       color_(color) {}
 
 WaylandBufferBackingSinglePixel::~WaylandBufferBackingSinglePixel() = default;
@@ -25,9 +28,4 @@
       connection()->single_pixel_buffer()->CreateSinglePixelBuffer(color_));
 }
 
-WaylandBufferBacking::BufferBackingType
-WaylandBufferBackingSinglePixel::GetBackingType() const {
-  return WaylandBufferBacking::BufferBackingType::kSinglePixel;
-}
-
 }  // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.h b/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.h
index cf6e324e..e6b135b 100644
--- a/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.h
+++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.h
@@ -27,7 +27,6 @@
   // WaylandBufferBacking override:
   void RequestBufferHandle(
       base::OnceCallback<void(wl::Object<wl_buffer>)> callback) override;
-  BufferBackingType GetBackingType() const override;
 
   SkColor4f color_;
 };
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc b/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc
index 026a0e8..bb7e43d 100644
--- a/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc
+++ b/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc
@@ -6,17 +6,41 @@
 
 #include <ostream>
 
+#include "ui/ozone/platform/wayland/host/wayland_buffer_backing.h"
 #include "ui/ozone/platform/wayland/host/wayland_connection.h"
 #include "ui/ozone/platform/wayland/host/wayland_syncobj_timeline.h"
 
 namespace ui {
+namespace {
+WaylandBufferHandle::SyncMethod determine_sync_method(
+    WaylandBufferBacking* backing) {
+  switch (backing->type()) {
+    case WaylandBufferBacking::BufferBackingType::kSinglePixel:
+      return WaylandBufferHandle::SyncMethod::kNone;
+    case WaylandBufferBacking::BufferBackingType::kShm:
+      return WaylandBufferHandle::SyncMethod::kImplicit;
+    case WaylandBufferBacking::BufferBackingType::kDmabuf:
+      if (backing->connection()->SupportsExplicitSync()) {
+        return WaylandBufferHandle::SyncMethod::kSyncobj;
+      } else if (backing->connection()->UseImplicitSyncInterop()) {
+        return WaylandBufferHandle::SyncMethod::kDMAFence;
+      } else {
+        return WaylandBufferHandle::SyncMethod::kImplicit;
+      }
+    default:
+      NOTREACHED();
+  }
+}
+}  // namespace
 
 WaylandBufferHandle::WaylandBufferHandle(WaylandBufferBacking* backing)
-    : backing_(backing), weak_factory_(this) {}
+    : backing_(backing),
+      sync_method_(determine_sync_method(backing)),
+      weak_factory_(this) {}
 
 WaylandBufferHandle::~WaylandBufferHandle() {
   for (auto& cb : released_callbacks_)
-    std::move(cb.second).Run(wl_buffer_.get());
+    std::move(cb.second).Run(wl_buffer_.get(), /*is_destruct=*/true);
 }
 
 void WaylandBufferHandle::OnWlBufferCreated(wl::Object<wl_buffer> wl_buffer) {
@@ -28,10 +52,10 @@
   static constexpr wl_buffer_listener kBufferListener = {
       .release = &OnRelease,
   };
-  if (backing_->UseExplicitSyncRelease()) {
+  if (sync_method_ == SyncMethod::kSyncobj) {
     release_timeline_ =
         WaylandSyncobjReleaseTimeline::Create(backing_->connection());
-  } else {
+  } else if (sync_method_ != SyncMethod::kNone) {
     wl_buffer_add_listener(wl_buffer_.get(), &kBufferListener, this);
   }
 
@@ -47,11 +71,13 @@
 
 void WaylandBufferHandle::OnWlBufferReleased(wl_buffer* wl_buff) {
   DCHECK_EQ(wl_buff, wl_buffer_.get());
-  DCHECK(!backing_->UseExplicitSyncRelease());
+  DCHECK(sync_method_ == SyncMethod::kDMAFence ||
+         sync_method_ == SyncMethod::kImplicit);
   DCHECK_LE(released_callbacks_.size(), 1u);
 
-  if (!released_callbacks_.empty())
-    std::move(released_callbacks_.begin()->second).Run(wl_buff);
+  if (!released_callbacks_.empty()) {
+    std::move(released_callbacks_.begin()->second).Run(wl_buff, false);
+  }
   released_callbacks_.clear();
 }
 
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_handle.h b/ui/ozone/platform/wayland/host/wayland_buffer_handle.h
index c852aec..f775eb1 100644
--- a/ui/ozone/platform/wayland/host/wayland_buffer_handle.h
+++ b/ui/ozone/platform/wayland/host/wayland_buffer_handle.h
@@ -21,6 +21,17 @@
 // corresponding WaylandBufferBackings.
 class WaylandBufferHandle {
  public:
+  enum class SyncMethod {
+    // No acquire or release needed
+    kNone = 0,
+    // Attach and release are treated as ready to use/reuse
+    kImplicit = 1,
+    // Using DRM syncobj timeline
+    kSyncobj = 2,
+    // Using fence packaged in dmabuf, should not co-exist with kSyncObj
+    kDMAFence = 3,
+  };
+
   WaylandBufferHandle() = delete;
   WaylandBufferHandle(const WaylandBufferHandle&) = delete;
   WaylandBufferHandle& operator=(const WaylandBufferHandle&) = delete;
@@ -32,7 +43,7 @@
     created_callback_ = std::move(callback);
   }
   void set_buffer_released_callback(
-      base::OnceCallback<void(wl_buffer*)> callback,
+      base::OnceCallback<void(wl_buffer*, bool)> callback,
       WaylandSurface* requestor) {
     released_callbacks_.emplace(requestor, std::move(callback));
   }
@@ -61,8 +72,9 @@
   void OnExplicitRelease(WaylandSurface* requestor);
 
   WaylandBufferBacking::BufferBackingType backing_type() const {
-    return backing_->GetBackingType();
+    return backing_->type();
   }
+  SyncMethod sync_method() const { return sync_method_; }
 
  private:
   void OnWlBufferCreated(wl::Object<wl_buffer> wl_buffer);
@@ -76,6 +88,9 @@
   // A wl_buffer backed by the dmabuf/shm |backing_| created on the GPU side.
   wl::Object<wl_buffer> wl_buffer_;
 
+  // How synchronization of this buffer is managed.
+  const SyncMethod sync_method_;
+
   // A callback that runs when the wl_buffer is created.
   base::OnceClosure created_callback_;
 
@@ -96,7 +111,7 @@
   // from the wl_compositor.
   // When linux explicit synchronization is adopted, buffer_listener is unset
   // and this callback should be reset by OnExplicitRelease() instead.
-  base::flat_map<WaylandSurface*, base::OnceCallback<void(wl_buffer*)>>
+  base::flat_map<WaylandSurface*, base::OnceCallback<void(wl_buffer*, bool)>>
       released_callbacks_;
 
   friend WaylandBufferBacking;
diff --git a/ui/ozone/platform/wayland/host/wayland_frame_manager.cc b/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
index 9d1ea0c..0ea6f4b 100644
--- a/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
+++ b/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
@@ -466,12 +466,6 @@
 
   bool needs_commit = false;
 
-  // If it's a solid color buffer, do not set a release callback as it's not
-  // required to wait for this buffer - Wayland compositor only uses that to
-  // produce a config for the quad.
-  const bool is_solid_color_buffer =
-      buffer_handle->backing_type() ==
-      WaylandBufferBacking::BufferBackingType::kSolidColor;
   if (will_attach) {
     // Setup frame callback if wayland_surface will commit this buffer.
     // On Mutter, we don't receive frame.callback acks if we don't attach a
@@ -496,16 +490,24 @@
       needs_commit = true;
     }
 
-    if (!is_solid_color_buffer) {
-      if (connection_->SupportsExplicitSync()) {
+    switch (buffer_handle->sync_method()) {
+      case WaylandBufferHandle::SyncMethod::kNone:
+        break;
+      case WaylandBufferHandle::SyncMethod::kSyncobj:
         surface->RequestExplicitRelease(
             base::BindOnce(&WaylandFrameManager::OnExplicitBufferRelease,
                            weak_factory_.GetWeakPtr(), surface));
-      }
-      buffer_handle->set_buffer_released_callback(
-          base::BindOnce(&WaylandFrameManager::OnWlBufferRelease,
-                         weak_factory_.GetWeakPtr(), surface),
-          surface);
+        [[fallthrough]];
+      case WaylandBufferHandle::SyncMethod::kDMAFence:
+        [[fallthrough]];
+      case WaylandBufferHandle::SyncMethod::kImplicit:
+        buffer_handle->set_buffer_released_callback(
+            base::BindOnce(&WaylandFrameManager::OnWlBufferRelease,
+                           weak_factory_.GetWeakPtr(), surface),
+            surface);
+        break;
+      default:
+        NOTREACHED();
     }
   }
 
@@ -521,7 +523,7 @@
     needs_commit = true;
   }
 
-  if (!is_solid_color_buffer) {
+  if (buffer_handle->sync_method() != WaylandBufferHandle::SyncMethod::kNone) {
     // If we have submitted this buffer in a previous frame and it is not
     // released yet, submitting the buffer again will not make wayland
     // compositor to release it twice. Remove it from the previous frame.
@@ -754,7 +756,8 @@
 }
 
 void WaylandFrameManager::OnWlBufferRelease(WaylandSurface* surface,
-                                            wl_buffer* buffer) {
+                                            wl_buffer* buffer,
+                                            bool is_destruct) {
   DCHECK(buffer);
 
   // Releases may not necessarily come in order, so search the submitted
@@ -763,7 +766,8 @@
     auto result = frame->submitted_buffers.find(surface);
     if (result != frame->submitted_buffers.end() &&
         result->second->buffer() == buffer) {
-      if (connection_->UseImplicitSyncInterop()) {
+      if (!is_destruct && result->second->sync_method() ==
+                              WaylandBufferHandle::SyncMethod::kDMAFence) {
         base::ScopedFD fence =
             connection_->buffer_manager_host()->ExtractReleaseFence(
                 result->second->id());
@@ -782,7 +786,9 @@
       TRACE_EVENT_INSTANT("wayland", "OnWlBufferRelease", "frame_id",
                           frame->frame_id, "buffer_id", result->second->id());
       frame->submitted_buffers.erase(result);
-      break;
+      if (!is_destruct) {
+        break;
+      }
     }
   }
 
diff --git a/ui/ozone/platform/wayland/host/wayland_frame_manager.h b/ui/ozone/platform/wayland/host/wayland_frame_manager.h
index 87db62c..d2663ab 100644
--- a/ui/ozone/platform/wayland/host/wayland_frame_manager.h
+++ b/ui/ozone/platform/wayland/host/wayland_frame_manager.h
@@ -187,10 +187,13 @@
   // presentation feedback info.
   void ClearProcessedSubmittedFrames();
 
+  // TODO(crbug.com/422765424): These 2 functions can be merged into one.
   void OnExplicitBufferRelease(WaylandSurface* surface,
                                wl_buffer* wl_buffer,
                                base::ScopedFD fence);
-  void OnWlBufferRelease(WaylandSurface* surface, wl_buffer* wl_buffer);
+  void OnWlBufferRelease(WaylandSurface* surface,
+                         wl_buffer* wl_buffer,
+                         bool is_destruct);
 
   // wl_callback_listener callbacks:
   static void OnFrameDone(void* data, wl_callback* callback, uint32_t time);
diff --git a/ui/views/animation/ink_drop_host.h b/ui/views/animation/ink_drop_host.h
index 26734958..7a05772f 100644
--- a/ui/views/animation/ink_drop_host.h
+++ b/ui/views/animation/ink_drop_host.h
@@ -193,6 +193,7 @@
 
   View* host_view() { return host_view_; }
   const View* host_view() const { return host_view_; }
+  bool in_attention_state_for_testing() const { return in_attention_state_; }
 
  private:
   friend class test::InkDropHostTestApi;
diff --git a/ui/views/window/dialog_client_view.cc b/ui/views/window/dialog_client_view.cc
index aa8610a..520b888 100644
--- a/ui/views/window/dialog_client_view.cc
+++ b/ui/views/window/dialog_client_view.cc
@@ -403,8 +403,10 @@
 void DialogClientView::ButtonPressed(ui::mojom::DialogButton type,
                                      const ui::Event& event) {
   DialogDelegate* const delegate = GetDialogDelegate();
-  if (!delegate || input_protector_->IsPossiblyUnintendedInteraction(
-                       event, /*allow_key_events=*/true)) {
+  if (!delegate ||
+      input_protector_->IsPossiblyUnintendedInteraction(
+          event, /*allow_key_events=*/delegate
+                     ->ShouldAllowKeyEventsDuringInputProtection())) {
     return;
   }
 
diff --git a/ui/views/window/dialog_delegate.cc b/ui/views/window/dialog_delegate.cc
index fa171a29..453e164 100644
--- a/ui/views/window/dialog_delegate.cc
+++ b/ui/views/window/dialog_delegate.cc
@@ -228,6 +228,10 @@
   return false;
 }
 
+bool DialogDelegate::ShouldAllowKeyEventsDuringInputProtection() const {
+  return true;
+}
+
 bool DialogDelegate::Cancel() {
   DCHECK(!already_started_close_);
   if (HasCallback(cancel_callback_)) {
diff --git a/ui/views/window/dialog_delegate.h b/ui/views/window/dialog_delegate.h
index df267c8..b41fce35 100644
--- a/ui/views/window/dialog_delegate.h
+++ b/ui/views/window/dialog_delegate.h
@@ -353,6 +353,12 @@
       View* button,
       const ui::Event& event) const;
 
+  // Returns true if key events should be allowed during input protection. If
+  // true, calls to
+  // `InputEventActivationProtector::IsPossiblyUnintendedInteraction` will
+  // ignore key events.
+  virtual bool ShouldAllowKeyEventsDuringInputProtection() const;
+
   // For Dialog boxes, if there is a "Cancel" button or no dialog button at all,
   // this is called when the user presses the "Cancel" button.  This function
   // should return true if the window can be closed after it returns, or false
diff --git a/ui/views/window/dialog_delegate_unittest.cc b/ui/views/window/dialog_delegate_unittest.cc
index a5f6363..32af8bee 100644
--- a/ui/views/window/dialog_delegate_unittest.cc
+++ b/ui/views/window/dialog_delegate_unittest.cc
@@ -68,6 +68,11 @@
   std::u16string GetWindowTitle() const override { return title_; }
   View* GetInitiallyFocusedView() override { return input_; }
 
+  // DialogDelegate overrides:
+  bool ShouldAllowKeyEventsDuringInputProtection() const override {
+    return should_allow_key_events_during_input_protection_;
+  }
+
   void TearDown() {
     input_ = nullptr;
     GetWidget()->Close();
@@ -80,6 +85,9 @@
   void set_should_handle_escape(bool should_handle_escape) {
     should_handle_escape_ = should_handle_escape;
   }
+  void set_should_allow_key_events_during_input_protection(bool value) {
+    should_allow_key_events_during_input_protection_ = value;
+  }
 
   views::Textfield* input() { return input_; }
 
@@ -88,6 +96,7 @@
   std::u16string title_;
   bool show_close_button_ = true;
   bool should_handle_escape_ = false;
+  bool should_allow_key_events_during_input_protection_ = true;
 };
 
 namespace {
@@ -489,6 +498,14 @@
   EXPECT_FALSE(dialog->GetOkButton()->GetEnabled());
 }
 
+TEST_F(DialogTest, CanOverrideShouldAllowKeyEventsDuringInputProtection) {
+  dialog()->set_should_allow_key_events_during_input_protection(true);
+  EXPECT_TRUE(dialog()->ShouldAllowKeyEventsDuringInputProtection());
+
+  dialog()->set_should_allow_key_events_during_input_protection(false);
+  EXPECT_FALSE(dialog()->ShouldAllowKeyEventsDuringInputProtection());
+}
+
 using DialogDelegateCloseTest = ViewsTestBase;
 
 TEST_F(DialogDelegateCloseTest, AnyCallbackInhibitsDefaultClose) {
diff --git a/v8 b/v8
index ad9041e..06588c1 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit ad9041e4d0f760e0c1c87d79a60b9ff1d2c77f96
+Subproject commit 06588c16dc5fb1d32c50f884015b90e327dd444c